ReferenceCLI
vx strike
Strike a soldier's camp (dismantle it and return it to the pool) once its work has landed
Strike a soldier's camp (dismantle it and return it to the pool) once its work has landed.
Usage:
vx strike <task-id> [--force] [--discard]
Refuses unless the camp is clean and (for a mission) landed. For a scout,
also refuses unless its final report exists at
~/.vexillum/projects/<project>/reports/<agent-name>-<task-id>.md - the report is
the scout's work product, the same way a mission's is its landed commit.
--force skips the report check (never the clean/landed camp check) - an
explicit escape hatch, for use after explicit discard approval.
A shipped mission lands when its pull request is merged, so strike checks
that. When the camp's commits are not on the base branch yet, the refusal
says to merge the pull request and run git pull on the base branch in the
project checkout, then retry. If gh is installed and logged in, strike also
asks GitHub whether the pull request merged (only for a shipped task, and
never required): a merged pull request counts as landed once its merge
commit is on the local base branch, even when later commits on the base
touch the same lines and the content check would refuse forever. Until the
base has been pulled, the refusal says so.
--discard strikes the camp even when that check fails, or when the camp has
uncommitted changes. It prints exactly what it threw away: the unlanded
commits (hash and subject) and the uncommitted changes, which are reset. Use
it only when the general has confirmed that the camp's work is already on the
base or is abandoned - never on your own judgment. The worktree is detached
from the task branch, which is kept with the discarded commits: the output
says how many are unlanded and that it can be deleted by hand.
A herdr tab that is already gone (a soldier stopped by hand) never fails a
strike. Any other herdr error is reported after the camp was returned and the
task closed (an interrupted, failed or unconfirmed task becomes struck); striking again
retries closing the pane, and on a task whose camp is already back in the pool
it only cleans up the record. A camp leased to another task is never touched.
When the task's camp slot was reused by another task since (a stale entry
that used to be impossible to clean while that task held the slot), strike
retires only the stale entry: it never touches the slot's worktree or pane,
which belong to the other task now. It first checks that the task's own branch
vexillum/<task-id> is landed, or gone, and refuses otherwise; --discard skips
that check and lists the unlanded commits, keeping the branch.
On success, returns the worktree to the pool for reuse and closes the
herdr pane, then prunes: it deletes the task's local branch
vexillum/<task-id> with git branch -d semantics (never -D) when the branch
is an ancestor of the base branch, or when the task is shipped, gh reports
its pull request as merged and the base was pulled. Otherwise, or when the
branch is checked out in another worktree, the branch is kept and one line
says why and what to do. It also runs git worktree prune on the project
repo, and prints what was pruned in one short line. --discard deletes a
branch only under those same rules, so an unlanded branch survives it.