Reference

Files

Every file and folder vexillum creates, where, what it holds and whether it is safe to delete.

vexillum writes in two places: your project (what vx init scaffolds) and the machine-level ~/.vexillum. This page lists both, derived from the code, with one line per entry. "Safe to delete" means vexillum keeps working afterwards; the note says what you lose.

In your project

vx init (and vx upgrade) scaffold this. Everything here lives in the project checkout.

<project>/
  AGENTS.md                       the vexillum block (or your own file, plus the block)
  CLAUDE.md                       "@AGENTS.md", or the block when there is no AGENTS.md
  .claude/
    settings.json                 gains the sentinel Stop hook
    skills/
      vexillum/  forum/  muster/  the first-party skills
  .pi/                            only for a Pi commander
    settings.json                 gains the skills reference
    extensions/vexillum-wake.ts   the wake extension
  .vexillum/
    config.json                   marks the project initialized
    models.json                   model and effort profiles
    yolo.json                     yolo mode switch (only after vx yolo)
    .gitignore                    ignores forum/
    forum/                        scratch artifacts written by agents (gitignored)
    agents-md-slot.backup.md      backups, only after an upgrade --force or a repair
    AGENTS.md.backup
    CLAUDE.md.backup
    backups/skills/<name>/
    backups/pi/vexillum-wake.ts
PathWritten byHoldsSafe to delete?
AGENTS.mdinit, upgradegains the vexillum block (between the markers); your own text is never touched. See The AGENTS.md slotNo. It is your file and carries the commander's instructions; re-run vx init to restore the block
CLAUDE.mdinit, upgradeholds the vexillum block instead of AGENTS.md when the project has no AGENTS.md; otherwise it is created with, or given, the line @AGENTS.md so Claude Code sees the blockNo. Same as above; without the line or the block Claude Code stops seeing the commander rules
.claude/settings.jsoninit, upgradegains the async Stop hook that runs vx sentinel await through a PATH-independent one-line wrapper (see Sentinel); existing content is merged, never overwritten. Invalid JSON is left untouched and reportedNot the whole file, it can hold your own settings. Deleting only the hook entry stops the commander from being woken until vx upgrade re-adds it
.claude/skills/<name>/init, upgradethe vexillum, forum and muster skills, if you accepted themYes. vx upgrade reinstalls them (an edited one is backed up first)
.pi/extensions/vexillum-wake.tsinit, upgrade, only when pi is a commanderthe extension that wakes a Pi commander: it runs vx sentinel await as a child of Pi and hands a wake to the model. Committed with the project; a no-op in soldier campsYes, but the Pi commander is never woken until vx upgrade or vx init writes it back. Pi loads it only once you trust the folder
.pi/settings.jsoninit, upgrade, only when pi is a commandergains "skills": ["../.claude/skills"] so Pi sees the vexillum skills; existing content is merged, never overwritten. Invalid JSON is left untouched and reportedNot the whole file, it can hold your own Pi settings. Without the entry Pi does not see the skills
.vexillum/config.jsoninit, upgrademarks the project initialized; records the commander harnesses; stores a content hash per installed skill, and one for the Pi wake extension, so upgrade can tell whether you edited itNot advisable. The project then reads as not initialized, and the edited-or-not memory of the skills is lost; vx init recreates it
.vexillum/models.jsoninit (once)the model and effort profiles; yours to edit, never overwritten. See models.jsonYes, but your profiles go with it; the built-in defaults apply until init writes a new one
.vexillum/yolo.jsonvx yolo on, vx yolo offwhether yolo mode is on for the project; absent means off. Committed with the project, like models.jsonYes. It turns yolo mode off
.vexillum/.gitignoreinitignores forum/ so the forum's scratch artifacts stay out of gitYes, but .vexillum/forum/ then shows up in git status
.vexillum/forum/agents, by the forum and muster skills (not created by init)scratch HTML artifacts opened with vx forum, for example plan.html or muster.htmlYes. They are regenerated when needed
.vexillum/agents-md-slot.backup.mdupgrade --forceyour edited block, saved before it is replacedYes, once you no longer need your edit
.vexillum/AGENTS.md.backup, .vexillum/CLAUDE.md.backupupgradethe whole file that holds the block, saved before a malformed block is repairedYes, once you checked the repair
.vexillum/backups/skills/<name>/upgrade --forcean edited skill, saved before it is overwrittenYes, once you no longer need your edit
.vexillum/backups/pi/vexillum-wake.tsupgrade --forcean edited wake extension, saved before it is overwrittenYes, once you no longer need your edit

AGENTS.md and CLAUDE.md are yours: init lists them in a notice and asks before changing them. Commit AGENTS.md, CLAUDE.md, .claude/ and .vexillum/ (the backups and forum/ are the exceptions you will not want to commit).

In ~/.vexillum

Machine-level state, shared by every project. Nothing here is committed anywhere. See State for how the project key is derived.

~/.vexillum/
  models.json                          optional global model profiles (you create it)
  sentinel.pid  sentinel.lock          the single sentinel's lock files
  sentinel.json  sentinel.log          its build record and log
  sentinel-awaiters/<pid>.json         one record per live `vx sentinel await`
  forum/
    server.pid  server.json            the forum server's lock and discovery file
    last-port  server.log              preferred port and server log
    listener.pid  listener.log         the forum listener's lock and log
  forums/<session>/
    session.json  transcript.json      one review session: queue and conversation
    layout.json                        layout issues inbox
    whiteboards/                       whiteboard scenes and previews
    attachments/                       images the reviewer attached
  projects/<repo>-<hash>/              one namespace per project
    tasks/<id>.json                    one task
    camps/
      pool.json  pool.lock             the worktree pool's state and lock
      <slot>/<repo>/                   a camp: one git worktree
    wakes/<id>.json                    pending sentinel wakes
    wakes/forum/<session>.json         pending forum wakes
    forum-inbox/<session>/<uid>.json   forum feedback for the commander
    forum-inbox/<session>/read/        confirmed feedback
    pending/<id>.json                  the commander's pending decisions
    reports/<agent>-<id>.md            a scout's final report
    pauses/<agent>.md                  a soldier's declared pause
    commanders.json  commanders.lock   the commander registry and its lock
PathHoldsSafe to delete?
models.jsonoptional global base for the profiles; you create itYes, but your global profiles go with it
sentinel.pid, sentinel.lockthe single per-machine sentinel: its pid and the lock that keeps a second one from startingOnly with the sentinel stopped. Deleting them under a live sentinel can let a second one start
sentinel.jsonthe build the running sentinel was started from, so a newer binary can replace itYes (only while no sentinel runs)
sentinel.logthe sentinel's logYes
sentinel-awaiters/<pid>.jsonone record per live vx sentinel await hook processYes. Stale records are cleaned up
forum/server.pid, forum/server.jsonthe forum server's lock and its discovery file (address and agent token, mode 0600); exist only while it runsOnly with the server stopped
forum/last-portthe port the server used last, preferred on the next start so an open tab survivesYes
forum/server.logthe forum server's logYes
forum/listener.pid, forum/listener.logthe single per-user forum listener, see ForumOnly with the listener stopped; the log always
forums/<session>/one forum review session: session.json (queue and status), transcript.json (the conversation), layout.json, whiteboards/ and attachments/Yes for an ended session. You lose its transcript and drawings. Nothing prunes these folders for you
projects/<repo>-<hash>/tasks/<id>.jsonone task, the Task schemaOnly through vx strike. Deleting it by hand makes vexillum forget the task while its camp and branch remain
projects/<repo>-<hash>/camps/the worktree pool: pool.json, pool.lock and <slot>/<repo>/No. The slots are git worktrees registered in your repository; use vx strike
projects/<repo>-<hash>/wakes/<id>.jsona pending sentinel wake. It sits in the queue of the commander that dispatched the task, which can be another project than the task's (origin names that one); a wake being delivered is briefly renamed <id>.json.claimed-<time>-<pid>-<n>Yes. You lose only that notification
projects/<repo>-<hash>/wakes/forum/<session>.jsona pending forum wake (one per review session)Yes. You lose only that notification
projects/<repo>-<hash>/forum-inbox/<session>/<uid>.jsonforum feedback waiting for the commander; confirmed ones move to read/ (the newest 200 are kept)read/ yes. Unread feedback is lost if you delete it
projects/<repo>-<hash>/pending/<id>.jsona commander's pending decision, see vx pendingYes, if you no longer need that decision recorded
projects/<repo>-<hash>/reports/<agent>-<id>.mda scout's final report (written by the scout, not by the binary)Yes, once you read it
projects/<repo>-<hash>/pauses/<agent>.mda soldier's declared pause (written by the soldier)Yes. Without it, an idle soldier is treated as unconfirmed again
projects/<repo>-<hash>/commanders.jsonthe commander registry: per harness (claude, pi, opencode), the herdr pane of the commander that last ran vx dispatch or vx forum in the project, read from HERDR_PANE_ID. A pane that herdr no longer reports as the same harness working in the project is treated as absent, and the pane is looked up again by directory. See Forum. commanders.lock only serializes writersYes. It is rewritten the next time a commander runs one of those commands; until then the forum shows no commander for a commander that has no live Stop hook

Every JSON file is written to a temporary *.tmp file and renamed into place. A crash can leave a stray *.tmp file behind; it is safe to delete.

On this page