Stale "auto-update failed" status message is misleading and can't be cleared
Status Open
Reported on v2.1.220
Maintainer reply None cached
Workaround ✓ Mentioned in thread ↓
Activity 5 comments · opened Jul 29, 2026
Two related issues around the auto-updater's failure state:
- Misleading remediation text. When a background update check fails, the status line shows "auto-update failed - run claude doctor". Running
claude doctorreports "No installation issues found" and doesn't surface the failure at all — it only compares installed vs. latest version, not the update-attempt failure state in~/.claude/.last-update-result.json. The message should either point to a command that actually helps (e.g.claude update), orclaude doctorshould read and report on that file's contents.
claude updatedoesn't clear a stale failure record. Reproduction: with~/.claude/.last-update-result.jsoncontaining{"outcome":"failed","status":"install_failed",...}from an earlier failed check, runningclaude updatewhile already on the latest version reports "Claude Code is up to date" but does not rewrite.last-update-result.json— the stalefailedrecord (and presumably the status-line warning) persists. The already-up-to-date/no-op path should still write a fresh success result so a transient failure doesn't leave a permanent-looking warning until the next background cycle happens to run.
Details from investigation:
.last-update-result.jsonat time of failure:{"timestamp":"2026-07-29T14:33:52.420Z","path":"native","outcome":"failed","status":"install_failed","version_from":"2.1.220","version_to":null,"error_code":null}- Install itself was healthy throughout (correct permissions, disk space, latest version already installed per both the npm registry and
downloads.claude.ai). version_to: nullsuggests the failure was in resolving update metadata, not an actual install/write step.
Showing cached comments. Read the full discussion on GitHub ↗
4 Comments
This is what's been visible in my iTerm for most of the day, but as Claude stated in the PR comment above, the install is actually healthy:
<img width="327" height="56" alt="Image" src="https://github.com/user-attachments/assets/6d2875d4-19b4-44ac-934e-8917f7cf8544" />
Confirming both problems on a Windows 11 native install at the same version (2.1.220). Adding hard data since this thread doesn't have a Windows native case yet.
Environment
%USERPROFILE%\.local\bin\claude.exe(265,720,480 bytes)claude --version→ 2.1.220autoUpdatesChannel: "latest", and thelatestchannel manifest also returns2.1.220— already current, nothing to update toThe failure record
Note that
error_codeisnullin addition toversion_to, so the record carries no actionable cause whatsoever — which is a large part of whyclaude doctorhas nothing to act on.Timing: this is a startup check firing ~20 s in
claude.exeprocess start:2026-07-30 10:00:38KST (UTC+9) =01:00:38Z01:00:58.711ZSo the failure lands 20.7 s after process launch, not during a long-running background cycle. That is consistent with a transient network / version-metadata resolution failure at startup rather than an install problem — matching @owenbrown's DNS analysis in #81898, despite the
install_failedlabel.Nothing was actually attempted on disk
~/.claude/downloads/— empty, no partial artifacts~/.local/share/claude/versions/— contains only2.1.217and2.1.220; no directory was created for any newer versionC:, no proxy configured (ProxyEnable = 0)This supports the conclusion that it failed before the install step, i.e.
status: "install_failed"is mislabeled.Problem 2 reproduces exactly as described
After that run, the
.last-update-result.jsontimestamp was unchanged (still01:00:58.711Z) and the banner persisted. The "already up to date" path is a no-op that never clears the stale failure record.Workaround — removing the record and restarting clears the banner:
One aside:
~/.claude/telemetry/is empty on this machine, so there is no local indication that this failure is reported anywhere other than that one file. If that holds generally, the already-on-latest failure case may be substantially under-observed on your side.Same root cause as #65093 (filed 2026-06-03, labelled
bug/has repro/regression/area:installation), which has a deterministic repro: on an install already at the latest version, drop the network mid-session → the failed check is recorded asinstall_failedwithversion_to: null, i.e. no install was ever attempted.Your point 2 is exactly the never-self-heals half of that report, also covered by #70608: the record is never reset by a subsequent successful check, so the banner outlives reconnection and restarts, and only deleting
~/.claude/.last-update-result.jsonby hand clears it.Point 1 lines up too —
claude doctornever reads that file, so the remediation the banner points at cannot possibly clear the state it reports.Still reproducing on 2.1.220 (Windows 10, native, channel
latest). Cross-linking so the reports don't stay split across #65093 / #81898 / #70608 / this one.Confirming both points on macOS (Apple Silicon), native install, v2.1.220, channel
latest.One data point I don't see elsewhere in this thread or in #70608 / #65093 — the stale record regenerates, so deleting it is not a one-time fix:
~/.claude/.last-update-result.json, restarted, banner cleared.Re: point 2 (
claude updatedoesn't clear a stale record) — confirmed, with a precise observation: after a successfulthe file's mtime was unchanged (still 08:54:21). So the success path doesn't touch the file at all, rather than writing a record that happens to be ignored.
Note that
statusisinstall_failedeven thoughversion_toisnull— no target version was ever resolved, so nothing was downloaded or installed. A failed check is being recorded as a failed install, which is the same root cause as #65093.Everything else was verified healthy at the time of the failed record, so this is not a local environment problem:
https://downloads.claude.ai/claude-code-releases/latest→2.1.220~/.cache/claude/stagingempty; no partial downloads or lock files~/.local/share/claude/versions/and~/.local/binwritable, correct uidclaude doctorreports no installation issuesSince the only two
outcomevalues aresuccessandfailed, an "already on latest, nothing to do" check has no outcome it can record — so one transient failure is latched permanently and no amount of successful checking can clear it.