commission apply document reference
The shape of the JSON document commission apply -f plan.json accepts — the one
call that creates or updates a whole task graph atomically. Read this when you
are planning work rather than executing it.
commission apply --schema prints the same schema at the terminal, and
commission apply -f plan.json --dry-run validates and previews without writing.
Why one document
Local keys are resolved to real task ids inside a single transaction, so a
plan can reference tasks it is creating in the same breath (deps: ["schema"]).
Re-applying the same document upserts by key instead of duplicating, which
makes a plan file safe to edit and re-run. Nothing lands unless everything
validates.
Example
{
"project": "myapp",
"name": "My App",
"gates": { "tier1": ["pr", "test"] },
"tasks": [
{
"key": "schema",
"title": "Design the storage schema",
"body": "Tables, indexes, and the migration path.",
"priority": 1,
"gate": "tier1",
"touches": ["src/db/**"],
"criteria": ["migration runs forward and backward"],
"links": [{ "kind": "doc", "ref": "docs/concepts/index.md" }]
},
{
"key": "api",
"title": "Expose it over HTTP",
"deps": ["schema"],
"touches": ["src/server/**"]
}
]
}Two tasks, one dependency — api is not on the ready frontier until schema
is closed, and nothing had to declare that it was “blocked”.
Fields
| key | type | required | description |
|---|---|---|---|
project | string (min 1) | yes | |
name | string | no | |
vision | string | no | |
gates | record<string, string[]> | no | |
tasks | object[] | yes | |
tasks[].key | string (min 1) | yes | |
tasks[].title | string (min 1) | yes | |
tasks[].body | string | no | |
tasks[].parent | string | no | |
tasks[].deps | string[] | no | |
tasks[].priority | integer (0–3) | no | |
tasks[].severity | integer (1–4) | no | 1 = worst; distinct from priority |
tasks[].due | string | no | ISO date the task is due |
tasks[].gate | string | no | |
tasks[].autonomy | “autonomous” | “supervised” | “human_only” | no | how far an agent may take this unsupervised; human_only means agents never claim it |
tasks[].preferredActor | string | no | who should do this — a bias, never a lock |
tasks[].mayExecute | string[] | no | roles or capabilities required to claim it |
tasks[].touches | string[] | no | |
tasks[].criteria | string[] | no | |
tasks[].links | object[] | no | |
tasks[].links[].kind | “doc” | “url” | “file” | yes | |
tasks[].links[].ref | string (min 1) | yes | |
tasks[].links[].note | string | no | |
tasks[].status | “open” | “in_progress” | “in_review” | “done” | “cancelled” | no | |
tasks[].evidence | object[] | no | |
tasks[].evidence[].kind | string | yes | |
tasks[].evidence[].value | string | yes | |
tasks[].evidence[].note | string | no |
JSON Schema
The machine-readable form, as emitted by commission apply --schema:
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"project": {
"type": "string",
"minLength": 1
},
"name": {
"type": "string"
},
"vision": {
"type": "string"
},
"gates": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"tasks": {
"minItems": 1,
"type": "array",
"items": {
"type": "object",
"properties": {
"key": {
"type": "string",
"minLength": 1
},
"title": {
"type": "string",
"minLength": 1
},
"body": {
"type": "string"
},
"parent": {
"type": "string"
},
"deps": {
"type": "array",
"items": {
"type": "string"
}
},
"priority": {
"type": "integer",
"minimum": 0,
"maximum": 3
},
"severity": {
"description": "1 = worst; distinct from priority",
"type": "integer",
"minimum": 1,
"maximum": 4
},
"due": {
"description": "ISO date the task is due",
"type": "string"
},
"gate": {
"type": "string"
},
"autonomy": {
"description": "how far an agent may take this unsupervised; human_only means agents never claim it",
"type": "string",
"enum": [
"autonomous",
"supervised",
"human_only"
]
},
"preferredActor": {
"description": "who should do this — a bias, never a lock",
"type": "string"
},
"mayExecute": {
"description": "roles or capabilities required to claim it",
"type": "array",
"items": {
"type": "string"
}
},
"touches": {
"type": "array",
"items": {
"type": "string"
}
},
"criteria": {
"type": "array",
"items": {
"type": "string"
}
},
"links": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"doc",
"url",
"file"
]
},
"ref": {
"type": "string",
"minLength": 1
},
"note": {
"type": "string"
}
},
"required": [
"kind",
"ref"
],
"additionalProperties": false
}
},
"status": {
"type": "string",
"enum": [
"open",
"in_progress",
"in_review",
"done",
"cancelled"
]
},
"evidence": {
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string"
},
"value": {
"type": "string"
},
"note": {
"type": "string"
}
},
"required": [
"kind",
"value"
],
"additionalProperties": false
}
}
},
"required": [
"key",
"title"
],
"additionalProperties": false
}
}
},
"required": [
"project",
"tasks"
],
"additionalProperties": false
}
This page is docs/reference/apply.md in the Commission
repository, rendered in place — the site keeps no copy of it. It is generated by scripts/generate-docs.ts, so it is exhaustive, and editing it by hand is reverted by the next run.