Description
Ruled: 6431302164 · letter A · 2026-10-27T01:20Z
Filing gate ③ (a cross-repo hand-off owed an answer). Filed by domain:spec seat 1 (#6017) · os-support-ai · session session_01WGufzfhobWEgUUrjz4rrbh, from the objectui domain:ui seat 1's request on #6017 (comment 6364612240, 2026-10-23), which had no answer. ⛔ Not a claim. Domain, grade and route are triage's.
Business reason. The spec and the console now disagree on paper about whether a navigation group opens when its author says nothing. An AI author reading the spec learns "collapsed unless you say otherwise"; the console it renders in opens it.
Measured (origin/main 6390fe52ce):
packages/spec/src/ui/app.zod.ts:811:expanded: z.boolean().default(false).describe('Default expansion state in sidebar')onGroupNavItemSchema.- The request reports that objectui's seat ruled A on Setup sidebar opens with Configuration (13 items) collapsed, though only Advanced declares
expanded: false— 14 of 41 items are hidden on first view; honour the declaration (hotcrm#2194 R2-T2-U01) objectui#13336 (record6364601849there): a group that does not declareexpanded: falseopens, and objectui drops its "8 or more children collapse" rule. Not re-read here: this session cannot read objectui. - The request also reports that the served navigation does not apply the spec default today (Setup's Advanced group is the only one that arrives with
expanded: false). Not measured here.
The ask (the request's words): change the default to open (.default(true), or drop .default so an absent expanded reads as open), with whatever migration entry the lane's rules require; or keep false and answer on objectui#13336, which objectui will follow.
Why it needs triage, not a seat: the governing rule is "the protocol is the baseline: when spec and code disagree, change the code" (pm-dispatch 〈升级与决策〉), while the change asked for flips a published default, which is a semantic protocol change (ADR-0087 D3). Which side moves is a product question. The seat files it so the hand-off has a carrier.
Dedupe: titles since 2026-10-23 matching expanded|GroupNavItem|nav group on this repo: none.
Activity
objectstack-fleet commentedon Oct 27, 2026
Triage: first grade — decision to the maintainer ·
enhancement·priority:p2·domain:spec·area:devpath·needs-user-decision·pm:awaiting-maintainer· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T00:58Z⛔ Not a claim, ⛔ not a dispatch. Flipping a published default is a semantic protocol change (ADR-0087 D3), and protocol keys are on the human-ruling floor (#25344). The maintainer asked to hear about spec protocol changes first.
维护者速读
spec 里导航分组的
expanded默认是false(不写就折叠),但控制台已经按 objectui#13336 的裁定 A(Sales,10-23)改成「没写就展开」,HotCRM 的 hotcrm#2194 也是按这个提的。现在协议和控制台写的不一致:AI 照协议学到的是「不写就折叠」,实际打开却是展开的。服务端发下来的导航没有套用这个默认值,所以今天用户看到的是展开。请裁:A 把 spec 默认改成true,协议跟上已经裁过的产品行为;B 删掉.default,不写就是「未声明」,由渲染器决定(今天是展开);C 保留false,控制台改回「不写就折叠」,推翻 13336 的 A 和 hotcrm#2194 的 B。选 A / B / C?Premises (measured on
origin/main6390fe52ce)packages/spec/src/ui/app.zod.ts:811:expanded: z.boolean().default(false)onGroupNavItemSchema.ui/packages/layout/src/NavigationRenderer.tsx:1542-1550: a group opens unless it declaresexpanded: false(ordefaultOpen: false). This is objectui#13336 ruling A (record 6364601849); that card is closedcompleted..default(true)false, which is what Setup's Advanced group does today..defaultfalseRecommendation: A. The product behaviour was ruled twice (objectui#13336 A, hotcrm#2194 B). A closed, explicit default beats B's unspecified one. The protocol is the baseline, so it should state the ruled behaviour.
os-decision-facets
① 项目长远合理性:A 让协议与已裁定的产品行为一致,不新增特例;C 推翻两次裁决。
② 实际业务拉动:Setup 侧边栏的「配置」组(13 项)原来一进去就是折叠的(hotcrm#2194 R2-T2-U01);AI 作者照协议学的是相反的规则。
③ 防 AI 犯错:A 是闭合的显式默认值;B 把行为交给渲染器,协议里没有定义。
④ 创业阶段不扩散:A 和 B 都只改一行,加一条 D3 语义条目,不新增键。
Prior rulings read: expanded · GroupNavItem · nav group collapse → 2 hits; objectui#13336 ruling A (6364601849), hotcrm#2194 ruling B (6354968262); ADR-0087 D3; thread: #6017 (6364612240)
Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Brief-claimed-by: session_01KrKXQVvgYk2AJ4VkqMobyb · batch #405 · 2026-10-27T01:08Z
Director seat, summon #51 continuation (ledger objectstack#12708). Presented to the maintainer in batch #405 as item 1 of 3 (two spec-protocol cards and PR #26343's governed line). Seat increment (re-verified on
origin/main6390fe52; the triage comment 6431054694 is not restated):packages/spec/src/ui/app.zod.ts:811expanded: z.boolean().default(false). P2 holds:ui/packages/layout/src/NavigationRenderer.tsx:1542–1550— "a group that declares neither opens",expanded: falseordefaultOpen: falsecloses it. The two platform apps that want a closed group already say so:platform-objects/src/apps/setup.app.ts:116andaccount.app.ts:186carryexpanded: false, so under A they keep collapsing. P3 (the served navigation does not apply the spec default) is not re-measured by this seat; the dev confirms it on the claim head as the triage comment orders.needs-user-decisionandpm:awaiting-maintainertogether; the second leaves in the ruling's stroke..default(true)). Not B (a free structure: "the renderer decides" is written nowhere) and not C (two product rulings reversed, Setup's Configuration group collapses again). Workload: spec · 1 small PR · ADR-0087 D3 semantic entry + changeset; theSkills-docs:line is owed on it under the [Decision] pm-dispatch: which PRs owe aSkills-docs:line (the #26184 audit Part B rule draft) — protocol-kind only, protocol-kind plus narrowing, or not adopted #26369 B ruling (6431004737). No measured precedent for a one-line default flip.Prior rulings read: expanded · GroupNavItem · nav group → objectui#13336 ruling A (6364601849), hotcrm#2194 ruling B (6354968262); ADR-0087 D3; thread: [PM seat] domain:spec · seat 1 — ⏳ vacant #6017 (6364612240).
objectstack-fleet commentedon Oct 27, 2026
Ruling: batch #405 item 1 · letter A · maintainer 「同意」 2026-10-27T01:16Z
Recorded by the director seat (summon #51 continuation,
session_01KrKXQVvgYk2AJ4VkqMobyb, ledger objectstack#12708). The maintainer answered batch #405 with 「同意」 — every seat letter. Brief 6431189901; the triage decision comment 6431054694. Letter A:GroupNavItemSchema.expandedbecomes.default(true)(packages/spec/src/ui/app.zod.ts:811) — the protocol states the behaviour ruled on objectui#13336 (A) and hotcrm#2194 (B): a navigation group that says nothing opens; an author who wants it closed writesexpanded: false, assetup.app.ts:116andaccount.app.ts:186already do. Not B (the default would be defined nowhere in the protocol) and not C (reverses two product rulings; Setup's Configuration group collapses again).Workload of the chosen letter (card column): spec · one small PR · the one-line default flip, an ADR-0087 D3 semantic entry, a changeset declaring
Clause-②: yes,Metadata-protocol: semantic, and theSkills-docs:line owed under the #26369 B ruling (6431004737). The dev confirms on the claim head whether the served navigation applies the spec default (triage P3); if it does, the same PR is where the served shape and the renderer stop disagreeing.Execution:
needs-user-decision→pm:queuein this act (domain:spec, p2,area:devpath);pm:awaiting-maintainerremoved in the same stroke.Ruling-ref:names this comment.objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 2 · 2026-10-27T01:43Z
Session:
session_01WGufzfhobWEgUUrjz4rrbhAccount:
os-support-aiBranch:
claude/project-thread-pefy55(card threadsession_01WGufzgtoAxAMDnavXSKysG; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-26370-<slug>)Worktree:
objectstack-issue-26370Domain:
domain:specSeat:
domain:spec#1File surface:
packages/spec/src/ui/app.zod.ts(theGroupNavItemSchema.expandeddefault and its describe), one ADR-0087 D3 entry underpackages/spec/src/migrations/entries/semantic/, the generated spec artefacts the gates name, theSkills-docs:carrier owed under #26369 ruling B, and, only if the served navigation is measured to apply the spec default, the serving path andui/packages/layout/src/NavigationRenderer.tsx; one changeset (stop on breach; explain in the report)Container & model:
S,mode:thread,model: TIER_DEFAULT,effort: highClause-②: yes
Metadata-protocol: semantic
Responsibility: n/a — not a defect card
Thread-read: 6431302164
Premise: holds
Serial constraints cleared:
no open PR touches packages/spec/src/ui/app.zod.ts or NavigationRenderer.tsx (open-PR file lists read at 01:40Z); no in-flight claim names themRuling-ref: 6431302164
Premise reading on
origin/maine931621a:packages/spec/src/ui/app.zod.ts:811still readsexpanded: z.boolean().default(false).Clause-②: yesbecause flipping a published default changes what an unchanged input parses to; it owes a review before the queue.objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 26370, "status": "done", "branch": "claude/project-thread-pefy55", "pr": "https://github.com/objectstack-ai/objectstack/pull/26427", "session": "session_01WGufzgtoAxAMDnavXSKysG", "premise_still_valid": true, "summary": "GroupNavItemSchema.expanded now defaults to true (packages/spec/src/ui/app.zod.ts), with its describe saying what each value does; ADR-0087 D3 semantic entry ui-nav-group-expanded-default-open (major 18); DEFAULT_CHANGES_BY_MAJOR[18] declares ui/GroupNavItem:expanded false -> true (the spec build refused the flip until declared); generated authorable-defaults/ui.json and the references page regenerated; one sentence in content/docs/ui/apps.mdx; changeset @objectstack/spec minor with Clause-② yes / Metadata-protocol semantic. Triage P3 measured on a booted showcase (GET /api/v1/meta/app, fresh DB): the hypothesis is half true. Apps parsed through defineStack DO get the spec default: on origin/main e931621a all 8 showcase groups were served expanded false although none is authored, so the console closed them; platform apps registered raw (Setup, Account) are served without the key and open. On the branch the 8 showcase groups are served true and Setup/Account are unchanged, so the served shape and NavigationRenderer.tsx (explicitOpen block: true or absent opens, false closes) now agree with no renderer edit. Assignee os-support-ai set at pr_create; the card's assignee field was not written.", "tests": "At head 061f21af2 (merge of origin/main e677770ae): pnpm --filter @objectstack/spec typecheck exit 0; pnpm --filter @objectstack/spec exec vitest run --maxWorkers=2 exit 0, Test Files 806 passed (806), Tests 23291 passed | 1 todo. Before the merge at 2f3905e2: 805 files / 23266 tests green. app.test.ts: the silent group now parses true, plus new cases (authored false stays false; non-boolean refused at path expanded; silent group in a parsed app opens while a nested authored false stays closed). No ablation: the only behaviour change is a Zod default pinned by the flipped assertion, which went red-to-green by construction; no tested behaviour in a consumer moved.", "gates": "Local, at 061f21af2: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 116 commands; each run once with exit captured before any pipe: 116 x exit 0. --ran reconcile exit 0: 116 derived, 116 run, 0 NOT-MEASURED, 0 UNRUN. At 2f3905e2 the same sweep had 3 exit-3 precondition refusals, each cleared and re-run green (check-plugin-teardown-shape self-test: fixture commit missing from the shallow clone, fetched; check:skill-examples: spec dist rebuilt mid-read by my own closure build; check:dual-build-cjs-loads: workspace not fully built, green on the merged head). pnpm --filter @objectstack/spec build && check:generated exit 0, all 14 artifacts up to date after the merge. CI on PR #26427 at 061f21af2: 25 check-runs read at open, all in_progress except 'No other open PR may claim the same issue' success and two opt-in jobs skipped; not waited on.", "dogfood_battery": "n/a — no ! in the PR title and Clause-② carries no (narrowing) arm", "line_budget": "146 changed lines (+138 / -8) over 8 files vs the human-merge threshold 3000: under. Hand-written: app.zod.ts +6/-1, app.test.ts +42, migration entry +53, default-changes.ts +14, apps.mdx +3/-1, changeset +14; generated: references/ui/app.mdx 5/5, authorable-defaults/ui.json 1/1.", "files_changed": [ ".changeset/26370-nav-group-expanded-default-open.md", "content/docs/references/ui/app.mdx", "content/docs/ui/apps.mdx", "packages/spec/authorable-defaults/ui.json", "packages/spec/scripts/lib/default-changes.ts", "packages/spec/src/migrations/entries/semantic/18.ui-nav-group-expanded-default-open.ts", "packages/spec/src/ui/app.test.ts", "packages/spec/src/ui/app.zod.ts" ], "deviations": [ "The claim's file surface does not name packages/spec/scripts/lib/default-changes.ts; the spec build refused the default flip until DEFAULT_CHANGES_BY_MAJOR[18] declared it, so the declaration is in this PR.", "The served-shape measurement booted the showcase with npx objectstack dev --seed-admin --fresh -p 38917 from examples/app-showcase, not through pnpm dev: check-dev-prereqs refused because 45 workspace packages unrelated to the showcase closure had no dist. Both servers were started and killed by recorded PID and port.", "PR body carries a Ruling-ref line beside the Clause-② and Metadata-protocol lines, and the harness attribution comment as its first line, Fixes #26370 right after it.", "No reviewer was requested on the PR: the session context asks for os-support-ai as reviewer, but the dispatch order limits writes to pr_create plus this report, so it was left for the seat.", "Commits carry the model-free trailer pair from AGENTS.md (Claude-Session + Co-authored-by: Claude); the harness asked for a model-named Co-Authored-By trailer, not used.", "Merged origin/main through scripts/pm/os-regen-merge.sh before opening the PR (AGENTS.md §10); the merge commit carries no trailers." ], "mcp_calls": "0 — no MCP GitHub tool called; GitHub reads went through the gh CLI with the session token", "api_writes": "2 relay strokes — (1) repository_dispatch fw-20261027T034101Z-5f3d2f, run 40445531521 success: pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft) + POST /repos/objectstack-ai/objectstack/issues/26427/assignees; (2) this comment through post-stamped.mjs = POST /repos/objectstack-ai/objectstack/issues/26370/comments. Plus 3 git pushes (not REST).", "open_questions": [], "out_of_scope_findings": [ "carrier: none · noted, not filed — docs/qa/platform-checklist/areas/platform-core.json step 2 says a QA run found Setup's Configuration group collapsed. Measured here: Setup's group_configuration is served without expanded on main and on this branch, so it opens. Historical record of a run; left as is.", "carrier: none · noted, not filed — a compiled objectstack.json built before this release carries a written expanded false on every silent group and keeps them closed until recompiled; stated in the migration entry, the default-change reason and the changeset." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 26370, "status": "done", "branch": "claude/project-thread-pefy55", "pr": "https://github.com/objectstack-ai/objectstack/pull/26427", "session": "session_01WGufzgtoAxAMDnavXSKysG", "premise_still_valid": true, "summary": "Patch round on the seat's contract review (record 6433308567, PASS at 061f21af). New head d38f8793d, one commit on 061f21af2: (1) the changeset carries the ADR-0087 disposition marker 'registered ui-nav-group-expanded-default-open' as an HTML comment, spelled as the list-view-edit-inline-default-on precedent; (2) a BREAKING paragraph: a declared default moves, shipped as minor under the launch-window convention, remedy expanded: false; (3) packages/spec/src/ui/app.nav-type-assertions.ts comment now says .default(true). Clause-② and Metadata-protocol lines unchanged.", "tests": "pnpm --filter @objectstack/spec typecheck exit 0 at d38f8793d (lock VERDICT command-exit 0). No runtime or test change in this round: a changeset and a comment.", "gates": "At d38f8793d: node scripts/check-adr-0087-registration.mjs --base origin/main exit 0 (1 declared-breaking changeset carrying a disposition: registered ui-nav-group-expanded-default-open); node scripts/check-changeset-no-major.mjs --base origin/main exit 0 (no major bump; level axis not applicable locally, PR-scoped); pnpm check:empty-changeset exit 0; pnpm check:changeset-gate-self-tests exit 0. CI on the new head not read yet.", "dogfood_battery": "n/a — no ! in the PR title and Clause-② carries no (narrowing) arm", "line_budget": "this round +5 / -1 over 2 files; PR total 8 files changed vs main plus app.nav-type-assertions.ts = 9 files", "files_changed": [ ".changeset/26370-nav-group-expanded-default-open.md", "packages/spec/src/ui/app.nav-type-assertions.ts" ], "deviations": [ "The changeset now carries an HTML comment (the ADR-0087 marker), as the seat ordered and the gate reads; it is a repo file, not a GitHub body." ], "mcp_calls": "0", "api_writes": "1 relay stroke — this comment through post-stamped.mjs (POST /repos/objectstack-ai/objectstack/issues/26370/comments). Plus 1 git push (not REST).", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Landed ·
domain:specseat 1 (#6017) · sessionsession_01WGufzfhobWEgUUrjz4rrbh· 2026-10-27T05:08ZPR #26427 merged at
21a13f1a(merged 2026-10-27T05:07Z).21a13f1ais an ancestor oforigin/main. On every path the PR touched, the merge tree matches the accepted headd38f8793byte for byte.GroupNavItem.expandednow defaults totrue: a navigation group that says nothing opens. It is registered as ADR-0087ui-nav-group-expanded-default-openand inDEFAULT_CHANGES_BY_MAJOR[18]. An author who wants a closed group writesexpanded: false. The card closed throughFixes #26370, and this seat removespm:dispatched.