A task is a row in the awaithumans database. It moves through a small state machine driven by three actors: the agent (creates / cancels), the human (completes), and the scheduler (times out).Documentation Index
Fetch the complete documentation index at: https://docs.awaithumans.dev/llms.txt
Use this file to discover all available pages before exploring further.
Statuses
| Status | Terminal? | Meaning |
|---|---|---|
CREATED | no | Just inserted; channels haven’t fired yet. |
NOTIFIED | no | At least one channel delivered the task. |
IN_PROGRESS | no | Human opened the task (best-effort tracking). |
SUBMITTED | no | Human clicked submit; verifier (if any) is running. |
VERIFIED | no | Verifier passed; commit imminent. |
REJECTED | no | Verifier rejected this attempt. Human can resubmit. |
COMPLETED | yes | Final response stored; agent unblocked. |
TIMED_OUT | yes | Scheduler fired timeout_at before completion. |
CANCELLED | yes | Agent or operator cancelled. |
VERIFICATION_EXHAUSTED | yes | Out of max_attempts; agent gets a typed error. |
What the agent sees
The SDK’sawait_human() long-polls until the task is terminal, then maps the status to a typed return / exception:
awaitHuman and instanceof checks.
What the dashboard shows
Each status renders with a distinct badge color so an operator scanning the queue sees at a glance which tasks need attention.REJECTED tasks (non-terminal but failed) get a yellow “needs attention” treatment so a reviewer doesn’t think the verifier silently swallowed their submission.
Audit trail
Every status transition writes a row toaudit_entries with:
from_status→to_statusaction(created,completed,verified,rejected,timed_out,cancelled)actor_type(agent,human,system)actor_email(when human-driven)channel(where the action happened:dashboard,slack,email)extra_data(response keys, verifier reason, etc.)
/task/{id}/audit. Operators use it to debug “what happened to this task” without joining tables.
Why REJECTED is non-terminal
If the verifier rejects an attempt and we marked the task terminal, the human couldn’t fix their answer. Instead, REJECTED keeps the task active, the verifier reason is shown to the reviewer (“notes contradict decision”), and they get another shot. The cycle ends when either:- A submission passes the verifier →
COMPLETED max_attemptsis exhausted →VERIFICATION_EXHAUSTED(terminal)- Timeout fires →
TIMED_OUT(terminal)
await_human() with the same key returns the same outcome rather than starting over. See Idempotency.