Blocked-by: objectstack-ai/objectstack#12931
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. Requested as objectstack#12931 (the Blocked-by: above), which carries the ready-to-run commands.
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
Blocked-by: objectstack-ai/objectstack#12931
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. Requested as objectstack#12931 (theBlocked-by:above), which carries the ready-to-run commands.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