OpenClaw Cron Jobs Show "error" Status Even When Messages Delivered Successfully
Your cron job runs, posts to Discord, and the message appears. But
openclaw cron list shows lastRunStatus: "error" and
lastError: "โ ๏ธ โ๏ธ Message failed". The delivery worked โ the error
is a false positive from the QA transport layer. Here's what's happening and
how to suppress it.
What's Happening
Issue #67441: when a cron job runs an isolated agent session that posts to Discord
via the message tool and returns NO_REPLY, the cron
runner evaluates whether the session produced a "response." NO_REPLY
signals no user-facing reply โ which the QA transport incorrectly interprets as
a delivery failure and marks the job as errored.
The Discord message went through. Your users see it. The cron job log says it failed. This makes cron monitoring unreliable โ you can't tell real failures from these false positives without checking Discord manually.
Affected Pattern
This specifically hits cron jobs that:
- Run an isolated agent session (not an inline task)
- Post to Discord (or another channel) via the
messagetool - Return
NO_REPLYas the final agent response (correct behavior for message tool sends)
Workaround #1 โ Return a Confirmation String Instead of NO_REPLY
The cron runner expects the session to produce some text output to consider
the job successful. Instead of NO_REPLY, have your cron agent return a
minimal confirmation:
// In your SOUL.md or cron task prompt โ change the ending instruction:
// Before (triggers false positive):
"After sending, reply with exactly: NO_REPLY"
// After (resolves false positive):
"After sending, reply with exactly: โ
sent"
The confirmation string won't be delivered to the channel (it's a session-level response, not a message tool call), but the cron runner sees it as a successful completion.
Workaround #2 โ Use an Inline Cron Task Instead of an Isolated Session
If your cron job is simple enough, switch from an isolated session pattern to an inline task. Inline cron tasks evaluate completion differently and aren't affected by the QA transport false positive:
// crons entry in openclaw.json
{
"crons": [
{
"schedule": "0 8 * * *",
"task": "Send the morning briefing to Discord channel #briefings",
"isolated": false // inline, not isolated session
}
]
}
Workaround #3 โ Ignore the Error Status in Monitoring
If you're monitoring cron health and know this false positive exists, you can
filter it out by checking whether lastError contains "Message failed"
โ treat that specific error string as non-critical until the bug is fixed:
openclaw cron list | grep -v "Message failed"
How to Confirm It's a False Positive (Not a Real Failure)
# Check if the message actually made it to Discord
openclaw cron list --verbose
# Look at lastRunAt timestamp, then check Discord for a message at that time
# Also check gateway logs around the cron run time
openclaw gateway logs | grep -A5 "cron"
If the Discord message is there and the timestamp matches โ it's the false positive. If there's no Discord message โ it's a real failure and something else is wrong.
TL;DR
- Cron + isolated session + message tool + NO_REPLY = false positive
lastRunStatus: "error" - Fix A: Return
โ sentinstead ofNO_REPLYat end of cron task - Fix B: Switch to inline cron task (
isolated: false) - Fix C: Filter
"Message failed"out of monitoring until patched - Tracking: GitHub issue #67441
Cron jobs not behaving?
ClawReady configures scheduled tasks and heartbeat systems that work reliably โ right isolation mode, right response pattern, real error monitoring you can actually trust.
Book a Free Call โ