State Management
Animus separates authored repository config from mutable runtime state.
Project-Local .animus/
The repository keeps only the configuration you are expected to author:
.animus/
├── config.json
├── workflows.yaml
├── workflows/
└── plugins/These files define workflow behavior, overrides, and local pack customizations.
Repo-Scoped Runtime State
Runtime state lives under ~/.animus/<repo-scope>/, not in the repository:
~/.animus/<repo-scope>/
├── core-state.json
├── resume-config.json
├── workflow.db
├── config/
├── daemon/
├── docs/
├── state/
└── worktrees/Important runtime stores:
workflow.dbfor workflows, checkpoints, tasks, and requirementsstate/for review, history, error, schedule, QA, and pack-selection stateworktrees/for managed task worktreesdocs/for generated planning artifacts such asproduct-vision.md
Why the Split Exists
Keeping mutable state outside the repository gives Animus a few important properties:
- linked worktrees resolve back to one shared repo scope
- runtime files do not pollute source control
- large and frequently updated state can evolve without rewriting repo-local config
- legacy
.animus/-local state can be migrated forward without changing the authored YAML surface
Pack and Workflow Resolution
Animus still resolves workflows from layered sources:
- project pack overrides in
.animus/plugins/ - project YAML in
.animus/workflows.yamland.animus/workflows/*.yaml - installed packs in
~/.animus/packs/ - bundled workflow content compiled into the CLI
State location and workflow resolution are related but different concerns:
- workflow definitions come from YAML and pack content
- execution state and operational records live under
~/.animus/<repo-scope>/
Mutation Policy
Do not hand-edit Animus-managed runtime JSON or SQLite state unless you are explicitly working on Animus persistence or migrations.
Approved mutation surfaces:
- CLI commands such as
animus subject status --kind task - Animus MCP tools such as
animus.subject.update - pack commands such as
animus pack pin
Repository Scope
The repo scope uses the canonical project path to derive a stable identifier:
<sanitized-repo-name>-<12-hex-sha256-prefix>This is what lets Animus keep one runtime home for a repository even when you invoke it from linked worktrees.