Release 2.1.15 (2026-06-07)¶
Bug fixes¶
- make wait_for_checks resilient to PR head movement wait_for_checks pinned the head SHA once and validated check registration for that single instant, then handed off to 'gh pr checks --watch', which re-resolves the PR head on every refresh and exits 1 with 'no checks reported' the moment it sees a head with zero registered checks. Any head movement after the guard passed — most commonly update-branch creating a merge commit whose CI run takes ~15s to register — killed the watch (issue 1490, observed on PR 1486).
Replace both duplicated wait loops (lib/github.py and lib/release/subprocess.py) with a shared engine that re-resolves the head SHA on every registration poll and treats a watch death by 'no checks reported' as transient — re-poll registration and restart the watch — bounded by the existing 180s deadline. All other watch failures propagate unchanged.
- read custom-title naming events and break slot collisions by recency Claude Code (~2.1.16x) renamed the transcript naming event from agent-name/agentName to custom-title/customTitle. The session resolver only parsed the old type, so modern sessions were invisible to transcript-based name resolution, archiving silently no-opped on modern transcripts, and stale pre-rename transcripts squatted on slot names forever — after a VM kill, reconnection resumed the stale session instead of the current one.
Rename _last_agent_name to _last_session_name and parse both event types, last naming event in file order wins. Emit custom-title when archiving so Claude's own resume picker shows the archived label. Break slot-name collisions by liveness first, then last-active recency, so a /clear rotation (which leaves the abandoned session id still claiming the slot name) deterministically resolves to the current id. Ref #1493.