Filed by the domain:ui execution seat (seat post #5560) as the ruled follow-up to #5633. Filed unassigned.
This is the "consolidate first" half of #5633's own triage ruling. It was fenced out of that round because it changes resolver behaviour, so the gate landed first and the consolidation is returned here rather than bolted onto PR #5932.
The measurement (from #5633's implementation, re-discovered from source, not inherited)
The card that opened #5633 said four record-reading resolvers. Discovery on every run found eight, plus four dynamic-surface sites rather than two. The four that were uncatalogued:
packages/components/src/renderers/form/button.tsxpackages/plugin-list/src/ListView.tsxpackages/plugin-detail/src/RelatedList.tsxpackages/components/src/previews/ActionPreview.tsx
The eight do not agree with each other. Three different tokenisers are in use — split('-'), split(/[-_\s]/), split(/[-_\s]+/) — and only five of the eight carry the Home→House alias.
Why this is worth a card and not a watch
The divergence is user-visible, not cosmetic: the same authored icon name can resolve on one surface and fail on another. That is exactly the sidebar-vs-action-bar disagreement #5633 opened with, and it survives #5932 untouched.
It also caps what the new gate can say. scripts/check-lucide-icon-record-names.mjs deliberately takes the widest tokeniser plus the alias map, so that it never invents a violation none of the eight would actually produce. The cost of that choice is that the gate under-reports precisely where the resolvers disagree — the blind spot is structural, disclosed in #5932, and does not close until the seams collapse.
Scope
One shared resolver, one iconNameMap, one tokeniser; the eight call sites re-pointed at it.
Two consequences to verify rather than assume:
- Collapsing to one tokeniser changes what some surfaces resolve — the three tokenisers are not equivalent. Enumerate the authored names whose resolution changes under each candidate tokeniser before picking one; a name that resolves today on a lax surface and stops resolving under a stricter shared rule is a regression that must be caught here, not in review.
- The
Home→House alias currently applies on five of eight surfaces. Making it universal is the obvious reading, but it is a behaviour change on the other three and should be stated as one.
Once landed, the gate's census shrinks from eight sites to one and its normalisation stops being a widest-common approximation — so scripts/check-lucide-icon-record-names.mjs should be simplified in the same PR, not left carrying a census it no longer needs.
Ruled alternatives (both rejected — do not re-litigate without new evidence)
- Leave the eight in place, let the gate watch them. Rejected: it accepts a real user-visible inconsistency as permanent.
- Narrow the gate to the strictest tokeniser, turning the disagreement into gate failures. Rejected: the gate would report defects the resolvers do not have, which is how a gate gets suppressed and the whole class goes unwatched.
References
Filed by the
domain:uiexecution seat (seat post #5560) as the ruled follow-up to #5633. Filed unassigned.This is the "consolidate first" half of #5633's own triage ruling. It was fenced out of that round because it changes resolver behaviour, so the gate landed first and the consolidation is returned here rather than bolted onto PR #5932.
The measurement (from #5633's implementation, re-discovered from source, not inherited)
The card that opened #5633 said four record-reading resolvers. Discovery on every run found eight, plus four dynamic-surface sites rather than two. The four that were uncatalogued:
packages/components/src/renderers/form/button.tsxpackages/plugin-list/src/ListView.tsxpackages/plugin-detail/src/RelatedList.tsxpackages/components/src/previews/ActionPreview.tsxThe eight do not agree with each other. Three different tokenisers are in use —
split('-'),split(/[-_\s]/),split(/[-_\s]+/)— and only five of the eight carry theHome→Housealias.Why this is worth a card and not a watch
The divergence is user-visible, not cosmetic: the same authored icon name can resolve on one surface and fail on another. That is exactly the sidebar-vs-action-bar disagreement #5633 opened with, and it survives #5932 untouched.
It also caps what the new gate can say.
scripts/check-lucide-icon-record-names.mjsdeliberately takes the widest tokeniser plus the alias map, so that it never invents a violation none of the eight would actually produce. The cost of that choice is that the gate under-reports precisely where the resolvers disagree — the blind spot is structural, disclosed in #5932, and does not close until the seams collapse.Scope
One shared resolver, one
iconNameMap, one tokeniser; the eight call sites re-pointed at it.Two consequences to verify rather than assume:
Home→Housealias currently applies on five of eight surfaces. Making it universal is the obvious reading, but it is a behaviour change on the other three and should be stated as one.Once landed, the gate's census shrinks from eight sites to one and its normalisation stops being a widest-common approximation — so
scripts/check-lucide-icon-record-names.mjsshould be simplified in the same PR, not left carrying a census it no longer needs.Ruled alternatives (both rejected — do not re-litigate without new evidence)
References
icon:literal reaching a record-reading lucide resolver is a liveiconskey — four hand-copied resolvers, four local pins, no gate over the population #5633 / PR Gate authored icon names against lucide's runtimeiconsrecord #5932 — the gate, its eight-site census, and the disclosed under-reportingscripts/check-lucide-icon-record-names.mjs