AgentFixboard

doctor --fix leaves a pending Proactive check so every run fails

After openclaw doctor --fix on an install whose heartbeat was every: "0m", every new automation run fails with Automation migration is incomplete; run openclaw doctor --fix.

From GitHub

openclaw/openclaw

Difficulty
Easy
Time
~5 min
Steps
2
Fixed in
—
Last checked

Not fixed upstream yet: the issue is open. Source: issue open. Last checked 2026-10-23.

Symptom

After openclaw doctor --fix on an install whose heartbeat was every: "0m", every new automation run fails with Automation migration is incomplete; run openclaw doctor --fix.

Evidence what you'll see

  • The later heartbeat cadence and scratch steps provisioned job Proactive check (<agent>) with enabled: true, every 30m, and receipt automation-default:<store>:<agent> = {"phase":"pending"}.
  • Only retireHeartbeatWithDoctor completes receipts, and that step had already run. The pending receipt then fails each tick in src/cron/service/timer-execution.ts.
  • With several channels configured, the failure alert also failed with Channel is required when multiple channels are configured.
  • Deleting the job is not a safe recovery: a later doctor run refuses an incomplete cutover whose job is gone (src/commands/doctor-heartbeat-monitors.ts).

Why it happens

Heartbeat retirement strips the heartbeat keys before the standalone cadence and scratch steps run. Those steps then resolve the default agent from a leftover HEARTBEAT.md, and resolveLegacyHeartbeatIntervalMs defaults a missing interval to "30m". The code comment on job.enabled = enrolled && intervalMs !== null says an implicit cadence alone must not provision a job.

Affected versions

OpenClaw 2026.10.6 (main 17416f83ecf), git install, macOS 26 (Darwin 25.6.0). Before the upgrade, agents.defaults.heartbeat was { every: "0m", target: "discord", to: "channel:…", directPolicy: "block" }, plus one non-default agent with heartbeat: { every: "0m" }. The default workspace still had a template HEARTBEAT.md.

Fix steps

0 of 2 done

Your check marks stay in this browser only.

How to check it worked

  • After doctor on a disabled heartbeat (every: "0m"), no enabled Proactive check job is created, the cutover receipt is not left phase: "pending", and runs no longer print Automation migration is incomplete; run openclaw doctor --fix.

If it still fails

  • The reporter did not reproduce the sequence in a clean environment. The step order is from the doctor output and src/commands/doctor-health-contributions-final.ts. Related open issue #145949 tracks a disabled heartbeat re-enabling itself.
  • The linked issue does not name a release that changes this step order. Main at 3b153699457 is described as having no change to that order.

Sources and credit

Summarized in our own words from these public reports. Credit goes to their authors.

Provided as is, without warranty. Try changes in a non-production environment and back up first. Security-related steps: verify against the official docs. Terms · Request removal or attribution change

Hit an error we don't cover? Submit it