[Bug] Auto-update reports install_failed with null version_to/error_code despite already being on latest (macOS native)
Description
The background auto-updater recorded a failed update attempt, but the resulting status is uninformative and doesn't correspond to an actual available update — claude doctor shows a persistent failure banner even though the CLI is already on the latest version.
Environment
- Running: native 2.1.233
- Commit: f8d57569aaf3
- Platform: darwin-arm64 (macOS)
- Config install method: native
- Auto-updates: enabled, channel: latest
Steps to reproduce
- Let the background auto-updater run normally.
- Run
claude doctor— it shows:
````
Last update attempt: failed (install_failed) — 2026-08-17
- Run
claude updatemanually — it reports:
````
Current version: 2.1.233
Checking for updates to latest version...
Claude Code is up to date (2.1.233)
- Run
claude doctoragain — the failed status from step 2 is still shown, unchanged.
Diagnostic data
~/.claude/.last-update-result.json:
{"timestamp":"2026-08-17T05:36:20.985Z","path":"native","outcome":"failed","status":"install_failed","version_from":"2.1.233","version_to":null,"error_code":null}
Note version_to and error_code are both null — the failure record doesn't identify what version it was trying to install or why it failed, which made this impossible to diagnose locally.
Also noting update/doctor expose no verbose/debug flag to get more detail:
claude update --verbose→error: unknown option '--verbose'claude update --debug→error: unknown option '--debug'claude --debug update→ misparsesupdateas a--printprompt argument instead of routing to the update subcommand
Expected behavior
- The failure record should include enough detail (target version, actual error) to diagnose without guessing.
- If the CLI is already on the latest available version, a stale/false
install_failedstatus from an earlier check shouldn't persist indefinitely inclaude doctoroutput.
Related issues
This looks like the same underlying pattern as #67634, #81898, and #82408, but I'm filing separately since none of those threads have this exact version_to: null, error_code: null diagnostic detail.