400 with a details object carrying the schema errors.
The atomic claim is the board’s concurrency primitive.
POST /api/board/:taskId/claim returns 409 when another worker already won. A 409 is data, not a transient error — do not retry it. The task is taken. The same rule applies to the 409 illegal_transition on PATCH /api/board/:taskId.Task statuses
| Status | Terminal? | Notes |
|---|---|---|
backlog | No | Triage queue; not immediately claimable |
todo | No | Ready to claim |
in_progress | No | Claimed and being worked |
in_review | No | Work complete, pending verification |
blocked | No | Waiting on a dependency or human input |
done | Yes | Verified complete |
cancelled | Yes | Abandoned |
Routes
| Method | Path | Summary |
|---|---|---|
GET | /api/board | List tasks for a team (or ready-to-work tasks) |
POST | /api/board | Create a task |
GET | /api/board/:taskId | One task plus comments and ancestor chain |
POST | /api/board/:taskId/claim | Atomically claim a todo task |
PATCH | /api/board/:taskId | Transition status or edit metadata |
POST | /api/board/:taskId/comments | Add a comment |
GET | /api/board/:taskId/executions | The run ledger for a task |
POST | /api/board/:taskId/executions | Open an execution row after a claim |
PATCH | /api/board/executions/:execId | Close an execution with its outcome |
POST | /api/board/:taskId/deps | Link a dependency |
POST | /api/board/:taskId/cancel-dependents | Cancel the dead downstream chain |
POST | /api/board/:taskId/workspace | Provision a git worktree |
GET | /api/board/:taskId/workspace | Cold-resume read: workspace and reconstructed state |
PATCH | /api/board/:taskId/workspace | Pause or complete the worktree |
POST | /api/board/:taskId/workspace/handoff | Write the clock-out AGENT_HANDOFF.json |
GET | /api/board/:taskId/workspace/detail | SoR file contents and unified diff |
GET /api/board
Lists tasks for a team. With ready=true, returns only tasks whose dependencies are all done and that are immediately claimable (status: todo).
Scope results to one team. Omit for all teams.
Filter by one of the seven task statuses. Ignored when
ready=true.Pass
"true" to return only ready-to-work tasks. Overrides status and includeDropped.Pass
"true" to include soft-deleted tasks.Response 200 OK
The task list, newest
updatedAt first. The ready variant orders by priority then updatedAt.POST /api/board
Creates a task. Defaults to status: "todo" (immediately claimable). Pass status: "backlog" for triage.
Request body
Task title. 1–500 chars.
Task description. Up to 20,000 chars.
Initial status. Defaults to
"todo". One of the seven task statuses.Integer priority.
The team to assign this task to.
Parent task id to make this a subtask. The parent chain bounds delegation depth.
Response 200 OK
POST /api/board/:taskId/claim
Atomically claims a todo task for a single assignee. At most one caller wins — the task flips to in_progress and the loser gets 409.
Request body
The agent id claiming the task. Must be non-empty.
The runtime this agent runs on (e.g.
claude-code, clawboo-native).Responses
200 OK — the claim won; the task is now in_progress:
409 Conflict — the task was not in a claimable state:
404 Not Found — the task does not exist:
PATCH /api/board/:taskId
Transitions a task’s status and/or edits its metadata. At least one field is required. The status change is enforced by the state machine — illegal transitions return 409. When the target status is done, the verification gate applies: a task with a failing deterministic verdict is rejected with 409 verification_required. Pass humanOverride: true to bypass the gate; the override is recorded in the governance audit log.
A task with no stored verification verdict is unverified, not failing — it lands
done normally. The gate blocks known-failing verdicts, not un-run verification. Moving a task back to todo clears the assignee and verdict.Request body
Target status. Must follow a legal state machine transition.
Integer priority update.
Updated title (1–500 chars).
Updated description (up to 20,000 chars).
Audited bypass of the
→done verification gate. Only meaningful with status: "done".Responses
200 OK — the update was applied:
409 Conflict — illegal transition or verification gate blocked →done:
GET /api/board/:taskId
Returns one task with its comments (oldest first) and its ancestor chain (parent-task lineage).
Response 200 OK
POST /api/board/:taskId/executions
Opens an execution-process row for a task — recorded immediately after a successful claim. The orphan reconciler reads this on restart; an executor that starts work must open one here and close it via the PATCH below, or a crash leaves the run orphaned.
Request body
The runtime id (e.g.
claude-code, clawboo-native). 1–100 chars.Git SHA of the worktree at the start of the run (checkpoint).
Human-readable reason for this execution (up to 2,000 chars).
Response 200 OK
The created execution row starts in status: "running":
PATCH /api/board/executions/:execId
Closes an execution row with its outcome and an optional token/cost ledger.
Request body
Final execution status. One of
succeeded, failed, timed_out, cancelled.Human-readable execution summary (up to 20,000 chars).
Git SHA of the worktree at the end of the run.
Input token count for billing.
Output token count for billing.
USD cost of this execution.
Error message if the execution failed (up to 20,000 chars).
GET /api/board/:taskId/executions
Lists a task’s execution-process rows (the full run ledger), oldest first.
POST /api/board/:taskId/deps
Links a dependency: the task in the path will not become ready until dependsOnTaskId reaches done.
Request body
The id of the blocking task. Both tasks must exist.
POST /api/board/:taskId/cancel-dependents
Cancels still-pending (todo/backlog) transitive dependents of a failed task. A blocked task can never become done, so its downstream chain is dead. Dependents already in_progress, done, or cancelled are left untouched.
Response 200 OK
POST /api/board/:taskId/workspace
Provisions a git worktree + branch + system-of-record scaffold for a file-mutating task. The worktree lives outside the user’s repo so it never pollutes git status. Research and review tasks are refused (422) because they have no file mutations to isolate.
Request body
Absolute path to the git repository to branch from.
Task kind that determines isolation.
code (default) → worktree; research / review → refused with 422.Branch point (default
HEAD) when no baseSha is provided.Responses
200 OK — the worktree was provisioned:
422 Unprocessable Entity — the task kind resolves to no worktree:
PATCH /api/board/:taskId/workspace
Pauses or completes the worktree.
pause— commits uncommitted work, drops the worktree, keeps the branch (staysactiveand resumable).complete— runs the verification gate on the diff: a green deterministic gate promotes todone; a failing gate routes toblockedorin_progress.
Request body
Either
"pause" or "complete".POST /api/board/:taskId/workspace/handoff
Writes the clock-out AGENT_HANDOFF.json into the task’s worktree — structured data so a different runtime (or a human) can pick up the task cleanly.
Request body
Who is handing off (agent id or
"human").The producing runtime (e.g.
clawboo-native, claude-code, or "human").List of subtasks completed in this session.
List of items that are broken or unverified.
The recommended next action for whoever picks up the task.
GET /api/board/:taskId/workspace
Cold-resume read: the task’s workspace row plus the resume state reconstructed from the system-of-record files (AGENT_HANDOFF.json, task-progress.md, init.sh). A fresh runtime can pick up the task from the worktree alone using this endpoint.
GET /api/board/:taskId/workspace/detail
Returns the SoR file contents (TASK.md, task-progress.md, DECISIONS.json, init.sh, VERIFICATION.md, AGENT_HANDOFF.json) plus the unified diff and diff-stat against the baseline. Bookkeeping files are excluded from the diff.
See also
- The board — state machine, atomic claim, dep chains, orphan reconciliation
- Worktrees and handoff — per-task system-of-record and cross-runtime
AGENT_HANDOFF.json - Verification — builder≠judge, deterministic gate,
completed_with_debt - Runtimes API —
POST /api/runtimes/:id/rundrives a task end-to-end - REST API overview