Problem
Session lock files () are not being released after cron job completion, causing complete system paralysis.
Symptoms
- Cron job acquires session lock for write operation
- Lock is never released after run completion (even when
isError=false)
- All subsequent message/run attempts timeout after 10s with "session file locked" error
- System becomes completely unresponsive until manual intervention
- Subsequent cron runs fail with cascading timeouts (backoff 30s ineffective)
Root Cause
Bug in session lifecycle management:
- Lock acquired in
sessions.ts for write operations
- Lock release logic not triggered on run completion (possible race condition)
- Announce/delivery mechanism tries to access session while still locked
Reproduction
- Create cron job with
sessionTarget="main" and payload.kind="systemEvent"
- Wait for job to execute
- Try to send message to session → timeout 10s
- Check
agents/main/sessions/*.lock → orphan lock file exists
Impact
Critical — Complete system paralysis requiring manual intervention:
# Manual recovery (only option)
rm -f /data/.openclaw/agents/main/sessions/*.lock
rm -f /data/.openclaw/agents/main/sessions/*.jsonl # May be corrupted
docker restart <container>
Occurrences
- 2026-03-02 00:43 — First incident (session
594d661f...c07.jsonl)
- 2026-03-02 14:59 — Second incident (session
615691e5...5758.jsonl)
- Frequency — ~2x in 14 hours (recurring)
Expected Behavior
Lock should be released immediately after run completion, regardless of:
isError status (true/false)
- Delivery mode (
none/announce/webhook)
- Exception/crash during run
Environment
- OpenClaw version — 2026.2.23 (npm install)
- Runtime — Docker container (Hostinger VPS)
- OS — Linux 6.8.0-101-generic (x64)
- Node — v22.22.0
Workaround Applied
Created aggressive lock guardian monitoring:
- Check every 15min (down from 1h)
- Auto-cleanup locks >30min (down from 120min)
- Backup sessions before removal
Workaround mitigates impact but does not fix root cause.
Proposed Fix
- Add
finally block in session write operations to guarantee lock release
- Add timeout for lock acquisition (fail fast if lock held >60s)
- Add lock age check before acquiring (refuse if existing lock >5min)
- Log lock acquisition/release for debugging
Related Code
Likely affected files:
packages/runtime/src/sessions.ts (session lifecycle)
packages/runtime/src/cron.ts (cron job execution)
- Lock acquisition/release logic
Request
Please investigate session lock lifecycle management and add guaranteed lock release on run completion.
This is a critical production bug causing complete system outages.
Problem
Session lock files () are not being released after cron job completion, causing complete system paralysis.
Symptoms
isError=false)Root Cause
Bug in session lifecycle management:
sessions.tsfor write operationsReproduction
sessionTarget="main"andpayload.kind="systemEvent"agents/main/sessions/*.lock→ orphan lock file existsImpact
Critical — Complete system paralysis requiring manual intervention:
Occurrences
594d661f...c07.jsonl)615691e5...5758.jsonl)Expected Behavior
Lock should be released immediately after run completion, regardless of:
isErrorstatus (true/false)none/announce/webhook)Environment
Workaround Applied
Created aggressive lock guardian monitoring:
Workaround mitigates impact but does not fix root cause.
Proposed Fix
finallyblock in session write operations to guarantee lock releaseRelated Code
Likely affected files:
packages/runtime/src/sessions.ts(session lifecycle)packages/runtime/src/cron.ts(cron job execution)Request
Please investigate session lock lifecycle management and add guaranteed lock release on run completion.
This is a critical production bug causing complete system outages.