Description
When configuring heartbeat.target: "last" for agents, multiple old sessions respond to heartbeat triggers simultaneously, causing:
- Duplicate messages: Same heartbeat generates multiple responses
- Communication confusion: Users receive conflicting or redundant messages
- Session accumulation: Sessions grow unbounded (observed: 180 sessions across 9 agents)
Evidence
Session Count Before Cleanup
| Agent |
Sessions |
| xiaoma |
42 |
| xiaoyang |
79 |
| xiaozhu |
35 |
| daxiang |
6 |
| xiaoniu |
6 |
| Total |
180 |
Duplicate Reports Example
In one hour (17:xx), two progress summary reports were generated:
20260311-1708-progress-summary.md (6145 bytes)
20260311-1712-progress-summary.md (802 bytes)
Both were generated by different sessions responding to the same heartbeat trigger.
Root Cause
The target: "last" mechanism does not correctly identify the "last active" session:
- Old sessions are not properly closed
- Multiple sessions can be considered "last"
- Heartbeat runner triggers all matching sessions in parallel
Steps to Reproduce
- Configure multiple agents with
heartbeat.target: "last"
- Run heartbeat for several days (15-minute interval)
- Check session counts:
ls -1 ~/.openclaw/agents/*/sessions/*.jsonl | wc -l
- Observe duplicate heartbeat responses
Expected Behavior
- Only ONE session should respond to each heartbeat trigger
- Old sessions should be automatically cleaned up
target: "last" should reliably identify the single most recent session
Actual Behavior
- Multiple sessions respond simultaneously
- Sessions accumulate without cleanup
target: "last" mechanism is unreliable
Environment
- OpenClaw version: 2026.3.8 (3caab92)
- OS: Linux 6.17.0-14-generic (x64)
- Node: v22.22.1
- Agent count: 9
- Total sessions before cleanup: 180
- Heartbeat config:
{ "every": "15m", "target": "last" }
Workaround
Manual session cleanup (retaining only 5 most recent per agent):
for agent_dir in ~/.openclaw/agents/*/sessions; do
sessions=($(ls -t "$agent_dir"/*.jsonl 2>/dev/null))
count=0
for session in "${sessions[@]}"; do
count=$((count + 1))
if [ $count -gt 5 ]; then
mv "$session" ~/.openclaw/agents/$(basename $(dirname "$agent_dir"))/sessions-backup/
fi
done
done
Result: 180 sessions → 43 sessions (76% reduction)
Related Issues
Proposed Fix
- Clarify definition of "last" session (last modified? last activity? last message?)
- Implement proper session lifecycle management
- Add automatic cleanup for stale sessions
- Consider adding
session.maintenance.maxSessionsPerAgent config option
Impact
- Severity: High
- Frequency: Every heartbeat cycle (every 15 minutes)
- User Impact: Communication confusion, duplicate messages, disk space waste
- Workaround Available: Yes (manual cleanup)
Description
When configuring
heartbeat.target: "last"for agents, multiple old sessions respond to heartbeat triggers simultaneously, causing:Evidence
Session Count Before Cleanup
Duplicate Reports Example
In one hour (17:xx), two progress summary reports were generated:
20260311-1708-progress-summary.md(6145 bytes)20260311-1712-progress-summary.md(802 bytes)Both were generated by different sessions responding to the same heartbeat trigger.
Root Cause
The
target: "last"mechanism does not correctly identify the "last active" session:Steps to Reproduce
heartbeat.target: "last"ls -1 ~/.openclaw/agents/*/sessions/*.jsonl | wc -lExpected Behavior
target: "last"should reliably identify the single most recent sessionActual Behavior
target: "last"mechanism is unreliableEnvironment
{ "every": "15m", "target": "last" }Workaround
Manual session cleanup (retaining only 5 most recent per agent):
Result: 180 sessions → 43 sessions (76% reduction)
Related Issues
Proposed Fix
session.maintenance.maxSessionsPerAgentconfig optionImpact