Skip to content

[Bug] heartbeat target: "last" causes multiple sessions to respond simultaneously #43126

@hhdnxx

Description

@hhdnxx

Description

When configuring heartbeat.target: "last" for agents, multiple old sessions respond to heartbeat triggers simultaneously, causing:

  1. Duplicate messages: Same heartbeat generates multiple responses
  2. Communication confusion: Users receive conflicting or redundant messages
  3. 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:

  1. Old sessions are not properly closed
  2. Multiple sessions can be considered "last"
  3. Heartbeat runner triggers all matching sessions in parallel

Steps to Reproduce

  1. Configure multiple agents with heartbeat.target: "last"
  2. Run heartbeat for several days (15-minute interval)
  3. Check session counts: ls -1 ~/.openclaw/agents/*/sessions/*.jsonl | wc -l
  4. 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

  1. Clarify definition of "last" session (last modified? last activity? last message?)
  2. Implement proper session lifecycle management
  3. Add automatic cleanup for stale sessions
  4. 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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions