False 'auto-update failed' notification when already on latest version
Status Open
Reported on v2.1.220
Maintainer reply None cached
Workaround ✓ Mentioned in thread ↓
Activity 5 comments · opened Jul 28, 2026
Summary
Claude Code shows a persistent banner: "Auto-update failed — Run claude doctor", but the installation is already on the latest version and no action is required.
Steps to reproduce
- Use Claude Code normally (desktop app or CLI).
- Observe the "Auto-update failed" notification in the UI.
- Run
claude doctoras instructed. - Run
claude update.
Observed behaviour
claude doctor output:
Last update attempt: failed (install_failed) — 2026-07-28
No installation issues found.
claude update output:
Current version: 2.1.220
Claude Code is up to date (2.1.220)
The binary is already at the latest version (2.1.220). The auto-update mechanism recorded a failed install attempt, but the correct version is already running.
Expected behaviour
If the installed version already matches the latest release, the "auto-update failed" banner should not be shown (or should resolve itself silently). The message is confusing because it implies something is broken when nothing is.
Environment
- Version: 2.1.220
- Platform: darwin-arm64
- Config install method: native
- Auto-update channel: latest
Showing cached comments. Read the full discussion on GitHub ↗
4 Comments
This is the second time this happened, in addtion to the expectation that this does not surface an error as I am already on the newest version, it is not clear on how to remove the message.
<img width="454" height="63" alt="Image" src="https://github.com/user-attachments/assets/f509d735-4bc7-46d6-8a1f-733992abe576" />
Hit this too, on the same version. I dug into the logs and I think I have the root cause — it isn't a false positive, the update genuinely fails, but for a reason that has nothing to do with the installation.
Root cause: the updater fires during macOS DarkWake, before the network is up
~/.claude/.last-update-result.json:version_toisnullbecause it never reached the install step. The debug log shows what actually happened:DNS is fine on this machine —
dig, Node'sgetaddrinfo, andcurlall resolvedownloads.claude.aiin ~3ms when the machine is awake. The failures only happen while the lid is shut.I cross-referenced every auto-updater failure in one day's debug log against
pmset -g log. All five landed within seconds of a Power Nap maintenance wake:| Failure | Time after preceding DarkWake began | Length of that DarkWake |
|---|---|---|
| 1 | +3s | 12s |
| 2 | +2s | 25s |
| 3 | +2s | 2s |
| 4 | +2s | 2s |
| 5 | +2s | DarkWake → FullWake |
Five for five. The 30-minute update timer fires during the brief wake, Wi-Fi and
mDNSResponderhaven't re-associated yet, andgetaddrinfofails immediately.Why the retries don't help
All three attempts land inside the same ~2-second dead window:
~600ms apart, ~2s total — on a 2-second maintenance wake the machine is back asleep before attempt 3 could ever succeed.
The telling part: other subsystems in the same process handle this correctly
Interleaved in that identical window:
api.anthropic.comfails at the same millisecond — this is the whole network stack being down, not anything specific todownloads.claude.ai.SSETransportandremote-bridgeback off, reconnect on the next real wake, and never bother the user. The updater alone treats a transient resolver failure as terminal and raises a sticky banner that's still sitting there when you open the lid an hour later.Suggestions
ENOTFOUND/EAI_AGAINon the version fetch as retryable-later rather than a failed update — don't recordinstall_failedor surface a banner for it. It's indistinguishable from "offline", which is a normal state for a laptop.Secondary:
"autoUpdates": falseappears to be ignored on native installsRelated, and probably worth its own issue, but it's why this was hard to get rid of. This config has had
"autoUpdates": falsein~/.claude.jsonfor a long time, alongside"installMethod": "native", and the updater still runs every 30 minutes.There's a config key named
autoUpdatesProtectedForNativethat sits adjacent toinstallMethodandautoUpdates, which suggests native installs deliberately override theautoUpdatessetting. Whatever the reason for that, it's silent — the setting staysfalsein the config file and reads as though it's in effect. Either honoring it or warning that it's been overridden would help. (See also #56723, closed, on this same setting being undocumented.)Environment
This looks like the same bug as #65093 (filed 2026-06-03, labelled
bug/has repro/regression/area:installation), which has a deterministic repro and the diagnosis: on an install already at the latest version, a failed update check — e.g. the network dropping mid-session — is recorded asinstall_failedwithversion_to: null, meaning no install was ever attempted. The record is then never reset by a later successful check, so the banner survives reconnection and restarts.That matches your output exactly:
install_failedon 2.1.220 whileclaude updatereports the binary is already up to date. Workaround until it is fixed: delete~/.claude/.last-update-result.json(neitherclaude doctornorclaude updateclears it).See also #82408 and #70608 for the "stale record never self-heals" half. Cross-linking so these don't stay split.
Same symptom, adding a repro with the underlying state file contents plus one data point I haven't seen mentioned yet.
Environment: Linux x64 (Ubuntu), native install, 2.1.220, channel
latest.Symptom:
claude doctorkept reporting a failed auto-update whileclaude updatesimultaneously reported:(exit 0)
What doctor was reading:
~/.claude/.last-update-result.jsoncontained:version_to: nullanderror_code: nullsuggest the background check failed before it even resolved a target version (transient network at session start is my guess), and that got recorded as a hardinstall_failed.Two observations:
stable= 2.1.212 andlatest= 2.1.220, i.e. the installed version was ahead of the stable pointer. Probably irrelevant given the null target, but noting it since none of the related issues (#65093, #66208) mention the channel-pointer state.Workaround: deleting
~/.claude/.last-update-result.jsoncleared the banner; doctor then showsLast update attempt: none recordedandNo installation issues found. Obviously this just clears the stale record rather than fixing the write logic, so it may recur on the next misfiring background check.Host-side causes ruled out before concluding it was this bug: versions dir and
~/.local/binboth user-writable, 800G+ free disk, no staging leftovers, and the only lock in~/.local/state/claude/locksbelonged to the live session PID.