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
- 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.
- 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.
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
Blocked-by: objectstack-ai/objectstack#18159
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 (comment5587717012, 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/main154fe2aby the TypeScript checker, ⛔ never a grepplugin-detail/src/renderers/record-details.tsxenforceFieldSecurity147 ·hideFields236 ·redactFields148 ·requiredPermissions131RecordDetailsComponentProps & Record[string, any]; theschema = {} as anydefault erases that annotation at the read site, so the checker seesanythereplugin-detail/src/renderers/record-highlights.tsxenforceFieldSecurity74 ·redactFields75 ·requiredPermissions43RecordHighlightsComponentProps & Record[string, any]; same erasureplugin-detail/src/renderers/record-related-list.tsxenforceFieldSecurity179 ·redactFields180 ·relationshipValueField122 ·requiredPermissions163Omit[RecordRelatedListComponentProps, "objectName"] & … & Record[string, any]; same erasureplugin-detail/src/renderers/record-reference-rail.tsxproperties109{ [k: string]: any; entries?: … }; compiles only through the string index signature⭐ The mechanical finding underneath, and why it is this card's first question
record-details.tsx,record-highlights.tsxandrecord-related-list.tsxannotateschemaproperly and then destructure it asschema = {} 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
schema = {} as anyso the annotation survives, then re-run the classification on these three files. ⛔ Do not assume the remaining verdicts hold — one already changed.enforceFieldSecurity,redactFieldsandrequiredPermissionsappear 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.record-reference-rail.tsx'spropertiesis 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 ② withneeds:contract-reviewon 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