Auto-updater silently downgrades binary when current version exceeds stable channel head (2.1.143 → 2.1.133 revert on Windows)
Summary
On Windows, after a one-time force-install of CC 2.1.143 with autoUpdatesChannel: "stable" left unchanged, the bridge binary at ~/.local/bin/claude.exe silently reverted 2.1.143 → 2.1.133 within ~80 minutes. The stable channel head was 2.1.133 at the time. Setting autoUpdatesChannel: "latest" + minimumVersion: "2.1.143" stopped the revert; a 13-tick / 60-minute watcher confirmed stickiness after the change.
The observed behavior is consistent with the auto-updater enforcing current_binary == channel_head on a timer (force-downgrade when current > head), not the expected upgrade-only-forward (current >= head).
Environment
- OS: Windows 11 Pro 26300, pwsh 7.6.1
- Binary path:
C:\Users\<u>\.local\bin\claude.exe - Install vector:
iex (irm https://claude.ai/install.ps1) 2.1.143 - Channel before fix:
stable(head = 2.1.133) - Channel after fix:
latest+minimumVersion: "2.1.143"
Timeline (2026-05-17 EDT)
| Time | Event |
|---|---|
| 13:10:42 | Manual install of 2.1.143. SHA256 e480244f…69eb6, size 228,902,560. --version → 2.1.143 (Claude Code). autoUpdatesChannel left "stable". |
| ~14:30 | Observed --version → 2.1.133. SHA on disk = 2.1.133's SHA (ba4c4196…4016e). No user install ran between 13:10 and 14:30. |
| ~15:00 | ~/.claude/settings.json + ~/.claude/settings.local.json: autoUpdatesChannel → "latest", added minimumVersion: "2.1.143". |
| ~15:00 | Binary re-upgraded to 2.1.143 automatically, before any manual install command ran. |
| 15:30 | Manual reinstall as belt-and-suspenders; SHA unchanged. |
| 15:58 → 16:58 | Watcher script probed binary every 5 min for 60 min (13 ticks). All ticks verdict=OK; SHA, size, and --version constant. |
Expected
A binary at a version higher than the active channel head should not be downgraded silently.
Actual
Binary was downgraded to channel head despite being newer.
Workaround
~~~jsonc
// ~/.claude/settings.json and ~/.claude/settings.local.json
{
"autoUpdatesChannel": "latest",
"minimumVersion": "2.1.143"
}
~~~
Asks
- Confirm whether the updater intentionally enforces
current == channel_headonstable. - If unintentional: patch to forward-only semantics on
stable. - If intentional: document explicitly that
stablewill downgrade a higher-version binary to head, so users running off-channel forces understand the contract.
Related
Prior issue #59450 (Round-17 stability diagnostic, 2.1.142 upgrade, dispatch-path version-split).
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗