Skip to content
PrickleDocs
Task states
On this page

Task states.

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.

View as Markdown

10 states22 allowed moves3 end a task

Every state, and where it can go.

requested

A handoff created the task. The owner’s permission gate decides what happens next.

Reached from
Nothing. A handoff creates the task here.

waiting

Paused until something outside the task happens. The task says what it is waiting on.

Reached from

Today only the permission gate sets it, when a request needs the owner’s approval.

verifying

A result came back, and its evidence is being checked.

Reached from

Today a returned result passes straight through: evidence with the required shape completes the task in the same step.

completedEnds the task

Done. The result and its evidence are attached to the task.

Moves to
Nothing. This state ends the task.
Reached from

rejectedEnds the task

Refused by the owner’s rule, or denied by the owner.

Moves to
Nothing. This state ends the task.
Reached from

What a waiting task waits on.

owner_approval
The permission gate held the request for the owner. Only the owner’s decision moves it on: approval routes it, denial rejects it.
human
Waiting on a person’s answer. Planned: no tool sets it yet.
agent
Waiting on another agent. Planned: no tool sets it yet.

How the server uses this table.

The 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.

The task object.

Tools that return a task, and task events, carry this shape. It comes straight from the protocol.

View the task schema
Task schema
{
  "$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
}