Found while implementing #6249 (repairing the menubar demo's array shortcut and its two blank-row separators). Filed unassigned and out of that card's fence: #6249's triage ruling scopes it to "one small fixture PR", and its dispatch says to file anything found outside the fixture rather than widen the PR.
⚠️ content/docs/components/overlay/menubar.mdx is currently held by open PR #6345, which rewrites the handler line in this same block. Whoever picks this up should sequence after that PR lands.
What was measured, at 50f987f9a
The page's ## Schema section publishes this:
interface MenubarItem {
label?: string;
value?: string;
icon?: string;
shortcut?: string[];
type?: 'separator';
disabled?: boolean;
}
No such interface exists. MenubarMenu.items is typed MenuItem[] (packages/types/src/overlay.ts:417-425), and the shipped MenuItem (overlay.ts:330-359, mirrored at zod/overlay.zod.ts:131-141) disagrees with the published block on five of its six lines:
| taught on the page |
actually shipped |
label?: string |
label: string — required (overlay.ts:334, z.string() at overlay.zod.ts:133) |
value?: string |
not declared at all |
shortcut?: string[] |
shortcut?: string (overlay.ts:350, overlay.zod.ts:137) |
type?: 'separator' |
separator?: boolean (overlay.ts:358, overlay.zod.ts:139) |
| (absent) |
children?: MenuItem[] — real, and the renderer draws submenus from it |
icon?: string, disabled?: boolean |
✅ these two match |
Also on the same block: MenubarSchema.menus is taught as required, but is declared menus?: MenubarMenu[] (overlay.ts:436, overlay.zod.ts:179).
Excluded from this card: the onSelect?: string | ActionConfig line. That is the handler question PR #6345 and #6346 already own — this card should not touch it.
Why this is worth a card rather than a note
This block is the producer of the defect #6249 exists to end. The fixture wrote "shortcut": ["Ctrl","T"] and {"type":"separator"} because the page next to it declares exactly those two spellings. Repairing the fixture alone leaves the page teaching the wrong shapes one screen below the corrected demo — which is precisely the failure #6157's own test header records in reverse ("#6143 round 2 had just corrected the PROSE on those same pages; the demo rendered beside the prose still contradicted it").
Under AGENTS.md #0.1 (fix the metadata at the producer, not the consumer), the published interface is the producer here.
value is not a menubar-only stray, which is why it belongs on this card rather than being waved through — measured across the whole catalog:
components-overlay-menubar/application-menubar — 11 items carry value
components-overlay-context-menu/basic-context-menu — 4
components-overlay-dropdown-menu/basic-dropdown-menu — 3
components-overlay-dropdown-menu/with-icons — 3
21 items author a key MenuItem does not declare and no renderer reads. MenuItemSchema is a bare z.object, so zod strips it and reports success — the #6157 class-2 blindness, which is why no gate has ever reported it.
Related, and deliberately not merged into this
The open question
Whether the page should keep teaching shortcut at all. It is genuinely declared, but the menubar renderer never reads it (see the companion finding filed alongside this one), so documenting it on this page advertises an affordance this component cannot draw. That is the same honesty call #6249's triage already made for the demo, and it should be made once for the prose rather than guessed at.
Refs: #6249 · #6326 · #6346 · #5250 · #6157.
Generated by Claude Code
Found while implementing #6249 (repairing the menubar demo's array
shortcutand its two blank-row separators). Filed unassigned and out of that card's fence: #6249's triage ruling scopes it to "one small fixture PR", and its dispatch says to file anything found outside the fixture rather than widen the PR.content/docs/components/overlay/menubar.mdxis currently held by open PR #6345, which rewrites the handler line in this same block. Whoever picks this up should sequence after that PR lands.What was measured, at
50f987f9aThe page's
## Schemasection publishes this:No such interface exists.
MenubarMenu.itemsis typedMenuItem[](packages/types/src/overlay.ts:417-425), and the shippedMenuItem(overlay.ts:330-359, mirrored atzod/overlay.zod.ts:131-141) disagrees with the published block on five of its six lines:label?: stringlabel: string— required (overlay.ts:334,z.string()atoverlay.zod.ts:133)value?: stringshortcut?: string[]shortcut?: string(overlay.ts:350,overlay.zod.ts:137)type?: 'separator'separator?: boolean(overlay.ts:358,overlay.zod.ts:139)children?: MenuItem[]— real, and the renderer draws submenus from iticon?: string,disabled?: booleanAlso on the same block:
MenubarSchema.menusis taught as required, but is declaredmenus?: MenubarMenu[](overlay.ts:436,overlay.zod.ts:179).Excluded from this card: the
onSelect?: string | ActionConfigline. That is the handler question PR #6345 and #6346 already own — this card should not touch it.Why this is worth a card rather than a note
This block is the producer of the defect #6249 exists to end. The fixture wrote
"shortcut": ["Ctrl","T"]and{"type":"separator"}because the page next to it declares exactly those two spellings. Repairing the fixture alone leaves the page teaching the wrong shapes one screen below the corrected demo — which is precisely the failure #6157's own test header records in reverse ("#6143 round 2 had just corrected the PROSE on those same pages; the demo rendered beside the prose still contradicted it").Under AGENTS.md #0.1 (fix the metadata at the producer, not the consumer), the published interface is the producer here.
valueis not a menubar-only stray, which is why it belongs on this card rather than being waved through — measured across the whole catalog:components-overlay-menubar/application-menubar— 11 items carryvaluecomponents-overlay-context-menu/basic-context-menu— 4components-overlay-dropdown-menu/basic-dropdown-menu— 3components-overlay-dropdown-menu/with-icons— 321 items author a key
MenuItemdoes not declare and no renderer reads.MenuItemSchemais a barez.object, so zod strips it and reports success — the #6157 class-2 blindness, which is why no gate has ever reported it.Related, and deliberately not merged into this
ui:menubarnever reads an item'siconeither — the thirdMenuItem-shaped container, and the one no census can see #6326 — quotes this same block as evidence thatMenubarItem.iconis documented, and is scoped to the renderer's unreadicon. This card is about the block being wrong; that one is about a key the block gets right.item.onSelect, while the declaredMenuItem.onClickis read by nothing #6346 / PR docs(components): follow the shipped types on the last five action props #6345 — own the handler line.shortcutarray against astringslot, and its separator renders as a blank menu item #6249 — repaired the fixture only; the page was fenced out.BaseSchema.passthrough()makesobjectui validateaccept arbitrary undeclared keys #5250 — records why nothing caught this: no gate parses these JSON fixtures or thisplaintextfence.The open question
Whether the page should keep teaching
shortcutat all. It is genuinely declared, but the menubar renderer never reads it (see the companion finding filed alongside this one), so documenting it on this page advertises an affordance this component cannot draw. That is the same honesty call #6249's triage already made for the demo, and it should be made once for the prose rather than guessed at.Refs: #6249 · #6326 · #6346 · #5250 · #6157.
Generated by Claude Code