Filed by the dev seat executing objectui#7664 (ruling (a): the plugin dialect is the authoritative 'kanban' arm). Measured on the branch claude/issue-7664-kanban-plugin-dialect-authoritative at bd1fc7111, whose read census is the same on origin/main because the PR moves the declaration without touching a read site. Out of scope there: the ruling's execution list says "import the declared type instead of its local one; behaviour unchanged", so the shape was carried member for member and each row below is its own ADR-0049 decision.
The facts
Read census over packages/plugin-kanban/src (non-test files), per member of the now-declared KanbanSchema (packages/types/src/complex.ts):
| member |
declared |
read sites in the plugin (non-test) |
allowCollapse |
yes |
0 — KanbanEnhanced collapses lanes off column.collapsed, never off the board flag |
cardTemplates |
yes |
0 — CardTemplates.tsx takes templates as a component prop; nothing reads schema.cardTemplates |
columnWidths |
yes |
0 — useColumnWidths takes a ColumnWidthConfig option; nothing reads schema.columnWidths |
titleField |
no (rides BaseSchema's index signature) |
ObjectKanban.tsx — `schema.cardTitle |
The other 15 declared members each have at least one read site (objectName 25, groupBy 14, columns 6, data 4, cardTitle 3, swimlaneField, grouping, cardFields, limit, className, quickAdd, onQuickAdd, coverImageField, conditionalFormatting via KanbanRenderer, onCardMove via KanbanRenderer). filter is the other read-but-undeclared key and is already carded: objectui#7712.
Probe used, so the zeros are readings: grep -o of schema.MEMBER and bare MEMBER over ObjectKanban.tsx + index.tsx, and grep -l of the bare word over every non-test file under src/ excluding types.ts; a same-shaped control on coverImageField returns 2 files / 7 hits.
Why it is a card
The whole point of the objectui#7664 ruling is that "declared = rendered" for the 'kanban' key. Three declared members that no registered board reads are the declared-but-unenforced class ADR-0049 targets: an author who writes allowCollapse: true validates green and gets a board that never collapses. And one read that the declaration does not name means cardTitle and titleField are two spellings for one thing, only one of which the validator can see.
Docs half (same class, adjacent)
The root README.md "Kanban Board" example authors columns: [{ value, label, color }] plus titleField — a column shape no renderer reads (KanbanColumn is { id, title, cards, … }; value / label have zero read sites, and a column color is now a named refusal after objectui#7664). It is not validated by any gate (json fence, root README), so it stayed green while teaching a shape that renders empty lanes.
Not decided here
Each row is enforce-or-remove: retire the three (tombstone + refusal, changeset), or wire them (a read site each); and for titleField, either declare it as the alias it is or retire the fallback and let cardTitle be the one spelling. Two of the four move a published surface, so this is a triage-and-rule card, not a dispatchable fix.
Refs: objectui#7664 (ruling (a)) · objectui#7712 (filter, the other undeclared read) · objectui#7322 (the sibling object-kanban arm) · ADR-0049.
Filed from Claude Code session https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3.
Generated by Claude Code
Filed by the dev seat executing objectui#7664 (ruling (a): the plugin dialect is the authoritative
'kanban'arm). Measured on the branchclaude/issue-7664-kanban-plugin-dialect-authoritativeatbd1fc7111, whose read census is the same onorigin/mainbecause the PR moves the declaration without touching a read site. Out of scope there: the ruling's execution list says "import the declared type instead of its local one; behaviour unchanged", so the shape was carried member for member and each row below is its own ADR-0049 decision.The facts
Read census over
packages/plugin-kanban/src(non-test files), per member of the now-declaredKanbanSchema(packages/types/src/complex.ts):allowCollapseKanbanEnhancedcollapses lanes offcolumn.collapsed, never off the board flagcardTemplatesCardTemplates.tsxtakestemplatesas a component prop; nothing readsschema.cardTemplatescolumnWidthsuseColumnWidthstakes aColumnWidthConfigoption; nothing readsschema.columnWidthstitleFieldBaseSchema's index signature)ObjectKanban.tsx— `schema.cardTitleThe other 15 declared members each have at least one read site (
objectName25,groupBy14,columns6,data4,cardTitle3,swimlaneField,grouping,cardFields,limit,className,quickAdd,onQuickAdd,coverImageField,conditionalFormattingviaKanbanRenderer,onCardMoveviaKanbanRenderer).filteris the other read-but-undeclared key and is already carded: objectui#7712.Probe used, so the zeros are readings:
grep -oofschema.MEMBERand bareMEMBERoverObjectKanban.tsx+index.tsx, andgrep -lof the bare word over every non-test file undersrc/excludingtypes.ts; a same-shaped control oncoverImageFieldreturns 2 files / 7 hits.Why it is a card
The whole point of the objectui#7664 ruling is that "declared = rendered" for the
'kanban'key. Three declared members that no registered board reads are the declared-but-unenforced class ADR-0049 targets: an author who writesallowCollapse: truevalidates green and gets a board that never collapses. And one read that the declaration does not name meanscardTitleandtitleFieldare two spellings for one thing, only one of which the validator can see.Docs half (same class, adjacent)
The root
README.md"Kanban Board" example authorscolumns: [{ value, label, color }]plustitleField— a column shape no renderer reads (KanbanColumnis{ id, title, cards, … };value/labelhave zero read sites, and a columncoloris now a named refusal after objectui#7664). It is not validated by any gate (jsonfence, root README), so it stayed green while teaching a shape that renders empty lanes.Not decided here
Each row is enforce-or-remove: retire the three (tombstone + refusal, changeset), or wire them (a read site each); and for
titleField, either declare it as the alias it is or retire the fallback and letcardTitlebe the one spelling. Two of the four move a published surface, so this is a triage-and-rule card, not a dispatchable fix.Refs: objectui#7664 (ruling (a)) · objectui#7712 (
filter, the other undeclared read) · objectui#7322 (the siblingobject-kanbanarm) · ADR-0049.Filed from Claude Code session
https://claude.ai/code/session_01KbJQ1y1J12nZxYzFWhP8Q3.Generated by Claude Code