Every Claude account keeps an open 5h window during active hours, even with the lid closed. When the keeper cannot open a window, the card says why and offers the fix. A dead token chain never leaves a dead token in service. The Codex account reads usage again.
usage_monitor.py:2114-2117 counts nominal 5s sleeps. Under clamshell dark wakes the sweep ran 15:00, 16:48, 18:14 UTC on 10-26 while the 10-min poller ran 8 times. Windows lapse for every account while the lid is closed.invalid_grant on 10-22 10:22:14. auth.py:518-528 nulls only cc_refresh_token; the dead cc_access_token stays. Keeper pings 401 and skips recovery (usage_monitor.py:2008 needs cc_refresh_token). Poller sends the dead token every cycle (:1879); each 401/429 renews the PRIMARY chain under a cc_429 label: ~140 needless renewals/day. 10-17..10-21: 429 on every ping, body discarded, cause unrecoverable.codex/usage.py:257 shutil.which misses ~/.local/bin/codex. Frozen since 2026-09-05. _validate_codex_account wipes the error.auth.py:498 invalid_grant live recovery imports on the stamp alone, without _live_tokens_belong_to.ping_account returns a PingResult (status, error type, message[:200], request id, retry-after, unified rate-limit reset headers, transport flag); values-free log line.force= on refresh_cc_token, explicit result enum), re-ping once, then ping with the primary token, then persist needs_reauth. 429 schedules from retry-after / reset header. Transport errors retry short and do not escalate. Per-account try/except._sweep_wake.invalid_grant without recovery nulls cc_access_token and cc_expires_at too, and records the CC chain as needing re-auth._refresh_token_flow resolves a chain (cc | primary) once under the lock and uses it for columns, invalid_grant handling, log text, and the early-return token. Per-chain breaker columns with a migration._live_tokens_belong_to; one shared stamp+ownership helper for reconcile, authority guard, and this path.five_hour/seven_day or null resets_at: no AttributeError; clear the stale reset.codex/usage.py, codex/switching.py, codex/accounts.py, codex/_fsutil.py, dcr_settings.py, skill_listing.py, memory/merge_capture.py) go through findbin.find_bin, with the WIP name guard folded in. Guard test bans new bare shutil.which for user CLIs in service modules.credential_helpers.py:575) when the row token is known dead.