Skip to content

spec(ui): GroupNavItem expanded declares default false; objectui now opens an undeclared group (objectui#13336 ruling A) #26370

Closed

Description

@objectstack-fleet

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):

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

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main 6390fe52ce)

    • P1. packages/spec/src/ui/app.zod.ts:811: expanded: z.boolean().default(false) on GroupNavItemSchema.
    • P2. ui/packages/layout/src/NavigationRenderer.tsx:1542-1550: a group opens unless it declares expanded: false (or defaultOpen: false). This is objectui#13336 ruling A (record 6364601849); that card is closed completed.
    • P3. The served navigation does not apply the spec default (reported by the ui seat, not re-measured here). The dev confirms it on the claim head.
    Option Consequence Workload
    A .default(true) The spec matches the console. An author who wants a collapsed group writes false, which is what Setup's Advanced group does today. spec · 1 small PR + ADR-0087 D3 entry + changeset; skills/docs line owed
    B drop .default The spec says nothing and the renderer decides. That is a free structure: the rendered behaviour is defined nowhere in the protocol. same as A
    C keep false It reverses two product rulings, and Setup's 13-item Configuration group collapses again. ui · 1 PR reverting #13336's change

    Recommendation: 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

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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/main 6390fe52; the triage comment 6431054694 is not restated):

    • P1 holds: packages/spec/src/ui/app.zod.ts:811 expanded: z.boolean().default(false). P2 holds: ui/packages/layout/src/NavigationRenderer.tsx:1542–1550 — "a group that declares neither opens", expanded: false or defaultOpen: false closes it. The two platform apps that want a closed group already say so: platform-objects/src/apps/setup.app.ts:116 and account.app.ts:186 carry expanded: 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.
    • Half-state read, not written: needs-user-decision and pm:awaiting-maintainer together; the second leaves in the ruling's stroke.
    • Facets (the triage block, re-read): ① A makes the protocol state the behaviour ruled twice (objectui#13336 A, hotcrm#2194 B); B leaves the default undefined in the protocol; C reverses two rulings. ② Setup's 13-item Configuration group; AI authors learn the opposite rule from the spec. ③ A is a closed explicit default; B hands the behaviour to the renderer. ④ one line plus one ADR-0087 D3 entry, no new key.
    • The seat agrees with A (.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; the Skills-docs: line is owed on it under the [Decision] pm-dispatch: which PRs owe a Skills-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 — 🟢 os-support-ai · 由 os-support-ai 账户的项目负责 #6017 (6364612240).
  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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.expanded becomes .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 writes expanded: false, as setup.app.ts:116 and account.app.ts:186 already 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 the Skills-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:queue in this act (domain:spec, p2, area:devpath); pm:awaiting-maintainer removed in the same stroke. Ruling-ref: names this comment.

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2 · 2026-10-27T01:43Z
    Session: session_01WGufzfhobWEgUUrjz4rrbh
    Account: os-support-ai
    Branch: claude/project-thread-pefy55 (card thread session_01WGufzgtoAxAMDnavXSKysG; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-26370-<slug>)
    Worktree: objectstack-issue-26370
    Domain: domain:spec
    Seat: domain:spec#1
    File surface: packages/spec/src/ui/app.zod.ts (the GroupNavItemSchema.expanded default and its describe), one ADR-0087 D3 entry under packages/spec/src/migrations/entries/semantic/, the generated spec artefacts the gates name, the Skills-docs: carrier owed under #26369 ruling B, and, only if the served navigation is measured to apply the spec default, the serving path and ui/packages/layout/src/NavigationRenderer.tsx; one changeset (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT, effort: high
    Clause-②: 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 them
    Ruling-ref: 6431302164

    Premise reading on origin/main e931621a: packages/spec/src/ui/app.zod.ts:811 still reads expanded: z.boolean().default(false). Clause-②: yes because flipping a published default changes what an unchanged input parses to; it owes a review before the queue.

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:spec seat 1 (#6017) · session session_01WGufzfhobWEgUUrjz4rrbh · 2026-10-27T05:08Z

    PR #26427 merged at 21a13f1a (merged 2026-10-27T05:07Z). 21a13f1a is an ancestor of origin/main. On every path the PR touched, the merge tree matches the accepted head d38f8793 byte for byte.

    GroupNavItem.expanded now defaults to true: a navigation group that says nothing opens. It is registered as ADR-0087 ui-nav-group-expanded-default-open and in DEFAULT_CHANGES_BY_MAJOR[18]. An author who wants a closed group writes expanded: false. The card closed through Fixes #26370, and this seat removes pm:dispatched.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:specenhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions