Reliable cron config learned through repeated failures. Follow these rules for every new cron.
Every cron that delivers to the user must explicitly set a fast model. The global default can get stuck on model resolution (MiniMax cold-start especially).
json
"model": "deepseek/deepseek-v4-flash"
Time-sensitive crons that need pinning:
Non-time-sensitive crons (dashboard, backup, security audit) can use default model — delay is harmless.
Cron agentTurn payloads run in an isolated context. They cannot cd to the workspace first. Every command MUST use absolute paths.
WRONG:
text
cd /workspace && python3 scripts/sync.py
RIGHT:
text
/usr/bin/python3 /home/hobopi/.openclaw/workspace/scripts/sync-ledger-to-sheet.py
Preflight checks reject cd && python3 chains.
Cron typeTimeoutReasonExpense check-in300s (600s for 10pm)May wait for Hobo replyNews briefing600sWeb search + curation takes timeExpense sync60sQuick script, just needs to runInvestment sync600sReads all ledger filesDashboard gen180sRuns 3 scripts in sequenceToken tracker300sHeavy usage data parsingTransport check-in600sPrevious-day ask, may waitBackup300star + gzipSecurity audit600sFull healthcheck
For crons that deliver to Telegram, use explicit delivery:
json
"delivery": {
"mode": "announce",
"channel": "telegram",
"to": "telegram:37134287"
}
mode: "none" for crons that don't need to notify the user (dashboard updates, token tracking).
lastRunStatus and consecutiveErrors on cron statuslastDiagnostics shows the error phase: model-call-started = model resolution timeoutSet cron.maxConcurrentRuns in openclaw.json when multiple crons fire simultaneously:
json
"cron": { "maxConcurrentRuns": 2 }
Prevents Sunday 5am clash (security audit + hourly dashboard + expense check-in).
json
"failureAlert": {
"after": 2,
"mode": "announce",
"channel": "telegram",
"to": "telegram:37134287"
}
Notifies Hobo after 2 consecutive failures. Default enabled.