ci/woodpecker/pr/ci Pipeline was canceled
The launcher runs the runtime as a spawnSync CHILD of node(mosaic) (deliberate, per launch.ts:99 — parent survives to propagate signals), so MOSAIC_LEASE_SESSION_ID lives on the claude child, not the pane's root pid. The transport read only pane.pid's /proc/environ and returned RESOLVE_FAILED for every real 'mosaic claude' seat. Now BFS the pane's process subtree (bounded, injectable children-reader) and read the first descendant that carries a valid lease id; fail-closed if none. Unit tests now exercise the real walk (pane=node without lease -> child=claude with lease) rather than mocking the resolution. Found by scooby greenfield E2E on fomo-lin with proc-level evidence. Co-Authored-By: Claude Opus 4.8 <[email protected]> Claude-Session: https://claude.ai/code/session_013SAYFkRhQfhguY7AHfiUC8