ReferenceCLI

vx decide

Answer a blocked task's open question so it can continue

Answer a blocked task's open question so it can continue.

Usage:
  vx decide <task-id> <answer>
  vx decide <task-id> --dismiss

Only a task in status "blocked" can be answered. Delivers <answer> to the
soldier's still-open herdr pane and records it against the task's structured
decision, not just as more prose in the transcript. That decision is the
field "decision" of 'vx status --json'. If the open question came from Claude Code's
AskUserQuestion selector, <answer> (an option's exact text, or its 1-based
rendered number) is delivered as a single key press (the same mechanism a
human picking from that menu would use) unless it resolves to "Type
something.", which falls back to plain text like every other decision.

A pi soldier has no such selector. When it asked through its ask_user tool (the
decision has kind "ask", with the question and its options), <answer> is an
option's exact text, its 1-based number, or any free text, and is written to
the file that tool is waiting on: the soldier carries on with it and nothing
is typed into its pane. If the question was already answered in the pane, the
answer is refused and the task can be cleared with --dismiss. A pi soldier that
asked in plain prose (a needs-decision: line, or a session where the ask_user
extension did not load) is answered as plain text.

An opencode soldier (2.x) that is blocked on a screen of OpenCode's own is
answered with key presses where the screen is known, after the pane is read
again so nothing is typed into a screen that has moved on. On a permission
prompt, <answer> "allow once" presses Enter and "reject" presses Esc; "always
allow" is refused, because it may save a rule for good. On a question form,
<answer> is an option's 1-based number or its exact text, delivered as
arrow-down presses and Enter; any other text goes into the form's "Type your
own answer" field one key press per character, so it is limited to printable
ASCII, and a bare number that is not an option is refused. A screen vexillum
does not know, and any 1.x screen, is refused with nothing typed. A soldier
that ended its turn with a needs-decision: line is answered as plain text, like
every other harness.

Once the answer is delivered it is also recorded on the task as an amendment
(field "amendments" in 'vx status --json'), together with the question it answered,
so a mission's tribunal review counts it as part of the mission's intent. A
selector pick is recorded as the option's text. --dismiss records nothing.

On a fast settle the task's status updates immediately: running if the
soldier is still going, blocked again if it asks another question, done or
failed if it settled that quickly. Otherwise the task is left running for
the sentinel to record the eventual settle, exactly like a fresh dispatch.

--dismiss clears a task that was marked blocked by mistake (the soldier was
never really asking anything) without sending it anything: no prompt, no key
press. The task becomes whatever its pane says it is: running if the soldier
is still working, done (or unconfirmed) if it has settled, interrupted if the
pane is gone. It is refused if the pane is genuinely blocked on a question.
The dismissed question stays on the task, marked dismissed, and does not
block it again; 'vx status --json' shows it. Use it when 'vx prompt' or
'vx ship' refuse a task as blocked and there is nothing to answer.

If the task is actually "interrupted" (its herdr pane is gone - vexillum
just hadn't noticed yet), this marks it interrupted and refuses: there is
nothing left to answer against. Use 'vx redispatch' instead.