3c7cf95d8c
F60, and the general rule F58 and F59 were reaching for one case at a time: a transaction must settle or be abandoned deterministically, and must never spin on an answer that cannot change. Terminal now means failed or completed. Both drop the transaction and free the session; nothing will ever lease either task again. Blocked keeps the transaction, because a reopen returns the task to the queue and that exact owner can still commit. TaskBlocked therefore retains the ending epoch the way TaskReleased already did, or the late-handoff path would have nothing to fence against after the reopen. A refusal parks the commit instead of retrying every five seconds. It is the coordinator's answer about who owns the task, so it stays true until an event about that task arrives, and any such event un-parks it. A reopen arrives as TaskCorrected, so the rule cannot be a list of event types. Backoff runs 30s to a 5 minute cap. A transport failure is not an answer and keeps retrying at once. That distinction is the whole reason the park keys on a 4xx StatusError rather than on any error at all. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVbaKucEYBjMqVeUgJUsc1