Automation troubleshooting
Use this page for scheduler and delivery issues (cron + heartbeat).
Command ladder
Cron not firing
cron statusreports enabled and a futurenextWakeAtMs.- Job is enabled and has a valid schedule/timezone.
cron runsshowsokor explicit skip reason.
cron: scheduler disabled; jobs will not run automatically→ cron disabled in config/env.cron: timer tick failed→ scheduler tick crashed; inspect surrounding stack/log context.reason: not-duein run output →openclaw cron run <jobId> --dueor Web UI Run if due was used and the job is not due yet.main job requires payload.kind="systemEvent"→ the job is stored as a main-session job with an incompatible payload. Use the Web UI Timeline message or Check first, then nudge job type, or recreate the job with a matchingsessionTarget/payload.kind.isolated job requires payload.kind=agentTurn→ the job is stored as an isolated job without an assistant-task payload. Use the Web UI Assistant task job type or recreate the job with--session isolated --message ....wake-gate-empty→ the wake-gate check ran and found no work. This is a valid skipped result, not a scheduler failure.already runningoralready-running→ the previous run or target lane is still active. Wait for it to finish, then inspectopenclaw cron runs --id <jobId> --limit 20.
Cron fired but no delivery
- Run status is
ok. - Delivery mode/target are set for isolated jobs.
- Channel probe reports target channel connected.
- Run succeeded but delivery mode is
none→ no external message is expected. - Delivery target missing/invalid (
channel/to) → run may succeed internally but skip outbound. - Channel auth errors (
unauthorized,missing_scope,Forbidden) → delivery blocked by channel credentials/permissions. - Web UI shows
Not deliveredon an internal run → delivery was not requested. Set result delivery toannounceorwebhookwhen you expect an outbound message.
Heartbeat suppressed or skipped
- Heartbeat enabled with non-zero interval.
- Last heartbeat result is
ran(or skip reason is understood).
heartbeat skippedwithreason=quiet-hours→ outsideactiveHours.requests-in-flight→ main lane busy; heartbeat deferred.empty-heartbeat-file→ interval heartbeat skipped becauseHEARTBEAT.mdhas no actionable content and no tagged cron event is queued.alerts-disabled→ visibility settings suppress outbound heartbeat messages.
Timezone and activeHours gotchas
Config path not found: agents.defaults.userTimezonemeans the key is unset; heartbeat falls back to host timezone (oractiveHours.timezoneif set).- Cron without
--tzuses gateway host timezone. - Heartbeat
activeHoursuses configured timezone resolution (user,local, or explicit IANA tz). - ISO timestamps without timezone are treated as UTC for cron
atschedules.
- Jobs run at the wrong wall-clock time after host timezone changes.
- Heartbeat always skipped during your daytime because
activeHours.timezoneis wrong.