Repository navigation
feat(types): object-kanban declares grouping as the spec's GroupingConfig, by reference (objectui#11216) - #11568
Conversation
…nfig, by reference (objectui#11216) The spec's object-kanban row types `grouping` as the list view's own GroupingConfigSchema, and ObjectKanban reads grouping.fields[0].field as the swimlaneField fallback. The arm did not declare the key, so the strict authoring face refused a well-formed config by name while the tolerant face kept any value unjudged. - zod mirror: grouping: stripImportedDefaults(GroupingConfigSchema).optional(), spelled as ObjectGridSchema.grouping spells it. - TS twin: grouping?: GroupingConfig. - New pin object-kanban-grouping-typed-11216: accept on every face, the spec row's refusals at the key, and verdict parity with the spec row. - The grouping census in grouping-field-padded-refused-7347 gains the arm. - The descriptions that called the spec row z.unknown() (two 8313 test headers, the console MEMBER_PINS entry) describe the typed row. - Docs: grouping rows in plugin-kanban.mdx and schema-reference.md. Claude-Session: https://claude.ai/code/session_01FjqrwXPfSMkSfkKYDSRkN2 Co-authored-by: Claude <noreply@anthropic.com>
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Isolated at-tier review by a subagent of ① Derived judgmentsEach accept-set and public-surface change the diff implies, judged:
Check-runs on the head, read twice. At the first read the eight test shards, ② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
…jectui#11216 The pending 11355 changeset says `grouping` is "still undeclared"; it publishes in the same release as this branch's change, which declares it on both faces. Append a dated note in the 7664 form; the existing text and frontmatter are unchanged (the HEAD blob is a byte prefix of the new file). Claude-Session: https://claude.ai/code/session_01FjqrwXPfSMkSfkKYDSRkN2 Co-authored-by: Claude <noreply@anthropic.com>
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
|
Generated by Claude Code |
Fixes #11216
Clause-②: yes
What this changes
object-kanbannow declaresgroupingon both faces of@object-ui/types, as@objectstack/spec'sGroupingConfigSchema, by reference. The spec'sobject-kanbanrow has typed the key that way since 17.6.0, whichmaininstalls.ObjectKanbanreadsgrouping.fields[0].fieldas the fallback forswimlaneField.Before this change the arm did not declare the key, so the faces and the spec gave three answers for one document:
groupingvalue{ fields: [{ field: 'owner' }] }{ fields: [{ field: ' x ' }] }grouping.fields.0.field(custom)'owner'grouping(invalid_type){ fields: [] }grouping.fields(too_small)packages/types/src/zod/objectql.zod.ts):grouping: stripImportedDefaults(SpecGroupingConfigSchema).optional(), which is howObjectGridSchema.groupingspells it. The strict face is derived from the same declaration, so one member covers both runtime faces. The spec'sorderandcollapseddefaults are not added to a parsed document. The comment that left the key to this card is gone.packages/types/src/objectql.ts):grouping?: GroupingConfig. A type-level row pins it equal toSpecObjectKanbanProps['grouping']and toGroupingConfig | undefined.ObjectKanban.tsxstill readsswimlaneField || grouping.fields[0].field.Descriptions that called the spec row
z.unknown()Each one now describes the typed row: it fixes the block's SHAPE, but not which position this board reads.
packages/plugin-kanban/src/__tests__/structuredKeysAreDeclaredAndHonoured-8313.test.ts(header).packages/plugin-kanban/src/__tests__/ObjectKanban.structuredMembersReachTheirSinks-8313.test.tsx(header).apps/console/src/__tests__/registry-inputs-spec-parity.test.ts, theMEMBER_PINSentryobject-kanban.grouping(itspinstext only; no booked difference moved).mainatab18797. The card names "the kanban registration description (packages/plugin-kanban/src/index.tsx)". That file has nounknown()wording: a search forunknownfinds only two unrelated code lines, whileswimlaneField(the control) is found. Thegroupinginput description there says onlyfields[0].fieldis read, which is still true, so it is unchanged. The wording the card meant is in the three places above. The console entry is the registration's member-pin description, and the claim listed it as conditional surface.Also in this change
packages/types/src/__tests__/grouping-field-padded-refused-7347.test.ts: its census of arms that declaregroupinggoes red when a new arm declares it, soobject-kanbangets aDECLARINGrow. The padded-name refusal is now pinned on all four of the arm's faces.groupingrow incontent/docs/plugins/plugin-kanban.mdxand incontent/docs/api/schema-reference.md. The schema reference paragraph that said "groupingis still undeclared" is corrected..changeset/11216-kanban-grouping-typed.md:@object-ui/typesminor.Tests, measured at
cf8c860packages/types/src/__tests__/object-kanban-grouping-typed-11216.test.tsran on the base tree:Tests 28 failed | 12 passed (40). The strict face refused the well-formed config withunrecognized_keysat the node, and the tolerant faces kept every shape the spec refuses. (That run used an earlier version of the pin's issue helper. The ablation below is the measurement on the committed pin.)Test Files 1 passed (1)andTests 40 passed (40).pnpm exec vitest run packages/types/:Test Files 348 passed (348),Tests 9366 passed (9366).pnpm exec vitest run packages/plugin-kanban/:Test Files 65 passed (65),Tests 442 passed (442).pnpm exec vitest run apps/console/src/__tests__/registry-inputs-spec-parity.test.ts:Tests 255 passed (255).object-kanbandocuments or grouping through the validators, run without editing any of them:Test Files 11 passed (11),Tests 176 passed (176).pnpm --filter @object-ui/types type-checkandpnpm --filter @object-ui/plugin-kanban type-check: exit 0. Both script names were echoed.tsc -p tsconfig.test.json --listFileslists both editedpackages/typespins.pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-kanban^...' build: exit 0.Ablations, at
cf8c860, throughablation-replace.mjs(anchor must hit; restore proven by blob hash)The subject resolves through relative imports to
src/, so nodist/leg applies.4abab7e182f1to78fdd976f360. The new pin plus the 7347 census then gaveTests 47 failed | 116 passed (163). Red rows: every strict-face accept row, every refusal row on all three faces, every verdict-parity row, the 7347 census, and itsobject-kanbanrows. Restored: the blob equals HEAD (4abab7e182f1) andgit diff HEADis empty.tsc -p tsconfig.test.jsonexited 2 withTS2344on both type rows of the new pin. It also gave two errors inzod-mirror-parity.test.ts, whose declared-but-unmirrored ratchet namesobjectql.zod.ts#ObjectKanbanSchema/grouping. Restored: the blob equals HEAD (9d326515ade6) andgit diff HEADis empty. The first attempt at this leg was refused by the tool and nothing landed: its replacement text was a prefix of the anchor, so the count could not rise. It was re-run with a marker replacement.Gates (local, at
cf8c860)check:control-bytesOK ·check:new-line-citations"0 new citation(s)" ·check:changeset-claimsexit 0 ·check:pending-changeset-literals"No test source names a pending changeset." ·check-changeset-presenceOK (1 changeset) ·check-changeset-no-majorOK ·check-changeset-overwriteOK ·check:installed-pin-claimsOK ·check:spec-symbolsexit 0 ·check:doc-types/check:prompt-keys/check:doc-fences/check:doc-example-ids/check-doc-linksOK ·check:component-surface-parity/check:designer-field-key-parity/check:handler-key-reads/check:element-data-source-declarationexit 0 ·check:test-path-roots/check:shell-escape-residue/check:vi-mock-specifiersOK. ESLint on the seven edited TS files (--no-inline-config --format json): 7 files, 0 errors, 50no-explicit-anywarnings. All of those warnings are on lines this diff does not touch, and the new pin has none. The repo-widepnpm lint,pnpm check(objectui check) and the fullpnpm testare left to CI.Acceptance notes
.changeset/11355-small-p1-sites.mdsays "grouping, the read's fallback, is still undeclared". It is a dated record of that change, andcheck-changeset-overwriterefuses edits to existing changesets, so it is left as is. Both entries will publish in the same release, this one after it.ObjectKanban.filterMembersReachTheWire-8176.test.tsx(header) still callsfilter's spec rowz.unknown().optional(). On the installed release, that row is an array of closed{ field, operator, value }objects, andsortis not on theobject-kanbanrow. The consoleMEMBER_PINSentryobject-kanban.filterrepeats the same claim. Out of this card's scope and not changed here. No one is set to pick it up.Generated by Claude Code