Filed unassigned by the dev seat executing objectui#6459's re-census (session session_013hfmP9hoMd3dJwTh85J4yB), out of that card's direction-B measurement — the keys DataTableSchema declares that ObjectGrid never passes. Recording only; not proposing a change.
Measured at origin/main = a04d7c65c162a56d7e83c20e40aa8fad37ae64bd
Declared on both published faces:
- TS:
packages/types/src/data-display.ts:674 — toolbar?: SchemaNode[], documented "Table toolbar actions/content". - zod mirror:
packages/types/src/zod/data-display.zod.ts, inside DataTableSchema — toolbar: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]).optional().describe('Toolbar content').
So "toolbar": [ ... ] on a data-table is authorable, gets editor completion, and passes validation.
Read by nothing.packages/components/src/renderers/complex/data-table.tsx is the registered renderer for type: 'data-table'. It contains exactly two occurrences of the word toolbar — lines 981 and 1174 — and both are prose comments about unrelated chrome. The schema destructure at lines 727-737 does not list it, and there is no schema.toolbar read anywhere in the file. Repo-wide, no property read or destructure of toolbar resolves to a data-table schema (the plugin-view/src/ObjectView.tsx and app-shell/.../PreviewShell.tsx hits are unrelated React props of the same name).
Positive control, same query shape:emptyAction — the sibling SchemaNode slot on the same interface — hits data-table.tsx:2079-2080, where it is mounted through SchemaRenderer. The shape finds a SchemaNode slot when one is actually read, so the zero above is a reading.
Nothing is watching it.toolbar appears in none of packages/types/src/__tests__/zod-mirror-parity.test.ts's four ledgers (KnownDrift, NarrowerThanDeclared, UnmirroredDeclared, RuntimeOnlyDeclared) — a grep for the word in that file returns zero hits. It is mirrored, so the unmirrored ledger cannot see it; it is not callback-shaped, so the runtime-only ledger does not cover it.
Secondary observation, recorded but not the finding
The two faces spell the key differently: TS says SchemaNode[], the mirror says SchemaNode OR SchemaNode[]. The mirror admits a single node that the TS declaration refuses. Recording the divergence as measured; whether the parity guard ought to see it is a separate question from whether anything reads the key at all.
Why it is worth a card
This is the ADR-0049 enforce-or-remove shape on a published, authorable key: declared on the type, declared on the validator, documented in the interface, and inert at runtime. An author who writes a toolbar onto a data-table gets a green document and a blank result, with no signal anywhere that told them so — the exact failure mode the declared-vs-enforced family exists to close, and the one that is worst for AI-authored metadata, which has nothing but the declaration to go on.
Whether the right move is to wire it (mount the nodes above the table, beside the existing search/export chrome) or to retire it under ADR-0087 is a ruling, not an in-lane call: packages/types is a published surface with its own review floor.
Dedup
Scanned all 252 open issues via the repo-scoped REST list endpoint plus local regex over titles and bodies: zero hits for toolbar-with-DataTableSchema, for toolbar-with-unread/inert/dead/no-reader, and for the declaration spelling itself. Control term renderCellEditor hits objectui#6459, so the scan shape was live rather than silently empty.
Related
- objectui#6459 — the census this fell out of; its direction-B list is where this key surfaced. Not addressed there: that card is fenced to measurement.
- objectui#6152 — the
UnmirroredDeclared debt. Different family: this key IS mirrored, which is precisely why that ledger never saw it.
Generated by Claude Code
Filed unassigned by the dev seat executing objectui#6459's re-census (session
session_013hfmP9hoMd3dJwTh85J4yB), out of that card's direction-B measurement — the keysDataTableSchemadeclares thatObjectGridnever passes. Recording only; not proposing a change.Measured at
origin/main=a04d7c65c162a56d7e83c20e40aa8fad37ae64bdDeclared on both published faces:
packages/types/src/data-display.ts:674—toolbar?: SchemaNode[], documented "Table toolbar actions/content".packages/types/src/zod/data-display.zod.ts, insideDataTableSchema—toolbar: z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)]).optional().describe('Toolbar content').So
"toolbar": [ ... ]on adata-tableis authorable, gets editor completion, and passes validation.Read by nothing.
packages/components/src/renderers/complex/data-table.tsxis the registered renderer fortype: 'data-table'. It contains exactly two occurrences of the wordtoolbar— lines 981 and 1174 — and both are prose comments about unrelated chrome. The schema destructure at lines 727-737 does not list it, and there is noschema.toolbarread anywhere in the file. Repo-wide, no property read or destructure oftoolbarresolves to a data-table schema (theplugin-view/src/ObjectView.tsxandapp-shell/.../PreviewShell.tsxhits are unrelated React props of the same name).Positive control, same query shape:
emptyAction— the siblingSchemaNodeslot on the same interface — hitsdata-table.tsx:2079-2080, where it is mounted throughSchemaRenderer. The shape finds a SchemaNode slot when one is actually read, so the zero above is a reading.Nothing is watching it.
toolbarappears in none ofpackages/types/src/__tests__/zod-mirror-parity.test.ts's four ledgers (KnownDrift,NarrowerThanDeclared,UnmirroredDeclared,RuntimeOnlyDeclared) — a grep for the word in that file returns zero hits. It is mirrored, so the unmirrored ledger cannot see it; it is not callback-shaped, so the runtime-only ledger does not cover it.Secondary observation, recorded but not the finding
The two faces spell the key differently: TS says
SchemaNode[], the mirror saysSchemaNodeORSchemaNode[]. The mirror admits a single node that the TS declaration refuses. Recording the divergence as measured; whether the parity guard ought to see it is a separate question from whether anything reads the key at all.Why it is worth a card
This is the ADR-0049 enforce-or-remove shape on a published, authorable key: declared on the type, declared on the validator, documented in the interface, and inert at runtime. An author who writes a toolbar onto a
data-tablegets a green document and a blank result, with no signal anywhere that told them so — the exact failure mode the declared-vs-enforced family exists to close, and the one that is worst for AI-authored metadata, which has nothing but the declaration to go on.Whether the right move is to wire it (mount the nodes above the table, beside the existing search/export chrome) or to retire it under ADR-0087 is a ruling, not an in-lane call:
packages/typesis a published surface with its own review floor.Dedup
Scanned all 252 open issues via the repo-scoped REST list endpoint plus local regex over titles and bodies: zero hits for toolbar-with-DataTableSchema, for toolbar-with-unread/inert/dead/no-reader, and for the declaration spelling itself. Control term
renderCellEditorhits objectui#6459, so the scan shape was live rather than silently empty.Related
UnmirroredDeclareddebt. Different family: this key IS mirrored, which is precisely why that ledger never saw it.Generated by Claude Code