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: the ?palette=1 deep-link is dropped when an app root redirects to its default page #27450
Filing gate: ① a product defect found by a QA run (off-clause probe, RUNNER rule 8).
Reproduction
Boot the showcase and sign in as admin.
Open http://localhost:PORT/_console/apps/showcase_app?palette=1 and wait about 6 s.
Expected: the command palette opens, as it does for ?palette=1 on a non-redirecting route such as /_console/apps/com.example.showcase/showcase_task?palette=1.
Actual: the URL settles on /_console/apps/com.example.showcase/page/showcase_capability_map with no query string, and no overlay:command-palette is open. Reproduced twice.
Mechanism
The app-root redirect to the app's default page rebuilds the URL without carrying the search params, so the useUrlOverlay / COMMAND_PALETTE_PARAM (?palette=1) state is lost before the overlay reads it. The same likely applies to any URL-overlay param on an app-root link.
QA-source: #27441 · search.console-global-search · observed beside the clauses
Read fresh. The ?palette=1 deep link is dropped when an app root redirects to its default page. From the 18.3.0 RC run ([sweep] v18.3.0 release test sweep #27377 §5); it is retested on the next wave.
Claim: PM loop round 1
Session: session_01Utp6CbDAucNyQ4UtzCJKyh
Account: os-bill
Branch: claude/project-thread-7wdma9 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
Worktree: objectstack-issue-27450
Domain: domain:ui
Seat: domain:ui#4
File surface: ui/packages/app-shell/src/console/AppContent.tsx (the app-root / root landing redirects only), ui/packages/app-shell/src/utils/appRoute.ts only if the target is built there, tests beside, root .changeset/; ⛔ packages/** outside ui/ (stop on breach; explain in the report)
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on 77e993ea: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: ui code (the app-root redirect rebuilds the URL without its query) | the /metadata redirect beside it already carries location.search | every console user following an app-root deep link with an overlay param, today
Thread-read: 6491524766
Premise: holds
Serial constraints cleared: seat 2's PR #27590 (#27507, same file AppContent.tsx) merged 14:53Z at 77e993ea; no other open PR or in-flight claim names AppContent.tsx
Dispatched 2026-10-29T14:56Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
Claim amendment · 2026-10-29T14:58Z · to Claim 6500141247 (same session, same branch claude/project-thread-7wdma9).
File surface: adds ui/apps/console/src/components/RootLandingRedirect.tsx (the console root redirect, which drops ?palette=1 before the app-root landing sees it) and a test beside it. Seat-4 area; no open PR or in-flight claim names that file (open PR scan 14:31Z; #27498 touches only ui/apps/console/src/LocalizationFetchProvider.tsx). Left alone and named in the report: the no-active-app bounce to homePath in AppContent.tsx (a refusal, not a landing on the requested page).
{
"issue": 27450,
"status": "done",
"branch": "claude/project-thread-7wdma9",
"pr": "https://github.com/objectstack-ai/objectstack/pull/27641",
"head": "27534cfdbef8cd43f2e4eb4925019cb366510f09",
"session": "session_01Utp6CbjUouY1fgaJXGSQMk (card thread; seat session_01Utp6CbDAucNyQ4UtzCJKyh)",
"premise_still_valid": true,
"summary": "Premise held: on origin/main 77e993ea, AppRootLanding (AppContent.tsx) navigated to the landing built from the nav entry alone, dropping search and hash, while the name-alias move, LegacyMetadataRedirect directory mode, ShorthandRecordRedirect, SystemRedirect and SetupRedirect already carry them; RootLandingRedirect at the console root dropped them too. AppRootLanding now navigates to carryQueryOntoLanding(landing, location.search, location.hash): unchanged with nothing arriving, appended verbatim when the landing has no query, merged through URLSearchParams when it has one (a key the link names replaces the landing's values, never doubled; arriving hash wins). RootLandingRedirect appends search and hash to its bare /apps/SEGMENT or /home target. Generic query carriage, no palette special case. Left alone: the no-active-app bounce to homePath (a refusal, not the requested landing), LegacyMetadataRedirect resource mode (consumes ?type= by design), metadata/package/* (fixed target).",
"tests": "New AppContent.rootLandingCarriesQuery-27450.test.tsx (real AppContent mount, real CommandPaletteProvider in the ConsoleLayout stand-in) + 3 cases in RootLandingRedirect.route.test.tsx: pnpm --dir ui exec vitest run --maxWorkers=2 --reporter=verbose (both files): Test Files 2 passed (2), Tests 22 passed (22), lock VERDICT command-exit 0. Ablation 1 via scripts/ablation-replace.mjs on AppContent.tsx (anchor x1 to x0, blob d7094fbe6ab0 to 2ae181a36973; restored blob == HEAD, git diff HEAD empty): Tests 4 failed | 1 passed (5), the CONTROL green. Ablation 2 on RootLandingRedirect.tsx (blob c128700964fd to a12455e5f3b3; restored == HEAD): Tests 2 failed | 15 passed (17). No dist leg: both tests import the subject from source. Neighbour suites (20 files: AppContent landing/alias/bootRedirect/pseudoRoute/unresolvedAdmin/inaccessibleAppStrand, setup/system redirect targets, console RootLandingRedirect, landingHomeParity-7256, SetupRoute): Test Files 20 passed (20), Tests 193 passed (193). pnpm --filter @object-ui/app-shell run type-check: VERDICT command-exit 0; new test in tsconfig.test.json program (--listFilesOnly count 1). pnpm --filter @object-ui/console run type-check: VERDICT command-exit 0 after building app-shell and five plugin dists (first two runs exit 2 on TS2307 missing dists only); route test in program (count 1). eslint on the 4 touched files: 0 errors, no warning on a touched line.",
"gates": "At 27534cfd, dispatch-gates --commands --repo objectstack-ai/objectstack derived 34; all run, each exit captured before any pipe: node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0; node scripts/check-adr-0087-registration.mjs --self-test :: exit 0; node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0; node scripts/check-closing-keyword-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0; node scripts/check-comment-mask-corpus.mjs :: exit 0; node scripts/check-empty-changeset.mjs --base origin/main :: exit 0; node scripts/check-empty-changeset.mjs --self-test :: exit 0; node scripts/check-sdui-manifest.mjs :: exit 0; node scripts/check-sdui-manifest.mjs --self-test :: exit 0; node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0; node scripts/release-pending-publish.mjs --self-test :: exit 0; pnpm --dir ui exec vitest run scripts/ :: exit 0; pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0; pnpm check:changeset-gate-self-tests :: exit 0; pnpm check:closed-ceremony-text :: exit 0; pnpm check:cross-package-test-inputs :: exit 0; pnpm check:dispatcher-error-vocabulary :: exit 0; pnpm check:driver-memory-census :: exit 0; pnpm check:engine-double-contract :: exit 0; pnpm check:gitlink-declared :: exit 0; pnpm check:nul-bytes :: exit 0; pnpm check:pm-changeset-deadline-census :: exit 0; pnpm check:published-files :: exit 0; pnpm check:query-options-erasure :: exit 0; pnpm check:refd-timer-probe :: exit 0; pnpm check:skill-identifier-liveness :: exit 0; pnpm check:test-source-alias :: exit 0; pnpm check:tier-file-adoption :: exit 0; pnpm check:type-check-coverage :: exit 0; pnpm check:type-check-debt :: exit 0; pnpm check:undeclared-dep-imports :: exit 0; pnpm check:watch-hint-literal :: exit 0; pnpm check:where-matcher :: exit 0. --ran reconciliation: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Extra: ui check:new-line-citations 0 new (exit 0). origin/main moved 4 commits past 77e993ea, none touching the diff's files; no merge. CI check-runs on #27641: not awaited at report time, per os-dev.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"line_budget": "311 changed lines (+308/-3): AppContent.tsx +32/-1, RootLandingRedirect.tsx +9/-1, RootLandingRedirect.route.test.tsx +38/-1, new test 218, changeset 11; under the 3000 human-merge threshold",
"files_changed": [
".changeset/27450-app-root-deep-link-query.md",
"ui/apps/console/src/components/RootLandingRedirect.route.test.tsx",
"ui/apps/console/src/components/RootLandingRedirect.tsx",
"ui/packages/app-shell/src/console/AppContent.tsx",
"ui/packages/app-shell/src/console/__tests__/AppContent.rootLandingCarriesQuery-27450.test.tsx"
],
"deviations": [
"File surface: ui/apps/console/src/components/RootLandingRedirect.tsx and its route test are outside the original claim's surface; the order asked for RootLandingRedirect to be measured and carried, the seat agreed and amended the claim (comment 6500172717) before the edit landed in a push.",
"PR body order follows os-dev (Fixes line right after the attribution block, then the two declaration lines, then the six-line 维护者速读) rather than the order the dispatch listed (速读 before Fixes); os-dev wins on conflict.",
"PR body attribution line links this card thread (the harness's required project-thread link, kept exactly as the session context gives it) rather than the seat-thread link the dispatch spelled.",
"Harness post-PR assignee/review step skipped by order: no assignee, no reviewer on #27641."
],
"mcp_calls": "0 — no GitHub MCP tool called (card reads through gh api GET)",
"api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft) via repository_dispatch run 40906489464; this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/27450/comments). Plus git push of the branch (not REST).",
"open_questions": [],
"out_of_scope_findings": [
"observation, not filed · /home?palette=1 from the console root keeps the query but the home frame mounts no CommandPaletteProvider, so the palette does not open there · carrier: none · noted in PR Acceptance notes",
"observation, not filed · an unauthenticated /?palette=1 goes to login; whether LoginRedirect captures a bare / carrying a query is unmeasured here · carrier: none · noted in PR Acceptance notes"
]
}
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p3 ·
domain:ui·area:devpath· 2026-10-29T08:13Z⛔ Not a claim.
?palette=1deep link is dropped when an app root redirects to its default page. From the 18.3.0 RC run ([sweep] v18.3.0 release test sweep #27377 §5); it is retested on the next wave.bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
Claim: PM loop round 1
Session:
session_01Utp6CbDAucNyQ4UtzCJKyhAccount:
os-billBranch:
claude/project-thread-7wdma9(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27450Domain:
domain:uiSeat:
domain:ui#4File surface:
ui/packages/app-shell/src/console/AppContent.tsx(the app-root / root landing redirects only),ui/packages/app-shell/src/utils/appRoute.tsonly if the target is built there, tests beside, root.changeset/; ⛔packages/**outsideui/(stop on breach; explain in the report)Container & model:
M,mode:thread,model: TIER_DEFAULT(dispatch-gates --tieron77e993ea: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: ui code (the app-root redirect rebuilds the URL without its query) | the
/metadataredirect beside it already carrieslocation.search| every console user following an app-root deep link with an overlay param, todayThread-read: 6491524766
Premise: holds
Serial constraints cleared: seat 2's PR #27590 (#27507, same file
AppContent.tsx) merged 14:53Z at77e993ea; no other open PR or in-flight claim namesAppContent.tsxDispatched 2026-10-29T14:56Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.
Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
Claim amendment · 2026-10-29T14:58Z · to Claim 6500141247 (same session, same branch
claude/project-thread-7wdma9).File surface: adds
ui/apps/console/src/components/RootLandingRedirect.tsx(the console root redirect, which drops?palette=1before the app-root landing sees it) and a test beside it. Seat-4 area; no open PR or in-flight claim names that file (open PR scan 14:31Z; #27498 touches onlyui/apps/console/src/LocalizationFetchProvider.tsx). Left alone and named in the report: the no-active-app bounce tohomePathinAppContent.tsx(a refusal, not a landing on the requested page).Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#4 · os-bill · session_01Utp6CbjUouY1fgaJXGSQMk
os-dev-report
{ "issue": 27450, "status": "done", "branch": "claude/project-thread-7wdma9", "pr": "https://github.com/objectstack-ai/objectstack/pull/27641", "head": "27534cfdbef8cd43f2e4eb4925019cb366510f09", "session": "session_01Utp6CbjUouY1fgaJXGSQMk (card thread; seat session_01Utp6CbDAucNyQ4UtzCJKyh)", "premise_still_valid": true, "summary": "Premise held: on origin/main 77e993ea, AppRootLanding (AppContent.tsx) navigated to the landing built from the nav entry alone, dropping search and hash, while the name-alias move, LegacyMetadataRedirect directory mode, ShorthandRecordRedirect, SystemRedirect and SetupRedirect already carry them; RootLandingRedirect at the console root dropped them too. AppRootLanding now navigates to carryQueryOntoLanding(landing, location.search, location.hash): unchanged with nothing arriving, appended verbatim when the landing has no query, merged through URLSearchParams when it has one (a key the link names replaces the landing's values, never doubled; arriving hash wins). RootLandingRedirect appends search and hash to its bare /apps/SEGMENT or /home target. Generic query carriage, no palette special case. Left alone: the no-active-app bounce to homePath (a refusal, not the requested landing), LegacyMetadataRedirect resource mode (consumes ?type= by design), metadata/package/* (fixed target).", "tests": "New AppContent.rootLandingCarriesQuery-27450.test.tsx (real AppContent mount, real CommandPaletteProvider in the ConsoleLayout stand-in) + 3 cases in RootLandingRedirect.route.test.tsx: pnpm --dir ui exec vitest run --maxWorkers=2 --reporter=verbose (both files): Test Files 2 passed (2), Tests 22 passed (22), lock VERDICT command-exit 0. Ablation 1 via scripts/ablation-replace.mjs on AppContent.tsx (anchor x1 to x0, blob d7094fbe6ab0 to 2ae181a36973; restored blob == HEAD, git diff HEAD empty): Tests 4 failed | 1 passed (5), the CONTROL green. Ablation 2 on RootLandingRedirect.tsx (blob c128700964fd to a12455e5f3b3; restored == HEAD): Tests 2 failed | 15 passed (17). No dist leg: both tests import the subject from source. Neighbour suites (20 files: AppContent landing/alias/bootRedirect/pseudoRoute/unresolvedAdmin/inaccessibleAppStrand, setup/system redirect targets, console RootLandingRedirect, landingHomeParity-7256, SetupRoute): Test Files 20 passed (20), Tests 193 passed (193). pnpm --filter @object-ui/app-shell run type-check: VERDICT command-exit 0; new test in tsconfig.test.json program (--listFilesOnly count 1). pnpm --filter @object-ui/console run type-check: VERDICT command-exit 0 after building app-shell and five plugin dists (first two runs exit 2 on TS2307 missing dists only); route test in program (count 1). eslint on the 4 touched files: 0 errors, no warning on a touched line.", "gates": "At 27534cfd, dispatch-gates --commands --repo objectstack-ai/objectstack derived 34; all run, each exit captured before any pipe: node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0; node scripts/check-adr-0087-registration.mjs --self-test :: exit 0; node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0; node scripts/check-closing-keyword-parity.mjs :: exit 0; node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0; node scripts/check-comment-mask-corpus.mjs :: exit 0; node scripts/check-empty-changeset.mjs --base origin/main :: exit 0; node scripts/check-empty-changeset.mjs --self-test :: exit 0; node scripts/check-sdui-manifest.mjs :: exit 0; node scripts/check-sdui-manifest.mjs --self-test :: exit 0; node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0; node scripts/release-pending-publish.mjs --self-test :: exit 0; pnpm --dir ui exec vitest run scripts/ :: exit 0; pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0; pnpm check:changeset-gate-self-tests :: exit 0; pnpm check:closed-ceremony-text :: exit 0; pnpm check:cross-package-test-inputs :: exit 0; pnpm check:dispatcher-error-vocabulary :: exit 0; pnpm check:driver-memory-census :: exit 0; pnpm check:engine-double-contract :: exit 0; pnpm check:gitlink-declared :: exit 0; pnpm check:nul-bytes :: exit 0; pnpm check:pm-changeset-deadline-census :: exit 0; pnpm check:published-files :: exit 0; pnpm check:query-options-erasure :: exit 0; pnpm check:refd-timer-probe :: exit 0; pnpm check:skill-identifier-liveness :: exit 0; pnpm check:test-source-alias :: exit 0; pnpm check:tier-file-adoption :: exit 0; pnpm check:type-check-coverage :: exit 0; pnpm check:type-check-debt :: exit 0; pnpm check:undeclared-dep-imports :: exit 0; pnpm check:watch-hint-literal :: exit 0; pnpm check:where-matcher :: exit 0. --ran reconciliation: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN. Extra: ui check:new-line-citations 0 new (exit 0). origin/main moved 4 commits past 77e993ea, none touching the diff's files; no merge. CI check-runs on #27641: not awaited at report time, per os-dev.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "line_budget": "311 changed lines (+308/-3): AppContent.tsx +32/-1, RootLandingRedirect.tsx +9/-1, RootLandingRedirect.route.test.tsx +38/-1, new test 218, changeset 11; under the 3000 human-merge threshold", "files_changed": [ ".changeset/27450-app-root-deep-link-query.md", "ui/apps/console/src/components/RootLandingRedirect.route.test.tsx", "ui/apps/console/src/components/RootLandingRedirect.tsx", "ui/packages/app-shell/src/console/AppContent.tsx", "ui/packages/app-shell/src/console/__tests__/AppContent.rootLandingCarriesQuery-27450.test.tsx" ], "deviations": [ "File surface: ui/apps/console/src/components/RootLandingRedirect.tsx and its route test are outside the original claim's surface; the order asked for RootLandingRedirect to be measured and carried, the seat agreed and amended the claim (comment 6500172717) before the edit landed in a push.", "PR body order follows os-dev (Fixes line right after the attribution block, then the two declaration lines, then the six-line 维护者速读) rather than the order the dispatch listed (速读 before Fixes); os-dev wins on conflict.", "PR body attribution line links this card thread (the harness's required project-thread link, kept exactly as the session context gives it) rather than the seat-thread link the dispatch spelled.", "Harness post-PR assignee/review step skipped by order: no assignee, no reviewer on #27641." ], "mcp_calls": "0 — no GitHub MCP tool called (card reads through gh api GET)", "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft) via repository_dispatch run 40906489464; this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/27450/comments). Plus git push of the branch (not REST).", "open_questions": [], "out_of_scope_findings": [ "observation, not filed · /home?palette=1 from the console root keeps the query but the home frame mounts no CommandPaletteProvider, so the palette does not open there · carrier: none · noted in PR Acceptance notes", "observation, not filed · an unauthenticated /?palette=1 goes to login; whether LoginRedirect captures a bare / carrying a query is unmeasured here · carrier: none · noted in PR Acceptance notes" ] }objectstack-fleet commentedon Oct 29, 2026
domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
ACCEPT → PR #27641 comment 6501919061 · 2026-10-29T16:08Z
Generated by Claude Code