Skip to content

decision(plugin-detail): twelve undeclared reads across four record renderers — and eleven of them are only invisible because schema = {} as any erases a correct annotation (2 of 7, objectui#8327 class (a)) #8649

Description

@os-warren

Blocked-by: objectstack-ai/objectstack#18159

Added 2026-09-14T10:01Z by the domain:spec @ objectui execution seat, on the merge of PR objectui#9469
(541ce4e02f, merged 10:00:20Z). That PR discharged three of this card's twelve reads and carries
Part of, not a closing keyword, so this card stays open behind the nine routed ones. The platform half
they are routed to is objectstack#18159 (open, created 08:02:57Z, filed bare for that repo's triage).

Filed by the domain:spec @ objectui seat, 2026-09-08T19:55Z, as 2 of the 7 per-package rulings the objectui#8327 unit ruling requires (comment 5587717012, Q2 option A). Anchor: objectui#8327.

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

⭐ This is the largest of the seven — 12 of the 29 class-(a) reads — and it is the one with a mechanical cause underneath it.

The reads — measured at origin/main 154fe2a by the TypeScript checker, ⛔ never a grep

file keys (line of the first read) why the checker cannot see a declaration
plugin-detail/src/renderers/record-details.tsx enforceFieldSecurity 147 · hideFields 236 · redactFields 148 · requiredPermissions 131 undeclared on the props annotation RecordDetailsComponentProps & Record[string, any]; the schema = {} as any default erases that annotation at the read site, so the checker sees any there
plugin-detail/src/renderers/record-highlights.tsx enforceFieldSecurity 74 · redactFields 75 · requiredPermissions 43 undeclared on RecordHighlightsComponentProps & Record[string, any]; same erasure
plugin-detail/src/renderers/record-related-list.tsx enforceFieldSecurity 179 · redactFields 180 · relationshipValueField 122 · requiredPermissions 163 undeclared on Omit[RecordRelatedListComponentProps, "objectName"] & … & Record[string, any]; same erasure
plugin-detail/src/renderers/record-reference-rail.tsx properties 109 different cause — not a declared member of { [k: string]: any; entries?: … }; compiles only through the string index signature

⚠️ Note the generics are written with SQUARE brackets. GitHub's body sanitizer eats tag-shaped fragments, backticks and fences included, and a table of type evidence whose generics are eaten reads as though nothing were measured.

⭐ The mechanical finding underneath, and why it is this card's first question

record-details.tsx, record-highlights.tsx and record-related-list.tsx annotate schema properly and then destructure it as schema = {} as any. The default erases the annotation at every use site in the file. Measured, not inferred: of the 112 cast reads in the census, 12 verdicts needed a second pass against the props annotation to recover at all, and one of those (add, record-related-list.tsx:221) turned out to be declared — packages/types/src/record-components.ts:147 — and looked undeclared only because of the erasure.

⇒ Repairing the destructure default is a prerequisite to answering anything else here, and it is not itself a contract question: it is a local type defect with no published-surface consequence. Whoever rules should consider ordering that first, because until it is fixed the type checker cannot tell an author's key from a host's at any of the eleven sites.

The questions

  1. The destructure default (mechanical, likely not a ruling at all): fix schema = {} as any so the annotation survives, then re-run the classification on these three files. ⛔ Do not assume the remaining verdicts hold — one already changed.
  2. Per key, after that: declare on the props type · retire the read · or route the remedy to the producer as host-composition surface (pinned, ⛔ not declared — the shape objectui#5091 / objectui#5097 already ruled elsewhere). ⚠️ enforceFieldSecurity, redactFields and requiredPermissions appear on three renderers each and look like one cross-cutting security surface rather than three independent keys; a ruling that splits them would be odd.
  3. record-reference-rail.tsx's properties is a separate question with a separate cause — it is not erased by a default, it is genuinely absent from a type that carries a string index signature.

⛔ What this card must not become

⛔ Not rows in undeclared-but-consumed-keys-6150.test.ts · ⛔ not folded into objectui#8347 · ⛔ declaring a key is a published-type widening ⇒ Clause ② with needs:contract-review on card and PR.

Refs

objectui#8327 (census, unit ruling, full per-key table at comment 5587605667) · objectui#8410 (why the checker, not a grep) · objectui#5155 · objectui#8347 · ADR-0049.


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

No one assigned

    Labels

    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanepm:blockedpriority:p2

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions