[BUG] Windows installer reports success but silently skips overwrite when new binary matches existing file size
Summary
On Windows (x64), re-running irm https://claude.ai/install.ps1 | iex to update from 2.1.113 → 2.1.114 prints ✔ Claude Code successfully installed! Version: 2.1.114 but the binary at C:\Users\<user>\.local\bin\claude.exe is never rewritten. claude --version continues to report the old version.
The failure is silent: exit code 0, no warnings. Only way to notice is to check the file mtime or version afterward.
Root cause looks like a fast-path skip in the claude install subcommand based on file size (or similar heuristic) rather than hash — the old 2.1.113 binary happens to be exactly the same size as the 2.1.114 release on disk, so the installer treats it as already up-to-date.
Environment
- Windows 11 Pro 10.0.26220 (x64)
- Target path:
C:\Users\<user>\.local\bin\claude.exe - Installing from:
irm https://claude.ai/install.ps1 | iex - From: 2.1.113 → To: 2.1.114
Hard evidence
| File | Size (bytes) | SHA256 | Version |
|---|---|---|---|
| Manifest win32-x64 for 2.1.114 | 245,966,496 | 6f4a961ea8a1d656c41dd71cbef202cb71d13c443f86818c721167c33f8a51fd | 2.1.114 (expected) |
| Installed claude.exe after \"successful\" install | 245,966,496 | 0e62752f68fc2e15264601279bec58bacb9b8a788497dad2c4a688e43ff2e358 | 2.1.113 |
| Fresh download from CDN (/2.1.114/win32-x64/claude.exe) | 245,966,496 | 6f4a961ea8a1d656c41dd71cbef202cb71d13c443f86818c721167c33f8a51fd | 2.1.114 |
- The installed file has the same size as the 2.1.114 release but a different SHA256 — it is not the 2.1.114 binary.
- The installed file's mtime never advanced past the original install timestamp across multiple
irm ... | iexruns. - No running
claude.exeprocess (verified withGet-Process claudeempty andtaskkill /F /IM claude.exereporting \"not found\") — i.e. no file lock blocking the write. - No Mark-of-the-Web / Zone.Identifier ADS on the target path.
Invoke-RestMethod https://downloads.claude.ai/claude-code-releases/latestreturns2.1.114, so/latestis correct.
Reproduction
- Have Claude Code 2.1.113 installed via
install.ps1at%USERPROFILE%\.local\bin\claude.exe. - Ensure no
claude.exeprocess is running:Get-Process claude -ErrorAction SilentlyContinue— must be empty. - Run
irm https://claude.ai/install.ps1 | iex. Note output:✔ Claude Code successfully installed! Version: 2.1.114. - Run
claude --version→ still reports2.1.113. (Get-Item \"$env:USERPROFILE\.local\bin\claude.exe\").LastWriteTimeis unchanged.certutil -hashfile \"$env:USERPROFILE\.local\bin\claude.exe\" SHA256does not match thewin32-x64checksum fromhttps://downloads.claude.ai/claude-code-releases/2.1.114/manifest.json, despite(Get-Item ...).Lengthmatching the manifest'ssizefield exactly.
Workaround
Bypass the claude install subcommand and copy the verified-from-CDN binary directly:
\$dl = \"\$env:USERPROFILE\.claude\downloads\claude-2.1.114.exe\"
Invoke-WebRequest 'https://downloads.claude.ai/claude-code-releases/2.1.114/win32-x64/claude.exe' -OutFile \$dl
# verify against manifest checksum 6f4a961e...a51fd
Copy-Item -Force \$dl \"\$env:USERPROFILE\.local\bin\claude.exe\"
claude --version # 2.1.114
Suggested fix
Whatever claude install uses to decide \"already up-to-date\" on Windows should compare the manifest checksum (or at least the version string embedded in the binary), not the file size. Size collisions across adjacent releases are plausible and this will strand any user whose existing binary happens to match the new release's size.
Also worth surfacing a non-silent message when the installer decides to skip the overwrite, so users can distinguish \"already current\" from \"replace succeeded.\"
This issue has 3 comments on GitHub. Read the full discussion on GitHub ↗