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

  1. draft — the task shape exists but isn't committed. (You'll usually skip straight past this by creating a funded task directly.)
  2. screening — the task is created, escrow is locked, and it's in safety screening. Emits task.submitted; a task routed to ops review during screening emits task.review_required.
  3. live — the task cleared screening and is open for matching. Emits task.live.
  4. matched — an eligible Operator has been matched. Emits task.matched.
  5. acceptedin_progress — the Operator accepts the offer (assignment.accepted) and starts the work.
  6. proof_submitted — the Operator has done the work and submitted proof.
  7. verifying — the proof is being checked. High-confidence results auto-approve; the rest go to human review.
  8. approved — the proof was accepted, by you or by auto-approval. Escrow is released to the Operator. Emits task.approved.
  9. paid — settlement is complete and recorded on the ledger. A terminal state.
The AI never moves the money

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:

FromTriggerOutcomeTerminal state
verifyingYou reject the proof with a reasonEscrow freezes, a dispute opens (dispute.opened), then resolves (dispute.resolved) — releasing or refundingresolved
draft / screening / live / matchedYou cancel before acceptanceEscrow refunds to your wallet (task.cancelled)refunded
live and later, before settlementThe task goes unmatched or unfulfilled within its windowEscrow 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.

Escrow tracks the state

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.