Repository navigation
feat(types): declare navigation on the object-kanban and object-calendar arms, by reference to the spec (objectui#8652) - #11292
Conversation
…endar arms, by reference to the spec (objectui#8652) The objectui half of the maintainer ruling on objectui#8652 (verbatim "B"): `@objectstack/spec` 17.5.0 declares `navigation: NavigationConfigSchema` on the `object-kanban` and `object-calendar` element entries, and this repo now mirrors it. - `@object-ui/types`: `ObjectKanbanSchema.navigation` and `ObjectCalendarSchema.navigation` are declared on both faces - the TS face as `ViewNavigationConfig`, the zod face as `stripImportedDefaults(SpecNavigationConfigSchema).optional()`, the spelling the gantt / map / gallery arms use. A bad `mode` is now refused at `navigation.mode` and a bogus member inside the block is refused. - `plugin-calendar`: the `(schema as any).navigation` cast objectui#8651 left for this card is gone. - Both registrations publish `navigation` in `inputs`, each with a member pin driving every member through a real click; the two entries the 17.5.0 bump booked to this card are struck from the parity ledger. Claude-Session: https://claude.ai/code/session_01VhxTqosz7wn54ahqyxgERT Co-authored-by: Claude <noreply@anthropic.com>
…ban entry it falsifies - `.changeset/8652-kanban-calendar-navigation.md`: `@object-ui/types`, `@object-ui/plugin-kanban` and `@object-ui/plugin-calendar`, `minor` (a widening of a published face, by reference to the spec). - `.changeset/7322-object-kanban-component-props.md`: an append-only dated note. Its 「`navigation` is declared on neither face」 was true when written and is falsified by this change; the frontmatter is byte-identical. - The types pin reads the spec entry through a narrow parse-result type rather than `any`. Claude-Session: https://claude.ai/code/session_01VhxTqosz7wn54ahqyxgERT 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: Read 2026-10-01T00:11Z by the isolated reviewer running inside the adopting seat's session. Inputs: card #8652 (body and all 9 comments — the triage ruling ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
…ject-kanban and object-calendar blocks (objectui#8652) AGENTS.md #2, adopted by the seat as patch round 2 of objectui#8652: the declaration this card made is documented where the two blocks are documented. - `packages/plugin-kanban/README.md` and `packages/plugin-calendar/README.md`: the typed example blocks carry `navigation`, and a paragraph states the type (the spec's `NavigationConfig` by reference, `ViewNavigationConfig`, the type `ObjectGridSchema.navigation` uses), its mode list, the absent-key drawer and the parent-view precedence the member pins prove. - `content/docs/plugins/plugin-kanban.mdx` (Properties row) and `plugin-calendar.mdx` (Schema API line and paragraph): the same, in the same words. - `content/docs/api/schema-reference.md`: a `navigation` row on the `ObjectKanbanSchema` table, and the sentence that called `cardTitle` and `navigation` undeclared on this face is corrected - `cardTitle` has been declared since objectui#9606 and `navigation` is declared by this card; `swimlaneField` and `grouping` are still undeclared. Each page carries one sentence on the `page` caveat - `page`, and a block written without `mode`, opens nothing on a board or calendar no parent view navigates for - pointing at objectui#11293. The renderer is not changed here. Claude-Session: https://claude.ai/code/session_01VhxTqosz7wn54ahqyxgERT 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
|
Contract reviewServed-tier: Read 2026-10-01T00:34Z by the isolated reviewer running inside the adopting seat's session, round 2 on this PR. Inputs: card #8652 (body and all 10 comments, the earlier PASS record ① Derived judgmentsThe code face is byte-for-byte the face the earlier record judged, and each of its items re-reads the same on this head. Restated as one-liners so this record stands alone, then the docs face in full.
② Semver level
③ Boundary flagsRound-2
Implemented-by: VERDICT: PASS |
Fixes #8652
Clause-②: yes
navigationis now declared on theobject-kanbanandobject-calendarblocks, by reference to the spec. This is the objectui half of the maintainer ruling on objectui#8652 (verbatim 「B」): declarenavigationon the platform element schema first, then mirror it here. The platform half shipped in@objectstack/spec17.5.0, the release this repo resolves:ComponentPropsMap['object-kanban']andComponentPropsMap['object-calendar']both declarenavigation: NavigationConfigSchema.optional().Dispatched by the
domain:spec @ objectuiseat, sessionhttps://claude.ai/code/session_01VhxTqosz7wn54ahqyxgERT.Premises, re-measured on
origin/maine420df31before the first editnavigationis declared onObjectKanbanPropsSchemaandObjectCalendarPropsSchema: a valid block parses, a bogus key beside it is refused withunrecognized_keys, andmode: 'not-a-mode'is refused atnavigation.mode.ObjectTimelinePropsSchemaALSO declares it, asNavigationConfigSchema.optional(), with the same three verdicts. The dispatch read zeronavigationlines in the timeline schema. The timeline is untouched here, as ordered: it belongs to objectui#8654, which remains open.getPropertyOfType, not a grep).ObjectKanbanSchema.navigationandObjectCalendarSchema.navigationwere not declared, and both interfaces carry a string index signature typedany. Lit control:ObjectGanttSchema.navigationandObjectGridSchema.navigationread DECLARED on the same instrument. A nonsense key reads not declared. The zod arms carried nonavigationmember either.ObjectKanbanreadsschema.navigationwith no cast, which compiled only through the index signature.ObjectCalendarread it through(schema as any).KanbanSchemano longer declares it: that arm retired with the barekanbankey (objectui#8802), soObjectKanbanSchemais the only kanban face.object-kanban.navigationandobject-calendar.navigationas OWED to this card. Publishing anobject-armed input also carries the objectui#8212 obligation, a member pin apiece. See "What changed".What changed
@object-ui/types:ObjectKanbanSchema.navigationandObjectCalendarSchema.navigationare declared on both faces:ViewNavigationConfigon the TS face, andstripImportedDefaults(SpecNavigationConfigSchema).optional()on the zod face. These are the spellings the gantt, map and gallery arms already use, taken by reference and not restated.mode: 'page'default out of a parsed document, so an absent key still reaches the renderer's own{ mode: 'drawer' }fallback.@object-ui/plugin-calendar: the(schema as any).navigationcast that objectui#8651 left for this card is gone.OBJECT_CALENDAR_INPUTS, shared by theobject-calendarandcalendartags, publishesnavigation.@object-ui/plugin-kanban:OBJECT_KANBAN_INPUTSpublishesnavigation. The read-site comment is rewritten, because it named a designer-face declaration that did not exist.registry-inputs-spec-parity.test.ts:unpublishedKeyscap goes from 5 to 3.MEMBER_PINSentries are added, one per block.calendarUnionReads-8651.test.tsx: its one ledger entry wasnavigation, the key it deferred to this card. That entry is struck. The row that pinned the key UNDECLARED is inverted, not deleted: it now asserts the key is read AND declared.Pins
object-kanban-calendar-navigation-8652.test.tscovers both arms against the installed spec, which it reads in the same run:modeis refused atnavigation.mode, and a bogus member inside the block is refused;viewmember is refused;safeValidateSchemaagrees with the rows above;Equalassertion plus@ts-expect-errorrows. The zod-mirror-parity ratchet cannot see a TS member that goes missing (objectui#9711), so these rows defend it.kanbanNavigationMembers-8652.test.tsxandcalendarNavigationMembers-8652.test.tsxare the member pins. Each drives every member through a real click on the real renderer:noneandpreventNavigationopen nothing;new_windowandopenNewTabopen the record page in a new tab;sizeandwidth, the deprecatedwidthwins, a bucket resolves through the size table, andautogives the default width;Verification, all on
0c50a196c(the head of this PR)pnpm exec vitest run packages/types/plus the four pin files andregistry-inputs-spec-parity.test.ts:Test Files 303 passed (303),Tests 7760 passed (7760).pnpm --filter '@object-ui/plugin-kanban^...' --filter '@object-ui/plugin-calendar^...' run build). The rebuiltdist/objectql.d.tscarries onenavigationmember inside each of the two interface blocks.type-checkfor@object-ui/types,@object-ui/plugin-kanbanand@object-ui/plugin-calendarthen ran, with each script name echoed: allDone.--listFilesOnlyconfirms that eachtsconfig.test.jsonincludes the new pin files.pnpm exec vitest run packages/plugin-kanban/ packages/plugin-calendar/:Test Files 123 passed (123),Tests 838 passed | 95 skipped. None of the skips is in a file this change adds or edits.@object-ui/consoletype-checkis green. The neighbouring suites that read these two blocks passed: 49 files, 734 tests. They cover consolepublic-contractandpublic-block-binding-reach, the app-shell block-config previews andPageBlockInspector.retiredBlockProps,sdui-parser, thecoreregistry, and the prompt-keys and handler-key-read-sites script tests.check:designer-field-key-parity,check:component-surface-parity,check:prompt-keys,check:doc-types,check:installed-pin-claims;check:new-line-citations,check:control-bytes,check:changeset-claims(report-only; re-read below),check:pending-changeset-literals,check:handler-key-reads;check:spec-symbols,check:test-path-roots, the threecheck:vi-mock-*,check:element-data-source-declaration,check:registry-bare-names;check:doc-snippets,check:doc-examples,check:readme-exports,check:sdui-registration-pinsandcheck:eager-closure, each run once its build prerequisite was met;check:comment-mask-corpus,check:unreferenced-sources,type-check:coverage,lint:coverage, and changeset presence, no-major, fixed and overwrite.eslint --no-inline-config --format jsonover the 11 changed TS files reports 11 files and 0 errors. The root config enables no type-aware linting (noparserOptions/projectService), and no rule undereslint-rules/reads another file. So this diff cannot move a verdict on an untouched file. The repo-widepnpm lintis left to CI.Ablations, each committed first and restored to
HEADthroughablation-replace.mjsEach ablation was proven landed by anchor count and blob change. Each restore was proven by blob equals
HEADand an emptygit diff HEAD, and the tree was clean afterwards.ObjectKanbanSchema:tsc -p tsconfig.test.jsonexits 2, with TS2344 on theEqualassertion and TS2578 (unused@ts-expect-error) on the bad-mode row. The first attempt was a no-op: the tool refused it because the replacement was a prefix of the anchor. It was re-anchored and re-run.mode, bogus member, retiredviewandsafeValidateSchemarows.size: 'auto'and the parent-handler row stay green, as predicted.Acceptance notes
pageopens nothing on a standalone board or calendar. A block withoutmoderesolves topage, the spec's default. Neither renderer handsuseNavigationOverlayanonNavigate, sopagehas no channel unless a parent view suppliesonRowClick. This is measured by mounting the real components, and it is reported as a finding. It is NOT changed here. The published input descriptions state it, and two rows per member pin hold the description to it. A renderer that learns to navigate onpagereddens those rows, which is the signal to rewrite the description.openNewTab: trueoutranks an overlaymodeas well aspage:{ mode: 'drawer', openNewTab: true }opens a tab and no drawer. The spec describes the flag as "applies to page mode". This is shared hook behaviour, the grid's included. It is observed here and not pinned. Carrier: none.ObjectTree.tsxhas a comment sayingnavigationis declared on oneComponentPropsMapentry only (object-grid), and thatobject-treehas no entry. That is stale since 17.5.0, which givesobject-treean entry declaringnavigation: z.unknown().optional(). The tree is outside this claim. Carrier: none.AGENTS.md Add automated testing infrastructure and CI/CD workflows #2 (docs-driven): the docs and READMEs do not documentSuperseded by round 2 (navigation.161a5c5b4). The seat adopted the at-tier record's ③-3 escalation, and the docs now carry the key (see the round-2 section below). The registry descriptions carry the authoring guidance..changeset/7322-object-kanban-component-props.mdgets an append-only dated note, because its 「navigationis declared on neither face」 goes false here. Its frontmatter is byte-identical.check-changeset-overwritereports the modification, which is its legitimate-correction case.check:changeset-claimsnamed 41 pending changesets that reference touched files. Of those, only 5903 and 7917 mentionnavigation, and neither makes a claim this change falsifies.ObjectFormSchemaregion of the same two@object-ui/typesfiles. The regions are disjoint, so whichever PR lands second mergesmain.Generated by Claude Code
Patch round 2 (written by the seat)
161a5c5b4, AGENTS.md Add automated testing infrastructure and CI/CD workflows #2):navigationis documented on both blocks inpackages/plugin-kanban/README.md,packages/plugin-calendar/README.md,content/docs/plugins/plugin-kanban.mdx,content/docs/plugins/plugin-calendar.mdxand theObjectKanbanSchematable ofcontent/docs/api/schema-reference.md. Each states the spec'sNavigationConfigby reference (ViewNavigationConfig), the mode list, the absent-key drawer and the parent-view precedence, plus one sentence on thepagecaveat pointing at objectui#11293. The schema-reference sentence that calledcardTitleandnavigationundeclared on this face is corrected (cardTitlesince objectui#9606). The doc gates exit 0 on161a5c5b4: doc-version-claims, doc-types, doc-fences, doc-example-ids, doc-example-readers, readme-exports, doc-snippets, doc-examples, new-line-citations and control-bytes.