Found while implementing #5350 (retiring that renderer's undeclared column aliases). Observation class — filed unassigned and deliberately NOT fixed there, because which way it resolves is an ADR-0049 enforce-or-remove contract decision, not a re-spelling. #5350 stayed inside the spelling question the family ruling settled.
Measured
Every key packages/components/src/renderers/complex/table.tsx reads, derived from the file rather than recalled:
grep -oE '(schema|col)\.[a-zA-Z]+' packages/components/src/renderers/complex/table.tsx | sort -u
col.accessorKey col.cellClassName col.className col.header col.width
schema.caption schema.columns schema.data schema.footer
Nine. Against that, packages/types/src/data-display.ts declares:
| declaring type | declared and read | declared and inert |
|---|
TableSchema | caption, columns, data, footer | hoverable, striped |
TableColumn | header, accessorKey, className, cellClassName, width | minWidth, align, fixed, type, sortable, filterable, resizable, editable, cell |
Eleven declared keys are never read. hoverable and striped even carry @default annotations (true / false) describing behaviour that does not exist on this renderer.
The published page documents two of them as working
content/docs/api/schema-reference.md §TableSchema:
| Property | Type | Description |
|---|
hoverable | boolean | Highlight rows on hover. |
striped | boolean | Alternate row background colors. |
and its copyable example sets "hoverable": true, "striped": true. Both are inert. The section header one line above likewise reads "A data table with columns, optional striping, and hover effects."
This is the same declared-but-unenforced shape as #5373 (type: 'crud': four declaration faces, no renderer), one level down: the type renders, but a majority of what it declares does not. #5350 corrected the same section's spelling contract and deliberately left hoverable/striped in the example, because deleting them would have pre-empted this decision.
Not merely cosmetic for AI authoring
align and sortable are the two most likely for a generator to emit — a right-aligned amount column is the obvious thing to author, and the pre-#5350 reference example did exactly that ({ "name": "amount", "label": "Amount", "align": "right" }). It is accepted, type-checks, and does nothing, with no diagnostic. Same silent class as #5349.
The routes, not pre-decided
- Implement the inert keys on this renderer (
hoverable/striped/align are a few lines each; sortable/filterable/resizable/editable/cell are substantially more, and arguably why data-table exists). - Retire them from
TableSchema/TableColumn under ADR-0049 and point authors at data-table for the interactive set — the narrow reading being that table is deliberately the dumb static renderer and its type over-declares. - Split the type: keep
TableColumn as the rich shared shape data-table honours and give the static renderer a narrow declared subset, so declared = enforced holds per renderer.
Route 2 or 3 look consistent with the startup-focus / implementation-first standing instruction, but the pick is a maintainer call. Note TableColumn is shared: DataTableSchema and others consume it, so a retirement must be checked against those consumers first — this is not a single-renderer edit.
Reproduce
grep -oE '(schema|col)\.[a-zA-Z]+' packages/components/src/renderers/complex/table.tsx | sort -u
sed -n '227,278p' packages/types/src/data-display.ts # TableColumn
sed -n '285,313p' packages/types/src/data-display.ts # TableSchema
sed -n '394,422p' content/docs/api/schema-reference.md # the page, post-#5350
Related: #5350 (the spelling half, which left this alone), #5373 (same enforce-or-remove class), #5349 (the silence).
Generated by Claude Code
Found while implementing #5350 (retiring that renderer's undeclared column aliases). Observation class — filed unassigned and deliberately NOT fixed there, because which way it resolves is an ADR-0049 enforce-or-remove contract decision, not a re-spelling. #5350 stayed inside the spelling question the family ruling settled.
Measured
Every key
packages/components/src/renderers/complex/table.tsxreads, derived from the file rather than recalled:Nine. Against that,
packages/types/src/data-display.tsdeclares:TableSchemacaption,columns,data,footerhoverable,stripedTableColumnheader,accessorKey,className,cellClassName,widthminWidth,align,fixed,type,sortable,filterable,resizable,editable,cellEleven declared keys are never read.
hoverableandstripedeven carry@defaultannotations (true/false) describing behaviour that does not exist on this renderer.The published page documents two of them as working
content/docs/api/schema-reference.md§TableSchema:hoverablebooleanstripedbooleanand its copyable example sets
"hoverable": true, "striped": true. Both are inert. The section header one line above likewise reads "A data table with columns, optional striping, and hover effects."This is the same declared-but-unenforced shape as #5373 (
type: 'crud': four declaration faces, no renderer), one level down: the type renders, but a majority of what it declares does not. #5350 corrected the same section's spelling contract and deliberately lefthoverable/stripedin the example, because deleting them would have pre-empted this decision.Not merely cosmetic for AI authoring
alignandsortableare the two most likely for a generator to emit — a right-aligned amount column is the obvious thing to author, and the pre-#5350 reference example did exactly that ({ "name": "amount", "label": "Amount", "align": "right" }). It is accepted, type-checks, and does nothing, with no diagnostic. Same silent class as #5349.The routes, not pre-decided
hoverable/striped/alignare a few lines each;sortable/filterable/resizable/editable/cellare substantially more, and arguably whydata-tableexists).TableSchema/TableColumnunder ADR-0049 and point authors atdata-tablefor the interactive set — the narrow reading being thattableis deliberately the dumb static renderer and its type over-declares.TableColumnas the rich shared shapedata-tablehonours and give the static renderer a narrow declared subset, sodeclared = enforcedholds per renderer.Route 2 or 3 look consistent with the startup-focus / implementation-first standing instruction, but the pick is a maintainer call. Note
TableColumnis shared:DataTableSchemaand others consume it, so a retirement must be checked against those consumers first — this is not a single-renderer edit.Reproduce
Related: #5350 (the spelling half, which left this alone), #5373 (same enforce-or-remove class), #5349 (the silence).
Generated by Claude Code