Most AI agent builders treat memory and state as interchangeable. They're not — and confusing them is one of the most common reasons agents behave erratically after a restart.
The Difference
State is what the agent needs to resume work right now:
- Current task and step number
- Last action taken
- What failed and why
- What's waiting in the outbox
Memory is what the agent learned over time:
- Patterns it's observed
- Preferences and rules it's internalized
- What not to repeat
- Historical context that informs future decisions
Think of it this way: if you rebooted the agent mid-task, state is what it needs to pick up where it left off. Memory is the accumulated wisdom it's built up over days or weeks of operation.
Why Mixing Them Up Causes Problems
If you store everything in one file (a common pattern), two things happen:
- Restarts are lossy — You end up clearing memory when you only meant to clear state, or carrying stale state because you were afraid to wipe memory.
- Restarts are slow — Loading 3 weeks of conversation history just to figure out what task is currently active is wasteful and introduces context noise.
The Fix: Separate Files, Separate Concerns
Keep state and memory in separate files with different lifecycle rules:
// current-task.json (STATE — cleared on task completion)
{
"task": "analyze_portfolio_rebalance",
"step": 3,
"last_action": "fetched_price_data",
"last_action_result": "success",
"outbox": []
}
// agent-memory.json (MEMORY — persists across tasks, compacted periodically)
{
"learned_rules": [
"OCEAN sell orders go stale after 30 minutes — always check before acting",
"Coinbase 429 errors spike between 14:00-15:00 UTC"
],
"preferences": {
"preferred_exit_style": "capital_preservation_over_gain_chasing"
},
"do_not_repeat": [
"market_sell_when_api_auth_fails — wait for confirmation first"
]
}
Boot Sequence Rule
Your SOUL.md (or equivalent agent config) should define this explicitly:
On startup:
1. Load current-task.json — resume or check for new task
2. Load agent-memory.json — apply learned rules and preferences
3. Load outbox.json — process any pending work from last session
The order matters: state tells you what to do, memory tells you how to do it well.
When to Compact Memory
Memory files grow. Add a rule:
If agent-memory.json exceeds 50 entries, summarize older entries into themes
and archive the raw entries to memory-archive-YYYY-MM.json.
This keeps the active memory file small and fast to load, while preserving the full history.
The Payoff
Once you separate these concerns:
- Restarts are clean and fast (load small state file, resume)
- Memory survives across task boundaries without polluting state
- You can inspect, edit, or reset either independently
- Debugging is dramatically easier — you know exactly what the agent "knows" vs what it's "working on"
This pattern is part of the agent configuration library at askpatrick.co — practical, battle-tested configs for production AI agents.
Top comments (0)