status --json
The machine-readable troop snapshot, and the task schema behind it.
vx status --jsonprints 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
| Field | Type | Notes |
|---|---|---|
schema_version | number | version of the task file schema; this build writes 1 and still reads 0 |
id | string | 16 hex characters |
kind | "mission" or "scout" | |
prompt | string | the original prompt |
status | string | pending, 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_at | RFC 3339 time | |
camp_slot, camp_path, camp_branch | number, string, string | set once a camp is acquired |
camp_base | string | branch the camp was forked from; may be empty |
output | string | the captured transcript |
herdr_workspace_id, herdr_tab_id, herdr_pane_id, herdr_agent_name | string | the soldier's herdr pane |
agent_not_found_since, idle_unconfirmed_since | time | when the sentinel first saw the condition |
pause_seen_at | time | when 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 |
redispatches | number | how many times the task was re-dispatched |
model, effort | string | the soldier's choice; empty means claude's default |
harness | string | the 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_major | number | for 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_version | string | for an opencode task, the full version found at dispatch, such as 2.0.32; absent for other harnesses |
harness_session | string | for 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 |
decision | object | present once the task has blocked at least once |
amendments | array | instructions the general gave after dispatch, via vx prompt and vx decide (not --dismiss); see below |
Optional fields are omitted when empty.
decision
| Field | Notes |
|---|---|
question | what the soldier asked |
options | choices it offered, if any |
asked_at | when it blocked |
answer, answered_at | set after vx decide |
kind | how 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_id | the id of an ask question, what an answer is addressed to |
dismissed | true 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
| Field | Notes |
|---|---|
text | what 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] |
at | RFC 3339 time it was recorded |
source | vx 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.