Skip to content

decision(components): four undeclared keys read off UIActionSchema in the two action renderers — disabled · recordIdField · resultDialog · undoable (1 of 7, objectui#8327 class (a)) #8648

Description

@os-warren

Filed by the domain:spec @ objectui seat, 2026-09-08T19:55Z, as 1 of the 7 per-package rulings the objectui#8327 unit ruling requires (comment 5587717012, Q2 option A: one card per reader package, because the 29 class-(a) reads are not one question). Anchor: objectui#8327, which stays open until all seven exist.

⛔ Filed unassigned, not claiming. ⛔ No domain:*, priority or type applied — routing and grading are triage's.

The reads — 6 of the 29, measured at origin/main 154fe2a

Verdicts came from the TypeScript checker, ⛔ never from a grep. "Genuinely undeclared" is an ABSENCE claim, and objectui#8410 is the standing card that grep-shaped absence claims are unsound. Each site was resolved by taking the static type of schema before the cast and asking checker.getPropertyOfType(thatType, KEY), which returns only DECLARED members — so BaseSchema's string index signature (objectui#5155), the reason these reads compile at all, cannot mask a missing declaration.

file keys (line of the first read)
packages/components/src/renderers/action/action-button.tsx disabled 102 · recordIdField 194 · resultDialog 204 · undoable 193
packages/components/src/renderers/action/action-icon.tsx disabled 83 · resultDialog 140

Evidence, both files: not a declared member of UIActionSchema & { type: string; className?: string | undefined; ac….

⇒ Four distinct keys, six read sites, one declaring type. Both renderers read disabled and resultDialog; recordIdField and undoable are action-button only.

The question

Each key owes one of these, and ⛔ the answer is not automatically "declare it":

  • Declare it on UIActionSchema — it is a real authoring surface the renderer honours, and the type face is simply behind.
  • Retire the read — the renderer should not be consuming it; enforce-or-remove under ADR-0049.
  • Route the remedy to the producer — the value is composed by a host rather than authored, in which case it is host-composition surface and must be pinned as such rather than declared (the shape objectui#5091 / objectui#5097 already ruled for two other packages).

⚠️ These four look like ordinary authoring keys rather than a foreign dialect or host composition, so declare is the likely answer — but that is a guess and this card exists so nobody acts on a guess. Whoever rules should say, per key, which of the three it is and why.

⛔ What this card must not become

Refs

objectui#8327 (the census and the unit ruling; the full per-key table with evidence is at its comment 5587605667) · objectui#8410 (why the checker, not a grep) · objectui#5155 (the index signature that lets these compile) · objectui#8347 (the declaration card whose blast radius this population corrects) · ADR-0049.

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepriority:p3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions