On this page
On this page
Automation
Automation troubleshooting
A command ladder and the common failure shapes for scheduled jobs. Part of the Automations guide.
Troubleshooting
Command ladder
Automations not firing
- Check the
cron.enabledconfig setting andOPENCLAW_SKIP_CRONin the Gateway's launch environment. Either can disable automatic runs; clear both disable settings and restart the Gateway to enable scheduling. - Confirm the Gateway is running continuously.
- Use
openclaw automations list --allto find disabled jobs andopenclaw doctorto inspect recorded auto-disable reasons, including terminal one-shot execution failures. Fix the cause before runningopenclaw automations enable <jobId>. Operator cancellations and restart interruptions remain visible in run history, but do not increase consecutive failures, trigger failure alerts or automatic repair, or record an auto-disable. A job failure completed before webhook delivery was interrupted still counts. Enabled, unchanged time-scheduled agent-turn jobs interrupted before delivery retry once through cron, including one-shots. Other interrupted one-shots stay disabled to avoid replaying uncertain work; inspect their history before continuing manually. - For
cronschedules, verify timezone (--tz) vs the host timezone. reason: not-duein run output means the manual run was checked withopenclaw automations run <jobId> --dueand the job was not due yet.- If the job's execution agent cannot be resolved, automatic and manual attempts record a failed task and a skipped run-history entry with the reason. Select an agent with
openclaw automations edit <jobId> --agent <id>. Automation has no recorded inference accountmeans an older job has not adopted a stored account yet. Runopenclaw doctor --fix: it backs up cron state and records the account the job's run would use (an explicit selection, or the first account in the normal account order) without pinning inherited models or changing fallbacks. When several accounts are eligible, Doctor names the others; if the account is unavailable or personal, Doctor names the job and the required action. An authorized operator can explicitly select the intended profile withopenclaw automations edit <jobId> --model <provider/model>@<profileId>. A job on an environment or provider-config key keeps that key and needs no adoption; it stops instead of switching once a stored account becomes eligible. The refusal ends the run without trying fallback models. CLI-native login and configured credentialless inference do not require adopting a host profile; an unbound CLI job cannot select or automatically borrow one. Doctor does not infer historical account ownership from the last model in run history.Automation candidate is incompatible with its recorded inference account and routemeans the selected model uses a different provider, or its runtime uses a CLI login that cannot replace the job's stored account. Model/default changes preserve account ownership. Select a model and host-managed runtime compatible with that account, or deliberately adopt another stored account withopenclaw automations edit <jobId> --model <provider/model>@<profileId>. A profile selection does not transfer ownership to a CLI login. Doctor leaves existing bindings unchanged; repeatingdoctor --fixdoes not repair this mismatch. See Inference account continuity.- A run can finish
okafter an exec call fails and the agent replies. Checkdiagnostic:inopenclaw automations show <jobId>ordiagnosticsin run history; unresolved exec failures produce a warning without exposing command arguments. Automation migration is incomplete; run openclaw doctor --fixmeans a converted monitor still has pending migration work. Complete Doctor's reported repair before running it.- If a capped job's stored named creator account is unavailable, the run fails before model/tool execution. Job details, run history, and warning logs name the account. Re-add it to the channel configuration, or recreate the automation from the intended account; changing the delivery
--accountdoes not change creator authority. Legacy jobs without account metadata keep their existing execution policy.
Job fired but no delivery
- A session queue capacity error means the target cannot admit another turn. Let its existing work settle before retrying. Main-session system events stay running until their turn settles; a restart before adoption records one interrupted error without replaying the reminder.
- Delivery mode
nonemeans no runner fallback send is expected. The agent can still send directly with themessagetool when a chat route is available. - Delivery target missing/invalid (
channel/to) means outbound was skipped. - For Matrix, copied or legacy jobs with lowercased
delivery.toroom IDs can fail because Matrix room IDs are case-sensitive. Edit the job to the exact!room:serverorroom:!room:servervalue from Matrix. - Channel auth errors (
unauthorized,Forbidden) mean delivery was blocked by credentials. - When the dispatcher records intentional suppression, job state, run history, and finished events include
deliverySuppressionReason(empty,silent,heartbeat, orchannel_transform). This is separate fromlastDeliveryError/deliveryError; required delivery failures also log an error when they happen. - For text-only isolated announcements, only a completed final that trims to uppercase
NO_REPLYsuppresses the text and fallback queued summary. Lowercase, wrapped forms, and trailing tokens remain visible. See Silent token suppression for the leading-line form and media behavior. - If the agent should message the user itself, check that the job has a usable route (
channel: "last"with a previous chat, or an explicit channel/target). - With
delivery.target: "owner", no resolved owner DM means delivery is unavailable; it does not skip execution or fall back to the last group conversation.delivery.directPolicy: "block"intentionally suppresses DM delivery. Inspect and edit the job's delivery settings.
Automations or heartbeat appear to prevent /new-style rollover
- Daily and idle reset freshness is not based on
updatedAt; see Session management. - Automation wakeups, heartbeat runs, exec notifications, and gateway bookkeeping may update the session row for routing/status, but they do not extend
sessionStartedAtorlastInteractionAt. - For legacy rows created before those fields existed, OpenClaw can recover
sessionStartedAtfrom the transcript JSONL session header when the file is still available. Legacy idle rows withoutlastInteractionAtuse that recovered start time as their idle baseline.
Timezone gotchas
- Cron expressions without
--tzuse the gateway host timezone. atschedules without timezone are treated as UTC.- Job
activeHourshas its own timezone (user,local, or an IANA zone), independent of the cron expression's--tz.
Was this useful?