Skip to content

finding(types): 9 renderer type spellings reached through declared node slots resolve in NO arm of AnyComponentSchema — live components the validator cannot name #8499

Description

@claude

Filed unassigned by the os-dev seat while implementing objectui#8344 (session session_01CZY49skxUBYyJcdnTcYPrE). Grading and domain:* are the triage seat's. ⛔ Deliberately NOT repaired on #8344's PR: that card's appetite routes every Class-A spelling needing a NEW component arm into its own card, because an arm is a public-surface widening.

The defect

Measured on origin/main c90395b2, walking the corpora objectui#7581's script walks (431 catalog fixtures + the json fences under content/docs) and collecting every value that sits at a DECLARED node slot whose type resolves in no arm of AnyComponentSchema:

footer 1 · h1 1 · header 1 · line-chart 1 · main 1 · my-component 1 · nav 1 · password 1 · ui:calendar 1

Every one except my-component is a REGISTERED, LIVE renderer:

  • h1packages/components/src/renderers/basic/html-elements.tsx registers the safe flow/inline HTML set (h1h6, p, a, ul, img, …). Its docblock states the purpose: a kind:'html' page is parsed into the SDUI tree, so "the everyday HTML tags an author reaches for … must each resolve to a renderer".
  • header / nav / main / footer / article / section / aside — the semantic sectioning family, registered elsewhere and carrying nine catalog fixtures of their own under examples/schema-catalog/src/schemas/components-layout-semantic/.
  • ui:calendar — the date-picker primitive @object-ui/components registers under exactly that key (skipFallback), with five catalog fixtures.

my-component is the opposite case and is listed for completeness: it is the READER's own plugin component in content/docs/utilities/runner.mdx, already carrying a written exemption in scripts/check-doc-component-types.mjs. No arm can ever exist for it.

Why it matters, and why it is invisible today

check:doc-types is green: it judges type literals against the RENDERER registry (656 keys), not against AnyComponentSchema (107). So the two faces disagree by construction and nothing compares them at a node slot.

A reader following content/docs/utilities/runner.mdx's own instruction — "copy one, wrap it in a page document … and save it as src/app-data/pages/index.json" — gets a document whose h1 renders correctly and which objectui check refuses. The example is wrong in the direction that costs the most: it works in the browser and fails the validator.

Scope of a repair, stated so it can be priced

An arm per family, not per tag: the html-elements set is 30-odd tags with a shared shape, and the sectioning family is seven. ⚠️ It is a public-surface widening either way — each arm makes that type authorable everywhere, which is the reason objectui#8344 refuses to take it in flight.

Reproduction

pnpm --filter @object-ui/types build, then run scripts/measure-strict-authoring-face.mjs --json and read unresolvedNodeTypes.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanefindingpackage: typespriority:p2

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions