Reference

status --json

The machine-readable troop snapshot, and the task schema behind it.

vx status --json

prints one JSON object. It is read-only and adds nothing to the persisted task: tasks is exactly the Task schema vexillum itself reads from <project root>/tasks/*.json, so a consumer such as the muster skill never works from a separate reinterpretation. Grouping, filtering and judgment calls (what counts as "needs attention", GitHub enrichment) belong to the consumer.

{
  "schema_version": 1,
  "generated_at": "2026-09-24T12:00:00Z",
  "project_root": "/abs/path/to/this project's ~/.vexillum namespace",
  "tasks": []
}

With no tasks, tasks is [], never null. Tasks are ordered most recently updated first.

Task fields

FieldTypeNotes
schema_versionnumberversion of the task file schema; this build writes 1 and still reads 0
idstring16 hex characters
kind"mission" or "scout"
promptstringthe original prompt
statusstringpending, running, blocked, done, failed, interrupted, shipped, unconfirmed, struck; see Missions and scouts. A shipped task is waiting for its pull request to be merged, not stuck. A struck task was interrupted or failed and its camp was returned with vx strike
created_at, updated_atRFC 3339 time
camp_slot, camp_path, camp_branchnumber, string, stringset once a camp is acquired
camp_basestringbranch the camp was forked from; may be empty
outputstringthe captured transcript
herdr_workspace_id, herdr_tab_id, herdr_pane_id, herdr_agent_namestringthe soldier's herdr pane
agent_not_found_since, idle_unconfirmed_sincetimewhen the sentinel first saw the condition
pause_seen_attimewhen the sentinel first saw a valid declared pause on the idle task; cleared when the task settles. It lets an unconfirmed note say a pause existed and is gone
redispatchesnumberhow many times the task was re-dispatched
model, effortstringthe soldier's choice; empty means claude's default
harnessstringthe agent CLI the soldier runs on, from the dispatch profile (claude, pi or opencode); empty means claude, as in a task file written before this field existed
harness_majornumberfor an opencode task, the OpenCode series it was dispatched on (1 or 2), detected from opencode --version and kept by vx redispatch; absent for other harnesses
harness_versionstringfor an opencode task, the full version found at dispatch, such as 2.0.32; absent for other harnesses
harness_sessionstringfor an opencode 2.x task with a model, the id of the OpenCode session created for its soldier (ses_...), reused by vx redispatch; absent otherwise
decisionobjectpresent once the task has blocked at least once
amendmentsarrayinstructions the general gave after dispatch, via vx prompt and vx decide (not --dismiss); see below

Optional fields are omitted when empty.

decision

FieldNotes
questionwhat the soldier asked
optionschoices it offered, if any
asked_atwhen it blocked
answer, answered_atset after vx decide
kindhow it must be answered: modal (a selector overlay) with a key press, ask (a Pi soldier's ask_user question) through a file, anything else as text
question_idthe id of an ask question, what an answer is addressed to
dismissedtrue when cleared with vx decide --dismiss instead of answered; answered_at is set, answer is not

A task in blocked always carries its question here, not just the word "blocked".

amendments

FieldNotes
textwhat the general said; for vx decide, the question and the answer (a selector pick as the option's text). At most 2000 characters, longer text is cut and marked [truncated]
atRFC 3339 time it was recorded
sourcevx prompt or vx decide

Omitted when empty. A task keeps its 20 most recent amendments. prompt never changes: vx ship gives the tribunal review the prompt followed by the amendments, so what the general asked for later counts as requested. Only vx prompt and vx decide write them, into the task's state file, never into a file in the camp.

Compatibility

Treat unknown fields as additive.

On this page