Bug Report
Version: OpenClaw 2026.3.7 (node, macOS arm64)
Channel: WhatsApp
Description
After batch-updating multiple cron jobs (changing delivery.channel on ~12 jobs), the gateway restarted as expected. However, all cron jobs got stuck in a stale runningAtMs state that persisted across restarts, preventing them from executing.
Steps to Reproduce
- Have multiple cron jobs running (we had ~20 active jobs)
- Batch-update delivery config on 12 jobs via
cron.update (two waves, ~7 then ~11 jobs)
- Gateway restarts after updates
- Jobs stop running —
cron.run returns {"ran": false, "reason": "already-running"}
sessions_list(kinds=["cron"]) shows zero active sessions
- The
runningAtMs timestamp in job state matches the gateway restart time, not any actual session
Expected Behavior
- Gateway restart should clear
runningAtMs for jobs with no matching active session
SIGUSR1 (graceful restart) should also clear stale running flags
- Jobs should resume their schedules after restart
Actual Behavior
runningAtMs persists in ~/.openclaw/cron/jobs.json across both SIGUSR1 and full stop/start
- All jobs with
runningAtMs set return already-running when manually triggered
- No cron sessions are actually running (confirmed via
sessions_list)
- Only a full
openclaw gateway stop && sleep 3 && openclaw gateway start clears the state (inconsistently — first try with SIGUSR1 did NOT work)
Additional Bug: delivery.mode: "none" with delivery.channel set
When updating jobs to set delivery.channel: "whatsapp" with delivery.mode: "none":
- OpenClaw still attempts delivery to WhatsApp despite
mode: "none"
- Fails with:
"Delivering to WhatsApp requires target <E.164|group JID>"
- Jobs are marked as
error even though the agentTurn payload executed successfully
- Setting
delivery.channel: null via patch is rejected by schema validation (must be string)
- Workaround: Add
delivery.to: "+1234567890" to satisfy the validator, even though delivery should not fire
Impact
- 7+ cron jobs stopped running for ~18 hours (missed morning briefing, klartext publish, satire generator, youtube reports, newsletter)
- Required manual intervention and full gateway restart to recover
- User perceived this as "crashes" since the gateway was unresponsive during restart cycles
Environment
- macOS (Apple Silicon, arm64)
- OpenClaw 2026.3.7
- LaunchAgent managed gateway
- ~20 active cron jobs, mixed schedules (every 10min to weekly)
- WhatsApp + Telegram channels configured
Suggested Fix
- On gateway startup, iterate all jobs with
runningAtMs set and check if a matching session exists. If not, clear runningAtMs.
delivery.mode: "none" should skip ALL delivery logic regardless of other delivery fields.
cron.update patch should support removing fields (e.g., setting channel: null to delete the key).
Bug Report
Version: OpenClaw 2026.3.7 (node, macOS arm64)
Channel: WhatsApp
Description
After batch-updating multiple cron jobs (changing
delivery.channelon ~12 jobs), the gateway restarted as expected. However, all cron jobs got stuck in a stalerunningAtMsstate that persisted across restarts, preventing them from executing.Steps to Reproduce
cron.update(two waves, ~7 then ~11 jobs)cron.runreturns{"ran": false, "reason": "already-running"}sessions_list(kinds=["cron"])shows zero active sessionsrunningAtMstimestamp in job state matches the gateway restart time, not any actual sessionExpected Behavior
runningAtMsfor jobs with no matching active sessionSIGUSR1(graceful restart) should also clear stale running flagsActual Behavior
runningAtMspersists in~/.openclaw/cron/jobs.jsonacross both SIGUSR1 and full stop/startrunningAtMsset returnalready-runningwhen manually triggeredsessions_list)openclaw gateway stop && sleep 3 && openclaw gateway startclears the state (inconsistently — first try with SIGUSR1 did NOT work)Additional Bug:
delivery.mode: "none"withdelivery.channelsetWhen updating jobs to set
delivery.channel: "whatsapp"withdelivery.mode: "none":mode: "none""Delivering to WhatsApp requires target <E.164|group JID>"erroreven though the agentTurn payload executed successfullydelivery.channel: nullvia patch is rejected by schema validation (must be string)delivery.to: "+1234567890"to satisfy the validator, even though delivery should not fireImpact
Environment
Suggested Fix
runningAtMsset and check if a matching session exists. If not, clearrunningAtMs.delivery.mode: "none"should skip ALL delivery logic regardless of other delivery fields.cron.updatepatch should support removing fields (e.g., settingchannel: nullto delete the key).