Found while implementing #5930 (routing ui:dropdown-menu item icons through resolveIcon). Filed unassigned; not repaired there, because changing what the gate judges is a scope of its own.
What was measured
scripts/check-lucide-icon-record-names.mjs part 2 judges icon names on nodes whose own type is a censused record-reading renderer. Menu items in ui:dropdown-menu are child objects that carry no type key at all, so they are never judged — the gate's own header states this boundary explicitly ("an icon on an UNTYPED node is not judged at all").
Before #5930 that was harmless: the site reached no resolver. After #5930 it reaches one, and the gate still does not cover it.
Measured directly, on the #5930 branch with the fix in place — the retired spelling edit was restored to examples/schema-catalog/src/schemas/components-overlay-dropdown-menu/with-icons.json and the gate re-run:
proof on disk — retired 'edit' present (expect 1): 1
gate exit with retired 'edit' in fixture = 0
OK lucide icon names: 64 authored/declared names reaching 8 record-reading resolvers are live `icons` keys
Exit 0, same 64 names. A dead spelling that now renders no glyph in a published fixture passes the gate silently. That fixture is a declared AI few-shot retrieval source, so the failure mode is teaching a dead name, not just a missing icon.
Why the census part did not catch it either
Part 1 rediscovers modules that read lucide's icons record directly. #5930 routes through resolveIcon rather than importing icons, so renderers/overlay/dropdown-menu.tsx correctly does not enter DECLARED_RECORD_READERS — the census stayed at 8, as designed. The blind spot is entirely in part 2's node-typing rule, not in the census.
Also stale after #5930
The gate's header carries a measured parenthetical that PR for #5930 falsifies:
the eight such names in the schema catalog are child items of button-group, breadcrumb, command and dropdown-menu — three of which never read icon, and the fourth renders it as raw text
dropdown-menu no longer renders it as raw text. Left untouched deliberately (out of that card's fence); it should be corrected with whatever change addresses the above.
Options, not a recommendation
- Judge an
icon on an untyped child node against its nearest typed ancestor whose renderer is a censused record reader. - Or declare, per container type, which child-item keys are icon names.
Related: #5931 is the fixture-side half of the neighbouring class; #5633 built this gate.
Found while implementing #5930 (routing
ui:dropdown-menuitem icons throughresolveIcon). Filed unassigned; not repaired there, because changing what the gate judges is a scope of its own.What was measured
scripts/check-lucide-icon-record-names.mjspart 2 judgesiconnames on nodes whose owntypeis a censused record-reading renderer. Menu items inui:dropdown-menuare child objects that carry notypekey at all, so they are never judged — the gate's own header states this boundary explicitly ("aniconon an UNTYPED node is not judged at all").Before #5930 that was harmless: the site reached no resolver. After #5930 it reaches one, and the gate still does not cover it.
Measured directly, on the #5930 branch with the fix in place — the retired spelling
editwas restored toexamples/schema-catalog/src/schemas/components-overlay-dropdown-menu/with-icons.jsonand the gate re-run:Exit 0, same 64 names. A dead spelling that now renders no glyph in a published fixture passes the gate silently. That fixture is a declared AI few-shot retrieval source, so the failure mode is teaching a dead name, not just a missing icon.
Why the census part did not catch it either
Part 1 rediscovers modules that read lucide's
iconsrecord directly. #5930 routes throughresolveIconrather than importingicons, sorenderers/overlay/dropdown-menu.tsxcorrectly does not enterDECLARED_RECORD_READERS— the census stayed at 8, as designed. The blind spot is entirely in part 2's node-typing rule, not in the census.Also stale after #5930
The gate's header carries a measured parenthetical that PR for #5930 falsifies:
dropdown-menuno longer renders it as raw text. Left untouched deliberately (out of that card's fence); it should be corrected with whatever change addresses the above.Options, not a recommendation
iconon an untyped child node against its nearest typed ancestor whose renderer is a censused record reader.Related: #5931 is the fixture-side half of the neighbouring class; #5633 built this gate.