You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When the session status is anything but completed, result.result_json is never read. After max_triage_attempts the run escalates with "triage output failed validation: ..." — blaming output that was never validated. The migration path has the same shape (validate_migration runs only on completed). #194's env_fault pause softens the transport-failure case only; a lost event channel is not classified as an env fault.
Incident
Run 20260816-113627-d0b2 (macOS, claude adapter). The hook relay had never been registered in that project, so every session's Stop event was lost and each session read as timeout with session_id: null. Both triage attempts wrote a result.json that passes validate_triage (strict and cache mode alike) — attempt 2 finished its actual work in 59 seconds — and both were discarded on session status alone. The escalation blamed the output; the output was fine. signals.py's own docstring predicts the failure mode: losing Stop events means every session stalls to session_timeout_min — "the loudest possible regression, delivered silently".
Make run/sweep enforce the zero-hook-events condition.cmd_validate fails on unregistered, missing, unreadable, or stale relays, but nothing stops a run whose sessions produce zero events: it burns session_timeout_min per session and escalates with the wrong blame. Hard-failing (or pausing) after the first session that ends with stop_seen == False and an empty run events dir would surface the miswiring at session one instead of N timeouts later.
Happy to attach the journal/state.json from the incident run.
Observed (0.10.0)
In
sweep.py's triage handling:When the session status is anything but
completed,result.result_jsonis never read. Aftermax_triage_attemptsthe run escalates with"triage output failed validation: ..."— blaming output that was never validated. The migration path has the same shape (validate_migrationruns only oncompleted). #194's env_fault pause softens the transport-failure case only; a lost event channel is not classified as an env fault.Incident
Run
20260816-113627-d0b2(macOS, claude adapter). The hook relay had never been registered in that project, so every session's Stop event was lost and each session read astimeoutwithsession_id: null. Both triage attempts wrote a result.json that passesvalidate_triage(strict and cache mode alike) — attempt 2 finished its actual work in 59 seconds — and both were discarded on session status alone. The escalation blamed the output; the output was fine.signals.py's own docstring predicts the failure mode: losing Stop events means every session stalls tosession_timeout_min— "the loudest possible regression, delivered silently".Proposals (either or both)
Validate the result artifact on non-completed status too. If it validates, either use it — a
timeoutwith a valid, complete artifact is a completed turn whose Stop event was lost — or at minimum attach "result artifact present and passes validation" to the escalation so the operator debugs the event channel rather than the agent.SessionResult.stop_seen(Session read-back adopts another story's spec: a review that produced nothing is scored done #261) is already the right discriminator:status == "timeout" and not stop_seenwith a validating artifact is the lost-event-channel signature. Routing it like Dev session lost to an API/transport failure is charged as a story timeout, exhausting the attempt budget #194's env_fault pause (pause, don't charge attempts) would fit the existing shape.Make run/sweep enforce the zero-hook-events condition.
cmd_validatefails on unregistered, missing, unreadable, or stale relays, but nothing stops a run whose sessions produce zero events: it burnssession_timeout_minper session and escalates with the wrong blame. Hard-failing (or pausing) after the first session that ends withstop_seen == Falseand an empty run events dir would surface the miswiring at session one instead of N timeouts later.Happy to attach the journal/state.json from the incident run.