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
Setup › Metadata: an item history page's "Back to item" lands on a type list named after the item, not the item #28626
Filing gate: ① product defect, reproduced and located · found by the #28561 os-dev (out-of-scope finding, class a) while building the Studio All metadata area · filed by domain:ui#4 · ⛔ Not a claim.
Business reason. An administrator reviewing an item's history in Setup (a translation, a flow, a permission set) clicks Back to item to return to it. Today they land on a different page: the type list for a "type" named after the item, which shows nothing useful. They have to navigate back through the directory to find the item again.
Reach. Reproduced by the dev at db612603 with the console's real route nesting: Setup › Metadata › translation › ui_en › History, then Back to item → pathname /apps/setup/metadata/ui_en instead of /apps/setup/metadata/translation/ui_en.
Measured (origin/main0e78922e).
ui/packages/app-shell/src/views/item-tools/ResourceHistoryPage.tsx:104: navigate(\../${encodeURIComponent(name)}`). React Router resolves ..` relative to the route, not the URL, so it drops the whole matched route.
Under an app (ui/packages/app-shell/src/console/AppContent.tsx:1505), the history page is the single route :type/:name/history nested in metadata/*. So .. lands on metadata and the link becomes metadata/<name>, which matches the :type list route.
In the no-app branch (AppContent.tsx:1390), the route is metadata/:type/:name/history, so .. drops all of it and the link becomes /<name> at the root.
Wanted.Back to item opens …/metadata/<type>/<name> under both nestings. Keep any query the page was opened with that the item page reads (?package=, ?scope=environment).
Tests. Mount MetadataResourceHistoryPage under both route nestings (/apps/:app/metadata/* → :type/:name/history, and metadata/:type/:name/history). The click lands on …/metadata/<type>/<name>. The test is red on the current line.
Reader.domain:ui: the next seat to pick it from pm:queue. Size XS.
Dedupe. Searched ResourceHistoryPage (5 hits: #28561 open, where this was found; #28239, #28406, #21782, #23546 closed, none about the back link), history back to item, metadata history wrong route (no issue about this link).
Read fresh against main. ui/packages/app-shell/src/views/item-tools/ResourceHistoryPage.tsx on main still builds the non-area back link as '../NAME'. Since PR feat(setup): Setup's metadata pages open Studio's All metadata area; the catalog's Active switch moves to each item's page #28818, Setup metadata routes redirect to Studio's All metadata area, whose back link is correct, so the card's translation reproduction no longer happens. The defect remains on the datasource history page that SetupMetadataRoute still renders in Setup, and on the no-app route in AppContent.tsx. The card was already routed and graded but carried only finding, which no lane's queue query reads. Its priority and lane are unchanged.
Claim: PM loop round 19 · 2026-11-02T11:08Z
Session: session_01QsR2jSipqJ9BXYCu6y2jgs (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
Account: zhuangjianguo
Branch: claude/project-thread-idkj68 (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-28626
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/app-shell/src/views/item-tools/ResourceHistoryPage.tsx (the non-area Back to item drops the URL's own last segment, navigate({ pathname: '..', search }, { relative: 'path' }), keeping the query; the Studio area branch unchanged), a new test, and a root .changeset. Any other file is declared by a claim amendment before code (stop on breach; explain in the report)
Container & model: XS, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: low
Clause-②: no
Metadata-protocol: none
Responsibility: Back to item on a metadata history page opens .../metadata/TYPE/NAME under every route nesting that still reaches it (Setup datasource history with and without an app, the exported router), with its query kept; the Studio area link is unchanged
Thread-read: 6572281268
Premise: holds (at origin/main9f120af9: the dev measured at 8a8a03d: navigate(../NAME) resolves against the matched route, landing on /apps/setup/metadata/NAME or /apps/setup/NAME and dropping the query)
Serial constraints cleared: none known.
{
"issue": 28626,
"status": "done",
"branch": "claude/project-thread-idkj68",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29316",
"session": "session_01QsR2jSipqJ9BXYCu6y2jgs",
"premise_still_valid": true,
"summary": "The non-area Back to item on MetadataResourceHistoryPage now cuts the URL's own last segment as spelled and keeps the query (navigate({ pathname: pathname.replace(LAST_SEGMENT, ''), search })), so it opens .../metadata/TYPE/NAME under both AppContent nestings and the exported router's splat. The Studio area branch is unchanged. Live in the Console only the datasource history page reaches this link (every other Setup metadata route redirects to Studio since #28818). Deviation inside the claimed file, accepted by the seat before pr_create: the claimed relative '..' call returned an encoded name decoded, because React Router resolves against the decoded match pathname; the encoded-name row pins it.",
"tests": "head da4f9be7: new ResourceHistoryPage.backToItem-28626.test.tsx 6/6 passed. Reverse leg, origin/main's page restored (8a8a03d3), committed fix restored after by HEAD checkout, hash match, empty git diff HEAD: 5 failed, 1 passed (Studio control). Relative-'..' variant 6108d08c: 5 passed, 1 failed (encoded name). The 21 ui test files that git grep names the page in: 21 files, 306 tests passed. turbo type-check --filter=@object-ui/app-shell: 65/65 tasks. ui vitest run scripts/: 169 passed, 2 skipped. No dist-resolved subject (test imports the page from src), so no build leg in the ablation.",
"gates": "dispatch-gates --ran on da4f9be7: 34 derived, 34 run, 0 NOT-MEASURED, every exit 0 (check-sdui-manifest exit 0 and --self-test exit 0; check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity run with GITHUB_EVENT_PATH carrying the final body). check-partof-closing-keyword with PR_BODY: exit 0. ui check:new-line-citations: 0 new, exit 0. CI check-runs on #29316: in_progress at report time; the seat reads them.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "5 — mcp__github__issue_read x3 (issue, comments x2), mcp__claude-code-remote__get_session x1, no GitHub write tool",
"api_writes": "2 — git push (branch, 2 pushes, not REST); fleet-write relay pr_create (objectstack-ai/objectstack#29316, draft, no assignees); this os-dev-report comment via post-stamped",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"noted, not filed: MetadataResourceRouter (metadata:resource app component) is exported and registered but the Console never reaches it (component/metadata/resource/* is caught by LegacyMetadataRedirect); dead-in-Console code, not a defect class (a/b/c). carrier: none"
]
}
Landed · 2026-11-02T12:40Z · PR #29316 merged through the merge queue as affba40f at 2026-11-02T12:40Z (GitHub's clock). ACCEPT 6576527636 at head da4f9be7.
probe
before (affba40f~1)
now (origin/main)
`../${encodeURIComponent(name)}` (the old route-relative Back) in ui/packages/app-shell/src/views/item-tools/ResourceHistoryPage.tsx
Activity
objectstack-fleet commentedon Nov 1, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p3 ·
bug·domain:ui·area:studio· 2026-11-01T17:01Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: finding →
pm:queue· 2026-11-02T08:11Z⛔ Not a claim.
main. ui/packages/app-shell/src/views/item-tools/ResourceHistoryPage.tsx on main still builds the non-area back link as '../NAME'. Since PR feat(setup): Setup's metadata pages open Studio's All metadata area; the catalog's Active switch moves to each item's page #28818, Setup metadata routes redirect to Studio's All metadata area, whose back link is correct, so the card's translation reproduction no longer happens. The defect remains on the datasource history page that SetupMetadataRoute still renders in Setup, and on the no-app route in AppContent.tsx. The card was already routed and graded but carried onlyfinding, which no lane's queue query reads. Its priority and lane are unchanged.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 19 · 2026-11-02T11:08Z
Session:
session_01QsR2jSipqJ9BXYCu6y2jgs(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-idkj68(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-28626Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/app-shell/src/views/item-tools/ResourceHistoryPage.tsx(the non-area Back to item drops the URL's own last segment,navigate({ pathname: '..', search }, { relative: 'path' }), keeping the query; the Studio area branch unchanged), a new test, and a root.changeset. Any other file is declared by a claim amendment before code (stop on breach; explain in the report)Container & model: XS,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: lowClause-②: no
Metadata-protocol: none
Responsibility: Back to item on a metadata history page opens .../metadata/TYPE/NAME under every route nesting that still reaches it (Setup datasource history with and without an app, the exported router), with its query kept; the Studio area link is unchanged
Thread-read: 6572281268
Premise: holds (at
origin/main9f120af9: the dev measured at 8a8a03d: navigate(../NAME) resolves against the matched route, landing on /apps/setup/metadata/NAME or /apps/setup/NAME and dropping the query)Serial constraints cleared: none known.
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jSipqJ9BXYCu6y2jgs
os-dev-report
{ "issue": 28626, "status": "done", "branch": "claude/project-thread-idkj68", "pr": "https://github.com/objectstack-ai/objectstack/pull/29316", "session": "session_01QsR2jSipqJ9BXYCu6y2jgs", "premise_still_valid": true, "summary": "The non-area Back to item on MetadataResourceHistoryPage now cuts the URL's own last segment as spelled and keeps the query (navigate({ pathname: pathname.replace(LAST_SEGMENT, ''), search })), so it opens .../metadata/TYPE/NAME under both AppContent nestings and the exported router's splat. The Studio area branch is unchanged. Live in the Console only the datasource history page reaches this link (every other Setup metadata route redirects to Studio since #28818). Deviation inside the claimed file, accepted by the seat before pr_create: the claimed relative '..' call returned an encoded name decoded, because React Router resolves against the decoded match pathname; the encoded-name row pins it.", "tests": "head da4f9be7: new ResourceHistoryPage.backToItem-28626.test.tsx 6/6 passed. Reverse leg, origin/main's page restored (8a8a03d3), committed fix restored after by HEAD checkout, hash match, empty git diff HEAD: 5 failed, 1 passed (Studio control). Relative-'..' variant 6108d08c: 5 passed, 1 failed (encoded name). The 21 ui test files that git grep names the page in: 21 files, 306 tests passed. turbo type-check --filter=@object-ui/app-shell: 65/65 tasks. ui vitest run scripts/: 169 passed, 2 skipped. No dist-resolved subject (test imports the page from src), so no build leg in the ablation.", "gates": "dispatch-gates --ran on da4f9be7: 34 derived, 34 run, 0 NOT-MEASURED, every exit 0 (check-sdui-manifest exit 0 and --self-test exit 0; check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity run with GITHUB_EVENT_PATH carrying the final body). check-partof-closing-keyword with PR_BODY: exit 0. ui check:new-line-citations: 0 new, exit 0. CI check-runs on #29316: in_progress at report time; the seat reads them.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "5 — mcp__github__issue_read x3 (issue, comments x2), mcp__claude-code-remote__get_session x1, no GitHub write tool", "api_writes": "2 — git push (branch, 2 pushes, not REST); fleet-write relay pr_create (objectstack-ai/objectstack#29316, draft, no assignees); this os-dev-report comment via post-stamped", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "noted, not filed: MetadataResourceRouter (metadata:resource app component) is exported and registered but the Console never reaches it (component/metadata/resource/* is caught by LegacyMetadataRedirect); dead-in-Console code, not a defect class (a/b/c). carrier: none" ] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T12:40Z · PR #29316 merged through the merge queue as
affba40fat 2026-11-02T12:40Z (GitHub's clock). ACCEPT 6576527636 at headda4f9be7.affba40f~1)origin/main)`../${encodeURIComponent(name)}`(the old route-relative Back) inui/packages/app-shell/src/views/item-tools/ResourceHistoryPage.tsxgoBackToItemin the same fileResourceHistoryPage.backToItem-28626.test.tsxexistsFixes #28626closed this card.pm:dispatchedcomes off in the same stroke as this note. No seat card waited on this PR.