Skip to content

Commit 3586643

Browse files
os-zhuangclaude
andcommitted
docs(audits): correct the app badge/separator finding — NavigationRenderer exists
My first pass claimed NavigationRenderer had been deleted; it has not. The component (layout/src/NavigationRenderer.tsx, 1327 lines) is publicly exported and SDUI-registered as `navigation-renderer`, and fully implements separator (:906) + badge/badgeVariant (:983-985, :1024-1025). The error came from a truncated grep (head -3 showed only CHANGELOG/ROADMAP hits). Corrected classification: badge/badgeVariant/separator are SURFACE-CONDITIONAL, not dead — they render through the SDUI component but not through UnifiedSidebar, which is what actually renders app.navigation in the console. Disposition flips from enforce-or-prune to port-the-three-branches. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 5c9ab56 commit 3586643

2 files changed

Lines changed: 11 additions & 7 deletions

File tree

docs/audits/2026-07-naming-drift-recheck.md

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ stale. Three real problems remain, two of them a coupled pair that produces
3131
| 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` |
3232
| 6 | page `visibility` | **ALIGNED** (item stale) | spec folds `visibility``visibleWhen` (`page.zod.ts:116,126`); `react/src/SchemaRenderer.tsx:285` consumes `visibleWhen`, `:294` still honors raw `visibility` |
3333
| 7 | dashboard `title` vs `label` | **ALIGNED** (item stale) | renderer dual-reads `title \|\| label` (`plugin-dashboard/.../DashboardRenderer.tsx:782`, `DashboardGridLayout.tsx:278`). Widget-level keys additionally hard-fail via a `.strict()` schema + naming error map (`dashboard.zod.ts:273,98-123`, #1894) |
34-
| 8 | app `accentColor` / `badgeVariant` / `separator` | **SPLIT**`accentColor` aligned; the other two **decayed** | #1894 declared all three in the spec to match objectui's `NavigationRenderer`. `accentColor` is still consumed (`app-shell/src/layout/ConsoleLayout.tsx:171`, `PageHeader.tsx:46`, `apps/console/src/hooks/useBranding.ts:25`). But **`NavigationRenderer` no longer exists**the live nav is `UnifiedSidebar`, which renders neither `badgeVariant` **nor `badge` itself**, and has no `separator` branch (`separator` is only recognized as "no href" by `AppContent.tsx:849` and excluded by `nav-target.ts:17`) |
34+
| 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`) |
3535
| 9 | action `disabled``enabled` | **RESOLVED 2026-07** | fixed across all six rendering surfaces (objectui#2863); showcase specimen `showcase_archive_task` (#3643) |
3636
|| flow `http` vs `http_request` | **ALIGNED** (item stale) | spec enum carries `http` marked canonical (`automation/flow.zod.ts:32`); the runtime registers `HTTP_TYPE = 'http'` (`service-automation/src/builtin/http-nodes.ts:48`) |
3737
|| 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 |
@@ -87,11 +87,15 @@ fix for this whole class; the per-item wiring below is the tactical one.
8787
instead of the live `lookupFilters` — corrected (framework).
8888

8989
**Recorded, not fixed (each needs an owner decision):**
90-
4. **app `badgeVariant` + nav `separator`** — a #1894 reverse-drift fix that
91-
**decayed** when `NavigationRenderer` was replaced by `UnifiedSidebar`.
92-
Enforce-or-prune: either the sidebar renders nav badges + separators (they are
93-
ordinary nav affordances), or both keys leave the spec. Note `badge` itself is
94-
also unrendered, so this is "nav badges are gone", not merely a variant key.
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.
9599
5. **`skill.permissions` has no gate** — mis-filed as naming drift; it is an
96100
aspirational-config item (§4). The ledger marks it `live` on the evidence of a
97101
*preview renderer* while the identically-unenforced `tool.permissions` is

docs/audits/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Spec moved to `dataset`+`values`/`dimensions`, but: the **chart view variant** +
4747
### 3. 🟠 Naming drift → silent no-ops (spec key ≠ consumed key)
4848
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`.
4949

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 `badgeVariant` + nav `separator` decayed when `NavigationRenderer` was replaced by `UnifiedSidebar`; `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. **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).
5151

5252
### 4. 🟠 Aspirational config (rich spec, zero runtime) — prune or mark `experimental`
5353
field enhanced-type configs (barcode/qr/slider/rating/color/location) + governance (encryption/masking/audit/dataQuality); object `enable`/versioning/partitioning/cdc/softDelete/search; agent autonomy (memory/guardrails/structuredOutput/lifecycle); tool `outputSchema`; job `retryPolicy`/`timeout`; theme rtl/density/touchTarget; translation `messageFormat:'icu'` (no ICU engine); **portal (entire)**; webhook non-HMAC auth.

0 commit comments

Comments
 (0)