Triage
Confirmed on current main. In wsl-only mode, the "Connecting to WSL…" splash stays up until the primary backend reports ready, and it has no controls, so a backend that never becomes ready leaves you no way back to Settings. Preflight failures are already capped (MAX_PREFLIGHT_FAILURE_ATTEMPTS), and handlePrimaryPreflightFailure falls back to Windows. A backend that passes preflight and then dies isn't capped: scheduleRestart only limits the delay (500ms, doubling, up to 10s), never the number of attempts, which matches the ~10s restart loop. A process that stays up but never answers is the other loop: probeReadiness keeps retrying on a 60s budget for as long as the child is alive.
The two crashes in your log explain why preflight passes and the process still exits:
The staged runtime's readiness check runs
t3 --versionwith stderr discarded (runtime_entry_runs). Any dynamic-linker failure, including the missinglibatomic.so.1on Ubuntu 22.04, gets reported as "WSL runtime archive does not contain a working t3 executable", and the install falls through to the mounted server tree. That fitslibatomic1making./t3 --versionwork. The archive can be intact while the binary still can't run on that distro, and the linker error never reachesdesktop.trace.ndjson.The mounted tree is the Windows server sidecar (
server.asarextracted underwsl-server-tree), installed for win32, soffi-rs's optional@yuuang/ffi-rs-linux-x64-gnubinding isn't in it. Server startuprequires@ff-labs/fff-nodefromWorkspaceSearchIndex.ts, which loadsffi-rs, and Linux Node throwsMODULE_NOT_FOUND. The mounted-tree preflight onlyrequiresnode-pty(whose Linux prebuild ships inside that package), so preflight reports ready and the exit is treated as an unexpected crash rather than a preflight failure. The code comment saying this fallback is recoverable doesn't hold for this tree.
This isn't a duplicate of open issue #3709 (login-shell Node older than 22.16 exits 0 before binding), closed issue #4535 (slow /mnt/c boot; the readiness probe now retries while the process is alive), closed issue #5967 (same splash, but no logs), or open issue #13738 (dual mode with a healthy backend that Windows can't reach at the NAT address). Those can show the same splash, but the lockout here comes from an uncapped failure after preflight in wsl-only mode.
An in-memory Windows fallback after repeated startup failures is the right recovery. It has the same shape as the non-fatal preflight path (applyWslWindowsFallbackInMemory), so wslOnly stays set for the next launch. It needs to cover both loops: exits before ready, and a live process whose readiness probes keep failing (the iptables case). That fallback won't make the staged runtime run without libatomic.so.1, and it won't make the Windows sidecar load ffi-rs on Linux. Those are separate fixes.