snapshot_session() pinned boot_attempts at the launch value whenever any
pane still had an unconfirmed AI restore target, so the 1 Hz autosave never
reset the crash-loop counter. A Codex conversation waiting at its startup
prompts (hook review, directory choice, "open in another app") therefore
counted every normal exit as a failed start, and the third launch moved the
whole workspace to session.crashed.json.
The breaker only answers "did this launch reach its first autosave"; the
restore target is still persisted through session_agent() and resumed on the
next launch. Drop the coupling and the recovery_boot_attempts field, and add
a GPUI regression that restores an unconfirmed Codex target on the third
attempt and asserts the snapshot reports zero attempts.