Skip to content

[Bug]: heartbeat.model config override not applied — heartbeats run on default model #30894

@nasacontrol-hq

Description

@nasacontrol-hq

Bug type

Behavior bug (incorrect output/state without crash)

Summary

The heartbeat.model config key is ignored. Heartbeats always run on the gateway's default model instead of the configured override.

Steps to reproduce

  1. Set heartbeat.model in config.yaml to a non-default model (e.g. anthropic/claude-3-5-haiku-20241022)
  2. Set defaultModel to a different model (e.g. anthropic/claude-opus-4-6)
  3. Wait for a heartbeat cycle to trigger
  4. Check session_status or gateway logs for which model was used

Expected behavior

Heartbeat runs should use the model specified in heartbeat.model config, not the gateway default model.

Actual behavior

Heartbeat runs always use the defaultModel (e.g. claude-opus-4-6) regardless of the heartbeat.model setting. The config key appears to be read but never applied to the heartbeat session's model override.

OpenClaw version

2026.2.26 (bc50708)

Operating system

macOS 26.3 (Sequoia) arm64 — Mac mini M4

Install method

npm global

Logs, screenshots, and evidence

Impact and severity

Affected: All users who configure heartbeat.model to reduce costs
Severity: Medium (causes unnecessary spend on expensive models for lightweight heartbeat checks)
Frequency: 100% repro
Consequence: Heartbeats run on Opus-tier models instead of Haiku, burning ~10-20x more tokens per heartbeat cycle than intended

Additional information

First observed on 2026.2.26. Unknown if earlier versions are affected.

Workaround: Move heartbeat logic to lightweight gateway-health-only checks and use cron jobs with explicit model overrides for anything substantial. Cron job model overrides work correctly; only heartbeat.model is broken.

Relevant config snippet:

heartbeat:
  model: anthropic/claude-3-5-haiku-20241022
  interval: 60
  activeHours: "07:00-23:00"
defaultModel: anthropic/claude-opus-4-6

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingbug:behaviorIncorrect behavior without a crash

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions