An execution is created the moment a delivery is accepted, before anything runs. From there it moves through statuses until it reaches one of three terminal ones.
| Status | Meaning |
|---|---|
WAITING | Created and queued. The normal starting point |
SCHEDULED | Created to start at a future instant, sitting on a delayed job |
RUNNING | A worker is executing it |
DELAYED | A step called delay(ms); re-queued until the next step is due |
WAITING_RERUN | A step is going to run again — a retry, or a deliberate rerun(ms) |
PAUSED | Suspended by pause(), waiting for its resume hook |
HELD | A real delivery, held because its deployment is switched off |
DRAFT | A test run, created outside the normal queue |
SUCCEEDED | Finished. Terminal |
FAILED | A step exhausted its attempts, or the run was force-failed. Terminal |
CANCELLED | Abandoned — by cancel(), by a cancel hook, or by a person. Terminal |
STALLED also exists in the vocabulary, so filters and test fixtures accept it, but nothing in
the platform currently produces one.
Most non-terminal statuses are transient — something is queued, running or timed, and the run will change state without you.
Two are different:
HELD has no job, no worker and no timer. It changes only when somebody releases or
discards the backlog. See Held deliveries.PAUSED waits for its resume hook. It is auto-cancelled at its expiry, but until then
nothing moves it.| Ending | Status |
|---|---|
| Every step finished | SUCCEEDED |
exit() | SUCCEEDED, remaining steps skipped |
| A step exhausted its retries | FAILED |
| The deployment's timeout elapsed | FAILED, as a whole run rather than at the step |
cancel(), or a person cancelling | CANCELLED |
| A paused run passed its expiry | CANCELLED |
| A test run whose queue job disappeared | FAILED — nobody declined it, it was lost |
A step is RUNNING, SUCCEEDED, FAILED or WAITING_RERUN. They do not always match the
execution's: a run can be RUNNING overall while its current step is WAITING_RERUN, and a
paused step stays RUNNING because it is suspended mid-flight and re-enters itself on resume.
Terminal executions are kept for 90 days by default, then collected with their steps and logs.
Events have their own retention — also 90 days by default — and an event source can set its own. The two are separate on purpose: the event is the evidence that a delivery happened, so it can outlive the run it started.