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
[14:20:57] Please read GitHub issue #57… [14:20:58] You've hit your weekly limit · resets Aug 17 at 4pm [error] You've hit your weekly limit…
agent_trace source:"coding"
no event for this run; newest coding event is 2026-08-13 02:53:55
startedAt 1786767644486 → observed 1786783320834 = 4.35 hours, on iteration 1 of 30.
The engine died one second after receiving the objective.
Three separate defects
1. lastProgressAt measures liveness, not progress. It advanced to within 3.5 minutes of the
observation on a run that has not left iteration 1 since 14:20. Whatever touches it is not gated
on the run advancing, so the single field a stall detector would read is precisely the field that
conceals a stall. #579 §1 proposes distinguishing a stalled run from a clean failure; on this
evidence a stall is currently undetectable from the run record.
2. Two tools disagree about one session.check_instance_loop → running; coding_session_capture → runState:"idle". Both read server state for the same session id.
The capture is correct.
3. The run wrote nothing to the unified trace.workflows/coding-session.ts contains zerologEvent calls and zerologError calls:
Coding events DO reach the trace, but only via lib/coding-failure.ts:341, on a classified
failure. A run that simply stops classifies nothing and therefore records nothing. The only
durable account of this run's death is the pane, retrievable only by someone who already knows the
session id.
The same shape, three more times
Instance a1d3522f-6b91-4cd9-bf7b-380e470192b7 (AIPA coder), objective git pull — a
two-second command — three runs:
run
elapsed
iteration
outcome
82739cb6
3.15 h
1/10
failed — stuck not resolved in time
1dbb3e54
3.41 h
1/10
failed — stuck not resolved in time
ebc70ac1
0.26 h
3/10
failed — stuck not resolved in time
So a stuck-run timeout exists, but at a scale of hours, and it produces a message that names no
cause. Two of the three never left iteration 1.
A run whose engine has emitted a terminal error does not remain status:"running". State where
the transition is made and why that point is correct.
lastProgressAt reflects progress, or is renamed and joined by a field that does. Whichever
is chosen, a stall must be detectable from the run record alone.
check_instance_loop and coding_session_capture cannot disagree about whether a session is
working. A test drives both off one state.
coding-session.ts writes the trace/error events its four peer workflows write — enough to
answer "what happened" without the pane. A guard asserts the coding driver is not an exception,
stated over the whole workflow set per ADR 0002, not a hand-listed subset.
Tests reproduce this exact case: engine emits a terminal provider error at step 1; assert the
run record goes terminal, the trace carries the cause, and no surface reports running.
Verified vs inferred
Verified: every value in the tables, read live 2026-08-15 from check_instance_loop, coding_session_capture and agent_trace; the elapsed arithmetic; both grep -c counts and
their peer-file comparisons; coding-failure.ts:341 as the coding trace writer; the three AIPA
run records.
Inferred: what advances lastProgressAt — the field is observably fresh on a run that has
not advanced, but the writer was not traced. AC2 should start by finding it; if it turns out
to be a legitimate progress signal on a sub-iteration unit, this is a naming and surfacing
problem rather than a correctness one, and should be re-rated.
A dead run reported "running" for 4.35 hours, and the only record of the truth was the pane
Measured live 2026-08-15, instance
e4d2d031-833b-4ccf-8b39-8af08337075b(PAS Coder), run70ea298e-bd0c-487e-a210-0efc2f019191, sessioncsess_88a4de4b-045b-4814-b978-b55626f62375.What each surface said, at the same moment
check_instance_loopstatus:"running",stopReason:null,finishedAt:null,iteration:1/30check_instance_loop.lastProgressAtcoding_session_capture.runState"idle"coding_session_capture.pane[14:20:57] Please read GitHub issue #57…[14:20:58] You've hit your weekly limit · resets Aug 17 at 4pm[error] You've hit your weekly limit…agent_trace source:"coding"2026-08-13 02:53:55startedAt1786767644486 → observed 1786783320834 = 4.35 hours, on iteration 1 of 30.The engine died one second after receiving the objective.
Three separate defects
1.
lastProgressAtmeasures liveness, not progress. It advanced to within 3.5 minutes of theobservation on a run that has not left iteration 1 since 14:20. Whatever touches it is not gated
on the run advancing, so the single field a stall detector would read is precisely the field that
conceals a stall. #579 §1 proposes distinguishing a stalled run from a clean failure; on this
evidence a stall is currently undetectable from the run record.
2. Two tools disagree about one session.
check_instance_loop→running;coding_session_capture→runState:"idle". Both read server state for the same session id.The capture is correct.
3. The run wrote nothing to the unified trace.
workflows/coding-session.tscontainszero
logEventcalls and zerologErrorcalls:Coding events DO reach the trace, but only via
lib/coding-failure.ts:341, on a classifiedfailure. A run that simply stops classifies nothing and therefore records nothing. The only
durable account of this run's death is the pane, retrievable only by someone who already knows the
session id.
The same shape, three more times
Instance
a1d3522f-6b91-4cd9-bf7b-380e470192b7(AIPA coder), objectivegit pull— atwo-second command — three runs:
82739cb6failed — stuck not resolved in time1dbb3e54failed — stuck not resolved in timeebc70ac1failed — stuck not resolved in timeSo a stuck-run timeout exists, but at a scale of hours, and it produces a message that names no
cause. Two of the three never left iteration 1.
Relationship to existing issues
15-minute human takeover. That handling is doubly wrong here: this limit resets on Aug 17,
so no takeover window of any length can help, and the run should fail immediately with the cause
named rather than wait.
question is upstream of notification: the platform does not currently know this run is over.
Notification cannot fix a run record that says
running.unknown#546 (WorkflowInternalErrorclassifiedunknown) and A Codex coding session is completely invisible — unmetered like a tmux drive, but unlike a tmux drive the absence is never recorded, and classifyEngineMetering has zero production callers #556 (invisible Codex session)are the same family: the coding driver's failure paths are the least instrumented.
Acceptance criteria
status:"running". State wherethe transition is made and why that point is correct.
lastProgressAtreflects progress, or is renamed and joined by a field that does. Whicheveris chosen, a stall must be detectable from the run record alone.
check_instance_loopandcoding_session_capturecannot disagree about whether a session isworking. A test drives both off one state.
coding-session.tswrites the trace/error events its four peer workflows write — enough toanswer "what happened" without the pane. A guard asserts the coding driver is not an exception,
stated over the whole workflow set per ADR 0002, not a hand-listed subset.
not a takeover-shaped wait ([bug] The dominant live cause of dead runs: the Engine's own subscription usage limit is handled as a 15-minute human takeover, so a run dies 41 minutes before the CLI comes back #541).
run record goes terminal, the trace carries the cause, and no surface reports
running.Verified vs inferred
check_instance_loop,coding_session_captureandagent_trace; the elapsed arithmetic; bothgrep -ccounts andtheir peer-file comparisons;
coding-failure.ts:341as the coding trace writer; the three AIPArun records.
lastProgressAt— the field is observably fresh on a run that hasnot advanced, but the writer was not traced. AC2 should start by finding it; if it turns out
to be a legitimate progress signal on a sub-iteration unit, this is a naming and surfacing
problem rather than a correctness one, and should be re-rated.