Some checks failed
CI / typecheck + vitest (Node 20) (push) Has been cancelled
One chain call that never settled, run under the per-key Mutex with no deadline, convoyed every subsequent request on that key silently while /models and /account stayed healthy (2026-08-12 incident). The per-fetch 30s aborts in the Ogmios providers predate the freeze and did not prevent it; the unbounded thing was the composition under the mutex. Mutex.run() now races each fn against a deadline (default 180s): on expiry the run rejects with MutexTimeoutError and the chain advances, so queued work proceeds instead of freezing. A zombie that settles later can at worst lose a UTxO-contention race with the run that replaced it - strictly better than a permanent convoy. New work is refused with MutexQueueFullError past a queue bound (default 64) instead of queueing without limit. Serialization and rejection-tolerance semantics are unchanged (covered by tests). Session locks in transcripts.ts construct the same class and inherit both protections. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>