Skip to content

finding(tooling): ui:icon becomes a record-reading resolver in #5631, but its type is absent from the lucide gate's census — 96 authored glyph names go unjudged, three of them already retired spellings #6009

Description

@yinlianghui

Found while implementing #5631 (the ui:icon glyph-key contract migration). Out of that card's scope — it is the wrong resolver table family, not the wrong schema key — so recorded here rather than folded in.

What happens

scripts/check-lucide-icon-record-names.mjs judges authored icon names by a hand-maintained census, RECORD_READING_TYPES, mapping a component type to the paths where its glyph names sit:

'button': { paths: ['icon'], … }
'action:button': { paths: ['icon'], … }
'action:icon': { paths: ['icon'], … }
…8 entries

'icon' — the ui:icon node type itself — is not among them, and could not have been before #5631: that renderer named its glyph with name, and every census path is an icon path.

After #5631 lands, ui:icon resolves schema.icon through lucide's runtime icons record. It is now exactly the kind of resolver this gate exists for, and its authored names are still not judged.

How it was measured

The gate's own --report counter, run on the same tree before and after the corpus conversion (the conversion reverted in place under a restoring trap, then restored — the tree verified byte-identical to HEAD afterwards):

before conversion: authored icon names judged: 30 | declines to judge: 254
after conversion: authored icon names judged: 30 | declines to judge: 350

+96, and judged does not move. The delta is exactly the 96 non-.mdx icon nodes the migration converted from name to icon; they moved out of "invisible to the gate" and into "seen, and declined". The gate stays green either way, which is the property worth noting: this is not a gate that fails, it is a gate whose population quietly shrank relative to what now reaches a resolver.

Why it matters concretely

Three of those 96 are a retired lucide spelling today:

examples/schema-catalog/src/schemas/marketing/call-to-action.json:53 icon: 'check-circle'
examples/schema-catalog/src/schemas/marketing/call-to-action.json:69 icon: 'check-circle'
examples/schema-catalog/src/schemas/marketing/call-to-action.json:85 icon: 'check-circle'

check-circle is absent from lucide's runtime icons record (the #5622 / #5586 mechanism: a retired spelling is dropped from the record while the deprecated named export survives). Those three rendered nothing before #5631 and render the visible placeholder after it — unchanged behaviour, no regression from that card — but they are precisely the population check-lucide-icon-record-names.mjs was built to catch, and it does not see them.

The fix is not mechanical, which is why this is filed rather than done

Adding

'icon': { paths: ['icon'], resolver: 'packages/components/src/renderers/basic/icon.tsx' },

to the census turns the gate red on the three check-circle nodes. That is the correct outcome, but it makes the census entry and a retired-spelling repair land together — and the spelling family (#5622 / #5586) is deliberately kept separate from the key family. Whoever takes this decides whether the repair is circle-check in the fixtures or something the #5935 consolidation should absorb first.

Related but distinct

References

Metadata

Metadata

Assignees

Labels

domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopm:queue

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions