You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(showcase): nav separator + badge specimens; correct the §3 item-8 verdict (#1878)
Adds the two nav-affordance specimens to the showcase Analytics group
(`nav_sep_reports` separator + `badge: 'NEW'`/`badgeVariant: 'secondary'` on
Hours by Status) and corrects the naming-drift recheck, which twice published
a wrong verdict for this item.
The keys are LIVE. UnifiedSidebar delegates the whole app-navigation tree to
NavigationRenderer (UnifiedSidebar.tsx:437), which implements separator
(:906) and badge/badgeVariant (:983-985); processedNavigation only reorders
and pins, spreading every other key through. Browser-verified against an
UNMODIFIED objectui checkout: the divider draws and the NEW pill renders. No
objectui change was needed -- the port this PR was originally going to make
would have duplicated existing capability.
Both wrong rounds shared one shape: a strong negative claim ("the component
was deleted", "nobody imports it") resting on a search whose results were
silently truncated (head -3) or filtered (a pathspec glob that never matched
the nested path). The doc now carries a methodology note: a grep can only
prove presence; for "does authoring this key do anything", author it and look.
Showcase suite 58/58 green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: docs/audits/2026-07-naming-drift-recheck.md
+38-11Lines changed: 38 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,7 +31,7 @@ stale. Three real problems remain, two of them a coupled pair that produces
31
31
| 5 |**page `label` → `title`**|**🔴 FORWARD-DRIFT — live**| spec `label` is required (`page.zod.ts:303`); the region/SDUI renderer reads `schema.title` with no fallback (`page.tsx:503-507`). Zero `schema.label` reads in `page.tsx`|
| 8 | app `accentColor` / `badgeVariant` / `separator`|**SPLIT** — `accentColor` aligned; the other two are **surface-conditional**|#1894 declared all three to match objectui's `NavigationRenderer`.`accentColor` is consumed on the live path (`app-shell/src/layout/ConsoleLayout.tsx:171`, `PageHeader.tsx:46`, `apps/console/src/hooks/useBranding.ts:25`). `badge`/`badgeVariant`/`separator`**are fully implemented** — but only in `layout/src/NavigationRenderer.tsx` (`:906` separator, `:983-985`/`:1024-1025` badge), which is a *publicly exported, SDUI-registered* component (`navigation-renderer`),**not** the console's own app sidebar. `UnifiedSidebar` — the component that actually renders `app.navigation` in the console — renders no badge and has no separator branch (`separator` is merely recognized as "no href" by `AppContent.tsx:849` and excluded by `nav-target.ts:17`)|
34
+
| 8 | app `accentColor` / `badgeVariant` / `separator`|**ALIGNED** — all three live (item stale) |`accentColor`: `app-shell/src/layout/ConsoleLayout.tsx:171`, `PageHeader.tsx:46`, `apps/console/src/hooks/useBranding.ts:25`. `badge`/`badgeVariant`/`separator`: implementedin `layout/src/NavigationRenderer.tsx` (`:906` separator, `:983-985`/`:1024-1025` badge) — and `UnifiedSidebar`**delegates the whole app-navigation tree to that component** (`UnifiedSidebar.tsx:437`, passing `processedNavigation`, which only re-orders/pins and spreads every other key through). **Browser-verified** against an unmodified objectui checkout with a showcase specimen: the separator draws and a `badge: 'NEW'` + `badgeVariant: 'secondary'` pill renders|
35
35
| 9 | action `disabled` → `enabled`|**RESOLVED 2026-07**| fixed across all six rendering surfaces (objectui#2863); showcase specimen `showcase_archive_task` (#3643) |
| — | skill `requiredPermissions` vs `permissions`|**NOT A DRIFT** — mis-filed |`requiredPermissions`**never existed** on `SkillSchema`; the spec key is and was `permissions` (`ai/skill.zod.ts:121`). The original audit described prose/label drift in the docs, not a spec-vs-runtime mismatch |
@@ -86,21 +86,48 @@ fix for this whole class; the per-item wiring below is the tactical one.
86
86
3.**`os doctor`** pointed `reference_filters` at the removed `referenceFilters`
87
87
instead of the live `lookupFilters` — corrected (framework).
88
88
89
+
4.**app `badge`/`badgeVariant` + nav `separator` — NOT a drift; nothing to do.**
90
+
*(This entry twice carried a wrong verdict before it was settled empirically —
91
+
see "A note on how this item was got wrong", below.)* All three are consumed:
92
+
`NavigationRenderer` implements them, and `UnifiedSidebar` delegates the whole
93
+
app-navigation tree to it (`UnifiedSidebar.tsx:437`). Proven end to end by a
94
+
showcase specimen (`nav_sep_reports` + `badge: 'NEW'` on Hours by Status)
95
+
rendering correctly against an **unmodified** objectui checkout.
96
+
89
97
**Recorded, not fixed (each needs an owner decision):**
90
-
4.**app `badge`/`badgeVariant` + nav `separator` — surface-conditional, do NOT
91
-
prune.** The capability is fully built in `NavigationRenderer` (public export
92
-
+ SDUI `navigation-renderer`); what is missing is the same three affordances
93
-
in `UnifiedSidebar`, the component that actually renders `app.navigation` in
94
-
the console. So an author's `badge: '3'` works if the nav is rendered through
95
-
the SDUI component and silently vanishes in the console shell — a
96
-
*surface-dependent* no-op, the hardest kind to diagnose. Disposition: port the
97
-
three branches into `UnifiedSidebar` (reference implementations already exist
98
-
at `NavigationRenderer.tsx:906,983-985`), not prune the keys.
99
98
5.**`skill.permissions` has no gate** — mis-filed as naming drift; it is an
100
99
aspirational-config item (§4). The ledger marks it `live` on the evidence of a
101
100
*preview renderer* while the identically-unenforced `tool.permissions` is
102
101
`dead` + `authorWarn`. An author writing `skill.permissions` gets silence
103
102
where they should get a warning.
104
103
6.**`agent.knowledge` is inert at runtime** — naming is fixed, but RAG resolves
105
104
its sources from the LLM tool call, not from the authored block. Wire or mark
106
-
experimental.
105
+
experimental. *(Both 5 and 6 are now tracked in #3686; the ledger was made
106
+
honest about them in #3685.)*
107
+
108
+
## A note on how item 8 was got wrong — twice
109
+
110
+
Worth recording, because the failure mode is generic and this document exists to
111
+
stop exactly this class of error.
112
+
113
+
**Round 1.**`git grep -rln "NavigationRenderer" | head -3` returned three
114
+
CHANGELOG/ROADMAP hits, and that was read as "the component was deleted." The
115
+
`head -3` had truncated the real source hit further down the alphabet.
116
+
→ Published claim: *"NavigationRenderer no longer exists."***False.**
field `maxLength`/`minLength`/`referenceFilters`/`maxRating`; page `type`→`pageType` & `label`→`title` & `visibility`; dashboard `title` vs `label`; app `accentColor`/`badgeVariant`/`separator` (renderer reads, **not in spec**); action `disabled`→`enabled`; flow `http` vs `http_request`; skill `requiredPermissions` vs `permissions`; agent `knowledge.{topics→sources}`; webhook `object`→`object_name`, `isActive`→`active`.
49
49
50
-
**✅ Rechecked 2026-07-27 — six of nine were already resolved; the list was stale, not the code.** Closed: `referenceFilters` (→ `lookupFilters`, #2377), `maxRating` (→ `max`), page `visibility` (→ `visibleWhen`), dashboard `title`/`label` (renderer dual-reads; widget keys hard-fail via `.strict()`, #1894), flow `http` (canonical), agent `knowledge.topics` (alias folded, #1891), webhook keys (#3489); action `disabled` fixed across all six rendering surfaces (objectui#2863 + #3643); skill `requiredPermissions` was **never a drift** (mis-filed prose drift). **Still real, fixed in the recheck pass:** the coupled page pair `type`→`pageType` + `label`→`title` (mis-renders every non-record page today) and two snake-only `max_length` readers. **Left as decisions:** app `badge`/`badgeVariant` + nav `separator` are implemented in `NavigationRenderer` (SDUI) but missing from `UnifiedSidebar`, the console's own app sidebar — a surface-dependent no-op, port rather than prune; `skill.permissions` has no gate (belongs in §4); `agent.knowledge` is inert at runtime. Full per-item evidence: [`2026-07-naming-drift-recheck.md`](./2026-07-naming-drift-recheck.md).
50
+
**✅ Rechecked 2026-07-27 — six of nine were already resolved; the list was stale, not the code.** Closed: `referenceFilters` (→ `lookupFilters`, #2377), `maxRating` (→ `max`), page `visibility` (→ `visibleWhen`), dashboard `title`/`label` (renderer dual-reads; widget keys hard-fail via `.strict()`, #1894), flow `http` (canonical), agent `knowledge.topics` (alias folded, #1891), webhook keys (#3489); action `disabled` fixed across all six rendering surfaces (objectui#2863 + #3643); skill `requiredPermissions` was **never a drift** (mis-filed prose drift). **Still real, fixed in the recheck pass:** the coupled page pair `type`→`pageType` + `label`→`title` (mis-renders every non-record page today) and two snake-only `max_length` readers. **Also confirmed aligned:** app `badge`/`badgeVariant` + nav `separator` are live — `UnifiedSidebar` delegates the app-navigation tree to `NavigationRenderer`, which implements all three (browser-verified with a showcase specimen; an earlier revision of this annotation claimed otherwise from a faulty grep — see the recheck doc's methodology note). **Left as decisions:** `skill.permissions` has no gate and `agent.knowledge` is inert at runtime — ledger corrected in #3685, enforce-or-prune tracked in #3686. Full per-item evidence: [`2026-07-naming-drift-recheck.md`](./2026-07-naming-drift-recheck.md).
51
51
52
52
### 4. 🟠 Aspirational config (rich spec, zero runtime) — prune or mark `experimental`
0 commit comments