SOUL.md vs AGENTS.md
Summary from official docs: https://docs.openclaw.ai/concepts/soul
One-line distinction
SOUL.md = voice, stance, style — who the agent is AGENTS.md = operating rules — what the agent does
Loading context
| SOUL.md | AGENTS.md | |
|---|---|---|
| Main session | ✅ injected | ✅ injected |
| Sub-agent / isolated cron | ❌ not injected | ✅ injected |
This is why AGENTS.md must be self-contained for every hard rule — when ops spawns tech or a cron runs isolated, SOUL.md is not present.
What belongs where
| Belongs in SOUL.md | Belongs in AGENTS.md |
|---|---|
| Tone, voice | Step-by-step procedures |
| Stance and opinions | Confirm/reject conditions |
| Bluntness level | Specific output format |
| Humor approach | Timeout, retry logic |
| Character limits (“Never paraphrase”) | Hard limits with numbers (“sl_pct < 1.5”) |
| Overall vibe | Dashboard reporting |
Warning from the docs
“Personality is not permission to be sloppy.”
A strong SOUL.md does not mean AGENTS.md can be loose. The two files complement each other — neither replaces the other.
Quick classification test
When unsure which file a rule belongs in, ask:
- “Without this, will the agent do the wrong thing?” → AGENTS.md
- “Without this, the agent still does the right thing but doesn’t sound like itself?” → SOUL.md