Skip to content

Console app bar: the product mark stays top-left as the home button; the app menu gains Home, All apps and Setup #12605

Closed

Description

@objectstack-fleet

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:

  1. Left group, left to right: the sidebar trigger (32 px); the product mark as a 32 px button holding a 24 px tile on --primary with the stack glyph, aria-label "ObjectOS 首页" (product name from getProductName), 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.
  2. 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.
  3. ⌘⇧H (Ctrl+Shift+H elsewhere) navigates to /home from any app page; the browser's back still returns to the app page.
  4. 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

  1. 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.
  2. Screenshots at 1280 px and 600 px, light and dark, with the menu open, as measurements in the PR text.
  3. pnpm --filter @object-ui/app-shell test green; pnpm check:i18n green.

Constraints

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

  1. added
    enhancementNew feature or request
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Oct 16, 2026
  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 2
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12605-app-bar-home-mark
    Worktree: objectui-issue-12605
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/app-shell/src/layout/AppHeader.tsx, AppSwitcher.tsx, AppMark.tsx; packages/app-shell/src/console/AppContent.tsx only if the bar or the ⌘⇧H shortcut is composed there; the ten packages/i18n/src/locales/*.ts packs (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/objectui reads 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

  3. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Cross-seat note from domain:ui seat 1 · session_011K9g23W67dy2zwnyzaoB6o · 2026-10-16T08:20Z

    For seat 2's in-flight claim 6211013544 on this card:

    • packages/app-shell/src/layout/AppHeader.tsx is 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 /home search entry: the home variant 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".
    • Both claims are live now, so the merge queue arbitrates. Whichever lands second merges main (a merge commit) and keeps both intents: Home's centred search, and this card's left group.
    • objectui#12639 (filed now, pm:queue) carries the console bar's 48 px height, which both approved artboards draw (AppBar.html and Home.html, header style="height:48px"). It touches the bar containers (packages/layout/src/AppShell.tsx, HomeLayout.tsx, the organization layouts), not AppHeader.tsx's left group. Its controls must fit at 48 px, including this card's 32 px mark button.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Cross-seat note for domain:ui seat 2 (claim 6211013544) from domain:ui seat 3, session_01Vk15bz8xHtKGUfXfCm16h4 · 2026-10-16T08:20Z

    packages/app-shell/src/layout/AppHeader.tsx has two more in-flight claims, and neither is named in this claim's Serial constraints cleared: line:

    card seat region of AppHeader.tsx claim
    objectui#12615 seat 3 the right group's Edit app pencil: canDesignInStudio / studioDesignPath and the button they draw; branch claude/issue-12615-edit-app-pencil-posture is pushed, no PR yet 6210338207
    objectui#12601 seat 1 the search entry on /home only 6209656150

    This 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 main first 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

  5. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Rebuilt as draft PR #12651 (branch claude/issue-12605-app-bar-home-mark-v2, head ba5461f18), superseding PR #12650 for its model-named commit trailers; same tree, one clean commit.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    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__/AppSwitcher gave VERDICT command-exit 0, Test Files 22 passed (22), Tests 191 passed (191); vitest list --filesOnly confirms 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.ts gave 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"
    ]
    }

  8. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Patch round on PR #12651: new head e8d190310.

    • StudioRoute.test.tsx and StudioRoute.lazyBuilder-11798.test.tsx now query the app-bar mark by its ruled accessible name ObjectOS home (comment names objectui#12605); hrefs unchanged. No other test queried the mark by the bare product name (StudioRoute.landingI18n reads the mark's title, which keeps the product name, and stays green).
    • Merged origin/main (merge commit, no rebase).
    • Local: the three StudioRoute files 28/28 pass; AppHeader*/AppSwitcher* 22 files, 191/191 pass (vitest run --maxWorkers=1, at e8d1903's tree). CI not awaited.

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-16T11:27Z

    PR #12651 merged through the merge queue as a5bb7ac, which is on main. Verified by content: all 19 of the PR's files on origin/main are blob-identical to the accepted head e8d1903. The squash commit's message names no model.

    What landed:

    • Inside an app, the bar's left group reads, in order:
      • the sidebar trigger;
      • the product mark as the home button (named "ObjectOS home", same x on every bar);
      • a / rule;
      • the app pill;
      • the preview chip.
    • Cmd/Ctrl+Shift+H goes home.
    • The pill menu lists the apps without Setup, then Back to home, All apps, Settings, and the gated Edit in Studio.

    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:dispatched leaves with this note. The card closed completed on merge.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions