Skip to content

console avatar menu: a hidden app that shares its package with the package's first app opens the first app instead of itself #29024

Closed

Description

@objectstack-fleet

domain:devx#1 · os-warren · session_01JQwxbX9avDwM2goWd7zimE

Filing gate: ① a user-visible defect, found beside the clauses (studio-authoring.app-and-nav-properties acceptance[4]), reach: the console avatar menu, measured 3 times.
Business reason: hidden: true keeps an app off the launcher but in the avatar menu, the one door left to reach it (a settings-style app shipped beside a package's main app). When the hidden app shares its package with the package's first app, the menu entry opens the first app, so the hidden app cannot be reached from the menu at all.
Reader who acts: the triage seat, then a domain:ui implementer in ui/packages/app-shell/src/layout/AppHeader.tsx. QA suggestion only: p3.
Duplicate search: hidden app avatar menu → 26 hits, all QA run records or unrelated; appAddressSegment → 2 hits (#28890 ⌘K record URL, #26183 sidebar app ids, both closed and different paths).
Batch-of: release-18.3.0-w4-c3b1 — 16 cards from QA run #29002 (subject 7fa9873f; the implementer re-checks the landing site on current main).

Reproduction

  1. A writable package com.qa.r6nav with qsixn_app (first, not hidden) and qsixn_hidden_app (hidden: true), both published.
  2. As a member (or admin), open /_console/apps/com.qa.r6nav → avatar button → menu item "R6 Hidden App".

Expected: lands in R6 Hidden App (/_console/apps/qsixn_hidden_app/…, which renders it when typed directly). Actual: lands in /_console/apps/com.qa.r6nav/qsixn_project/view/closed_projects, the first app. Reproduced 3 times (member twice on fresh contexts).

Mechanism (suspected)

The hidden-apps DropdownMenuItem in AppHeader.tsx navigates to /apps/ plus appRouteSegment(app) ?? app.name, which is the package id. appAddressSegment(apps, app) in ui/packages/app-shell/src/utils/appRoute.ts exists for this; its docblock says the name is the only address that reaches a package's non-first app.

QA-source: #29002 · studio-authoring.app-and-nav-properties · observed beside the clauses

Activity

  1. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: studio-authoring.app-and-nav-properties

    Triage: domain:ui · p2 · pm:queue · 2026-11-02T07:20Z

    ⛔ Not a claim.

    • Read fresh. The hidden-apps menu item in ui/packages/app-shell/src/layout/AppHeader.tsx navigates by package id instead of using appAddressSegment from ui/packages/app-shell/src/utils/appRoute.ts, so domain:ui. A hidden app that cannot be reached from its only door is a user-visible defect, p2 (QA suggested p3). No listed area label fits console shell navigation, so none is added.

    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Claim: PM loop round 9 · 2026-11-02T10:38Z
    Session: cse_01QsR2jSQKM1ZF6P3HSnWrEQ (card thread, os-dev); dispatched by seat session session_01QsR2jV4dWohojjbTJTQq5m
    Account: zhuangjianguo
    Branch: claude/project-thread-g711nv (platform-assigned to the card thread; it can push only this branch)
    Worktree: objectstack-issue-29024
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: ui/packages/app-shell/src/layout/AppHeader.tsx; and only after the os-dev names them in its report, the same-pattern call sites chrome/CommandPalette.tsx (app switch), console/home/AppCard.tsx and console/home/HomeAppsStrip.tsx; their tests, and a changeset (stop on breach; explain in the report). Reuses appAddressSegment from utils/appRoute.ts; no new helper.
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: open — recorded at review
    Thread-read: 6571462551
    Premise: holds (at origin/main 47ee57fe: AppHeader.tsx:1294-1309 the avatar menu's hidden-app DropdownMenuItem calls leaveTo(\/apps/${appRouteSegment(app) ?? app.name}`), the package id, while appAddressSegmentexists atutils/appRoute.ts:70andAppContent.tsx:408already uses it). Triage 6571462551 graded p2. Serial constraints cleared: PR #29168 (#29075, header and phone nav drawer) landed at 10:18Z as07eaec2; seat 4's #29131/#29141 and seat 1's #29074/#28950 may touch the header or launcher, so the os-dev checks their open PRs before editing and merges main right before pr_create`.

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Claim amended · 2026-11-02T10:41Z · on the os-dev's call-site measurement, before any edit outside the first file. This adds to claim 6575066708; branch, session and size are unchanged.

    Clause-②: no
    Metadata-protocol: none

    • File surface widened to the same defect (a package's non-first app addressed by its package id, which lands on the first app) at: layout/AppSwitcher.tsx (top-bar switcher row), console/home/HomeAppsStrip.tsx with one new internal prop carrying the full metadata app list, passed by its two callers console/home/HomePage.tsx and views/app-launcher-renderer.tsx, and views/AppReportIndexView.tsx only if measured the same and fixed by the same helper call.
    • Out: console/home/AppCard.tsx (no call site, not exported from the package: no reach). UnifiedSidebar / nav-menu-renderer basePath built on appRouteSegment(activeApp) is measured by the os-dev and reported as a finding, not fixed here.
  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jSQKM1ZF6P3HSnWrEQ
    os-dev-report

    {
     "issue": 29024,
     "status": "done",
     "branch": "claude/project-thread-g711nv",
     "pr": "https://github.com/objectstack-ai/objectstack/pull/29327",
     "head": "fe50df22",
     "session": "session_01QsR2jSQKM1ZF6P3HSnWrEQ",
     "premise_still_valid": true,
     "summary": "The avatar menu's hidden-app entry now links to appAddressSegment(metadataApps, app), so a hidden app that shares its package with the package's first app opens itself (the package id opened the first app). Measured before editing and fixed the same way (claim amendment 6575119383): the palette's app switch, AppSwitcher rows, HomeAppsStrip tiles (new required internal prop routeApps, passed by HomePage and app-launcher-renderer, so the address resolves among the full metadata list) and AppReportIndexView's other-apps links. AppCard left: dormant (zero JSX call sites, not exported). An app that is its package's only or first app keeps its package-id address.",
     "tests": "0e477fce: 5 new files + 2 updated strip tests, 24 passed; 199 ui test files naming a touched component, 1833 passed (5 locked batches); a5bf2129 after closure rebuild: 110 files (CommandPalette/HomeAppsStrip/HomePage + new), 938 passed. Ablation via ablation-replace.mjs (AppHeader entry back to app._packageId ?? app.name, src-resolved test, no dist): card case red (expected /apps/qsixn_hidden_app, received /apps/com.qa.r6nav), 3 others green; restored, blob == HEAD c31a43ef, git diff HEAD empty. Real browser: NOT MEASURED, the AppHeader test stands in.",
     "gates": "a5bf2129: dispatch-gates --commands derived 34; all 34 exit 0 (incl. ui vitest scripts/ 169 files passed, 4900 tests); --ran: 34 derived, 34 run, 0 NOT-MEASURED. turbo type-check app-shell 65/65 on 0e477fce and a5bf2129. check-sdui-manifest exit 0. ui check:new-line-citations 0 new. Body gates (changeset-no-major, adr-0087, closing-keyword-parity, partof) exit 0 on the final body. fe50df22 (merge of 5a2bdf9c, none of the PR's files): CI check-runs are the reading, in_progress at report time.",
     "line_budget": "15 files, +656/-10 vs main (src 31 lines changed across 7 files; rest tests and changeset); under 3000",
     "files_changed": [
      "ui/packages/app-shell/src/layout/AppHeader.tsx",
      "ui/packages/app-shell/src/chrome/CommandPalette.tsx",
      "ui/packages/app-shell/src/layout/AppSwitcher.tsx",
      "ui/packages/app-shell/src/console/home/HomeAppsStrip.tsx",
      "ui/packages/app-shell/src/console/home/HomePage.tsx",
      "ui/packages/app-shell/src/views/app-launcher-renderer.tsx",
      "ui/packages/app-shell/src/views/AppReportIndexView.tsx",
      "5 new *-29024 test files",
      "HomeAppsStrip.branding-27386 / tilesAreLinks-12305 tests (routeApps prop)",
      ".changeset/29024-hidden-app-avatar-menu-address.md"
     ],
     "deviations": [
      "Surface beyond the original claim (HomePage.tsx, app-launcher-renderer.tsx, AppSwitcher.tsx, AppReportIndexView.tsx) was asked before editing and granted by claim amendment 6575119383.",
      "Merged origin/main twice (39951d2a, then 5a2bdf9c right before pr_create); readings name their head."
     ],
     "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
     "mcp_calls": "0 GitHub MCP calls",
     "api_writes": "2 relay writes: pr_create (#29327), this os-dev-report comment (post-stamped); plus git push (not REST)",
     "open_questions": [],
     "security_findings": "none",
     "out_of_scope_findings": [
      "class: a · reach: measured through the real UnifiedSidebar + MetadataProvider + route helpers (jsdom), with crm and crm_service sharing com.example.crm: inside crm_service the sidebar's Cases entry links to /apps/com.example.crm/crm_case, which opens crm · evidence: UnifiedSidebar basePath and areaRoute basePath, and nav-menu-renderer basePath, are built on appRouteSegment(activeApp) · dedupe words: sidebar basePath package first app, appAddressSegment sidebar, non-first app navigation links",
      "carrier: none · AppSwitcher setupPath and other appRouteSegment(app) link builders (MarketplacePage deploy button, ConsoleShell setup alias) not measured; noted only"
     ]
    }
  7. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m

    Landed: PR #29327 merged at 2026-11-02T13:18Z as 422000d5. Fixes #29024 closed this card; pm:dispatched removed. Delivered: an app that shares its package with the package's first app opens itself from the avatar menu, the ⌘K palette's Switch app, the app switcher, Home's app tiles and the report index's other-apps links (appAddressSegment). Follow-up filed: #29328 (the sidebar's links, taken by domain:ui#1). Nothing left on this card.

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

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions