78f5feea11
A locked screen drops the radio, changes network or dozes, and one request fails. Both halves of an advance treated that as the session's fault. The outbox kept the failed event at its head with the comment that a later retry would pick it up, but nothing ever triggered one, so it sat there while the caller was rejected. advanceVibe then cleared the prefetched future and paused, destroying a plan that was still valid. Transient failures now hold the outbox entry unsettled and resend the same event id on a backoff, so no duplicate feedback reaches the director. The retry around the serve sits on the serve alone: serving a version is idempotent, while replaying the whole advance would report a second outcome for a track heard once. Each wait ends early when the browser says the network is back, which is the moment that matters when a screen unlocks. A drop that outlives every retry leaves the future intact to carry on from. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>