Auto-updater silently downgrades binary when current version exceeds stable channel head (2.1.143 → 2.1.133 revert on Windows)

Resolved 💬 3 comments Opened May 17, 2026 by mhunoval-certusgc Closed May 21, 2026

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. --version2.1.143 (Claude Code). autoUpdatesChannel left "stable". |
| ~14:30 | Observed --version2.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

  1. Confirm whether the updater intentionally enforces current == channel_head on stable.
  2. If unintentional: patch to forward-only semantics on stable.
  3. If intentional: document explicitly that stable will 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).

View original on GitHub ↗

This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗