You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
studio(interfaces): the nav rail draws a separator item as an unlabeled disabled row and ignores badge #11791
Filing gate ① — product defect with a named location and a reproduction. reach: Studio → showcase → Interfaces: the nav_sep_reports entry (type: 'separator') shows in the rail as a greyed, unlabeled row with a generic icon; Hours by Status' badge: 'NEW' is not shown.
Who acts on it: objectui triage → the Studio / app-shell owner. ⛔ Not a claim. Found in a manual browser QA pass of Studio on 2026-10-07; filed one card per finding on the maintainer's word: 「你发现的问题全部提交 issue」, and on the one-card-per-finding question 「覆盖规则,逐条立卡」.
What happens
The running app's sidebar draws the separator as a divider and the badge as a pill; Studio's rail does not, so the design surface disagrees with the app it designs.
Where it comes from (read in source)
NavTree in StudioDesignSurface.tsx has branches for groups and leaves only; resolveSurface returns null for separator, which renders as a disabled button.
Suggested direction (triage to rule)
Draw separator as a divider and render badge / badgeVariant like the runtime sidebar.
Environment
objectstack 879bd38c · examples/app-showcase booted with objectstack dev --ui --seed-admin on an isolated port and SQLite file · objectui 179f6fe9 (HEAD; the framework pin .objectui-sha is a58626c8) served by the console's Vite dev server, perf numbers from a vite build of the same commit · Chromium 141 at 1440×900 · signed in as the seeded platform admin admin@objectos.ai unless stated.
Duplicate check
Semantic issue search on objectstack-ai/objectui (open and closed), nav rail separator unlabeled row badge studio: 1 hits (0 open, 1 closed).
Semantic issue search on objectstack-ai/objectui (open and closed), navigation separator item rendered as blank row badge not shown in app nav: 5 hits (0 open, 5 closed).
Path: ② the capabilities an end user meets in the app — the navigation rail | 缺项 | P3
Triage: first grade, bug · priority:p3 · domain:ui · area:studio · pm:queue. Direction as the body proposes
Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-07T16:20Z. ⛔ Not a claim, ⛔ not a dispatch.
Triage: lands in the Studio Interfaces nav rail ⇒ domain:ui; rationale: a Studio or console surface in objectui. Filed from the Studio browser QA pass of 2026-10-07 (objectstack 879bd38c, objectui 179f6fe9).
Why p3: a separator renders as a disabled row and badges are ignored in Studio's rail. The runtime sidebar is correct.
Direction:
draw separator as a divider
render badge and badgeVariant as the runtime sidebar does
Deferred, not parked: domain:ui seat 2 (session_01MgfduSkFrfM3eorB3UGfAU) · 2026-10-08T00:38Z. ⛔ Not a claim. The card stays pm:queue.
Why it is not dispatched this round. The body places the fix in NavTree (StudioDesignSurface.tsx) and resolveSurface (studio-design/navSurface.ts). Seat 1's in-flight objectui#11790 (claim 6049484420) holds NavTree's per-type rows and navSurface.ts's resolveSurface. It names this card's separator rendering as out of its scope, but the rows are the same code. Same region: serial across rounds.
Known pits for whoever picks it up:
objectui#11790 may add per-type branches to NavTree. Re-read its merged diff first, so the separator and badge branches join that shape rather than a second one.
"Like the runtime sidebar" has a measured reference. The console's own sidebar already draws separator as a divider and badge / badgeVariant as a pill. Reuse its rendering decision, not a copy of its markup.
StudioDesignSurface.tsx: NavTree only (about :1756–:1885). A separator entry draws as a divider, not a disabled row. A leaf's badge / badgeVariant draws as the runtime sidebar draws it.
navSurface.ts: resolveSurface for separator (about :161–:197), only if the divider needs it.
The tests beside these, and .changeset/11791-*.md.
⛔ Not on it:
the nav item inspector and its separator hint (about :2165), as objectui#11790 left it;
seat 1's objectui#11823 (claim 6050316971): the inspector body's studio-canvas branch and studio-canvas-preview.tsx;
seat 3's objectui#11786 (claim 6050603483): useDraftAutoSave, the Data and Automations pillars' draft saves, and the publish path;
the runtime sidebar's own files: import only, if a shared piece exists there; ⛔ no edit;
packages/components/src/ui/** and packages/i18n/**.
Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui over these paths: no path-derived mandate; default tier)
Clause-②: no
Responsibility: objectui app-shell Studio: NavTree branches on groups and leaves only, so a separator renders as a disabled unlabeled row and a leaf's badge is dropped | none in Studio: the running app's sidebar already draws both | every author designing an app's navigation in Studio's Interfaces pillar, measured by the filer on the showcase (nav_sep_reports; Hours by Status badge NEW)
Thread-read: 6049744485
Serial constraints cleared: none blocking.
This card's deferral (note 6049744485) waited for objectui#11790. It closed as completed at 2026-10-08T01:24Z (merge 59ce048), so the release condition holds.
os-dev-report
{
"issue": 11791,
"status": "done",
"branch": "claude/issue-11791-navtree-separator-badge",
"pr": "#11873",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"summary": "NavTree in StudioDesignSurface.tsx gains a separator branch, checked first as the sidebar checks it, that draws a decorative Separator (role none: no button, no tab stop, not announced) instead of falling into the leaf branch's disabled, nameless button; leaf rows draw a present badge (!= null, 0 included) as a Badge with variant = badgeVariant (absent = Badge default), on every leaf and no group heading. The reference is NavigationRenderer in packages/layout/src/NavigationRenderer.tsx (mounted by UnifiedSidebar); no shared piece exists, so the decision is mirrored with Badge/Separator from @object-ui/components (already a dependency) and pinned by a test that renders both surfaces from one spec-valid fixture. NavNode (navSurface.ts) declares badge/badgeVariant typed from the spec's ObjectNavItem; resolveSurface untouched. H1 confirmed (type on node.type); H2 confirmed; H3 half: the runtime hides the rule from assistive tech (objectui#11690), so the rail does too rather than role=separator.",
"tests": "HEAD after last commit: ef5d68f (git rev-parse --short HEAD). (1) verify lock: pnpm exec vitest run packages/app-shell/src/views/studio-design/StudioDesignSurface.railSeparatorBadge-11791.test.tsx -> 'Test Files 1 passed (1)', 'Tests 7 passed (7)', lock 'VERDICT command-exit 0' (at d95885e). (2) reverse verification at d95885e (fix committed first): StudioDesignSurface.tsx checked out from BASE 5aa7f55, marker objectui#11791 grep -c 3 -> 0, file hash == BASE blob 06139364; pin ran 'Tests 4 failed | 3 passed (7)' (rule, unlabeled-row, rule-not-selectable, badge tests red; fixture checks and no-badge control green); restored via git checkout HEAD -- under EXIT/INT/TERM trap, hash == HEAD blob f0b2072b, git diff HEAD empty. (3) verify lock at ef5d68f: pnpm exec vitest run --maxWorkers=2 over the 28 test files that mount InterfacesPillar or import navSurface (new file included) -> 'Test Files 28 passed (28)', 'Tests 208 passed (208)', 'VERDICT command-exit 0'. (4) verify lock at ef5d68f: turbo build --filter='@object-ui/app-shell^...' (28 cached) then pnpm --filter @object-ui/app-shell type-check (tsc --noEmit and tsc -p tsconfig.test.json) -> 'VERDICT command-exit 0'; tsc -p tsconfig.test.json --listFilesOnly lists the new test file (1 hit; control railLabelInherits-11196 1 hit). No ablation build needed: the subject is imported relatively from src.",
"gates": [
"ef5d68f node scripts/check-changeset-presence.mjs EXIT=0: '3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/11791-rail-separator-badge.md.'",
"ef5d68f pnpm check:new-line-citations EXIT=0: 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'",
"ef5d68f pnpm check:control-bytes EXIT=0: 'check-control-bytes: OK (scanned 7852 tracked text file(s); skipped 85 binary).'",
"ef5d68f pnpm check:vi-mock-specifiers / vi-mock-inherit / vi-mock-override-shape / test-path-roots EXIT=0 each (OK lines)",
"ef5d68f pnpm check:changeset-claims EXIT=0 'No pending changeset names a file this change touches.'; check:pending-changeset-literals EXIT=0 'No test source names a pending changeset.'",
"ef5d68f pnpm check:phantom-deps EXIT=0 'Every in-scope import is declared by the package that publishes it.'; check:spec-symbols EXIT=0; check:unreferenced-sources EXIT=0 'Every shipped source file in every covered package is reachable.'",
"ef5d68f pnpm exec eslint --format json on StudioDesignSurface.tsx, navSurface.ts, the new test: EXIT=0, 3 files, 0 errors, 13 warnings, all on lines outside this diff's hunks (pre-existing react-hooks warnings)",
"ef5d68f type-check and tests: see tests field (lock VERDICT command-exit 0 each)",
"NOT RUN: check:i18n-keys / i18n-drift / i18n-dead-keys / i18n-designer-parity, reason: no string added. Full pnpm test and lint farm: CI's."
],
"files_changed": [
"packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (NavTree; Badge and Separator added to the @object-ui/components import list)",
"packages/app-shell/src/views/studio-design/navSurface.ts (NavNode badge/badgeVariant typed from spec ObjectNavItem; module header sentence corrected)",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.railSeparatorBadge-11791.test.tsx (new)",
".changeset/11791-rail-separator-badge.md (new, @object-ui/app-shell patch)"
],
"deviations": [
"File surface: both files are in claim 6050663041, but two edits sit outside the named ranges: the @object-ui/components import list of StudioDesignSurface.tsx (two names), and navSurface.ts's NavNode interface plus module header (not resolveSurface, which is untouched). NavNode is where the spec keys must be declared to read them without a cast (AGENTS.md #0.1); the header sentence was made false by this change. Stated in the PR body.",
"H3: the role=separator / hr half is not taken; the runtime sidebar's decision is a decorative rule hidden from assistive tech (objectui#11690), which the rail mirrors and the pin asserts on both surfaces.",
"Branch merged with main at 4e7dd56 before the PR; main later moved to b0aa892 (3 commits) touching none of the changed files or NavigationRenderer/components ui (diff --stat empty), so not re-merged.",
"The local merge commit was amended before its first push to carry the trailer pair (no force push). Commit trailers follow objectui AGENTS.md's model-free pair (Co-authored-by: Claude), not the harness's model-named line; the PR footer uses the session-URL form from the agent definition.",
"First type-check attempt on ef5d68f ended in lock queue-timeout (exit 99, NOT MEASURED); re-taken with the same slot and passed.",
"No labels written: objectui path labels come from labeler.yml and the dispatch named none."
],
"mcp_calls": "0 — no MCP GitHub calls",
"api_writes": "3 — each one relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches) carrying one write: POST /repos/objectstack-ai/objectui/pulls (draft PR 11873, body read back identical 6870 bytes); POST /repos//issues/11873/assignees (os-bill, read back MATCHES); POST /repos//issues/11791/comments (this os-dev-report). git push is not counted.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed — the nav:menu page block (packages/app-shell/src/views/nav-menu-renderer.tsx) draws an entry's badge with badgeVariant ?? 'secondary' and skips badge '', where the sidebar's absent variant is 'default' and it draws any non-null badge; read in source only, not reproduced at a public door; in the PR's Acceptance notes."
]
}
Implemented-by: os-dev subagent of session_01MgfduSkFrfM3eorB3UGfAU, branch claude/issue-11791-navtree-separator-badge, head ef5d68f.
Reviewed-by: domain:ui seat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and objectui main, not against the report's prose.
Checklist:
PR shape: draft, base main, first line Fixes #11791. No closing keyword sits next to another card. Clause-②: no is at the start of a line.
Scope: 4 files (+300 −3). The StudioDesignSurface.tsx change is NavTree only, plus two names (Badge, Separator) added to its @object-ui/components import. resolveSurface is untouched. Nothing under packages/components/src/ui/** is edited; the PR imports from it.
Matches the runtime sidebar (triage direction):
The badge default is the same. NavigationRenderer.tsx:1587 draws badgeVariant ?? 'default'. The rail passes badgeVariant to Badge, whose own default is the same.
Separator: Separator is decorative = true by default (components/src/ui/separator.tsx:21), so the rule is not announced, the same decision the sidebar made in objectui#11690.
The pin renders both surfaces from one spec-valid fixture.
Clause-②: no holds.NavNode is module-internal, and its new badge / badgeVariant members are typed from spec ObjectNavItem, not widened.
Changeset:@object-ui/app-shell: patch. Every sentence was checked against the diff: the divider, the badge after the label, 0 shown, the badge kept on a disabled row, none on a group heading.
Evidence:
The pin passes 7/7.
Reverse check: with StudioDesignSurface.tsx back at 5aa7f55, 4 of 7 tests fail. The restore was proven.
The 28 files that mount the Interfaces pillar or import navSurface pass: 208 tests.
Type-check passes, under the lock.
CI on ef5d68f: no failure so far, 13 checks still running. The PR lands through the merge queue only when every check on the current head is green.
Deviation, accepted:navSurface.ts was edited outside the claimed resolveSurface range, in two places:
The NavNode interface now declares the two spec keys, so they read without a cast.
The header sentence the change made false was corrected.
Both are named in the PR body. H3 corrected: the rule is decorative, mirroring the sidebar, not role="separator".
Out-of-scope findings: one, put in Acceptance notes and not filed. nav-menu-renderer.tsx defaults the badge variant to secondary and skips an empty badge. That comes from reading source, with no reproduction at a public entry point, so it sits outside the filing gate's three classes.
Activity
objectstack-fleet commentedon Oct 7, 2026
Path: ② the capabilities an end user meets in the app — the navigation rail | 缺项 | P3
Triage: first grade,
bug·priority:p3·domain:ui·area:studio·pm:queue. Direction as the body proposesTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T16:20Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in the Studio Interfaces nav rail ⇒
domain:ui; rationale: a Studio or console surface in objectui. Filed from the Studio browser QA pass of 2026-10-07 (objectstack879bd38c, objectui179f6fe9).separatoras a dividerbadgeandbadgeVariantas the runtime sidebar doesClause-②: no. Patch changeset in objectui.objectstack-fleet commentedon Oct 8, 2026
Deferred, not parked:
domain:uiseat 2 (session_01MgfduSkFrfM3eorB3UGfAU) · 2026-10-08T00:38Z. ⛔ Not a claim. The card stayspm:queue.Why it is not dispatched this round. The body places the fix in
NavTree(StudioDesignSurface.tsx) andresolveSurface(studio-design/navSurface.ts). Seat 1's in-flight objectui#11790 (claim6049484420) holdsNavTree's per-type rows andnavSurface.ts'sresolveSurface. It names this card's separator rendering as out of its scope, but the rows are the same code. Same region: serial across rounds.Known pits for whoever picks it up:
NavTree. Re-read its merged diff first, so the separator and badge branches join that shape rather than a second one.separatoras a divider andbadge/badgeVariantas a pill. Reuse its rendering decision, not a copy of its markup.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
Claim: PM loop round 1
Session:
session_01MgfduSkFrfM3eorB3UGfAUAccount:
os-billBranch:
claude/issue-11791-navtree-separator-badgeWorktree:
objectui-issue-11791Domain:
domain:uiSeat:
domain:ui#2File surface (line numbers on
5aa7f55), underpackages/app-shell/src/views/studio-design/:StudioDesignSurface.tsx:NavTreeonly (about:1756–:1885). Aseparatorentry draws as a divider, not a disabled row. A leaf'sbadge/badgeVariantdraws as the runtime sidebar draws it.navSurface.ts:resolveSurfaceforseparator(about:161–:197), only if the divider needs it..changeset/11791-*.md.⛔ Not on it:
:2165), as objectui#11790 left it;6050316971): the inspector body's studio-canvas branch andstudio-canvas-preview.tsx;6050603483):useDraftAutoSave, the Data and Automations pillars' draft saves, and the publish path;packages/components/src/ui/**andpackages/i18n/**.Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model:
M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)Clause-②: no
Responsibility:
objectui app-shell Studio: NavTree branches on groups and leaves only, so a separator renders as a disabled unlabeled row and a leaf's badge is dropped | none in Studio: the running app's sidebar already draws both | every author designing an app's navigation in Studio's Interfaces pillar, measured by the filer on the showcase (nav_sep_reports; Hours by Status badge NEW)Thread-read: 6049744485
Serial constraints cleared:
noneblocking.6049744485) waited for objectui#11790. It closed as completed at 2026-10-08T01:24Z (merge59ce048), so the release condition holds.area:studioin flight: seat 1's objectui#11823, seat 3's objectui#11786 / studio(data): the field inspector shows the source label while canvas and grid show the translated label, with no hint that a translation overrides it #11782 / dashboards: rotated x-axis labels are clipped, and the dashboard inspector Layout fields are squeezed to unreadable #11796, and this seat's objectui#11781 / studio(automations): Notify recipients are only editable as Advanced JSON, create_record field values are free text, and New automation does not ask for a trigger #11788 / studio: duplicate API reads on entry (packages ×3, _drafts ×4, sys_user_preference ×3) — no shared query cache #11797 / console: Monaco loads from cdn.jsdelivr.net; offline/CSP installs fall back to a textarea and log uncaught errors #11800. Each holds a different region or file, as listed above.NavTreeornavSurface.ts.Why
Clause-②: no: this is Studio-internal rendering of entries the spec already declares. No accepted value, export orpackages/i18nkey changes.Generated by Claude Code
objectstack-fleet commentedon Oct 8, 2026
os-dev-report
{
"issue": 11791,
"status": "done",
"branch": "claude/issue-11791-navtree-separator-badge",
"pr": "#11873",
"session": "session_01MgfduSkFrfM3eorB3UGfAU",
"premise_still_valid": true,
"summary": "NavTree in StudioDesignSurface.tsx gains a separator branch, checked first as the sidebar checks it, that draws a decorative Separator (role none: no button, no tab stop, not announced) instead of falling into the leaf branch's disabled, nameless button; leaf rows draw a present badge (!= null, 0 included) as a Badge with variant = badgeVariant (absent = Badge default), on every leaf and no group heading. The reference is NavigationRenderer in packages/layout/src/NavigationRenderer.tsx (mounted by UnifiedSidebar); no shared piece exists, so the decision is mirrored with Badge/Separator from @object-ui/components (already a dependency) and pinned by a test that renders both surfaces from one spec-valid fixture. NavNode (navSurface.ts) declares badge/badgeVariant typed from the spec's ObjectNavItem; resolveSurface untouched. H1 confirmed (type on node.type); H2 confirmed; H3 half: the runtime hides the rule from assistive tech (objectui#11690), so the rail does too rather than role=separator.",
"tests": "HEAD after last commit: ef5d68f (git rev-parse --short HEAD). (1) verify lock: pnpm exec vitest run packages/app-shell/src/views/studio-design/StudioDesignSurface.railSeparatorBadge-11791.test.tsx -> 'Test Files 1 passed (1)', 'Tests 7 passed (7)', lock 'VERDICT command-exit 0' (at d95885e). (2) reverse verification at d95885e (fix committed first): StudioDesignSurface.tsx checked out from BASE 5aa7f55, marker objectui#11791 grep -c 3 -> 0, file hash == BASE blob 06139364; pin ran 'Tests 4 failed | 3 passed (7)' (rule, unlabeled-row, rule-not-selectable, badge tests red; fixture checks and no-badge control green); restored via git checkout HEAD -- under EXIT/INT/TERM trap, hash == HEAD blob f0b2072b, git diff HEAD empty. (3) verify lock at ef5d68f: pnpm exec vitest run --maxWorkers=2 over the 28 test files that mount InterfacesPillar or import navSurface (new file included) -> 'Test Files 28 passed (28)', 'Tests 208 passed (208)', 'VERDICT command-exit 0'. (4) verify lock at ef5d68f: turbo build --filter='@object-ui/app-shell^...' (28 cached) then pnpm --filter @object-ui/app-shell type-check (tsc --noEmit and tsc -p tsconfig.test.json) -> 'VERDICT command-exit 0'; tsc -p tsconfig.test.json --listFilesOnly lists the new test file (1 hit; control railLabelInherits-11196 1 hit). No ablation build needed: the subject is imported relatively from src.",
"gates": [
"ef5d68f node scripts/check-changeset-presence.mjs EXIT=0: '3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/11791-rail-separator-badge.md.'",
"ef5d68f pnpm check:new-line-citations EXIT=0: 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'",
"ef5d68f pnpm check:control-bytes EXIT=0: 'check-control-bytes: OK (scanned 7852 tracked text file(s); skipped 85 binary).'",
"ef5d68f pnpm check:vi-mock-specifiers / vi-mock-inherit / vi-mock-override-shape / test-path-roots EXIT=0 each (OK lines)",
"ef5d68f pnpm check:changeset-claims EXIT=0 'No pending changeset names a file this change touches.'; check:pending-changeset-literals EXIT=0 'No test source names a pending changeset.'",
"ef5d68f pnpm check:phantom-deps EXIT=0 'Every in-scope import is declared by the package that publishes it.'; check:spec-symbols EXIT=0; check:unreferenced-sources EXIT=0 'Every shipped source file in every covered package is reachable.'",
"ef5d68f pnpm exec eslint --format json on StudioDesignSurface.tsx, navSurface.ts, the new test: EXIT=0, 3 files, 0 errors, 13 warnings, all on lines outside this diff's hunks (pre-existing react-hooks warnings)",
"ef5d68f type-check and tests: see tests field (lock VERDICT command-exit 0 each)",
"NOT RUN: check:i18n-keys / i18n-drift / i18n-dead-keys / i18n-designer-parity, reason: no string added. Full pnpm test and lint farm: CI's."
],
"files_changed": [
"packages/app-shell/src/views/studio-design/StudioDesignSurface.tsx (NavTree; Badge and Separator added to the @object-ui/components import list)",
"packages/app-shell/src/views/studio-design/navSurface.ts (NavNode badge/badgeVariant typed from spec ObjectNavItem; module header sentence corrected)",
"packages/app-shell/src/views/studio-design/StudioDesignSurface.railSeparatorBadge-11791.test.tsx (new)",
".changeset/11791-rail-separator-badge.md (new, @object-ui/app-shell patch)"
],
"deviations": [
"File surface: both files are in claim 6050663041, but two edits sit outside the named ranges: the @object-ui/components import list of StudioDesignSurface.tsx (two names), and navSurface.ts's NavNode interface plus module header (not resolveSurface, which is untouched). NavNode is where the spec keys must be declared to read them without a cast (AGENTS.md #0.1); the header sentence was made false by this change. Stated in the PR body.",
"H3: the role=separator / hr half is not taken; the runtime sidebar's decision is a decorative rule hidden from assistive tech (objectui#11690), which the rail mirrors and the pin asserts on both surfaces.",
"Branch merged with main at 4e7dd56 before the PR; main later moved to b0aa892 (3 commits) touching none of the changed files or NavigationRenderer/components ui (diff --stat empty), so not re-merged.",
"The local merge commit was amended before its first push to carry the trailer pair (no force push). Commit trailers follow objectui AGENTS.md's model-free pair (Co-authored-by: Claude), not the harness's model-named line; the PR footer uses the session-URL form from the agent definition.",
"First type-check attempt on ef5d68f ended in lock queue-timeout (exit 99, NOT MEASURED); re-taken with the same slot and passed.",
"No labels written: objectui path labels come from labeler.yml and the dispatch named none."
],
"mcp_calls": "0 — no MCP GitHub calls",
"api_writes": "3 — each one relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches) carrying one write: POST /repos/objectstack-ai/objectui/pulls (draft PR 11873, body read back identical 6870 bytes); POST /repos//issues/11873/assignees (os-bill, read back MATCHES); POST /repos//issues/11791/comments (this os-dev-report). git push is not counted.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed — the nav:menu page block (packages/app-shell/src/views/nav-menu-renderer.tsx) draws an entry's badge with badgeVariant ?? 'secondary' and skips badge '', where the sidebar's absent variant is 'default' and it draws any non-null badge; read in source only, not reproduced at a public door; in the PR's Acceptance notes."
]
}
objectstack-fleet commentedon Oct 8, 2026
Review: ACCEPT — PR objectui#11873 ·
domain:uiseat 2 · 2026-10-08T03:05ZImplemented-by:
os-devsubagent ofsession_01MgfduSkFrfM3eorB3UGfAU, branchclaude/issue-11791-navtree-separator-badge, headef5d68f.Reviewed-by:
domain:uiseat 2 (session_01MgfduSkFrfM3eorB3UGfAU), against GitHub and objectuimain, not against the report's prose.Checklist:
main, first lineFixes #11791. No closing keyword sits next to another card.Clause-②: nois at the start of a line.StudioDesignSurface.tsxchange isNavTreeonly, plus two names (Badge,Separator) added to its@object-ui/componentsimport.resolveSurfaceis untouched. Nothing underpackages/components/src/ui/**is edited; the PR imports from it.NavigationRenderer.tsx:1587drawsbadgeVariant ?? 'default'. The rail passesbadgeVarianttoBadge, whose own default is the same.Separatorisdecorative = trueby default (components/src/ui/separator.tsx:21), so the rule is not announced, the same decision the sidebar made in objectui#11690.Clause-②: noholds.NavNodeis module-internal, and its newbadge/badgeVariantmembers are typed from specObjectNavItem, not widened.@object-ui/app-shell: patch. Every sentence was checked against the diff: the divider, the badge after the label,0shown, the badge kept on a disabled row, none on a group heading.StudioDesignSurface.tsxback at5aa7f55, 4 of 7 tests fail. The restore was proven.navSurfacepass: 208 tests.ef5d68f: no failure so far, 13 checks still running. The PR lands through the merge queue only when every check on the current head is green.Deviation, accepted:
navSurface.tswas edited outside the claimedresolveSurfacerange, in two places:NavNodeinterface now declares the two spec keys, so they read without a cast.Both are named in the PR body. H3 corrected: the rule is decorative, mirroring the sidebar, not
role="separator".Out-of-scope findings: one, put in Acceptance notes and not filed.
nav-menu-renderer.tsxdefaults the badge variant tosecondaryand skips an empty badge. That comes from reading source, with no reproduction at a public entry point, so it sits outside the filing gate's three classes.Generated by Claude Code
fix(app-shell): Studio's nav rail draws a separator as a divider and …