Triage
Confirmed. This is a real desktop bug: when the local backend child dies before (or while) serving the renderer, production shows a blank window and never surfaces the failure.
This is not a duplicate of #9239. That issue is a Linux credential-store stall. This report is a confirmed backend process crash on macOS (code=1, ECONNREFUSED), with a failed t3code://app load.
What the code does today
Production serves the first UI through the backend (t3code:// → backend in apps/desktop/src/electron/ElectronProtocol.ts). The main window is created after HTTP readiness, then loadURL("t3code://app/").
In DesktopWindow.ts:
loadURL()rejection is swallowed (catch(() => undefined)).did-fail-loadonly logs.- Automatic reload retries are development-only.
- The connecting splash is a backend-independent data URL, but it is WSL-only.
In DesktopBackendManager.ts, an unexpected child exit schedules an unbounded restart (backend exited unexpectedly; restart scheduled). The existing terminal UI (onPreflightFailed / showErrorBox) covers WSL preflight and Electron-main bootstrap only — not a crash-looping primary child. handleBackendNotReady clears a latch; it does not replace the blank page.
Frontend error handling cannot run because the page never loads. The child reason is already written to server-child.log; the window never shows it.
Related
- #9239 / #9246 — same blank-window symptom, different cause.
- #3513 — sticky error after the renderer loads; opposite gap.
- #8896 / #9312 — persistence/migration crash-loops (including
no such column) that leave desktop without a usable window. Related trigger class. - #10101 — added
branch_pull_request_json, the column in these logs.
The missing-column crash is a separate cause (likely another skipped/unapplied projection migration). This issue should stay scoped to the missing startup diagnostics.
Suggested fix
Add a main-process, backend-independent terminal failure surface (data-URL page like the WSL splash, or a dialog with Open/Copy logs) when:
- production main-frame
t3code://appfails, or - the primary child crash-loops past a bound without staying ready.
Show the last child error, plus Retry and Open/Copy logs. Do not rely on the web error boundary for this path.