---
title: "Task verbs"
url: https://services.dev/docs/reference/task-verbs
captured: [task-verbs.txt]
---
# Task verbs

URL: https://services.dev/docs/reference/task-verbs

> Every act on a Task, the worklists.dev verb it maps to, who writes it, the operation and event, the status it folds to on both sides, and what it means for the member.

A Task's status is never a column. It is a fold over the Task's own appended acts, and each act names its [worklists.dev](https://worklists.dev) verb, so any client that speaks those verbs reads a Task the same way. Surfaces keep their own status words. [Tasks](https://services.dev/docs/people/pool/tasks.md) explains the lifecycle, and [What a person can do](https://services.dev/docs/people/acts.md) each act.

## The crosswalk

One row per act. A status shows as services.dev's word, then what a worklists.dev client reads.

| worklists.dev | Act | Written by | Operation | Event | Folds to: services.dev · worklists.dev | For the member |
|---|---|---|---|---|---|---|
| `dispatch` | [`posted`](https://services.dev/docs/people/acts.md#the-acts) | the step | none: the job reaching the step | `task.posted` | `open` · pending | an offer, at a fee fixed now |
| `assign` | [`offered`](https://services.dev/docs/people/acts.md#the-acts) | the dispatch, a direct or the owner's pick | [`task.offer`](https://services.dev/docs/reference/operations.md#taskoffer) | `task.offered` | `open` · pending | a teaser, never a party's name |
| `claim` | [`claimed`](https://services.dev/docs/people/acts.md#the-acts) | the member | [`task.claim`](https://services.dev/docs/reference/operations.md#taskclaim) | `task.claimed` | `claimed` · claimed | held for them, gone from every other feed |
| `unassign` | [`released`](https://services.dev/docs/people/acts.md#the-acts) | the member | [`task.release`](https://services.dev/docs/reference/operations.md#taskrelease) | none | `open` · pending | free, and never scored |
| `unassign` | `reopened` | the clock, after `expired` | none | none | `open` · pending | never scored |
| `start` | [`cleared`](https://services.dev/docs/people/acts.md#the-acts) | the member | [`task.clear`](https://services.dev/docs/reference/operations.md#taskclear) | none | `cleared` · in-progress | the packet opens to them alone |
| `start` | [`arrived`](https://services.dev/docs/people/acts.md#the-acts) | the member, at the site | [`task.arrive`](https://services.dev/docs/reference/operations.md#taskarrive) | none | `on_site` · in-progress | location is read now |
| `block` | [`questioned`](https://services.dev/docs/people/acts.md#the-acts) | the member | [`task.message`](https://services.dev/docs/reference/operations.md#taskmessage) with `question` | `job.paused` | `cleared`, waiting on the client · blocked | the hold and the step's clock pause |
| `unblock` | `answered` | the party | the thread | none | `cleared` · in-progress | the hold runs again |
| `complete` | [`attested`](https://services.dev/docs/people/acts.md#the-acts), `sent_back`, `declined` | the member | [`task.attest`](https://services.dev/docs/reference/operations.md#taskattest), [`task.send_back`](https://services.dev/docs/reference/operations.md#tasksend_back), [`task.decline`](https://services.dev/docs/reference/operations.md#taskdecline) | `pay.accrued` | `done` · settled | paid at the act, whichever they chose |
| `complete` | [`completed`](https://services.dev/docs/people/acts.md#the-acts) | the member | [`task.complete`](https://services.dev/docs/reference/operations.md#taskcomplete) | `pay.accrued` | `done` · settled | paid per completed Task |
| `complete` | [`party_absent`](https://services.dev/docs/people/acts.md#the-acts) | the member, after `site.grace` | [`task.complete`](https://services.dev/docs/reference/operations.md#taskcomplete) with `party_absent` | `pay.accrued` | `done` · settled | the full fee |
| `complete` | [`party_silent`](https://services.dev/docs/people/acts.md#the-acts) | the clock, after `site.wait`, on the member's evidence | none | `pay.accrued` | `done` · settled | the full fee; the client may contest |
| `timeout` | `expired` | the clock, with no performer | none | `task.hold_expiring` before it | `open` · timed-out, then pending | never scored |
| `timeout` | `no_show` | the clock, with no performer | none | none | `open` · timed-out, then pending | counted once, in a work register |
| `escalate` | `widened` | the fill ladder | none | `task.widened` | `open` · escalated | a wider set of members, never past eligibility |
| `escalate` | [`contested`](https://services.dev/docs/people/acts.md#the-acts) | the member | [`task.contest`](https://services.dev/docs/reference/operations.md#taskcontest) | `task.contested` | `done`, contested · escalated | the send-back stops counting |
| `complete` | `ruled` | a credentialed peer, or staff | [`task.attest`](https://services.dev/docs/reference/operations.md#taskattest) on the contest Task, or the console | `task.ruled` | `done` · settled | an upheld send-back counts; one overturned never does |
| `cancel` | `withdrawn` | the job | none | `pay.accrued` for the kill share | `done`, withdrawn · cancelled | the kill share, once cleared |
| none | [`passed`](https://services.dev/docs/people/acts.md#the-acts) | a member who read the sheet | [`task.pass`](https://services.dev/docs/reference/operations.md#taskpass) | none | `open` · pending | free, and never counted against them |
| none | [`extended`](https://services.dev/docs/people/acts.md#the-acts) | the member, once | [`task.extend`](https://services.dev/docs/reference/operations.md#taskextend) | `task.extended` | `claimed` · claimed | the hold runs as long again |
| none | [`recused`](https://services.dev/docs/people/acts.md#the-acts) | the member, for a conflict | [`task.recuse`](https://services.dev/docs/reference/operations.md#taskrecuse) | `task.recused` | `open` · pending | unpaid, unscored, screened from the subject |
| none | `raised` | the fill ladder | none | `task.raised` | `open` · pending | the fee rises, never falls |
| none | `due_moved` | a quorum of passes on timing | none | `task.due_moved` | `open` · pending | a day more |
| none | `unreached` | the clock, at post | none | `task.unreached` | `open` · pending | nothing; the owner console alarms |
| none | `noted`, `flagged` | the member | [`task.message`](https://services.dev/docs/reference/operations.md#taskmessage) | none | unchanged | a message, or a signal the owner sees |
| `query` | the member's feed, or the owner's open Tasks |  | [`task.list`](https://services.dev/docs/reference/operations.md#tasklist) |  |  |  |
| `trace` | the Task with its acts |  | [`task.get`](https://services.dev/docs/reference/operations.md#taskget) |  |  |  |

## The Task, with its acts

```txt
→ GET /owner/tasks/tsk_7Hq2?acts=true   # the owner: the Task, and the acts its status folds from
```

```json title="captured/task-verbs.txt · 200 · tsk_7Hq2 · done · magic values: member = mbr_eligible"
{
  "id": "tsk_7Hq2",
  "object": "task",
  "pool": "translators",
  "role": "translator",
  "status": "done",
  "outcome": "attested",
  "acts": [
    { "seq": 1, "act": "posted", "verb": "dispatch", "by": "step:sign", "at": "2026-10-27T14:02:11Z", "fee_usd": 30 },
    { "seq": 2, "act": "offered", "verb": "assign", "by": "dispatch:feed", "at": "2026-10-27T14:02:11Z" },
    { "seq": 3, "act": "claimed", "verb": "claim", "by": "mbr_7Hq4", "at": "2026-10-27T14:20:03Z" },
    { "seq": 4, "act": "expired", "verb": "timeout", "by": "clock", "at": "2026-10-28T14:20:03Z", "breached": "held_until" },
    { "seq": 5, "act": "reopened", "verb": "unassign", "by": "clock", "at": "2026-10-28T14:20:03Z", "reopened": 1 },
    { "seq": 6, "act": "raised", "verb": null, "by": "fill:raise", "at": "2026-10-28T16:20:03Z", "fee_usd": 33 },
    { "seq": 7, "act": "claimed", "verb": "claim", "by": "mbr_eligible", "at": "2026-10-28T16:31:47Z" },
    { "seq": 8, "act": "cleared", "verb": "start", "by": "mbr_eligible", "at": "2026-10-28T16:32:15Z" },
    { "seq": 9, "act": "questioned", "verb": "block", "by": "mbr_eligible", "at": "2026-10-28T16:40:02Z", "msg": "msg_7Hq5" },
    { "seq": 10, "act": "answered", "verb": "unblock", "by": "client", "at": "2026-10-28T17:05:44Z", "msg": "msg_7Hq6" },
    { "seq": 11, "act": "attested", "verb": "complete", "by": "mbr_eligible", "at": "2026-10-28T17:21:09Z", "artifact": { "kind": "sha256", "digest": "27d7bdec3be22fd633af279053beef779c9c5080629816867bbfc4e4593a5b33" } }
  ]
}
```

## One worklist across doors

A member who works Pools on several doors reads them as one worklist: `GET /tasks?doors=all` lists every Task offered to them, in [one order for every brand](https://services.dev/docs/people/pool/dispatch.md#one-order-for-every-brand). A worklist is a query, so nothing is copied between doors, and each Task still answers to its own Pool's rules.

On an imported or listed Pool, `complete` accrues the [placement line](https://services.dev/docs/people/pool/share.md#the-placement-line) beside the member's pay. A `timeout`, a `cancel` and a pass accrue none.

## Rules every client keeps

| Rule | On services.dev |
|---|---|
| `complete` takes a hash, never a boolean | an act binds the hash of the packet the member read, or of the evidence they captured |
| A client acts only as the member | every act carries the member's own `ms_` session token; a brand's key or an agent never can, and gets `needs_a_person` |
| Pay follows the act, not the client | the same act pays the same fee whichever client wrote it |
| No claim on behalf of another | a claim names its caller; only the owner's `task.offer` reaches a named member |
| A refusal never names the holder | `task_taken` says the Task is held, never by whom |
| A timeout has no performer | the clock writes `expired` and `no_show`, and no person is put in `by` |
| No reopen of a done Task | a done Task takes no second act; a send-back on attested work is contested, never edited |
| A pull is free | no line charges a member to claim, clear or complete a Task |
| A worklist is a query, never a store | the feed is computed from open Tasks and the member's eligibility at the moment it is read |

```txt
→ POST /tasks/tsk_7Hq2/claim   # as mbr_7Hq9, while mbr_eligible holds it
```

```txt title="magic values: member = mbr_eligible"
← 409 task_taken: Another member holds this Task, or has it offered to them first. Read your feed for the Tasks offered to you now.
```

---

- Up: [Your first paid job](https://services.dev/docs.md)
- Previous: [Magic values](https://services.dev/docs/reference/magic-values.md)
