Concepts

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 harness

In 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/.gitignore

Project 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.

On this page