Built-In Presets
| Preset | Agent | Role | Volume |
|---|---|---|---|
pm | Juno | Product Manager — breaks down tickets, coordinates work, communicates via Slack | 30 GB |
eng | Titus | Engineer — writes code, opens PRs, iterates on review feedback | 50 GB |
tester | Scout | QA Tester — reviews PRs, tests changes, files bugs back to Linear | 30 GB |
How Agents Coordinate
Agents coordinate asynchronously through Linear and GitHub — there’s no direct agent-to-agent communication:- Juno checks Linear for unrefined tickets to break down
- Titus checks Linear for assigned engineering tickets, then checks GitHub for PR review comments
- Scout checks GitHub for PRs ready for review, then checks Linear for verification tasks
Workspace Files
Each agent’s behavior is defined by workspace files injected into~/.openclaw/workspace/ during bootstrap.
Per-Preset Files
| File | What It Does |
|---|---|
SOUL.md | Core personality — approach, values, superpowers, boundaries, vibe. This is who the agent is. |
IDENTITY.md | Name, role label, emoji, avatar. Short identification metadata. |
HEARTBEAT.md | State machine logic executed every minute. Defines what the agent checks for and how it transitions between states (idle → working → blocked → done). |
TOOLS.md | Tool-specific notes and common commands. Cheat sheet for the agent’s toolchain. |
Shared Base Files
These files are shared across all presets:| File | What It Does |
|---|---|
USER.md | Owner information — name, timezone, working hours, custom notes. Personalized from template variables. |
AGENTS.md | Operational instructions shared by all agents — memory management, safety rules, group chat etiquette, heartbeat protocol. |
BOOTSTRAP.md | First-run checklist — verifies integrations (Linear, GitHub, Claude Code) work, then deletes itself. |
Skills
Reusable skill files provide specialized workflows:| Skill | Used By | Purpose |
|---|---|---|
linear-ticket-prep | PM | Multi-phase ticket preparation — sizing, research, context gathering, prompt generation |
eng-ticket-workflow | Engineer | Structured ticket implementation workflow |
eng-pr-tester | Engineer | PR testing workflow |
pr-review-resolver | Engineer | PR review comment resolution |
Heartbeat Logic
The heartbeat is the core loop that drives each agent. It fires every minute as a checklist — the agent walks through it top to bottom, takes any actions needed, then waits for the next tick. On first boot, the heartbeat detectsBOOTSTRAP.md and runs first-time setup instead of the normal checklist — once bootstrap completes, it deletes the file and the regular heartbeat takes over.
The three agents have completely different heartbeats, each tailored to their role.
Juno (PM)
Juno’s heartbeat is the simplest — it’s focused on ticket preparation:- Check Linear for assigned tickets in “Todo” or “Backlog” that haven’t been prepped yet
- For each unprepped ticket, run the
linear-ticket-prepskill — a multi-phase workflow that sizes the ticket, researches context, and generates an implementation prompt - If any ticket is missing a description or acceptance criteria, flag it and ask the assigner for clarification
- Once a ticket is prepped, assign it to Titus and move it to “To Do”
Titus (Eng)
Titus runs a state machine that tracks multiple tickets in parallel viamemory/agent-state.json:
- Circuit breaker — if 3+ consecutive errors have occurred, notify the owner on Slack and stop. This prevents runaway failures
- Process active work — loop through each item in
activeWorkand act based on its state:AGENT_RUNNING— Claude Code is implementing the ticket. If stuck for 3+ cycles, comment on Linear and alert the owner. If finished, transition toBUILD_CHECKBUILD_CHECK— run typecheck, build, and e2e tests. On pass: create a PR, assign Scout for review, move the ticket to “In Review”, transition toAWAITING_REVIEW. On fail (under 3 attempts): spawn Claude Code to fix, go back toAGENT_RUNNING. On fail (3+ attempts): create a draft PR with the failure summaryAWAITING_REVIEW— check if the PR is merged. If yes, rebase dependent branches and remove from active work. Otherwise, do nothingIDLE_BLOCKED— waiting on a dependency. If the blocking ticket’s PR is merged, rebase and transition toAGENT_RUNNING
- Pick up new work — if fewer than 2 items are actively running, check Linear for the next prioritized ticket, add it to
activeWork, and spawn Claude Code to start implementation
Scout (QA)
Scout’s heartbeat covers two jobs — resolving review comments and testing PRs:- Resolve review comments — scan all open PRs for unresolved review comments. For each one, use the
pr-review-resolverskill to parse comments, apply fixes via Claude Code, and push - Find PRs to test — query Linear for tickets in “In Review” or “In Review by Agent” with a linked PR. Skip any ticket already tested at the same PR head commit
- Review against acceptance criteria — for each untested ticket, check out the PR branch and review the diff against the Linear ticket’s acceptance criteria. If requirements are unmet, comment on Linear with specific gaps and label
needs-work - Run build and tests — auto-detect the package manager, run install, build, and test suites. On pass: comment on Linear with a checkmark and label
qa-passed - Auto-fix failures — on build or test failure, invoke Claude Code with the error context to apply a minimal fix, commit, push, and re-run once. If still failing after retry, comment on Linear with the error summary and label
qa-failed
Template Variables
Workspace files with.tpl extensions support template variables that get replaced at deploy time:
| Variable | Description | Example Value |
|---|---|---|
{{OWNER_NAME}} | Your name | Boss |
{{TIMEZONE}} | Your timezone | PST (America/Los_Angeles) |
{{WORKING_HOURS}} | Your working hours | 9am-6pm |
{{USER_NOTES}} | Custom notes for agents | No additional notes provided yet. |
{{LINEAR_TEAM}} | Linear team identifier | AGE |
{{GITHUB_REPO}} | Target repository | org/repo |
agent-army init and stored in the manifest.
Customization
All preset files live in thepresets/ directory. If you clone the repo locally, you can edit any .md file directly — change an agent’s personality, tweak its heartbeat logic, or adjust its tool notes. Your changes will be picked up on the next deploy.
You can also customize agents in the manifest:
What You Can Change
- Volume size — Adjust persistent storage per agent (e.g., engineers may need more for large repos)
- Instance type — Override the default server size (e.g.,
t3.largefor compute-heavy agents) - Environment variables — Add agent-specific config via
envVars
Custom Agents
To create an agent with a completely custom role, setpreset: null and provide custom content:
soulContent— Your custom SOUL.md content defining the agent’s personality and roleidentityContent— Your custom IDENTITY.md content with name and metadata