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: one app's sidebar opens pages under two app ids — /apps/clm/… for contracts, /apps/app.objectstack.hotclm/… for obligations and the approvals inbox #26183
Filing class: ① user-visible defect — reach: public door, measured in a browser on 18.1.0 (the Console objectstack dev --ui serves) with objectstack-ai/hotclm main. Reader: the UI lane, ui/packages/app-shell navigation (the route segment objectui#11887 keyed paths on).
Business reason
Users bookmark and share these addresses. Within one app's sidebar, half the entries open under the app name and half under the package id, so the same app has two address families, and a link copied from one entry does not look like a link from the next.
Measured (hotclm: app name: 'clm', package id app.objectstack.hotclm)
待我处理 (component nav, the approvals inbox) → /_console/apps/app.objectstack.hotclm/component/approvals/inbox, and a request opened from it → /_console/apps/app.objectstack.hotclm/sys_approval_request/record/<id>
The sidebar stays the same app in both, so nothing breaks; the addresses differ.
Expected
Every entry of one app routes under one segment, whichever objectui#11818 / #11887 chose as canonical.
Dedupe: the archived objectui issues (2,000 most recently updated, all states) grepped for package id / app name in routes — objectui#11818 ("console routes address the same app by package id and by app name", closed by #11887) is this symptom; it is still visible on the 18.1.0 Console, so either the fix is not in the Console 18.1.0 ships or these two nav kinds were not covered.
Filed from the hotclm browser regression thread (2026-10-26); maintainer: 「平台的问题应该提交issue到平台」.
p2: one app's sidebar builds two address families (the app name against the package id), which breaks bookmarks and shared links. Pick one key for every route of an app (objectui#11887's choice), and redirect the other spelling.
Claim: PM loop round 1
Session: session_017iXjUm1rujwDk7f3KT1Pkk (seat); implementing card thread session_01WMwiEU2YGp3QigAjKszWFq
Account: os-steve
Branch: claude/project-thread-2gyl9h (platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)
Worktree: the card thread's own container
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/app-shell navigation: the object-nav (with viewName) and component-nav href builders, plus tests, and a root .changeset/ patch. Old addresses must keep resolving (stop on breach; explain in the report). ⛔ ui/.github/** and the root .github/workflows/ci.yml are out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root .changeset/.
Container & model: small, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: medium
Clause-②: no
Metadata-protocol: none
Responsibility: n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public Console
Thread-read: 6420644362
Premise: holds as filed (triage graded p2 15:58Z; browser-measured on the 18.1.0 Console; the dev re-reads the nav href builders on origin/main3d50a43b as step 1 and stops if main already routes both kinds under one segment; 2026-10-26T17:36Z). Borrowed from seat 2 (#25995) by agreement at 17:32Z, under the priority-first rule
Serial constraints cleared: none (app-shell is outside the sdui closure; the dev scans open PRs for the same nav files before editing)
Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.
Claim amendment (seat domain:ui#1, 2026-10-26T17:39Z): amends the claim 6423072682 after the dev's step-1 reading on origin/main3d50a43b. Append-only.
Measured: the canonical segment is the package id (ADR-0048 §3.6, ui/packages/app-shell/src/utils/appRoute.tsappRouteSegment; objectui#11818/#11887). The sidebar already builds every entry kind on it: UnifiedSidebar's basePath is /apps/${appRouteSegment(activeApp)}, and NavigationRendererresolveHref builds object (with viewName), component, page, dashboard, report and doc hrefs on that basePath. The card's obligations and approvals addresses are therefore the canonical ones. The name family comes from the app-name alias:
matchAppBySegment accepts the name, and AppContent then keys every path it builds on the URL's own segment.
Two landing producers emit the name: homePath.tsresolveDeclaredHomePath (logo / Home) and the console's RootLandingRedirectresolveLandingPath (the post-login /).
Route, replaced: the nav href builders are not the defect and stay untouched.
When the URL segment matched by the name alias and differs from the app's package-id segment, AppContent replace-navigates to the same path, search and hash under the package id, and keys appSegment on the canonical segment. Old name addresses keep resolving; they now redirect.
Both landing producers emit appRouteSegment(app), so there is no extra hop.
File surface, replaced:ui/packages/app-shell/src/console/AppContent.tsx, ui/packages/app-shell/src/utils/homePath.ts, ui/apps/console/src/components/RootLandingRedirect.tsx, tests beside them, and a root .changeset/ patch (app-shell, console). Both packages are outside the sdui closure.
Serial constraints, updated:AppContent.tsx is also edited by #26202 (#26172, the toast region, disjoint), which is armed and in the queue. This PR merges origin/main after #26202 lands and before it is armed.
{
"issue": 26183,
"status": "done",
"branch": "claude/project-thread-2gyl9h",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26262",
"session": "session_01WMwiEU2YGp3QigAjKszWFq",
"premise_still_valid": true,
"summary": "Symptom holds, attribution corrected: on origin/main 3d50a43b the sidebar already builds EVERY entry kind (object with viewName, component, page, dashboard, report, doc) on appRouteSegment = the package id, which ADR-0048 3.6 names canonical. The second family is the app-NAME alias: AppContent kept building on the URL's own segment, and the post-login landing (resolveLandingPath) and the logo/Home target (resolveDeclaredHomePath) both emitted the name. Fix: AppContent replace-navigates a name-alias route onto the app's one address (appAddressSegment: package id when it resolves back to the same app, else the name), keeping path, search, hash and history state, and keys appSegment on that address; both landing producers name the address directly. Old name URLs keep opening. Route and file surface approved by the seat (claim amendment 6423123764).",
"tests": "head bcab36d9. Local (os-verify-lock, ui root, --maxWorkers=2): apps/console/src + app-shell src/console, src/utils, src/hooks + homeAffordancesFollowDeclaration-7256 + homeRecoveryRedirectsFollowDeclaration-7373: Test Files 565 passed / 1 skipped (566), Tests 5219 passed / 8 skipped, VERDICT command-exit 0 (run on ef4efb25; later commits only touch three test files, re-run 3x: 5 files 19/19 each). New AppContent.nameAliasRedirect-26183 4/4. Ablation (AppContent effect early-returned, on-disk marker grep -c 1, restored via git checkout HEAD, git diff HEAD empty): the alias test and the 11818 alias control went red (2 failed / 4 passed), controls green. Pins updated for the address change: 11818 alias control, 12079 empty-navigation landing x2, 12980 page-scope pins booted on the package id (CI Test UI 10/16 on ef4efb25 showed the first-render probe racing the alias redirect; fixed in 3e312460), RootLandingRedirect Setup/Studio landing addresses.",
"gates": "dispatch-gates --commands: 35 derived; all 35 run with exit 0 (three first timed out at 280s on the shared box and were re-run alone: check-comment-mask-corpus, check:query-options-erasure, check:type-check-debt, each exit 0). --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. Also ui check:new-line-citations: 0 new, exit 0; eslint on touched source + new test: 0 errors. CI on bcab36d9: 46 success, 8 skipped, 0 failure (incl. Lint UI, Type Check UI, Build & E2E UI, Test UI 1-16, Test Core). Console build: cited from CI Build & E2E UI, not rebuilt locally.",
"dogfood_battery": "n/a: no ! in the PR title and Clause-2 no",
"mcp_calls": "1: mcp__github__get_job_logs (read)",
"api_writes": "2 relay/REST: fleet-write pr_create (PR 26262 + assignee os-steve, one action), this os-dev-report comment; plus 5 git pushes",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none, noted in PR Acceptance notes: the console's many hardcoded /apps/setup links now take one replace-hop onto /apps/com.objectstack.setup for a session whose list carries Setup; moving them to resolveHostAppSegment is separate",
"carrier: none, noted: ADR-0048 3.6 per-tenant namespace alias is still unbuilt; the name alias rewritten here is not it"
]
}
Activity
objectstack-fleet commentedon Oct 26, 2026
Triage: first grade —
bug·priority:p2·domain:ui·area:records·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-26T15:57Z⛔ Not a claim, ⛔ not a dispatch.
nameagainst the package id), which breaks bookmarks and shared links. Pick one key for every route of an app (objectui#11887's choice), and redirect the other spelling.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1
Session:
session_017iXjUm1rujwDk7f3KT1Pkk(seat); implementing card threadsession_01WMwiEU2YGp3QigAjKszWFqAccount:
os-steveBranch:
claude/project-thread-2gyl9h(platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record)Worktree: the card thread's own container
Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/app-shellnavigation: the object-nav (withviewName) and component-nav href builders, plus tests, and a root.changeset/patch. Old addresses must keep resolving (stop on breach; explain in the report). ⛔ui/.github/**and the root.github/workflows/ci.ymlare out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root.changeset/.Container & model:
small,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility:
n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public ConsoleThread-read: 6420644362
Premise: holds as filed (triage graded p2 15:58Z; browser-measured on the 18.1.0 Console; the dev re-reads the nav href builders on
origin/main3d50a43bas step 1 and stops if main already routes both kinds under one segment; 2026-10-26T17:36Z). Borrowed from seat 2 (#25995) by agreement at 17:32Z, under the priority-first ruleSerial constraints cleared: none (app-shell is outside the sdui closure; the dev scans open PRs for the same nav files before editing)
Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.
objectstack-fleet commentedon Oct 26, 2026
Claim amendment (seat
domain:ui#1, 2026-10-26T17:39Z): amends the claim6423072682after the dev's step-1 reading onorigin/main3d50a43b. Append-only.Measured: the canonical segment is the package id (ADR-0048 §3.6,
ui/packages/app-shell/src/utils/appRoute.tsappRouteSegment; objectui#11818/#11887). The sidebar already builds every entry kind on it:UnifiedSidebar's basePath is/apps/${appRouteSegment(activeApp)}, andNavigationRendererresolveHrefbuilds object (withviewName), component, page, dashboard, report and doc hrefs on that basePath. The card's obligations and approvals addresses are therefore the canonical ones. The name family comes from the app-name alias:matchAppBySegmentaccepts the name, andAppContentthen keys every path it builds on the URL's own segment.homePath.tsresolveDeclaredHomePath(logo / Home) and the console'sRootLandingRedirectresolveLandingPath(the post-login/).Route, replaced: the nav href builders are not the defect and stay untouched.
AppContentreplace-navigates to the same path, search and hash under the package id, and keysappSegmenton the canonical segment. Old name addresses keep resolving; they now redirect.appRouteSegment(app), so there is no extra hop.File surface, replaced:
ui/packages/app-shell/src/console/AppContent.tsx,ui/packages/app-shell/src/utils/homePath.ts,ui/apps/console/src/components/RootLandingRedirect.tsx, tests beside them, and a root.changeset/patch (app-shell, console). Both packages are outside the sdui closure.Serial constraints, updated:
AppContent.tsxis also edited by #26202 (#26172, the toast region, disjoint), which is armed and in the queue. This PR mergesorigin/mainafter #26202 lands and before it is armed.objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 26183, "status": "done", "branch": "claude/project-thread-2gyl9h", "pr": "https://github.com/objectstack-ai/objectstack/pull/26262", "session": "session_01WMwiEU2YGp3QigAjKszWFq", "premise_still_valid": true, "summary": "Symptom holds, attribution corrected: on origin/main 3d50a43b the sidebar already builds EVERY entry kind (object with viewName, component, page, dashboard, report, doc) on appRouteSegment = the package id, which ADR-0048 3.6 names canonical. The second family is the app-NAME alias: AppContent kept building on the URL's own segment, and the post-login landing (resolveLandingPath) and the logo/Home target (resolveDeclaredHomePath) both emitted the name. Fix: AppContent replace-navigates a name-alias route onto the app's one address (appAddressSegment: package id when it resolves back to the same app, else the name), keeping path, search, hash and history state, and keys appSegment on that address; both landing producers name the address directly. Old name URLs keep opening. Route and file surface approved by the seat (claim amendment 6423123764).", "tests": "head bcab36d9. Local (os-verify-lock, ui root, --maxWorkers=2): apps/console/src + app-shell src/console, src/utils, src/hooks + homeAffordancesFollowDeclaration-7256 + homeRecoveryRedirectsFollowDeclaration-7373: Test Files 565 passed / 1 skipped (566), Tests 5219 passed / 8 skipped, VERDICT command-exit 0 (run on ef4efb25; later commits only touch three test files, re-run 3x: 5 files 19/19 each). New AppContent.nameAliasRedirect-26183 4/4. Ablation (AppContent effect early-returned, on-disk marker grep -c 1, restored via git checkout HEAD, git diff HEAD empty): the alias test and the 11818 alias control went red (2 failed / 4 passed), controls green. Pins updated for the address change: 11818 alias control, 12079 empty-navigation landing x2, 12980 page-scope pins booted on the package id (CI Test UI 10/16 on ef4efb25 showed the first-render probe racing the alias redirect; fixed in 3e312460), RootLandingRedirect Setup/Studio landing addresses.", "gates": "dispatch-gates --commands: 35 derived; all 35 run with exit 0 (three first timed out at 280s on the shared box and were re-run alone: check-comment-mask-corpus, check:query-options-erasure, check:type-check-debt, each exit 0). --ran: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. Also ui check:new-line-citations: 0 new, exit 0; eslint on touched source + new test: 0 errors. CI on bcab36d9: 46 success, 8 skipped, 0 failure (incl. Lint UI, Type Check UI, Build & E2E UI, Test UI 1-16, Test Core). Console build: cited from CI Build & E2E UI, not rebuilt locally.", "dogfood_battery": "n/a: no ! in the PR title and Clause-2 no", "mcp_calls": "1: mcp__github__get_job_logs (read)", "api_writes": "2 relay/REST: fleet-write pr_create (PR 26262 + assignee os-steve, one action), this os-dev-report comment; plus 5 git pushes", "open_questions": [], "out_of_scope_findings": [ "carrier: none, noted in PR Acceptance notes: the console's many hardcoded /apps/setup links now take one replace-hop onto /apps/com.objectstack.setup for a session whose list carries Setup; moving them to resolveHostAppSegment is separate", "carrier: none, noted: ADR-0048 3.6 per-tenant namespace alias is still unbuilt; the name alias rewritten here is not it" ] }Generated by Claude Code