
Every run starts as a small message in a queue. Workers pick messages up, run one step, write the result and put the next step back in line. Nothing holds a run in memory for longer than a single step.
Why one step at a time
Short jobs make deploys painless and crashes cheap. If a worker dies, the step it held simply returns to the queue and another worker finishes it. Customers never see the restart.
Retries use the same path. A failed step goes back with a delay that grows each time, and after the last try it lands in a list a person can open, read and replay.

