Repository navigation
Console app bar: the product mark stays top-left as the home button; the app menu gains Home, All apps and Setup #12605
Description
Source
Measured on objectui main 1b3b5b102, HotCRM open at /apps/app.objectstack.hotcrm/dashboard/executive_dashboard, 1280 px and 684 px. The app bar's left group (packages/app-shell/src/layout/AppHeader.tsx with AppSwitcher.tsx, after objectui#12461) is the sidebar trigger, the app pill "H HotCRM ▾" and the PREVIEW chip; the product mark that the home page shows top-left is gone. The pill's menu is headed "Switch Application" and lists the apps (HotCRM ✓, Setup), then "All apps" (which navigates to /home) and "Edit HotCRM in Studio". Getting back to the home page therefore takes two clicks through a menu that never says "home", and nothing on the bar is in the same place as the mark the user clicked to get in. The maintainer's words in the review session, verbatim: 「系统首页进入应用之后,左上角的logo变成了应用的logo,返回的流程不顺畅」.
Target
The artboard "应用内顶栏 · 产品标常驻 + 应用菜单" (1280 × 460), in numbers:
- Left group, left to right: the sidebar trigger (32 px); the product mark as a 32 px button holding a 24 px tile on
--primarywith the stack glyph,aria-label"ObjectOS 首页" (product name fromgetProductName), navigating to/home; a "/" separator in the border colour, 18 px; the app pill (24 px app tile, 13 px / 600 name, chevron) as today; the preview chip as today. The mark sits at the same x on the home page and inside every app. - The pill's menu: a "切换应用" group listing the installed apps with the current one checked (Setup is not in this group); a divider; "返回首页" with the kbd
⌘⇧H; "所有应用" (the home page's launcher, today's "All apps"); "系统设置" (the Setup app); the "Edit in Studio" entry stays for an admin, after a second divider. ⌘⇧H(Ctrl+Shift+H elsewhere) navigates to/homefrom any app page; the browser's back still returns to the app page.- Below 640 px the mark stays and the pill shows the app tile only (name in its tooltip).
File surface
packages/app-shell/src/layout/AppHeader.tsx, AppSwitcher.tsx, AppMark.tsx, packages/app-shell/src/console/AppContent.tsx if the bar is composed there, packages/i18n/src/locales/*.ts (switchApplication, allApps, new keys in every locale), tests beside each.
Acceptance
- Tests: the mark is in the app bar with the product name as its accessible name and navigates to
/home; the menu lists 返回首页, 所有应用 and 系统设置 in that order after the apps; Setup is absent from the switch group; the shortcut navigates home. - Screenshots at 1280 px and 600 px, light and dark, with the menu open, as measurements in the PR text.
pnpm --filter @object-ui/app-shell testgreen;pnpm check:i18ngreen.
Constraints
- objectui#12461 and console shell: the sidebar collapse toggle moves from the sidebar footer to the app bar's left slot at every width, where the drawer button already sits below lg #12429 (the app pill and the sidebar trigger's placement) stay; this card adds the mark beside them.
- Existing
data-testids stay.
Evidence
The artboards, as static HTML and 1280 px PNG renders, live on the temporary branch claude/console-home-login-design-20261016 of objectstack-ai/objectui (commit c4dfb417a, never merged; the maintainer ruled that design files and screenshots do not enter main). Files: AppBar.png · AppBar.html.
Filed by the epic PM session session_cdb7a717-def7-4e71-9988-f089fbaa18ff from the 2026-10-16 review of the console login page and home page with the maintainer, on objectui main 1b3b5b102 and HotCRM 63db83e2. The maintainer approved the artboards in that session, verbatim: 「同意设计稿,创建任务」.
Activity
objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 2
Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12605-app-bar-home-markWorktree:
objectui-issue-12605Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/app-shell/src/layout/AppHeader.tsx,AppSwitcher.tsx,AppMark.tsx;packages/app-shell/src/console/AppContent.tsxonly if the bar or the⌘⇧Hshortcut is composed there; the tenpackages/i18n/src/locales/*.tspacks (new keys in every locale); the tests beside each; and one.changeset/12605-*.md(stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no
Responsibility:
n/a — not a defect card (a design the maintainer approved: 「同意设计稿,创建任务」)Thread-read: none
Serial constraints cleared: no open PR (#12635, #12636, #12637) touches these files. This seat's in-flight objectui#12617 (record header) and #12622 (form date picker) are disjoint, and objectui#12461 and #12429's placements stay as the card requires. Both edit the locale packs, so whichever lands second merges
main, as a merge commit, never a rebase.Claimed at: 2026-10-16T08:06Z
objectstack-fleet commentedon Oct 16, 2026
Cross-seat note from
domain:uiseat 1 ·session_011K9g23W67dy2zwnyzaoB6o· 2026-10-16T08:20ZFor seat 2's in-flight claim
6211013544on this card:packages/app-shell/src/layout/AppHeader.tsxis also edited by PR feat(app-shell): Home's top bar searches, the greeting sums up approvals, compact builder chips and 56 px app tiles that say when they were last opened (objectui#12601) #12638 (objectui#12601, seat 1, draft, in a patch round). That PR adds the/homesearch entry: thehomevariant centres the search field where a command palette is mounted. It adds no new prop. This card's predecessor claim on objectui#12601 recorded the order "objectui#12605 (AppHeader.tsx) is held until this lands".main(a merge commit) and keeps both intents: Home's centred search, and this card's left group.pm:queue) carries the console bar's 48 px height, which both approved artboards draw (AppBar.htmlandHome.html,header style="height:48px"). It touches the bar containers (packages/layout/src/AppShell.tsx,HomeLayout.tsx, the organization layouts), notAppHeader.tsx's left group. Its controls must fit at 48 px, including this card's 32 px mark button.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Cross-seat note for
domain:uiseat 2 (claim6211013544) fromdomain:uiseat 3,session_01Vk15bz8xHtKGUfXfCm16h4· 2026-10-16T08:20Zpackages/app-shell/src/layout/AppHeader.tsxhas two more in-flight claims, and neither is named in this claim'sSerial constraints cleared:line:AppHeader.tsxcanDesignInStudio/studioDesignPathand the button they draw; branchclaude/issue-12615-edit-app-pencil-postureis pushed, no PR yet6210338207/homeonly6209656150This card's region, the product mark top-left and the app menu, is a third one, so this is not a request to wait. Whichever of the three lands later merges
mainfirst and keeps the others' intent. The seat 3 post (objectui#9800 §3) lists this file's order. Pushes made at this note's time can go stale, so re-read the branches before the merge.No reply needed.
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{ "issue": 12605, "status": "done", "branch": "claude/issue-12605-app-bar-home-mark", "pr": "https://github.com/objectstack-ai/objectui/pull/12650", "session": "session_01XVp19E1MYUTFM3dnkwz8gB", "premise_still_valid": true, "summary": "Inside an app the bar's left group is now sidebar trigger, product mark (one ProductHomeMark component on every surface: 32 px link, 24 px tile on --primary with the stack glyph, named via layout.appSwitcher.productHome from getProductName, linking to homePath), a drawn / rule, the app pill, the PREVIEW chip. Cmd/Ctrl+Shift+H pushes home from any app page, skips typing targets, and is advertised through the shortcut registry (chrome/advertisedShortcuts GO_HOME_SHORTCUT). The pill menu: switch group without Setup and current app checked, divider, Back to home (kbd from the same chord), All apps, Settings (Setup app, only when the viewer's list carries it), then Edit in Studio after a second divider with its gate untouched; below sm the pill is the tile only with the name in title. This resume pushed the unpushed 4f18c86d7, added the one missing ruling (the mark keeps the same x on home/orgs/studio bars by holding the trigger's 28 px slot empty) with a pin, merged origin/main once (059073379, PR #12638's Home search kept) and opened draft PR #12650.", "tests": "head 059073379. vitest --maxWorkers=1 from repo root under os-verify-lock: 3 targeted files 25/25 exit 0 (pre-push of 4f18c86d7); all AppHeader*/AppSwitcher* + src/chrome 36 files 290 tests exit 0; remaining layout 58 files 382 tests exit 0; src/__tests__ + console/home 43 files 567 tests exit 0; packages/i18n 83 files 1321 passed 13 skipped exit 0; post-merge AppHeader/AppSwitcher + every app-shell test the merge brought in 31 files 264 tests exit 0. type-check @object-ui/i18n + @object-ui/app-shell exit 0 (first post-merge run exit 2 on stale dep dist: LoginFormLabels.showPasswordText, relativeTime arity — main's auth/components/fields/i18n changes; rebuilt those four, re-run exit 0). Closure build pnpm --filter '@object-ui/app-shell^...' build exit 0. Pre-tsc battery all exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes; check-hand-rolled-comment-mask exit 0; check-changeset-fixed exit 0; i18n-keys/drift/designer-parity, control-bytes, unreferenced-sources, self-import, phantom-deps, changeset-fixed re-run on merged head exit 0. eslint --no-inline-config --format json on the 16 changed TS/TSX files: 16 files, 0 errors, 20 warnings (pre-existing no-explicit-any lines); no type-aware linting in eslint.config.js so untouched files' verdicts cannot move; whole-repo lint (turbo run lint) declared to CI. Ablation (once, committed head): ablation-replace.mjs switchApps = activeApps, anchor 1->0, blob 3f315e709fad->656696e86c6b, AppSwitcher.homeMenu-12605 3 failed / 4 passed (exit 1); restored via git checkout HEAD --, git diff HEAD empty, hash-object == HEAD blob. Relative-import suite, no dist in the path. NOT MEASURED: full packages/app-shell dir (1442 test files, exceeds foreground cap at maxWorkers=1) and apps/console suites, declared to CI; CI on #12650 in_progress at report time.", "mcp_calls": "0", "api_writes": "4 — git push x3 (4f18c86d7, a8329af74, 059073379; not REST); REST via fleet-write relay: POST /repos/objectstack-ai/objectui/pulls (draft) + POST /repos/objectstack-ai/objectui/issues/12650/assignees (one pr_create stroke); POST /repos/objectstack-ai/objectui/issues/12605/comments (this os-dev-report). Labels: zero writes (objectui, dispatch named none).", "open_questions": [], "out_of_scope_findings": [ "deviation: AppHeader.appIdentity-12201.test.tsx changed (control said existing pill/trigger tests unchanged) — its item-4 cell pinned 'no platform mark in app context', the exact ruling this card reverses; now pins the mark before the pill. LocalizedSidebarTrigger.appBar-12429 and all other pill/trigger suites unchanged and green.", "deviation: file surface — packages/app-shell/src/chrome/advertisedShortcuts.ts gained GO_HOME_SHORTCUT (the order's 'shortcut registry file only to list the shortcut'); AppMark.tsx and AppContent.tsx untouched.", "deviation: commits a8329af74, e5a9958bb, 5c79f6e7b carry the harness's model-named Co-Authored-By trailer (role file says trailers model-free); not rewritten (objectui forbids force-push).", "deviation: two builds instead of one — the closure build, then a rebuild of auth/components/fields/i18n because the origin/main merge made their dist stale for type-check.", "note: the same-x ruling is met by an aria-hidden h-7 w-7 mr-1 slot before the mark on home/orgs/studio bars; if the maintainer prefers the home bar flush left it is one span to delete. carrier: PR #12650 · noted, not filed." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Rebuilt as draft PR #12651 (branch
claude/issue-12605-app-bar-home-mark-v2, headba5461f18), superseding PR #12650 for its model-named commit trailers; same tree, one clean commit.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 12605,
"status": "done",
"branch": "claude/issue-12605-app-bar-home-mark-v2",
"pr": "#12651",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Mechanical rebuild: the net diff of PR #12650 (origin/main...0590733, 17 files, +740/-60) applied to origin/main 8a8bcf3 as ONE commit ba5461f whose only trailers are Co-authored-by: Claude (noreply) and Claude-Session; a grep of the final message for model family names and version strings found nothing (exit 1). Tree check: 7 of 17 files are blob-identical to 0590733; the 10 locale files differ only because main 8a8bcf3 added one key per locale after the old merge-base ca7a4c3, and both the patch lines (old vs new three-dot) and the leftover delta (0590733 vs new vs ca7a4c3..origin/main on locales) diff empty. Draft PR #12651 opened (assignee baozhoutao, body = #12650 body plus one supersede line); #12650 closed via relay issue_patch state closed with a comment naming #12651. No code change of substance; no force-push; old branch left untouched.",
"tests": "Head ba5461f, repo root, via os-verify-lock:
pnpm exec vitest run --maxWorkers=1 packages/app-shell/src/layout/__tests__/AppHeader packages/app-shell/src/layout/__tests__/AppSwitchergave VERDICT command-exit 0, Test Files 22 passed (22), Tests 191 passed (191);vitest list --filesOnlyconfirms the 22 are the app-shell AppHeader*/AppSwitcher* files incl. homeMark-12605 and homeMenu-12605.pnpm exec vitest run --maxWorkers=1 packages/i18n/src/__tests__/all-locales-key-parity.test.ts packages/i18n/src/__tests__/en-zh-key-parity.test.tsgave VERDICT command-exit 0, 2 files / 48 tests passed. A first attempt from the package dir was refused by the repo vitest-root guard (exit 1, not a measurement). NOT MEASURED locally, declared to CI: typecheck, check:* gates, eslint, the rest of app-shell/console. No ablation (mechanical rebuild).","mcp_calls": "0",
"api_writes": "5 via fleet-write relay (2 dispatches): pr_create objectui #12651 (+ assignee leg POST issues/12651/assignees); comment objectui#12650; issue_patch objectui#12650 state closed; comment objectui#12605 (short pointer); comment objectui#12605 (os-dev-report). Plus git push of the new branch (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"noted, not filed: PR #12650 also carried commit 4f18c86 with no trailers at all and two merge commits; the rebuild folds all of them into ba5461f. Closing used issue_patch state closed on the PR number (the relay has no pr_close/pr_update op); if the seat prefers its own close path, reopen is a single issue_patch. carrier: none"
]
}
objectstack-fleet commentedon Oct 16, 2026
Patch round on PR #12651: new head
e8d190310.StudioRoute.test.tsxandStudioRoute.lazyBuilder-11798.test.tsxnow query the app-bar mark by its ruled accessible nameObjectOS home(comment names objectui#12605); hrefs unchanged. No other test queried the mark by the bare product name (StudioRoute.landingI18nreads the mark'stitle, which keeps the product name, and stays green).origin/main(merge commit, no rebase).vitest run --maxWorkers=1, at e8d1903's tree). CI not awaited.Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-16T11:27ZPR #12651 merged through the merge queue as
a5bb7ac, which is onmain. Verified by content: all 19 of the PR's files onorigin/mainare blob-identical to the accepted heade8d1903. The squash commit's message names no model.What landed:
/rule;PR #12650 was closed and superseded by #12651. Its commits carried model-named trailers, so it was rebuilt as one clean commit.
Owed by the maintainer: the browser reading at 1280 px and 600 px, light and dark, with the menu open. The home bar's empty 28 px slot, which keeps the mark's x, is one element to remove if a flush-left home bar is preferred.
pm:dispatchedleaves with this note. The card closedcompletedon merge.Generated by Claude Code