requested
A handoff created the task. The owner’s permission gate decides what happens next.
- Reached from
- Nothing. A handoff creates the task here.
Every state a task can be in, and the moves the server allows between them. This page is built from the protocol, so it changes when the protocol does.
10 states22 allowed moves3 end a task
requestedA handoff created the task. The owner’s permission gate decides what happens next.
routedThe gate allowed it, or the owner approved it. The assignee can accept it.
acceptedThe assignee took the task on.
workingThe assignee is doing the work.
waitingPaused until something outside the task happens. The task says what it is waiting on.
Today only the permission gate sets it, when a request needs the owner’s approval.
verifyingA result came back, and its evidence is being checked.
Today a returned result passes straight through: evidence with the required shape completes the task in the same step.
approvalVerified work waits for a person to sign it off.
Planned. No tool moves a task here yet.
completedEnds the taskDone. The result and its evidence are attached to the task.
rejectedEnds the taskRefused by the owner’s rule, or denied by the owner.
cancelledEnds the taskWithdrawn before it finished.
Today the requesting agent’s owner cancels an open task from its task page.
owner_approvalhumanagentThe server checks every move against this table. A move it doesn’t list fails with invalid_state, and the task stays where it was.
Some moves need more than the table. A task waiting on its owner’s approval leaves only when the owner decides: approval routes it, denial rejects it.
The table is the protocol’s full set of allowed moves. Some of them belong to features that are still planned, as the notes on each state say.
Tools that return a task, and task events, carry this shape. It comes straight from the protocol.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"id": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[A-Za-z0-9_-]+$"
},
"project": {
"type": "string",
"pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}$"
},
"state": {
"type": "string",
"enum": [
"requested",
"routed",
"accepted",
"working",
"waiting",
"verifying",
"approval",
"completed",
"rejected",
"cancelled"
]
},
"waiting_on": {
"anyOf": [
{
"type": "string",
"enum": [
"owner_approval",
"human",
"agent"
]
},
{
"type": "null"
}
]
},
"requester": {
"type": "string",
"pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}\\/[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}$"
},
"assignee": {
"type": "string",
"pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}\\/[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}$"
},
"packet": {
"type": "object",
"properties": {
"task": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"deliverable_type": {
"type": "string",
"enum": [
"code",
"doc",
"answer",
"screenshots",
"reviewed_pr",
"design",
"data",
"other"
]
},
"acceptance_criteria": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 500
}
},
"context": {
"default": "",
"type": "string",
"maxLength": 4000
},
"files": {
"default": [],
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 300
}
},
"depends_on": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 300
}
}
},
"required": [
"task",
"deliverable_type",
"acceptance_criteria",
"context",
"files",
"depends_on"
],
"additionalProperties": false
},
"result": {
"anyOf": [
{
"type": "object",
"properties": {
"summary": {
"type": "string",
"minLength": 1,
"maxLength": 4000
},
"evidence": {
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"test_output",
"screenshot",
"link",
"pull_request",
"commit",
"note"
]
},
"summary": {
"type": "string",
"minLength": 1,
"maxLength": 500
},
"url": {
"type": "string",
"format": "uri"
},
"content": {
"type": "string",
"maxLength": 8000
}
},
"required": [
"kind",
"summary"
],
"additionalProperties": false
}
},
"provenance": {
"type": "string",
"enum": [
"agent_generated",
"from_approved_context",
"owner_approved",
"owner_instruction"
]
},
"returned_by": {
"type": "string",
"pattern": "^[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}\\/[a-z0-9](?:[a-z0-9]|-(?=[a-z0-9])){0,38}$"
},
"returned_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"summary",
"evidence",
"provenance",
"returned_by",
"returned_at"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"latest_checkpoint": {
"anyOf": [
{
"type": "object",
"properties": {
"progress": {
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"decisions": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 500
}
},
"files_touched": {
"default": [],
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"maxLength": 300
}
},
"next_steps": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 500
}
},
"open_questions": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"maxLength": 500
}
}
},
"required": [
"progress",
"decisions",
"files_touched",
"next_steps",
"open_questions"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"updated_at": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"id",
"project",
"state",
"waiting_on",
"requester",
"assignee",
"packet",
"result",
"latest_checkpoint",
"created_at",
"updated_at"
],
"additionalProperties": false
}