#9429: fix: skip session model override for heartbeat runs
stale
Cluster:
Heartbeat Model Override Fixes
Fixes #9375
## Problem
When `agents.defaults.heartbeat.model` is set (e.g., `google/gemini-2.5-pro`), heartbeat runs should use that model. However, if the main session has a `modelOverride` stored (e.g., from using `/model opus` command), the heartbeat incorrectly runs on the session's overridden model instead.
## Root Cause
In `createModelSelectionState()`, the session's stored override takes precedence and overwrites the heartbeat model that was already resolved in `get-reply.ts`.
## Solution
1. Added `isHeartbeat` parameter to `createModelSelectionState()`
2. Skip the `storedOverride` logic when `isHeartbeat` is true
3. Pass `opts?.isHeartbeat` from `resolveReplyDirectives()`
Now `heartbeat.model` configuration takes precedence for heartbeat runs, as expected.
## Testing
- Verified heartbeat runs use configured heartbeat model even when session has a different model override
- Verified normal chat messages still respect session model overrides
<!-- greptile_comment -->
<h2>Greptile Overview</h2>
<h3>Greptile Summary</h3>
This PR threads an `isHeartbeat` flag into model selection, and when set it prevents session/parent stored model overrides (e.g., from `/model`) from overwriting the already-resolved heartbeat model. The change is applied in `resolveReplyDirectives()` (passing `opts?.isHeartbeat`) and in `createModelSelectionState()` (skipping `resolveStoredModelOverride()` application).
<h3>Confidence Score: 4/5</h3>
- Mostly safe to merge, but heartbeat runs may still incur stored-override side effects.
- The core precedence fix is narrowly scoped and appears correct, but `createModelSelectionState()` still treats stored overrides as present for catalog-loading and override-reset logic even on heartbeats, which could cause unnecessary work and unexpected session mutations during heartbeat runs.
- src/auto-reply/reply/model-selection.ts
<!-- greptile_other_comments_section -->
**Context used:**
- Context from `dashboard` - CLAUDE.md ([source](https://app.greptile.com/review/custom-context?memory=fd949e91-5c3a-4ab5-90a1-cbe184fd6ce8))
- Context from `dashboard` - AGENTS.md ([source](https://app.greptile.com/review/custom-context?memory=0d0c8278-ef8e-4d6c-ab21-f5527e322f13))
<!-- /greptile_comment -->
Most Similar PRs
#22277: fix: prevent heartbeat model override from bleeding into main session
by zhangjunmengyang · 2026-02-21
86.6%
#21615: fix(tui): preserve main session model during heartbeat model override
by lailoo · 2026-02-20
86.2%
#9721: fix: heartbeat model override not working for per-agent config (#9556)
by divol89 · 2026-02-05
81.4%
#23521: heartbeat: prevent model-override from bleeding into main session s...
by harshang03 · 2026-02-22
80.3%
#15575: fix(heartbeat): suppress prefixed HEARTBEAT_OK ack replies (#15505)
by TsekaLuk · 2026-02-13
78.9%
#21847: fix(session): /new and /reset no longer carry over model overrides
by hydro13 · 2026-02-20
76.8%
#13376: fix: pass model directly to agent for sub-agent runs
by jrbobbyhansen-pixel · 2026-02-10
76.6%
#13524: feat: conditional bootstrap file loading for heartbeat vs DM sessions
by tarun131313 · 2026-02-10
76.4%
#6750: fix(tui): show session model overrides in status bar
by ewijaya · 2026-02-02
76.1%
#10186: fix: clear model/provider override when /new starts a fresh session
by Yida-Dev · 2026-02-06
75.5%