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 verb, so any client that speaks those verbs reads a Task the same way. Surfaces keep their own status words. Tasks explains the lifecycle, and What a person can do each act.
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 | the step | none: the job reaching the step | task.posted | open · pending | an offer, at a fee fixed now |
assign | offered | the dispatch, a direct or the owner's pick | task.offer | task.offered | open · pending | a teaser, never a party's name |
claim | claimed | the member | task.claim | task.claimed | claimed · claimed | held for them, gone from every other feed |
unassign | released | the member | task.release | none | open · pending | free, and never scored |
unassign | reopened | the clock, after expired | none | none | open · pending | never scored |
start | cleared | the member | task.clear | none | cleared · in-progress | the packet opens to them alone |
start | arrived | the member, at the site | task.arrive | none | on_site · in-progress | location is read now |
block | questioned | the member | task.message 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, sent_back, declined | the member | task.attest, task.send_back, task.decline | pay.accrued | done · settled | paid at the act, whichever they chose |
complete | completed | the member | task.complete | pay.accrued | done · settled | paid per completed Task |
complete | party_absent | the member, after site.grace | task.complete with party_absent | pay.accrued | done · settled | the full fee |
→ GET /owner/tasks/tsk_7Hq2?acts=true # the owner: the Task, and the acts its status folds from
{
"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 },
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. 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 beside the member's pay. A timeout, a cancel and a pass accrue none.
| 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 |
→ POST /tasks/tsk_7Hq2/claim # as mbr_7Hq9, while mbr_eligible holds it← 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.