One more consequence of the readHttpApiStatus(cause) ?? 500 mapping in PrimaryEnvironmentRequestError.fromCause (apps/web/src/environments/primary/auth.ts:54, v0.1.3): it stops the web side from ever retrying "can't connect" errors.
retryTransientBootstrap treats a TypeError (Failed to fetch) as transient (auth.ts:294-305). But fetchSessionState and fetchPrimaryEnvironmentDescriptor (context.ts:12-27) wrap the error in PrimaryEnvironmentRequestError inside the retried operation. A transport error has no response, so it becomes status: 500, which is not in {502, 503, 504}, and the retry loop throws it on the first attempt. When the backend isn't listening yet, the route's beforeLoad goes straight to the fatal screen instead of waiting out the 15 s budget.
#26604 hit this after the backend was killed from outside and restarted: the renderer reloaded about 4.5 s before the backend was back, failed once, and stayed on the error screen until the user clicked Reload. That issue has the trace and log evidence.
Claude Code (claude-opus-5-5) via t3 triage