d08f9e14f6
A start-marker probe failure (Get-Process timing out on a PowerShell 5.1 cold start, #87169) in claimBackendChild used to stop the freshly spawned backend and rethrow — killing a healthy backend, triggering the renderer's repair respawn, and looping. And because stderr piping only attached after the claim, every before-ready failure surfaced as a bare exit code. - extract probe + claim policy into electron/backend-claim.ts: processStartMarker/execText (moved verbatim from main.ts), probeStartMarker, and a pure claimDecision(childAlive, probe) a Windows CI lane can drive with real PowerShell - probe failure + LIVE child now degrades to PID-only identity (pid-only:<pid> marker, WARNING logged), matching the existing createParentStartMarkerResolver degrade pattern; processIdentityMatches verifies degraded identities by PID liveness (command check still layers on top in backendIdentityMatches) - probe failure + DEAD child keeps the fail-closed throw, now carrying the child's buffered stderr/stdout tail - ring-buffered ~8KB output tail attached at spawn time in BOTH spawn paths (pool + primary); tail appended to claim errors, before-ready exit messages, and backend-ready's exited-before-port-announcement errors so the real exit reason reaches desktop.log and the boot UI - tests: claimDecision matrix (degrade test fails against the old stop+throw behavior), real processStartMarker probe, ring-buffer caps, and output-tail suffixes on backend-ready exit errors