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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
console: the "This app can't be opened" screen is a dead end — only Retry, no Back to home, no app bar #13122
Filing gate: ① a user-visible UX defect with a named landing point and a reproduction (pm:queue class).
Reader: the objectui lane owning packages/app-shell/src/console/AppContent.tsx — the fix PR there.
Dedupe (open AND closed, semantic search on objectstack-ai/objectui): "app can't be opened not found screen no way back home chrome-less" → 2 hits (#12305, #4473); "app not found verdict screen Retry only missing Back to home link" → 0; none covers this item.
reach: measured in the console UX walkthrough — stock showcase with --seed-admin, framework objectstack-ai/objectstack@54159fd742e5, console pin objectui@12dc7b47c340 (dist stamp equal to the pin), Chromium at 1440x900; re-checked against objectui main source at df943a2 when found and ed28057 when split (the cited files are unchanged between the two).
type: Bug
Split out of #13115 (item 1), which folded fifteen independent defects into one card under the per-fire filing quota, which the maintainer has since ruled does not bind a concentrated test run such as a walkthrough. Split by the 18.0 QA wave dispatch session session_01CfRDy7SuTfUqaTu2AEH2Hi, on the maintainer's instruction there, verbatim: 「#13115 你可以拆」.
Where
Open /_console/apps/com.objectstack.studio — an app id the server does not return (a stale bookmark, an uninstalled app).
Actual
A full-screen "This app can't be opened / The server did not return this app for your account." with only a Retry button — no app bar, no Back to home, no link anywhere.
Expected
The same way out the access-denied screen already offers (its "Back to home" button), on the not_found / unreachable / not-available verdicts too.
Source
packages/app-shell/src/console/AppContent.tsx — the requestedAppMissing branch's verdictScreen renders Empty + Retry only; renderAppAccessDenied has the home button.
Claim: PM loop round 16 (priority:p2)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-13122-app-missing-way-home
Worktree: objectui-issue-13122
Domain: domain:ui
Seat: domain:ui#2
File surface:
packages/app-shell/src/console/AppContent.tsx: the requestedAppMissing branch's verdictScreen (not_found / unreachable / not-available verdicts) offers the same way home the access-denied screen already offers (renderAppAccessDenied's "Back to home"), beside Retry. It reuses that button and its copy; no new key unless none exists.
Tests beside it.
One .changeset/13122-app-missing-way-home.md (@object-ui/app-shellpatch).
⛔ No new package export. Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (default tier; no path-derived mandate over this surface)
Clause-②: no (an internal console screen; no export, prop or key moves)
Responsibility: the console's app-missing verdict screen draws only Retry | renderAppAccessDenied already draws "Back to home" | every member following a stale bookmark or an uninstalled app's link (a full-screen dead end)
Thread-read: none
Serial constraints cleared: objectui#13097 (d87e4f2, AppRootLanding in the same file) landed. No in-flight objectui card or open PR touches AppContent.tsx (read at 05:38Z).
Claimed at: 2026-10-20T05:38Z
os-dev-report
{
"issue": 13122,
"status": "done",
"branch": "claude/issue-13122-app-missing-way-home",
"pr": "#13172",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Premise held on origin/main a57d80a: the requestedAppMissing verdict screens (app-not-found / app-unreachable / app-not-available) drew Empty + Retry only, while renderAppAccessDenied drew 'Back to home'. Factored that button into one render helper renderBackHomeButton(testId) in AppContent.tsx (same copy key empty.appAccessDeniedHome, same navigate(homePath)); access-denied calls it with its unchanged test id app-access-denied-home, and each missing verdict draws it beside Retry as VERDICT-home. No new i18n key, no export, no chrome change. Card assignee untouched; PR assignee baozhoutao set by the relay's pr_create (read back).",
"tests": "HEAD ada1ba4. Targeted: pnpm exec vitest run --maxWorkers=1 packages/app-shell/src/console/tests/AppContent.deniedVsUnpublished.test.tsx to 'Test Files 1 passed (1)', 'Tests 25 passed (25)' (6 new: 3x (a) way-home-and-navigates, 3x CONTROL Retry still drawn and re-calls refreshMetadata; existing denied-screen home cases unchanged and green). Ablation (fix committed first, node objectstack/scripts/ablation-replace.mjs --delete of the renderBackHomeButton VERDICT-home line in the missing branch, trap restore): 'ok mutation landed: anchor 1 to 0, blob 9343ae560f74 to bcd2e851e811' to 'Tests 3 failed | 22 passed (25)', exactly the three (a) cases red, three Retry CONTROLs + denied-screen home case green; restore proven 'blob == HEAD (9343ae560f74) and git diff HEAD is empty', independent git hash-object on disk == HEAD blob 9343ae560f748d669af602aed68ce6e9649104b2. (A first ablation run had the CONTROLs also assert the home button, so they went red too; the control was decoupled in commit ada1ba4 and the ablation re-run with the result above.) Under the lock: pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build (29 projects) exit 0; pnpm --filter @object-ui/app-shell type-check (echoed 'tsc --noEmit && tsc -p tsconfig.test.json'; tsconfig.test.json includes src/**/*.test.tsx) exit 0; lock VERDICT command-exit 0. eslint narrowed to the 2 changed files: exit 0, 0 errors (warnings on pre-existing lines); population = root eslint.config.js, --format json counted 2 files, config has no projectService/parserOptions.project so no type-aware cross-file verdicts. Battery at ada1ba4 all exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, check-hand-rolled-comment-mask.mjs, check-changeset-fixed.mjs, check-changeset-presence.mjs. check:spec-floors exit 1 (known on main per dispatch, recorded, not touched). NOT MEASURED: full packages/app-shell/ directory run, reason: a sibling's full-directory app-shell run (pid 14720, objectui-issue-13114) held the shared lock for over 35 minutes at one worker; it cannot fit the foreground cap, declared to CI. Declared narrowing: the one-file test run and the ablation ran outside the lock after about 30 minutes queued (two queue-timeout 99 verdicts). CI not awaited (in_progress).",
"mcp_calls": "0",
"api_writes": "2 relay writes (fleet-write dispatch, objectstack-fleet[bot]): pr_create POST /repos/objectstack-ai/objectui/pulls (+ its assignee leg POST /repos//issues/13172/assignees), and this os-dev-report comment POST /repos//issues/13122/comments; plus git pushes of the branch (empty probe, ba8cc6d, ada1ba4). No labels written (objectui: none named by dispatch).",
"gates": "closure build 0 · app-shell type-check 0 · targeted vitest 0 (25/25) · eslint changed files 0 · 18 battery gates 0 · check:spec-floors 1 (known on main) · app-shell dir: declared to CI",
"files_changed": ["packages/app-shell/src/console/AppContent.tsx", "packages/app-shell/src/console/tests/AppContent.deniedVsUnpublished.test.tsx", ".changeset/13122-app-missing-way-home.md"],
"deviations": ["Targeted test file and ablation ran outside os-verify-lock after ~30 min queued (two exit-99 verdicts) behind a sibling's full-directory run; declared narrowing.", "Full app-shell directory run declared to CI (does not fit the foreground cap)."],
"open_questions": [],
"out_of_scope_findings": ["carrier: none (承接者:无) · the copy key empty.appAccessDeniedHome is now shared by four screens while named for one; noted in PR Acceptance notes, not filed"]
}
Clause-②: no. This is an internal console screen; no export, prop or key moves. No contract review is owed, and the seat read the report.
Seat review: one render helper, renderBackHomeButton(testId), in AppContent.tsx (same copy key empty.appAccessDeniedHome, same navigate(homePath)):
the access-denied screen calls it with its unchanged test id;
each app-missing verdict (app-not-found, app-unreachable, app-not-available) draws it beside Retry;
no new key, no export, no chrome change.
Pins: 6 new (three verdicts with a way home that navigates, and three Retry controls that still re-call refreshMetadata); the existing denied-screen cases are unchanged. The ablation turned exactly the three way-home cases red, and the restore was proven by blob.
Declared narrowing, accepted: the one-file test run and the ablation ran outside the shared lock after about 30 minutes queued behind a sibling's full-directory run. The full app-shell directory is CI's.
Changeset: @object-ui/app-shellpatch.
CI: all 36 check-runs completed on the head, 33 passed and 3 skipped.
Path fork: no governed path, 79 changed lines. Seat landing.
Findings: Acceptance notes. The copy key empty.appAccessDeniedHome now serves four screens while named for one; a rename is cosmetic.
Next: ready + auto-merge; landing is verified by content on main.
Verified by content: each of the 3 files the PR changes has the same blob at 5dbc6a5792 as at the accepted head ada1ba4e01. The merge message carries no model identifier.
Landed: the app-missing screens (not found, unreachable, not available) offer "Back to home" beside Retry, the same button the access-denied screen draws.
Activity
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 16 (
priority:p2)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13122-app-missing-way-homeWorktree:
objectui-issue-13122Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/app-shell/src/console/AppContent.tsx: therequestedAppMissingbranch'sverdictScreen(not_found / unreachable / not-available verdicts) offers the same way home the access-denied screen already offers (renderAppAccessDenied's "Back to home"), beside Retry. It reuses that button and its copy; no new key unless none exists..changeset/13122-app-missing-way-home.md(@object-ui/app-shellpatch).⛔ No new package export. Stop on breach; explain in the report.
Container & model:
S,mode:subagent,model: opus(default tier; no path-derived mandate over this surface)Clause-②: no (an internal console screen; no export, prop or key moves)
Responsibility: the console's app-missing verdict screen draws only Retry |
renderAppAccessDeniedalready draws "Back to home" | every member following a stale bookmark or an uninstalled app's link (a full-screen dead end)Thread-read: none
Serial constraints cleared: objectui#13097 (
d87e4f2,AppRootLandingin the same file) landed. No in-flight objectui card or open PR touchesAppContent.tsx(read at 05:38Z).Claimed at: 2026-10-20T05:38Z
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{
"issue": 13122,
"status": "done",
"branch": "claude/issue-13122-app-missing-way-home",
"pr": "#13172",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Premise held on origin/main a57d80a: the requestedAppMissing verdict screens (app-not-found / app-unreachable / app-not-available) drew Empty + Retry only, while renderAppAccessDenied drew 'Back to home'. Factored that button into one render helper renderBackHomeButton(testId) in AppContent.tsx (same copy key empty.appAccessDeniedHome, same navigate(homePath)); access-denied calls it with its unchanged test id app-access-denied-home, and each missing verdict draws it beside Retry as VERDICT-home. No new i18n key, no export, no chrome change. Card assignee untouched; PR assignee baozhoutao set by the relay's pr_create (read back).",
"tests": "HEAD ada1ba4. Targeted: pnpm exec vitest run --maxWorkers=1 packages/app-shell/src/console/tests/AppContent.deniedVsUnpublished.test.tsx to 'Test Files 1 passed (1)', 'Tests 25 passed (25)' (6 new: 3x (a) way-home-and-navigates, 3x CONTROL Retry still drawn and re-calls refreshMetadata; existing denied-screen home cases unchanged and green). Ablation (fix committed first, node objectstack/scripts/ablation-replace.mjs --delete of the renderBackHomeButton VERDICT-home line in the missing branch, trap restore): 'ok mutation landed: anchor 1 to 0, blob 9343ae560f74 to bcd2e851e811' to 'Tests 3 failed | 22 passed (25)', exactly the three (a) cases red, three Retry CONTROLs + denied-screen home case green; restore proven 'blob == HEAD (9343ae560f74) and git diff HEAD is empty', independent git hash-object on disk == HEAD blob 9343ae560f748d669af602aed68ce6e9649104b2. (A first ablation run had the CONTROLs also assert the home button, so they went red too; the control was decoupled in commit ada1ba4 and the ablation re-run with the result above.) Under the lock: pnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build (29 projects) exit 0; pnpm --filter @object-ui/app-shell type-check (echoed 'tsc --noEmit && tsc -p tsconfig.test.json'; tsconfig.test.json includes src/**/*.test.tsx) exit 0; lock VERDICT command-exit 0. eslint narrowed to the 2 changed files: exit 0, 0 errors (warnings on pre-existing lines); population = root eslint.config.js, --format json counted 2 files, config has no projectService/parserOptions.project so no type-aware cross-file verdicts. Battery at ada1ba4 all exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, check-hand-rolled-comment-mask.mjs, check-changeset-fixed.mjs, check-changeset-presence.mjs. check:spec-floors exit 1 (known on main per dispatch, recorded, not touched). NOT MEASURED: full packages/app-shell/ directory run, reason: a sibling's full-directory app-shell run (pid 14720, objectui-issue-13114) held the shared lock for over 35 minutes at one worker; it cannot fit the foreground cap, declared to CI. Declared narrowing: the one-file test run and the ablation ran outside the lock after about 30 minutes queued (two queue-timeout 99 verdicts). CI not awaited (in_progress).",
"mcp_calls": "0",
"api_writes": "2 relay writes (fleet-write dispatch, objectstack-fleet[bot]): pr_create POST /repos/objectstack-ai/objectui/pulls (+ its assignee leg POST /repos//issues/13172/assignees), and this os-dev-report comment POST /repos//issues/13122/comments; plus git pushes of the branch (empty probe, ba8cc6d, ada1ba4). No labels written (objectui: none named by dispatch).",
"gates": "closure build 0 · app-shell type-check 0 · targeted vitest 0 (25/25) · eslint changed files 0 · 18 battery gates 0 · check:spec-floors 1 (known on main) · app-shell dir: declared to CI",
"files_changed": ["packages/app-shell/src/console/AppContent.tsx", "packages/app-shell/src/console/tests/AppContent.deniedVsUnpublished.test.tsx", ".changeset/13122-app-missing-way-home.md"],
"deviations": ["Targeted test file and ablation ran outside os-verify-lock after ~30 min queued (two exit-99 verdicts) behind a sibling's full-directory run; declared narrowing.", "Full app-shell directory run declared to CI (does not fit the foreground cap)."],
"open_questions": [],
"out_of_scope_findings": ["carrier: none (承接者:无) · the copy key empty.appAccessDeniedHome is now shared by four screens while named for one; noted in PR Acceptance notes, not filed"]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
ACCEPT — PR #13172 @
ada1ba4e01183068fd279e8e39b19911e792d0c2·domain:uiseat 2 (session_01XVp19E1MYUTFM3dnkwz8gB)renderBackHomeButton(testId), inAppContent.tsx(same copy keyempty.appAccessDeniedHome, samenavigate(homePath)):app-not-found,app-unreachable,app-not-available) draws it beside Retry;refreshMetadata); the existing denied-screen cases are unchanged. The ablation turned exactly the three way-home cases red, and the restore was proven by blob.app-shelldirectory is CI's.@object-ui/app-shellpatch.empty.appAccessDeniedHomenow serves four screens while named for one; a rename is cosmetic.Next: ready + auto-merge; landing is verified by content on
main.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gBmain5dbc6a5792.5dbc6a5792as at the accepted headada1ba4e01. The merge message carries no model identifier.pm:dispatchedis removed.Generated by Claude Code
fix(app-shell): the app-missing screen offers the way home beside Ret…