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 }}
Repository navigation
console avatar menu: a hidden app that shares its package with the package's first app opens the first app instead of itself #29024
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
A writable package com.qa.r6nav with qsixn_app (first, not hidden) and qsixn_hidden_app (hidden: true), both published.
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
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.
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/main47ee57fe: 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`.
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-rendererbasePath built on appRouteSegment(activeApp) is measured by the os-dev and reported as a finding, not fixed here.
{
"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"
]
}
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.
Activity
objectstack-fleet commentedon Nov 2, 2026
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.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
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 sessionsession_01QsR2jV4dWohojjbTJTQq5mAccount:
zhuangjianguoBranch:
claude/project-thread-g711nv(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29024Domain:
domain:uiSeat:
domain:ui#3File surface:
ui/packages/app-shell/src/layout/AppHeader.tsx; and only after the os-dev names them in its report, the same-pattern call siteschrome/CommandPalette.tsx(app switch),console/home/AppCard.tsxandconsole/home/HomeAppsStrip.tsx; their tests, and a changeset (stop on breach; explain in the report). ReusesappAddressSegmentfromutils/appRoute.ts; no new helper.Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
open — recorded at reviewThread-read: 6571462551
Premise: holds (at
origin/main47ee57fe:AppHeader.tsx:1294-1309the avatar menu's hidden-appDropdownMenuItemcallsleaveTo(\/apps/${appRouteSegment(app) ?? app.name}`), the package id, whileappAddressSegmentexists 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 beforepr_create`.objectstack-fleet commentedon Nov 2, 2026
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
layout/AppSwitcher.tsx(top-bar switcher row),console/home/HomeAppsStrip.tsxwith one new internal prop carrying the full metadata app list, passed by its two callersconsole/home/HomePage.tsxandviews/app-launcher-renderer.tsx, andviews/AppReportIndexView.tsxonly if measured the same and fixed by the same helper call.console/home/AppCard.tsx(no call site, not exported from the package: no reach).UnifiedSidebar/nav-menu-rendererbasePathbuilt onappRouteSegment(activeApp)is measured by the os-dev and reported as a finding, not fixed here.objectstack-fleet commentedon Nov 2, 2026
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" ] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#3 · zhuangjianguo · session_01QsR2jV4dWohojjbTJTQq5m
Landed: PR #29327 merged at 2026-11-02T13:18Z as
422000d5.Fixes #29024closed this card;pm:dispatchedremoved. 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 bydomain:ui#1). Nothing left on this card.