State
Everything vexillum remembers is plain JSON on disk, written atomically.
No background process (sentinel, forum server) holds state that is not on disk. Every fact it relies on is a file, so a restart (of vexillum, herdr, or your machine) loses nothing it knew.
Layout
~/.vexillum/
models.json optional global model profiles
sentinel.pid sentinel.lock sentinel.json sentinel.log
sentinel-awaiters/ one record per live `vx sentinel await`
forum/ the forum server and listener: pid, log, port
forums/<session>/ one forum review session: queue, transcript, whiteboards
projects/
<repo>-<hash>/ one namespace per project
tasks/<id>.json one file per task
camps/ the worktree pool: pool.json and <slot>/<repo>/
wakes/<id>.json pending sentinel wakes
wakes/forum/ pending forum wakes, one per review session
forum-inbox/ forum feedback waiting for the commander
pending/ the commander's pending decisions
reports/ scout reports
pauses/ declared soldier pauses
commanders.json the herdr pane of each commander harnessIn the project itself, init writes AGENTS.md or CLAUDE.md, .claude/ (the skills and the sentinel hook), .vexillum/ (config.json, models.json, .gitignore) and, for a Pi commander, .pi/ (the wake extension and Pi's project settings):
<project>/
AGENTS.md CLAUDE.md
.claude/settings.json .claude/skills/
.pi/extensions/vexillum-wake.ts .pi/settings.json (a Pi commander only)
.vexillum/config.json .vexillum/models.json .vexillum/.gitignoreProject state is per project and machine-local; project files are committed with the project. See Files for every entry, what it holds and whether it is safe to delete.
The project key
A project's namespace is <repo>-<hash>: the directory name plus the first 8 hex characters of the sha256 of its absolute path, after resolving symlinks. Two projects never see each other's tasks, wakes or camps.
Moving a project orphans its state
The key is derived from the path. If you rename or move the project, what was recorded under the old key becomes invisible to commands run from the new location. vexillum does not detect the move.
Tasks
A task file is the Task schema: id, kind, prompt, status, timestamps, the camp slot, path, branch and base, the herdr pane identifiers, the model, effort and harness, and, once blocked, a structured decision. vx status --json prints exactly this schema; see status --json.
Atomic writes
State is written to a temporary file and renamed into place, so a reader (the sentinel, a second dispatch, status) never sees a half-written file.
After a restart
herdr restores a pane layout but not the process inside it. vexillum reconciles from disk: tasks that were running and whose herdr agent is confirmed gone become interrupted. Any work the soldier had committed is still in its camp.