series has no per-step timeout, so one hung model call stalls the whole run indefinitely #8
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
On emmett, 2026-09-12, the
inference-arbitrageoffload-audit in P3 hung when the host lost its network path mid-API-call. Observed state after ~4.5 hours:26 seconds of CPU over 4h32m, blocked in
epoll_waiton four open-but-dead sockets.Why it matters
The stall is indistinguishable from a healthy long-running run, and specifically invisible where the summary tells readers to look:
My own monitor only caught it because I was separately watching the host's reachability, not because anything in the run reported a problem.
Recovery is trivial once noticed
killon the child let the series recordand continue to the next target immediately. So the fix is detection, not recovery.
Suggested fix
A per-step timeout, or a no-output watchdog on the step's stdout, converting an indefinite stall into a recorded failure. P3 steps legitimately take 250–800s on this fleet (18 audits, observed range on carry), so any threshold needs headroom well above that — and the audits' duration varies with corpus size, which differs ~10x between hosts.
Environment
emmett (8 cores),
just series --with-modelwithPROFILEScovering 4 live profiles / 6122 transcripts. Host did not reboot (/proc/uptime121651s afterwards) — it lost only its ZeroTier path, filed separately. carry's concurrent run of the same series completed all 18 audits normally.Correction to this issue's Environment note
The note says the host "did not reboot (
/proc/uptime121651s afterwards) — it lost only its ZeroTier path, filed separately". That is wrong. emmett hibernated at ~15:40 EEST and resumed at 19:56:15:corroborated by the single 255.8-minute gap in emmett's own local load-collector samples, ending at the same second as the resume.
/proc/uptimecarries across a hibernate/resume within one boot, so it never supported the claim I made from it. The ZeroTier issue I filed alongside this one (oleks/emmett#705) is retracted and closed.This does not weaken the defect here — it sharpens it.
The trigger is not an exotic network partition. It is the host going to sleep, which is ordinary and will recur. The failure mode is unchanged and now has a mundane cause:
claude -pnever notices, sitting indo_epoll_wait(26s CPU over 4h32m);So any overnight or unattended run on a machine that sleeps is exposed, not just one that loses its mesh. That raises the priority of a no-output watchdog over a fixed per-step timeout: a watchdog on stdout would catch a sleeping host, a resumed-but-broken connection, and a genuinely wedged model call alike, without needing a threshold tuned to the 250–800s legitimate range.
Worth noting the run did resume cleanly once the dead child was killed — it recorded
rc=143 FAILED 16369.01sand moved to the next target. Nothing about the post-resume state was broken except that one call.