Task lifecycle
The state machine every task moves through — draft, screening, live, matched, accepted, in_progress, proof_submitted, verifying, approved, paid — with the dispute, refund, cancel, and expire branches.
Every task moves through a defined state machine. The happy path runs from draft to paid; branches handle rejection, cancellation, and expiry. Each transition is a ledger event and, where relevant, a webhook — so your systems and the task always agree on where things stand.
The main path
draft— the task shape exists but isn't committed. (You'll usually skip straight past this by creating a funded task directly.)screening— the task is created, escrow is locked, and it's in safety screening. Emitstask.submitted; a task routed to ops review during screening emitstask.review_required.live— the task cleared screening and is open for matching. Emitstask.live.matched— an eligible Operator has been matched. Emitstask.matched.accepted→in_progress— the Operator accepts the offer (assignment.accepted) and starts the work.proof_submitted— the Operator has done the work and submitted proof.verifying— the proof is being checked. High-confidence results auto-approve; the rest go to human review.approved— the proof was accepted, by you or by auto-approval. Escrow is released to the Operator. Emitstask.approved.paid— settlement is complete and recorded on the ledger. A terminal state.
Verification produces a report, but the transition into approved is your approval (or deterministic auto-approval), not a model's output. Money only moves on a deterministic state transition.
The branches
Not every task reaches paid. Three branches lead elsewhere:
| From | Trigger | Outcome | Terminal state |
|---|---|---|---|
verifying | You reject the proof with a reason | Escrow freezes, a dispute opens (dispute.opened), then resolves (dispute.resolved) — releasing or refunding | resolved |
draft / screening / live / matched | You cancel before acceptance | Escrow refunds to your wallet (task.cancelled) | refunded |
live and later, before settlement | The task goes unmatched or unfulfilled within its window | Escrow refunds; task closes (task.expired) | refunded |
A rejected task runs through a dispute rather than settling directly. The dispute's outcome decides whether escrow releases to the Operator or refunds to you — either way the task ends resolved. See Handle proof.
Terminal states
A task ends in exactly one of:
paid— approved and settled to the Operator.refunded— cancelled or expired; funds returned to your wallet.resolved— a dispute reached its outcome.
Once terminal, a task doesn't transition again. Corrections happen as new ledger entries, never edits to a settled task — see Escrow and the ledger.
Behind the task, the escrow lock moves through locked, partial, released, or disputed_frozen, and a refund returns funds to your wallet through the ledger — so the balance on your wallet always reconciles with where the task is.