Skip to content

spec: record:alert / record:quick_actions / record:history have no ComponentPropsMap row — same silent no-op mechanism #8691 closed for the rail #8744

Description

@os-zhuang

Found while implementing #8691 (the record:reference_rail row). Filed as an out-of-scope finding, unassigned.

The gap

After #8691, ComponentPropsMap carries 38 keys, record:* = 7. Three more record:* types sit in exactly the rail's pre-#8691 position — a registered objectui renderer, a PageComponentType enum entry (packages/spec/src/ui/page.zod.ts:58), a console palette slot (block-types.ts), and no props row — so the #5068 gate's dispatch skips them as unregistered and every authored key rides through in silence:

  • record:alert — the richest surface of the three: the objectui registration declares severity / title / body / visible / icon / action / dismissible / dismissKey as inputs (plugin-detail/src/index.tsx, ComponentRegistry.register('alert', …)), and the renderer reads them. A typo'd severty ships as a silent no-op today.
  • record:history — registration declares limit / emptyText / unknownUserText.
  • record:quick_actions — in the enum and the palette; renderer read points not yet measured.

The mechanism is #8691's, verbatim: an undeclared or misspelled key on these components parses, typechecks, validates, builds, ships, and does nothing, while sibling components in the same file get loud component-props-unknown-key diagnostics.

Why this may be deliberate — the triage question

validate-component-props.ts's header frames example-corpus types without rows ("record:quick_actions, record:alert and record:line_items") as "SDUI blocks live in objectui's registry and in the ADR-0080 manifest" — but that is the same framing the rail had until #8691 rejected it. Nothing in the map records a deliberate exclusion for these three (contrast object-chart, whose absence the #7751 comment records by name). Triage should decide: declare the rows (measuring key sets from the renderers' read points at the .objectui-sha pin, per the #8691 method — the registration's declared inputs are a claim to verify, not the measurement), or record the exclusion where the map states its other exclusions.

Note record:chatter is a spec row already but the console palette deliberately excludes it as a duplicate of record:discussion — and record:discussion (palette tier A) has no row either; whoever takes this should measure that pair together.

Blocked-by: nothing — independent of #8691, which is scoped to the rail only.


Generated by Claude Code

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions