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

Labels

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

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions