Skip to content

Locate the consumer of a registration's icon meta before extending the icon gate to it — zero read points in objectui AND objectstack, so two suspect spellings stay undetermined #5936

Description

@os-zhuang

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

  1. 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).
  2. Determine which resolution path it uses — record-reading, or the dynamic surface.
  3. 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.
  4. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpm:queue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions