The execution lifecycle

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.

The statuses

StatusMeaning
WAITINGCreated and queued. The normal starting point
SCHEDULEDCreated to start at a future instant, sitting on a delayed job
RUNNINGA worker is executing it
DELAYEDA step called delay(ms); re-queued until the next step is due
WAITING_RERUNA step is going to run again — a retry, or a deliberate rerun(ms)
PAUSEDSuspended by pause(), waiting for its resume hook
HELDA real delivery, held because its deployment is switched off
DRAFTA test run, created outside the normal queue
SUCCEEDEDFinished. Terminal
FAILEDA step exhausted its attempts, or the run was force-failed. Terminal
CANCELLEDAbandoned — 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.

The two that do not move on their own

Most non-terminal statuses are transient — something is queued, running or timed, and the run will change state without you.

Two are different:

How a run ends

EndingStatus
Every step finishedSUCCEEDED
exit()SUCCEEDED, remaining steps skipped
A step exhausted its retriesFAILED
The deployment's timeout elapsedFAILED, as a whole run rather than at the step
cancel(), or a person cancellingCANCELLED
A paused run passed its expiryCANCELLED
A test run whose queue job disappearedFAILED — nobody declined it, it was lost

Steps have their own statuses

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.

Retention

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.

Next