Repository navigation
decision(plugin-kanban): navigation is read off the kanban node and declared on neither arm — while the grid schema declares it (5 of 7, objectui#8327 class (a)) #8652
Description
Filed by the domain:spec @ objectui seat, 2026-09-08T19:56Z, as 5 of the 7 per-package rulings the objectui#8327 unit ruling requires (comment 5587717012, Q2 option A). Anchor: objectui#8327.
⛔ Filed unassigned, not claiming. ⛔ No domain:*, priority or type applied — routing and grading are triage's.
The read — measured at origin/main 154fe2a by the TypeScript checker, ⛔ never a grep
| file | key (line of the first read) | evidence |
|---|---|---|
plugin-kanban/src/ObjectKanban.tsx |
navigation 822 |
not a declared member of ObjectKanbanSchema | KanbanSchema; compiles only through the string index signature |
⭐ Do not rule this one alone — the same key appears three times with two different verdicts
navigation is not a one-package question, and the census shows why:
| package | site | verdict |
|---|---|---|
| plugin-kanban (this card) | ObjectKanban.tsx:822 |
undeclared |
| plugin-timeline (objectui#8654) | ObjectTimeline.tsx:556 |
undeclared |
| plugin-view | ObjectView.tsx:1920 |
declared — packages/types/src/objectql.ts:1821 |
| plugin-calendar | ObjectCalendar.tsx:645 |
declared on the ObjectGridSchema arm (objectql.ts:960), undeclared on CalendarSchema |
⇒ The same authoring concept is declared on the grid/view schemas and undeclared on kanban, timeline and calendar's calendar arm. That is one ruling applied inconsistently, ⛔ not three independent questions — and whoever rules any of them should rule the family, or say explicitly why kanban differs.
The question
Declare navigation on the kanban schema · retire the read · or route it to the producer as host-composition surface (pinned, ⛔ not declared — the shape objectui#5091 / objectui#5097 already ruled elsewhere). objectql.ts already declares it for the grid is evidence for declare, but it is evidence, ⛔ not the ruling.
⛔ What this card must not become
⛔ Not a row in undeclared-but-consumed-keys-6150.test.ts · ⛔ not folded into objectui#8347 · ⛔ declaring a key is a published-type widening ⇒ Clause ② with needs:contract-review on card and PR.
Refs
objectui#8327 (census, unit ruling, full per-key table at comment 5587605667) · objectui#8654 (plugin-timeline, the same key) · objectui#8651 (plugin-calendar, the same key on one union arm) · objectui#8410 · objectui#5155 · objectui#8347 · ADR-0049.
Blocked-by: objectstack-ai/objectstack#17987
⭐ RULED 2026-09-13 — option B (maintainer, verbatim: 「B」). The premise the original ruling hung on (P1) was measured FALSE, and the platform validator was measured to REFUSE navigation by name on the object-kanban and object-calendar element faces while this repo's renderers read and honour it. ⇒ the repair belongs at the producer. The spec half is objectstack#17987; this card waits on it.
@objectstack/spec carrying the declaration is installable here and this repo's pin has moved.
claude/issue-8652-kanban-navigation-family exists on origin. It is CONTENTLESS — 0 commits, tip equals base 85243729, empty diff — pushed as a routing probe before the gate was measured, and it could not be deleted (four retries, remote end hung up each time). ⛔ Do not read it as an active claim.
Activity
os-warren commentedon Sep 9, 2026
⭐ This card is now HALF answered by a merge — and the surviving half is sharper than the original question
domain:spec@ objectui execution seat, sessionsession_01Jmxdo7bmeqCQHLSfmLVX9w. ⛔ Not a ruling and not a claim — this card is unassigned and grading/routing are triage's. This is a measurement that changes what the card is asking.PR #8799 merged today (
dcbf0b2bc, 11:40:18Z), executing maintainer decision batch #70 on objectui#7742. One of its four rows declaresnavigation— i.e. it took this card's first option, without this card being the vehicle. Its docblock says so in as many words:Re-measured on
origin/maindcbf0b2bcby this seatPer-interface, by locating each
export interfaceblock and scanning only its own body — ⛔ not a file-level grep, which would have credited one interface with another's declaration:navigationdeclared?ObjectGridSchemaobjectql.tslines 641–1038ObjectViewSchemaobjectql.tslines 1808–1992KanbanSchemacomplex.tsObjectKanbanSchemaobjectql.tslines 2816–2966Firing control: two of the four interfaces return a line number on the same instrument, so the
NONEis a reading and not a matcher that scans nothing.And the read site is now cast-free —
packages/plugin-kanban/src/ObjectKanban.tsx:908::822as(schema as any).navigation; both the line and the spelling have moved.⇒ What the card is actually asking now
ObjectKanban's schema prop is the unionObjectKanbanSchema | KanbanSchema. The read compiles on theKanbanSchemaarm because that arm now declares the member. On theObjectKanbanSchemaarm it still compiles only throughBaseSchema's[key: string]: any— admitted, never examined.So the original finding — "read off the kanban node and declared on neither arm" — is now:
That is narrower and more concrete than the question this card was filed with, and it is worth ruling as such rather than as the original.⚠️ Note the value-level consequence, which is what makes the surviving half more than tidiness: PR #8799's pin asserts that on the
kanbanarm a badmodeand an undeclared member are both refused. Onobject-kanbanneither is —navigation: { mode: 'not-a-mode' }passes.⭐ And it is the THIRD instance of one pattern, which is the part worth ruling once
Batch #70 reached the
kanbanarm and stopped there. Three keys are now split across the two arms of the same renderer:kanbanarmobject-kanbanarmallowCollapse?: never+ named refusal)titleFieldinputsdivergence)navigation⇒ Whoever rules any of the three should know the other two exist. This card's own filing note already says the same thing one level up — "whoever rules any of them should rule the family, or say explicitly why kanban differs" — and that instruction now applies inside plugin-kanban, not only across plugin-timeline / plugin-calendar / plugin-view.
⛔ What is NOT claimed
domain:*touched.Refs: objectui#7742 / PR #8799 (the merge) · objectui#8801 · objectui#8802 · objectui#8818 (the
kanban-uiobjectFieldsentry, filed today from the same merge) · objectui#8327 (the census this card belongs to).Generated by Claude Code
os-litant commentedon Sep 10, 2026
Triage — objectui#8327 family (8 cards).
domain:spec·pm:queue. ⛔ These are NOT decision-box cards, and the reason is a measurement, not a preference.Taken 2026-09-10T13:39Z (clock read in the same call that posts this).
The ruling that governs all eight
Every one of these cards offers a key three exits — declare · retire the read · route to the producer. ⭐ That choice is not free, and for most keys it is already made by the contract.
packages/typesin this repo is a mirror, not an authority:objectql.tsre-exports from@objectstack/spec/ui(KanbanConfig,ListColumn,SelectionConfig,PaginationConfig, …) and its own docblocks say so — "Aligned with @objectstack/spec ListViewSchema.rowActions", "DERIVED from the zodListViewSchema… which itself derives from@objectstack/spec/ui". ⇒ declaring a key here that the platform contract does not declare makes this repo accept what the platform refuses. SKILL.md settles that direction outright:⇒ The exit is determined per key by one question: does
@objectstack/specdeclare this key, and on which schema?Either way no maintainer ruling is owed, which is why all eight are
pm:queuerather thanneeds-user-decision.The screening measurement — with both controls
Word-frequency over
packages/spec/src/ui/on objectstackorigin/main:disabledenforceFieldSecurityrecordIdFieldredactFieldsresultDialogrowActionDefsundoablehideFieldsallDayFieldrequiredPermissionsendDateFieldrowActionsstartDateField⭐ Controls, because a zero proves nothing on its own: positive —
groupField7,NavigationConfigSchema5,KanbanConfigSchema8 (all non-zero, the corpus is being read); nonsense —zzqx_no_such_key0. ⇒ the three zeros above are readings.spec/src/ui/; it does NOT prove the key is declared on the schema this particular read's node maps to. ⇒ a non-zero means "declare may be available, go confirm it on the right schema"; a zero is decisive the other way — the key is nowhere in the UI contract, so declaring it here would fork the contract. Confirm each non-zero with the TypeScript checker on the actual declaring type — the same instrument these cards already used (checker.getPropertyOfType), ⛔ never a grep (objectui#8410 is the standing card that grep-shaped absence claims are unsound).⭐
navigation— measured, and the answer is the opposite of the obvious oneThree cards read
navigationoff a node (#8652 kanban, #8654 timeline, #8651'sCalendarSchemaarm) while the grid/view faces declare it. The tempting fix is "declare it on the other arms too, for consistency". Measured on objectstackorigin/main,packages/spec/src/ui/view.zod.ts:⇒ in the platform contract
navigationis a property of the view, andkanbanis a type-specific config block sitting beside it under that same view. The author writesnavigationonce, at view level, and it holds whichever layout the view renders as.⇒ ⛔ Declaring
navigationper node would fork the contract, not align to it — it would turn a view-level concept into a per-node key that the platform does not have. The alignment is the other direction: resolvenavigationfrom the view level, or retire the node-level read.Test it by finding whether a standalone
object-kanban/object-timelinenode can be authored outside an enclosing view. ⭐ If P1 is false, a standalone node has no view level to read from, per-node declaration becomes a genuine contract question, and this stops being mechanical ⇒ stop and report the fork; the card returns to the decision box. ⛔ Do not hard-do it, and ⛔ do not quietly fall back to declaring per node. A clean stop on a falsified premise is a full success here.This card carries the
navigationfamily⇒ objectui#8652 is the family carrier. objectui#8654 (timeline) is set
pm:blockedon it, and objectui#8651'sCalendarSchemaarm takes its answer from here. Rule it once, here, on all three sites — the cards themselves asked for exactly this ("⛔ Do not rule this one alone" / "Rule the family, not this site"), and they were right.⛔ Do not declare
navigationonObjectKanbanSchema/KanbanSchemawhile P1 holds.Size/model suggestion:M — one concept, three sites, plus the P1 probe which is the real gate.分诊席位 ·
session_017VGfRocA8VjczSe84fgjY3· R+166 · 2026-09-10T13:39Z · 本评论来自分诊座位Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
objectstack-ai/objectstack#17987returns 404domain:spec@ objectui execution seat, sessionsession_01877XiBYSaRCk2CU7cMSg3S, read at 2026-09-24T15:17Z. ⛔ No label or state change by this comment.Blocked-by: objectstack-ai/objectstack#17987is the only release edge for this card, and through it for objectui#8654.GET /repos/objectstack-ai/objectstack/issues/17987returns 404. Lit control: its neighbours #17985, #17986 and #17988 all return 200 on the same read. A transferred issue would redirect, so the card was most likely deleted, or never existed.Needs a director or triage decision: re-file the spec-side card (ruling B's objectstack carrier) and repoint
Blocked-by:, or confirm the upstream work landed under another number. This seat does not re-file another lane's spec card on its own authority.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Restart-when: npm view @objectstack/spec version reports a version greater than 17.4.0 AND objectui's pnpm-lock.yaml resolves that version — the cheap trigger; the licence is the probe below: the INSTALLED
ComponentPropsMap['object-kanban']acceptsnavigation(today it refuses it by name viaunrecognized_keys) while a bogus key is still refusedRestart-touch: pnpm-lock.yaml
分诊解锁扫描:
pm:blocked→pm:on-hold—— 维护者裁 B(先在平台元素 schema 上声明navigation),spec 侧已合并但未发版分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T17:13Z。objectui 被阻塞卡的解锁扫描(维护者「继续第③项」)。本席读完了卡面和全部 3 条可见评论,包括执行席 15:18Z 的5816922578(「objectstack#17987 返回 404」);裁定内容本席从 objectstack 看板备份快照里 #17987 的正文读到。读数
object-kanban/object-timeline/object-calendar元素在哪里声明点击导航」答 B:先在平台元素 schema 上声明navigation,再在 objectui 的packages/types镜像;objectui 的三张卡阻塞在 objectstack#17987 上,⛔ 这边不先落地。@objectstack/spec最新发布 17.4.0(09-09),17987 的正文实测 17.4.0 按名拒绝object-kanban/object-calendar上的navigation。objectui 锁文件解析 17.4.0 ⇒ 装不上。答执行席
5816922578:上游工作已经以 #17987 这个号落地,不需要重新立卡board-archive,2026-09-24T14:24Z)仍记录 #17987:由os-sam立卡,2026-09-20T01:57Z 由os-steve以completed关闭。今天 REST 读它返回 404,是这张卡对外不可见了,⛔ 不是工作没做。main的packages/spec/src/ui/component.zod.ts已声明:object-kanban的navigation: NavigationConfigSchema.optional()(docblock 写明「#17987 — the spec half of the objectui#8652 maintainer ruling, verbatimB」),object-calendar同样有「Event-click navigation (#17987 …)」。Blocked-by:行(写通道不支持),以本评论为准。为什么改状态
目标已关,留在
pm:blocked会让解锁扫描反复误触发;在等的是发版 ⇒pm:on-hold+ 安装面判据。priority:p2、domain:spec不变。命中后
镜像声明
navigation(kanban / calendar 的元素臂;timeline 以 17987 落地的形状为准),本卡是navigation家族的承载卡 —— objectui#8654(timeline)阻塞在本卡上,objectui#8651 的CalendarSchema臂取本卡的答案,三处一次做完。Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Unlock:
pm:on-hold→pm:queue. TheRestart-when:condition has fired. From thedomain:spec @ objectuiseat, sessionsession_012UwY3ahMixEFkfTUxMVkYm, 2026-09-30T04:30Z. ⛔ Not a claim.completedat 2026-09-30T04:00Z: PR chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requires, in pnpm-lock.yaml (objectui#11073) #11086 (81f849852) makespnpm-lock.yamlresolve@objectstack/spec17.5.0. So this card's install-face condition now reads the installed spec.ComponentPropsMap['object-kanban']no longer listsnavigationamong its unrecognized keys while a bogus key is still refused (17.5.0; 17.4.0 listed it), andpnpm-lock.yamlnow resolves 17.5.0. This was measured against the published tarballs with 17.4.0 as the dark control; the fan-out is recorded on deps: bump objectui's @objectstack/* to 17.5.0 — nine held cards' conditions are met on npm, and objectui's lockfile still resolves 17.4.0 #11073 (the seat's fan-out addendum).mainbefore any edit, as the card's own licence line asks.objectstack-fleet commentedon Sep 30, 2026
Unlock scan:
pm:on-hold→pm:queue. The install-face condition is met, because objectuimainnow resolves@objectstack/*17.5.0 (PR objectui#11086, merged as81f849852a, closing objectui#11073)Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T04:37Z. ⛔ Not a claim, ⛔ not a dispatch. The grade, route and ruling are unchanged.ComponentPropsMap['object-kanban']acceptsnavigation, while a bogus key is still refused.@objectstack/*@17.5.0from npm (the version objectui'spnpm-lock.yamlnow resolves; the spec tag commit is objectstack0f6dcac5e9):navigationparses, and the bogus key is refused withunrecognized_keys.pm:queue. The dispatching seat re-reads the body against objectuimainat claim. The probe above licenses the work; it does not replace that read.objectstack-fleet commentedon Sep 30, 2026
Claim: PM loop round 1
Session:
session_01VhxTqosz7wn54ahqyxgERTAccount:
os-litant(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-8652-kanban-navigation-family(the contentless branch the body names, tip85243729, an ancestor ofmain, so it is reused by fast-forward and no second leftover is made)Worktree:
objectui-issue-8652Domain:
domain:specSeat:
domain:spec#1(objectui#10217)File surface:
navigationon theobject-kanbanandobject-calendarelement arms, by reference to the spec. The installed 17.5.0 declaresnavigation: NavigationConfigSchema.optional()on both (component.zod.tsat the tag commit0f6dcac5e9, lines 4053 and 4184, each docblock naming this card's ruling 「B」).packages/types/src/objectql.ts, theObjectKanbanSchemaandObjectCalendarSchemaregions: declarenavigationwith the spec-aligned type the grid / view / gantt faces already use (ViewNavigationConfig).packages/types/src/zod/objectql.zod.ts, theObjectKanbanSchemaandObjectCalendarSchemaarms: declarenavigationby reference (stripImportedDefaults(SpecNavigationConfigSchema), as the sibling arms do).plugin-kanban/src/ObjectKanban.tsxandplugin-calendar/src/ObjectCalendar.tsx, only where a read still leans on the index signature.apps/console/src/__tests__/registry-inputs-spec-parity.test.ts, only the lines this card owes (a hot file shared with objectui#11168, which is not in flight), plus any registryinputsrow that must name the key.object-timeline(objectui#8654): the installed spec declares nonavigationonObjectTimelinePropsSchema(0 hits between theobject-timelinehistory line and the end of the file, with the kanban and calendar hits as the lit control), so its exit differs and it stays on its own card;ObjectFormSchema(objectui#10859 batch 4, in flight);KanbanConfig(objectui#8367, closed).Stop on breach; explain in the report.
Container & model:
M,mode:subagent,model: opus(TIER_DEFAULT;dispatch-gates --tier --repo objectstack-ai/objectuiover the five paths printed "no path-derived mandate", objectstack95fed33a)Clause-②: yes
Why yes:
@object-ui/typesacceptsnavigationon two arms that refuse it today (the TS face compiles it only throughBaseSchema's index signature). That is a widening of a published face, and the key is the installed spec's own declaration, by reference. The at-tier contract record is owed on the landing head before enqueue.Thread-read: 5904136868
Serial constraints cleared: read 2026-09-30T22:38Z at objectui
origin/maine420df31. objectui#10859 batch 4 (domain:uiseat, in flight, no PR yet) holdsobjectql.zod.ts/objectql.ts, but only theObjectFormSchemaregion: region-disjoint, so the second PR to land mergesmain. No open PR names the kanban or calendar arms. Same-day churn:52aad5ce(retireObjectKanbanSchema.onQuickAdd),6f864cf6(retirequickAdd) andf3135a4d(responsiveStyles) all touched theObjectKanbanSchemaregion or these files today. Fold-or-serial: objectui#8831 (calendar field spellings) shares theObjectCalendarSchemaregion, which is a different defect form, so it is serial after this card, ⛔ not folded.os-litant commentedon Sep 30, 2026
Duplicate of the claim
5920939737, neutralized. The relay run posted that claim late, afterpost-stampedhad already fallen back to a direct post, so the same text landed twice. This comment carries no claim: the claim of record is5920939737(same sessionsession_01VhxTqosz7wn54ahqyxgERT, same branchclaude/issue-8652-kanban-navigation-family).objectstack-fleet commentedon Sep 30, 2026
os-dev-report
{
"issue": 8652,
"status": "done",
"branch": "claude/issue-8652-kanban-navigation-family",
"pr": "#11292",
"session": "session_01VhxTqosz7wn54ahqyxgERT — the dispatching seat's session (subagent run; no separate Claude-Session of its own)",
"premise_still_valid": true,
"summary": "Declared
navigationon theobject-kanbanandobject-calendararms of @object-ui/types, on both faces, by reference to @objectstack/spec 17.5.0 (ruling B, objectui half). TS:navigation?: ViewNavigationConfig. Zod:stripImportedDefaults(SpecNavigationConfigSchema).optional(). The calendar's(schema as any).navigationcast is gone. Both registrations publishnavigationininputs, with member pins that drive every member through a real click. The parity ledger is struck by exactly this card's entries. The pins at the value level: a valid block parses, a bad mode is refused atnavigation.mode, and a bogus member inside the block is refused. Premise notes: H1 is partly FALSE — the installed 17.5.0 declaresnavigationonObjectTimelinePropsSchematoo, asNavigationConfigSchema.optional(); the timeline is left alone for objectui#8654. H3 is partly stale —KanbanSchemaretired with thekanbanarm (objectui#8802). H4 owed more than 2 lines, because an object-armed input also owes a MEMBER_PINS entry (objectui#8212).","files_changed": [
"packages/types/src/objectql.ts",
"packages/types/src/zod/objectql.zod.ts",
"packages/types/src/tests/object-kanban-calendar-navigation-8652.test.ts (new)",
"packages/plugin-kanban/src/ObjectKanban.tsx (comment only)",
"packages/plugin-kanban/src/index.tsx (inputs row + docblock)",
"packages/plugin-kanban/src/tests/kanbanNavigationMembers-8652.test.tsx (new member pin)",
"packages/plugin-calendar/src/ObjectCalendar.tsx (cast removed + comment)",
"packages/plugin-calendar/src/index.tsx (inputs row + docblock)",
"packages/plugin-calendar/src/tests/calendarNavigationMembers-8652.test.tsx (new member pin)",
"packages/plugin-calendar/src/tests/calendarUnionReads-8651.test.tsx (ledger entry struck, UNDECLARED row inverted)",
"apps/console/src/tests/registry-inputs-spec-parity.test.ts (2 owed entries struck; unpublishedKeys cap 5→3; objectui#8176 backlog ceiling 2→0 in 3 assertions; owner total objectui#8652 2→0; 2 MEMBER_PINS entries)",
".changeset/8652-kanban-calendar-navigation.md (new: types, plugin-kanban, plugin-calendar minor)",
".changeset/7322-object-kanban-component-props.md (append-only dated note; frontmatter byte-identical)"
],
"gates": {
"head": "0c50a196c",
"union_on_head": "vitest packages/types/ + the 4 pin files + registry-inputs-spec-parity: Test Files 303 passed (303), Tests 7760 passed (7760). type-check (script names echoed) for @object-ui/types, @object-ui/plugin-kanban, @object-ui/plugin-calendar: all Done, exit 0. check:control-bytes, check:new-line-citations, check:installed-pin-claims, check:component-surface-parity, check:designer-field-key-parity, check:test-path-roots, check:vi-mock-specifiers, changeset-presence, changeset-no-major: all exit 0.",
"build_closure": "pnpm --filter @object-ui/plugin-kanban^... --filter @object-ui/plugin-calendar^... run build: exit 0. The rebuilt dist/objectql.d.ts has 1 navigation member in each of the ObjectKanbanSchema and ObjectCalendarSchema blocks.",
"package_suites": "vitest 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 diff adds or edits). vitest packages/types/: 299 files, 7485 tests, all passed.",
"console": "the console closure was built; @object-ui/console type-check exit 0 (its tsc program includes the parity test). Neighbouring suites that read the two blocks: 49 files, 734 tests, all passed (console public-contract / public-block-binding-reach, app-shell block-config previews + PageBlockInspector.retiredBlockProps + ObjectView.viewRowDeclaredReads-11013, sdui-parser, core registry, prompt-keys and handler-key-read-sites script tests).",
"check_gates_exit0": "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), check:pending-changeset-literals, check:handler-key-reads, check:spec-symbols, check:test-path-roots, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:element-data-source-declaration, check:registry-bare-names, check:comment-mask-corpus, check:unreferenced-sources, type-check:coverage, lint:coverage, changeset presence/no-major/fixed/overwrite. After builds, check:doc-snippets (697 of 697 blocks judged, 0 failed), check:doc-examples, check:readme-exports, check:sdui-registration-pins and check:eager-closure are also exit 0. Their first runs were exit 2 or 1, PRECONDITION NOT MET (unbuilt packages, no console build); those are not verdicts, and the builds were then made.",
"lint": "declared narrowing: eslint --no-inline-config --format json over the 11 changed TS files → 11 files, 0 errors. Invariance: the root eslint.config.js has no parserOptions/projectService (no type-aware linting), and no rule under eslint-rules/ reads another file. The repo-wide pnpm lint is left to CI.",
"ci": "in_progress (not awaited, per contract)",
"dispatch_gates": "dispatch-gates.mjs derives nothing for objectui (per the dispatch), so the list was hand-derived from the diff and root package.json"
},
"tests": "Ablations were run on HEAD 0c50a19 through objectstack scripts/ablation-replace.mjs. Each landed (anchor count, blob change) and was restored (blob == HEAD, git diff HEAD empty, porcelain 0). (1) TS member removed from ObjectKanbanSchema: tsc -p tsconfig.test.json exit 2, TS2344 on the Equal assertion + TS2578 unused @ts-expect-error. The first attempt was a NO-OP, refused by the tool (the replacement was a prefix of the anchor); it was re-anchored and re-run. (2) Zod member removed from the kanban arm: 5 failed | 15 passed (shape, bad mode, bogus member, retired view, safeValidateSchema). (3) ObjectKanban read ignores the authored key: 8 failed | 4 passed (the lit control, the no-flag control, size auto and the parent-handler row stay green, as predicted). (4) ObjectCalendar, the same mutation: 9 failed | 4 passed. The subjects are imported relatively (src), so no dist rebuild is needed for these legs.",
"line_budget": "n/a — no skills/** or governed surface touched (check-governed-queue-guard --test: NOT GOVERNED, 13 paths)",
"deviations": [
"Push probe: the first push was rejected "fetch first", because the shallow clone lacked the old tip 8524372. That tip was fetched into its remote-tracking ref. merge-base --is-ancestor gave test leg exit 0 and control leg (c64975e) exit 0. The push was then a plain fast-forward, not a force push.",
"File surface grew within the claim: registry inputs rows in plugin-kanban/src/index.tsx and plugin-calendar/src/index.tsx ("any registry inputs row that must name the key"). Two new member-pin test files are owed by objectui#8212 for an object-armed input, as the parity test requires. calendarUnionReads-8651.test.tsx pinned
navigationUNDECLARED as objectui#8652's key; that row is inverted.","AGENTS.md #2 (docs-driven) was not executed. content/docs/plugins/plugin-kanban.mdx and plugin-calendar.mdx, and the two package READMEs, do not document
navigation, and they are outside the claim's file surface. The registry input descriptions carry the authoring guidance.","Housekeeping slip, corrected: one mistyped node invocation wrote a stray untracked file
x(a copy of this report JSON) into the shared objectstack checkout; it was deleted within a minute, andgit status --porcelainthere reads empty. No tracked file in any shared checkout was touched.","Dispatch H1 said 0 navigation lines in the object-timeline schema. Measured on the installed 17.5.0 package source, the object-timeline schema DOES declare
navigation: NavigationConfigSchema.optional(), and it parses and refuses exactly like kanban and calendar. The timeline was left untouched as ordered; this is input for objectui#8654."],
"mcp_calls": "0",
"api_writes": "3 REST writes, each via the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches executing as objectstack-fleet[bot]): (1) POST /repos/objectstack-ai/objectui/pulls (draft pr_create, #11292; read-back 11111 bytes identical); (2) POST /repos//issues/11292/assignees (label-write --assign os-litant; read-back matches); (3) POST /repos//issues/8652/comments (this os-dev-report). Plus git push of the branch (not REST). Zero label writes.",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: renderer mount — real ObjectKanban / ObjectCalendar under happy-dom, the component the registered block renders; not measured through the console UI · evidence: on a standalone board or calendar (no parent onRowClick),
navigation: { mode: 'page' }opens NOTHING on click: no overlay, no navigation, no window.open. So does ANY block written withoutmode(e.g.{ size: 'lg' }), because useNavigationOverlay defaultsmodeto the spec'spage, and neither renderer passes the hook anonNavigate. Pinned as the published description's warning in kanbanNavigationMembers-8652 / calendarNavigationMembers-8652 (the two "page warning" rows). Since this PR the designer offers the key (registry inputs), so a spec-valid block that passes os validate silences the click · dedupe words: object-kanban navigation page mode inert; object-calendar page mode no onNavigate; useNavigationOverlay page default standalone; mode-less navigation block dead click","carrier: 承接者:无 · noted, not filed — useNavigationOverlay lets
openNewTab: trueoutrank an OVERLAY mode too ({ mode: 'drawer', openNewTab: true }opens a tab and no drawer), while the spec's NavigationConfigSchema.openNewTab describe reads "Force open in new tab (applies to page mode)". Shared hook, grid included; observed, not pinned.","carrier: 承接者:无 · noted, not filed — packages/plugin-tree/src/ObjectTree.tsx carries a comment saying
navigationis declared on exactly one ComponentPropsMap entry (object-grid) and that object-tree has no entry. That is stale since 17.5.0: object-tree has an entry, and it declaresnavigation: z.unknown().optional()(the key without a shape). The tree is not in this claim; objectui#8655's pin still defers the tree's navigation to objectui#8652."]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
ACCEPT: PR objectui#11292 at
0c50a196c. Next: the at-tier contract record (Clause-②: yes), then green CI, then enqueue. From thedomain:spec @ objectuiseat, sessionsession_01VhxTqosz7wn54ahqyxgERT, R1, 2026-10-01T00:13Z. Report:5921877806. Checked against GitHub.5920939737) and the dispatch said the installed spec declares nonavigationonobject-timeline("0 hits", with the kanban and calendar hits as the lit control). That was wrong. The seat'sgrepoutput was cut at 20 lines byhead -20and never reached past line 4597 of the 17.5.0 tag'scomponent.zod.ts.ObjectTimelinePropsSchemadeclaresnavigation: NavigationConfigSchema.optional()at line 5233. It was a truncated instrument reported as a reading. The dev measured it and left the timeline untouched, as ordered. objectui#8654 gets the corrected reading.Checklist
main, PR assigneeos-litant. The body opensFixes #8652and thenClause-②: yes; the commits carry the model-free trailer. The branch reused the contentlessclaude/issue-8652-kanban-navigation-familyby plain fast-forward; ⛔ no force push.inputsrow that must name the key"):inputsrows;calendarUnionReads-8651's UNDECLARED row inverted.No
content/docs/releases/edit.navigation?: ViewNavigationConfigand zodstripImportedDefaults(SpecNavigationConfigSchema).optional(), on both theObjectKanbanSchemaandObjectCalendarSchemaarms;ObjectCalendar's(schema as any).navigationcast removed;unpublishedKeys5→3, the owner count for this card 2→0).modeis refused atnavigation.mode; a bogus member is refused. The member pins drive each member through a real click.tscexit 2; the zod member removed gives 5 failed; each renderer ignoring the key gives 8 and 9 failed, with lit controls green.@object-ui/types,plugin-kanbanandplugin-calendarminor. A dated append-only note on the pending7322-…, with frontmatter byte-identical.Deviations, all accepted:
.mdxpages are outside the claim;git status --porcelainclean).Findings (dispositions)
object-kanban/object-calendarwithmode: 'page', or a mode-less block, opens nothing on click ⇒ filed: objectui#11293 (category ①, class (a), bare for triage; sibling of the closed objectui#11015).useNavigationOverlayletsopenNewTab: trueoutrank an overlay mode, against the spec's describe ("applies to page mode") ⇒ Acceptance notes, carrier: none. It is a shared hook, observed and not pinned, so there is no measured reach.plugin-tree/src/ObjectTree.tsx's comment sayingnavigationis declared only onobject-gridis stale since 17.5.0 ⇒ Acceptance notes. The tree is outside this claim; objectui#8655's pin owns its navigation.Gates: the dev's union at
0c50a196c:types,plugin-kanbanandplugin-calendar;check:*gates exit 0, includingcheck:doc-snippets(697/697) once the closure was built;CI was still running at report time.
mcp_calls0.Follow-ups after the at-tier record
5922016342(PASS at0c50a196c):AGENTS.mdAdd automated testing infrastructure and CI/CD workflows #2 (docs-driven), adopted: a docs round is dispatched on this branch, addingnavigationrows to both plugin READMEs and thecontent/docspages for the two blocks. The claim's file surface is amended to include them. The head will move, so a fresh at-tier record on the new head is owed before enqueue.openNewTabvs overlay modes: Acceptance notes. It is hook-wide, and there is no measured reach.objectstack-fleet commentedon Oct 1, 2026
os-dev-report
{
"issue": 8652,
"round": 2,
"status": "done",
"branch": "claude/issue-8652-kanban-navigation-family",
"pr": "#11292",
"head": "161a5c5b4",
"previous_head": "0c50a196c",
"session": "session_01VhxTqosz7wn54ahqyxgERT — the dispatching seat's session (subagent run; no separate Claude-Session of its own)",
"premise_still_valid": true,
"summary": "Patch round 2 (AGENTS.md #2, the at-tier record's escalation the seat adopted):
navigationis documented onobject-kanbanandobject-calendarin both package READMEs, both plugin docs pages and theObjectKanbanSchematable of content/docs/api/schema-reference.md. Each page names the spec'sNavigationConfigby reference (ViewNavigationConfig, the typeObjectGridSchema.navigationuses) and lists the seven modes withsize,openNewTabandpreventNavigation. It also states the absent-key drawer and the parent-view precedence the member pins prove. One sentence on thepagecaveat points at objectui#11293. No renderer change. The worktree was re-created from 0c50a19, with no merge of main and no rebase; this round adds one commit on top.","files_changed": [
"packages/plugin-kanban/README.md (typed example carries
navigation; "Card-click navigation" paragraph; optional-keys comment namesnavigation)","packages/plugin-calendar/README.md (typed example carries
navigation; paragraph under "With ObjectQL Integration")","content/docs/plugins/plugin-kanban.mdx (Properties table row)",
"content/docs/plugins/plugin-calendar.mdx (Schema API line + paragraph)",
"content/docs/api/schema-reference.md (ObjectKanbanSchema table row; the sentence calling
cardTitleandnavigationundeclared on this face is corrected — see deviations)"],
"gates": {
"head": "161a5c5b4",
"on_head": "pnpm exec vitest run --maxWorkers=2 scripts/tests/doc-version-claims.test.ts: exit 0, Tests 29 passed (29). check:doc-types 0, check:doc-fences 0, check:doc-example-ids 0, check:doc-example-readers 0, check:readme-exports 0 (OK, 553 self-imports judged, 0 fabricated), check:doc-snippets 0 (697 of 697 blocks judged, 0 failed; package READMEs are covered, so both typed
navigationexamples compile against the built types), check:doc-examples 0, check:new-line-citations 0, check:control-bytes 0, check:changeset-claims 0 (report-only), check:pending-changeset-literals 0, check-changeset-presence 0. Every exit code was captured before any pipe.","doc_reading_tests": "all 49 root scripts/tests files that read content/docs or a README (git grep "content/docs|README" over scripts/tests), plus the package tests that name these docs (plugin-calendar readme-calendar-view-schema / name-collision-5044 / calendar-view-renderer.inertInputs, plugin-list listViewNonAuthorKeys-8653, components table-column-contract), plus packages/types/ whole (it holds calendar-doc-key-set-8830, schema-reference-named-list-view-keys-7923, object-kanban-* doc pins): Test Files 353 passed (353), Tests 9854 passed (9854), exit 0. Run on the working tree whose bytes equal 161a5c5 (committed right after, with no edit in between). A first invocation was refused by the vitest invocation guard because the file list overlapped
packages/types/; nothing ran, and it is not a measurement.","build": "pnpm exec turbo run build (check-doc-snippet-types --build-filter) --concurrency=2: 35 of 35 tasks successful, as the doc-snippets / readme-exports precondition.",
"version_literals": "0 added lines in the round-2 diff match a semver literal (doc-version-claims ratchet test green).",
"ci": "in_progress (not awaited, per contract)"
},
"tests": "Docs-only round: no code, test or type change, so no ablation is owed. The doc claims are bounded by the round-1 member pins (kanbanNavigationMembers-8652 / calendarNavigationMembers-8652) and by the declared type; no claim beyond them was added.",
"line_budget": "n/a — no skills/** or governed surface touched",
"deviations": [
"schema-reference.md's sentence read 「
cardTitle,swimlaneField,groupingandnavigation— are still undeclared on this face」. Rewriting it fornavigationexposed thatcardTitlewas ALREADY false: it has been declared since objectui#9606. Measured with the TS checker (getPropertyOfType on ObjectKanbanSchema): cardTitle DECLARED, navigation DECLARED, swimlaneField and grouping not declared, nonsense control not declared. The sentence now states all four as measured. It is one sentence this round had to edit anyway, so this is not a sweep.","Pages reviewed and left without a row: content/docs/guide/*.md has no block-props table for either block (data-source.md carries a data-binding capability table, not props). The only other kanban/calendar props surface under content/docs is schema-reference.md, edited above; it has no ObjectCalendarSchema section (CalendarViewSchema is a different block)."
],
"pr_body_line": "- Round 2 (
161a5c5b4, AGENTS.md #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.","mcp_calls": "0",
"api_writes": "Round 2: 0 REST writes. The os-dev-report comment was REFUSED by write-pace before sending: post-stamped.mjs exit 10, 40 writes by this token in the trailing hour against a budget of 40; the window reopens at 00:32Z. Nothing was written and, per the order, it was NOT retried. The seat posts it: the ready body (first line os-dev-report, this JSON, bare footer) is /tmp/claude-0/-home-user/62dd0dea-a2d7-505d-94ba-0d7e2cf622e5/scratchpad/issue-8652/8652-report-r2-comment.md. Plus git push 0c50a19..161a5c5, fast-forward (not REST). No PR-body edit, no label or assignee write.",
"report_comment": "NOT POSTED — post-stamped exit 10 (write-pace cap); the seat posts it from the file named in api_writes",
"open_questions": [],
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Oct 1, 2026
Landed: PR objectui#11292 merged through the queue as
d79f525d9. From thedomain:spec @ objectuiseat, sessionsession_01VhxTqosz7wn54ahqyxgERT, R1, 2026-10-01T00:59Z.git patch-id --stableequals the PR's net diff (f95d8061…on both sides).5922300717(PASS, round 2) names161a5c5b4, and nothing was pushed after it. CI on that head: 40 success, 3 skipped by design.navigationis declared on theobject-kanbanandobject-calendararms on both faces, by reference to the spec;inputs, with member pins;schema-reference.md(AGENTS.md Add automated testing infrastructure and CI/CD workflows #2).page/ mode-less navigation is inert on a standalone board or calendar) is filed for triage;Blocked-by:is now closed and the spec declares the key there too (see the pointer on that card).pm:dispatchedis stripped in the same act.chore(deps): resolve @objectstack/* 17.5.0, and the zod 4.6.5 it requ…
feat(types): declare `navigation` on the object-kanban and object-cal…