3e8f7e2716
The recovery branch (Failed execution → CleanupStaleExecutionBySessionID → relaunch) is the load-bearing piece of shell session resilience and had no direct test. Extract the body into a free function that takes a narrow shellLifecycle interface so the four branches are testable without standing up a real lifecycle.Manager: - happy path (running execution, no cleanup) - stale recovery (Failed → cleanup → fresh) - initial GetOrEnsureExecution failure - cleanup failure must NOT trigger a re-launch loop - relaunch failure surfaces a clear "recover execution" error