Skip to content

Run and attempt states

A run is one execution of a task. An attempt is one try inside that run, so a run that retried twice has three attempts. For what they are, see runs and attempts.

StatusMeansSet when
pendingWaiting for a runner to pick it upThe run is created, or a stale run is requeued
assignedA runner has claimed itThe runner’s heartbeat claims the run
in_progressAn attempt is executingThe runner opens its first attempt
paused_approvalStopped at an approval gateThe task needs approval, or the agent asks mid-run
finalizedFinished, with an outcomeThe runner reports a result, an approval is denied, or the control plane stops it
cancelledStopped deliberatelyCancelled from the run
reviewReservedNothing sets it today

paused_approval is the one status a run can enter and leave without finishing.

  1. A run that needs approval is created already paused, before any runner sees it. A run that hits a gate mid-flight is paused where it stands.
  2. The run remembers the status it paused from.
  3. Approving returns the run to that remembered status, so a run paused before it was claimed goes back to pending and one paused mid-execution resumes.
  4. Denying finalizes the run with the outcome inconclusive and the reason approval_denied, fails the running attempt, and frees the runner.

A finalized run carries exactly one outcome.

OutcomeMeans
acceptedThe work was accepted. This is the one that lets the task advance
rejectedThe work was produced and rejected
inconclusiveNo usable answer. Denied, abandoned, or stopped

A run that stopped at a limit with real work on a branch is inconclusive with the reason partial, and it is never accepted on its own: the decision goes to a person. See when a run reaches a limit.

Alongside it, a run may carry a reason for finishing the way it did.

The reasons a runner may report are a closed list. A runner that reports anything else is refused and nothing is written, so a reason recorded on a run is always one of these. Two of them, approval_denied and wall_clock_exceeded, the platform also writes itself when it stops a run rather than waiting for the runner to report.

ReasonMeans
passedThe work was produced and the review accepted it
partialThe run stopped at a cap with work worth keeping; it is never accepted
cap_exceededThe run used every attempt it was allowed without reaching an accepted result
wall_clock_exceededThe run passed its wall-clock limit and was stopped
budget_exceededThe run reached the spend ceiling resolved for its task type
review_unparseableThe review of the work came back in a shape that could not be read as a verdict
redteam_unparseableThe red team’s report came back in a shape that could not be read as a verdict
checks_disagreeThe review and the task’s own checks reached opposite verdicts
awaiting_setupThe run needs a value from a person and raised a setup task asking for it
awaiting_assistThe run hit a blocker only a person can clear and raised a task asking for it
awaiting_approvalThe run reached an approval gate and nobody answered while it waited
approval_deniedAn approval gate was denied
toolchain_unavailableThe project’s toolchain could not be prepared in a fresh checkout, so nothing ran
containment_unavailableThe runner could not establish the boundary it runs agents inside, so nothing ran
no_adapterThe runner has no coding agent installed that can execute this run
no_agent_credentialThe coding agent had no credential to sign in with
no_run_envThe project environment the run asked for could not be assembled
no_mcp_credentialA tool server attached to the run had no usable stored credential
invalid_metadataThe run was dispatched without something the runner needs before it can start
model_family_mismatchThe model asked for belongs to a different provider than the agent running it
runner_errorThe runner itself failed
chat_completeA chat turn finished normally
chat_failedA chat turn failed
chat_malformed_requestA chat turn arrived in a shape the runner could not read

The platform writes a few reasons of its own, none of which a runner may report:

ReasonWritten when
abandonedThe assigned runner went stale and the run was out of attempts
admin_forcedA platform administrator stopped the run by hand
canary_echoThe run was the platform’s own end-to-end health probe rather than your work
chat_deadline_exceededA huddle chat turn did not come back in time
eva_chat_deadline_exceededAn Eva chat turn did not come back in time
managed_queue_timeoutNo managed runner claimed the chat run before it gave up waiting
completion_deadline_exceededA chat run passed its own deadline while a runner held it

An attempt carries a status and a phase. The status says whether it is alive; the phase says what it is doing.

StatusMeans
runningExecuting now
completedFinished and reported a result
failedFinished without one
cancelledStopped before it finished
PhaseMeans
planningWorking out what to do
executingDoing it
awaiting_reviewWaiting for its work to be evaluated
checksReserved. The runner is executing the task’s checks with no model in the loop
red_teamReserved. A separate attempt is trying to make the implementation fail
doneFinished

Every run carries an attempt ceiling, from the budget resolved for its task type. A run whose runner goes quiet is requeued to pending and tried again while attempts remain. Once they run out, the run finalizes inconclusive with the reason abandoned instead of waiting forever.

The current values are on limits.