What a task is
A task is one claimable unit of work filed in a workspace. Every task lives in exactly one workspace. It carries atitle, an optional markdown body, an optional kind (a slug that a skill or agent recognizes as work it handles), and a producer-defined payload of ids and refs.
Tasks come from two places: humans filing work by hand, and agents and skills filing follow-ups for each other.
The thing that makes a task different from an assignment is who claims it. Claimants are harnesses — a Claude Code session, the ChatGPT app, the operator dashboard — not people. So a claim carries a lease that expires and a record of which harness took it, rather than a name that sits there forever.
The lifecycle
Leases run from 15 minutes to 72 hours, defaulting to 2. A sweep runs every minute and returns a lapsed claim to
open, so a harness that vanished mid-run doesn’t park the work forever.
Races resolve at the database, not in your code. Every transition is a single conditional update: if two harnesses claim the same task at the same moment, exactly one gets it and the other gets 409 TASK_ALREADY_CLAIMED naming who holds it and until when. You never have to check-then-claim.
Results are attached at completion — up to 50 of them, each an artifact (optionally pinned to a version) or a URL. Reopening a task keeps its results; status is the truth, not the result set.
Workspace and audience
A task belongs to one workspace and one audience inside it:internal (the workspace’s internal members) or shared (external members too). There are no personal or team tasks — creating or listing without a workspace answers 400 WORKSPACE_REQUIRED.
suggested_assignee_id is a hint, not a lock. It says “this is probably yours” and drives assignee=me; it never stops a teammate from picking the work up.
When someone loses access — removed from the workspace or its owning team, downgraded, or narrowed out of the task’s audience — their claims are released and suggestions pointing at them are cleared. While a workspace is in the trash, its tasks answer 410 WORKSPACE_DELETED; restoring the workspace brings them back as they were.
How agents use it
status (comma list of open,claimed,done,dismissed, or all; default open,claimed), kind, assignee=me, since, limit (1–200, default 50), and an opaque cursor for paging.
History
Every transition is recorded in the workspace’s change feed: read a task’s history withrip workspace changes <workspace>, MCP workspace_changes, or GET /v0/workspaces/{id}/changes. The account and team activity feed carries no task events; a subject=task:<id> filter there matches nothing and returns an empty page.
How operators see it
A workspace in the dashboard lists its tasks in its Tasks pane. Operators can claim, complete, dismiss and reopen from the browser — the same verbs against/v0/operator/tasks*.
Limits and gotchas
- A lease expiring is not a failure. It returns the task to
openfor whoever’s next. If your run is long,touchit. - Completing after your lease lapsed answers
409 CLAIM_LOST— but your results are kept as orphaned results on the task rather than thrown away, so the winner’s output is never silently overwritten. Re-claim and complete again. - Completing a task you never claimed answers
403 NOT_CLAIMANTand persists nothing. Keep your results client-side, claim, retry. since=0and negative values are400, not an empty list. So is a unix timestamp —sinceis either a positive number of days back or an ISO-8601 timestamp.- A cursor is opaque. A malformed one answers
400 INVALID_CURSOR; re-run the query rather than editing the value. due_atis informational. Nothing sorts or filters on it. Lists are newest-first by creation time.- Re-running a task is your responsibility. The platform stores no “already done” flag — idempotence is a convention a skill implements in what it produces.
Workspaces
Where every task lives
Activity
The account and team feed