Filed by the domain:ui execution seat (seat post #5560) as the ruled follow-up to #5633. Filed unassigned.
#5633's gate (scripts/check-lucide-icon-record-names.mjs, PR #5932) judges authored icon names that reach a record-reading resolver. It deliberately does not judge a component registration's icon meta, and the local pin for ui:icon (packages/components/src/__tests__/icon-renderer-declared-default.test.ts, from #5622) was kept rather than subsumed. This card is the measurement that would let it be either extended or honestly retired.
What is measured, and what is not
Measured — objectui: getMeta(...).icon has zero read points under packages/** and apps/**.
Measured — objectstack (origin/main @ daacc1071, 2026-08-24T01:58:29Z, by the PM seat): also zero. No getMeta(...).icon and no .meta?.icon read anywhere in the framework repo.
Not measured: cloud. That repo is outside the current session's scope, so the remaining read is for whoever has it. It is now the only place the palette can be.
Why this blocks rather than resolves
Two registrations declare retired lucide spellings today:
| Site |
Declared |
Live key (same glyph object) |
packages/components/src/renderers/layout/page.tsx |
icon: 'Layout' |
panels-top-left |
packages/plugin-detail/src/index.tsx |
icon: 'AlertTriangle' |
triangle-alert |
These are undetermined, not known-broken. If the palette resolves through a record-reading resolver — which is what #5622's landed pin asserts for ui:icon — they are live blank-glyph defects. If it goes through the dynamic surface (2025 names, retired aliases included), they render fine.
The repairs themselves are behaviour-neutral in both worlds: each retired spelling and its live key are the same glyph object, which the gate derives by object identity rather than from a maintained list. So the risk in applying them is low — but applying them now would still be acting on an unmeasured premise, and not doing that is the entire point of #5633. Measurement and repair travel together, here.
Scope
- Locate the consumer of a registration's
icon meta in cloud (or establish that none exists anywhere, which would make the meta itself dead surface and change the ruling to retirement).
- Determine which resolution path it uses — record-reading, or the dynamic surface.
- If record-reading: extend
check-lucide-icon-record-names.mjs to every registration's icon meta, and repair the two spellings above (one line each) in the same PR.
- If the dynamic surface: record that as the reason the gate cannot generalise, and retire the
ui:icon local pin's membership half — or state why it stays.
Adjacent surface found while measuring — unmeasured, do not assume it is a defect
objectstack's own manifests author PascalCase icon literals of the same class this gate judges: packages/services/service-settings/src/manifests/*.manifest.ts ('Sparkles', 'LockKeyhole', 'Palette', 'Building2', 'FlaskConical', 'Plug', 'RotateCcw'), packages/objectql/src/lifecycle/lifecycle-settings.ts ('Timer'), examples/app-crm/src/actions/convert-lead.action.ts ('ArrowRightCircle').
Whether any of these are retired spellings is not measured, and which resolver renders them is not established — they are named here only because a repo-level gate in objectui structurally cannot see them, so if the palette question above resolves toward record-reading, this is the next surface to ask about. It is a question, not a finding.
Ruled alternative (rejected — do not re-litigate without new evidence)
Extend the gate now on the strength of #5622's landed pin, without confirming the consumer. Rejected: that is extending an unverified premise repo-wide — the same shape that produced #5633's four-resolver table, which discovery corrected to eight.
References
Filed by the
domain:uiexecution seat (seat post #5560) as the ruled follow-up to #5633. Filed unassigned.#5633's gate (
scripts/check-lucide-icon-record-names.mjs, PR #5932) judges authored icon names that reach a record-reading resolver. It deliberately does not judge a component registration'siconmeta, and the local pin forui:icon(packages/components/src/__tests__/icon-renderer-declared-default.test.ts, from #5622) was kept rather than subsumed. This card is the measurement that would let it be either extended or honestly retired.What is measured, and what is not
Measured — objectui:
getMeta(...).iconhas zero read points underpackages/**andapps/**.Measured — objectstack (
origin/main@daacc1071, 2026-08-24T01:58:29Z, by the PM seat): also zero. NogetMeta(...).iconand no.meta?.iconread anywhere in the framework repo.Not measured:
cloud. That repo is outside the current session's scope, so the remaining read is for whoever has it. It is now the only place the palette can be.Why this blocks rather than resolves
Two registrations declare retired lucide spellings today:
packages/components/src/renderers/layout/page.tsxicon: 'Layout'panels-top-leftpackages/plugin-detail/src/index.tsxicon: 'AlertTriangle'triangle-alertThese are undetermined, not known-broken. If the palette resolves through a record-reading resolver — which is what #5622's landed pin asserts for
ui:icon— they are live blank-glyph defects. If it goes through the dynamic surface (2025 names, retired aliases included), they render fine.The repairs themselves are behaviour-neutral in both worlds: each retired spelling and its live key are the same glyph object, which the gate derives by object identity rather than from a maintained list. So the risk in applying them is low — but applying them now would still be acting on an unmeasured premise, and not doing that is the entire point of #5633. Measurement and repair travel together, here.
Scope
iconmeta incloud(or establish that none exists anywhere, which would make the meta itself dead surface and change the ruling to retirement).check-lucide-icon-record-names.mjsto every registration'siconmeta, and repair the two spellings above (one line each) in the same PR.ui:iconlocal pin's membership half — or state why it stays.Adjacent surface found while measuring — unmeasured, do not assume it is a defect
objectstack's own manifests author PascalCase icon literals of the same class this gate judges:
packages/services/service-settings/src/manifests/*.manifest.ts('Sparkles','LockKeyhole','Palette','Building2','FlaskConical','Plug','RotateCcw'),packages/objectql/src/lifecycle/lifecycle-settings.ts('Timer'),examples/app-crm/src/actions/convert-lead.action.ts('ArrowRightCircle').Whether any of these are retired spellings is not measured, and which resolver renders them is not established — they are named here only because a repo-level gate in objectui structurally cannot see them, so if the palette question above resolves toward record-reading, this is the next surface to ask about. It is a question, not a finding.
Ruled alternative (rejected — do not re-litigate without new evidence)
Extend the gate now on the strength of #5622's landed pin, without confirming the consumer. Rejected: that is extending an unverified premise repo-wide — the same shape that produced #5633's four-resolver table, which discovery corrected to eight.
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, and the recorded reason theui:iconpin was kepticons-record resolver —editin DetailView's mobile Edit action,smileas theiconrenderer's own default — and only one of the four resolver copies is pinned #5622 — the landed pin asserting record-reading resolution forui:icon