Claude update always reports "still outdated" when Claude Code's autoUpdatesChannel is stable#26400

opened5d agobyOOfficiallySp

What happened

The user, in their own words: "i cannot seem to update the claude code runtime. i get the following error: Claude: Update command completed, but T3 Code still detects an outdated provider version."

This was a fresh install of the desktop app. Clicking Update now for Claude in Settings → Providers runs successfully every time, but the Claude version never changes and the same message comes back.

Diagnosis

T3 Code compares a native Claude Code install against npm's latest dist-tag, while claude update follows the update channel set in Claude Code's own settings. With "autoUpdatesChannel": "stable", the two disagree whenever stable is behind latest, and the update can never succeed.

  • Claude Code is the native install: ~/.local/bin/claude → ~/.local/share/claude/versions/2.1.308.
  • ~/.claude/settings.json has "autoUpdatesChannel": "stable".
  • npm dist-tags at the time: stable: 2.1.308, latest: 2.1.312, next: 2.1.312.
  • The version advisory takes "latest" from https://registry.npmjs.org/@anthropic-ai/claude-code/latest (fetchNpmLatestVersion, packages/provider-core/src/server/maintenanceResolver.ts:820). It reports 2.1.312 and marks 2.1.308 as behind_latest.
  • Update now runs claude update (native resolver, apps/server/src/provider/Drivers/ClaudeDriver.ts:84). That command follows the stable channel, finds 2.1.308 is current, and exits 0 without installing anything.
  • runCommandAndVerify (apps/server/src/provider/providerMaintenanceRunner.ts:536-548) re-probes, still finds the provider outdated, and returns "Update command completed, but T3 Code still detects an outdated provider version."
  • 2.1.308 is inside T3's supported range (>=2.1.280, compatibilityAdvisory.status = supported), so the warning is a false alarm.
  • Switching the channel to latest confirmed the cause. claude update then printed "Checking for updates to latest version..." and installed 2.1.312.
  • main still fetches the npm latest tag, so this is not fixed in a newer release.

Possible fixes:

  • For native installs, read autoUpdatesChannel from the Claude config dir T3 already resolves (resolveClaudeConfigDirPath), and compare against the matching npm dist-tag (for example /stable).
  • Or, when the native update exits 0 and the version is unchanged, say that Claude Code's update channel has nothing newer, and stop offering Update now for that version.

Steps to reproduce

  1. Install Claude Code natively, so claude resolves to ~/.local/bin/claude.
  2. Set "autoUpdatesChannel": "stable" in ~/.claude/settings.json.
  3. Check that npm's stable tag is behind latest: npm view @anthropic-ai/claude-code dist-tags.
  4. Open T3 Code → Settings → Providers. Claude shows an update is available. Click Update now.
  5. Result: "Update command completed, but T3 Code still detects an outdated provider version." The version is unchanged, and every retry gives the same result.

Version

0.1.3 (desktop app, T3 Code (Beta), fresh install)

Environment

macOS 27.0.1 (26A434), arm64, Node v26.12.1, Claude Code 2.1.308 (native install, stable channel)

Evidence

shell
1$ npm view @anthropic-ai/claude-code dist-tags
2{ "stable": "2.1.308", "latest": "2.1.312", "next": "2.1.312" }
3
4# T3 provider status cache (caches/claudeAgent.json)
5versionAdvisory.status = behind_latest
6versionAdvisory.currentVersion = 2.1.308
7versionAdvisory.latestVersion = 2.1.312
8versionAdvisory.updateCommand = ~/.local/bin/claude update
9compatibilityAdvisory.status = supported (recommendedRange >=2.1.280)
10
11# server.trace.ndjson: three update attempts, all Success, version unchanged
1209:45:44Z ProviderMaintenanceRunner.runProviderUpdate 2772ms Success
1309:45:59Z ProviderMaintenanceRunner.runProviderUpdate 2534ms Success
1409:51:30Z ProviderMaintenanceRunner.runProviderUpdate 2609ms Success
15# ~/.local/share/claude/versions/ afterwards: 2.1.292, 2.1.304, 2.1.308 (nothing new)
16
17# after changing autoUpdatesChannel to "latest"
18$ claude update
19Current version: 2.1.308
20Checking for updates to latest version...
21Updating to 2.1.312...
22Successfully updated from 2.1.308 to version 2.1.312

Related issues

  • #23937 has the same symptom for standalone Codex, where the native updater lags npm during a release window. Here the cause is a channel the user chose, which T3 can read from Claude Code's settings.
  • #22810: Chocolatey installs of Claude are compared against npm.
  • #24330: the update result message persists after refresh.

None of these covers Claude Code's autoUpdatesChannel.

Fix applied or workaround

With the user's approval, autoUpdatesChannel in ~/.claude/settings.json was changed from "stable" to "latest", then claude update was run, which installed 2.1.312. Users who want to stay on stable can ignore the warning, since the stable version is supported.

Filed by

Claude Code (claude-opus-5-5) via t3 triage

Synced from GitHub

Hit the same symptom on a nightly build, but with a different cause — worth recording here because the fix proposed above wouldn't have cleared it.

My autoUpdatesChannel was already "latest". The mismatch isn't between two channels, it's between two publication pipelines that both call their pointer latest:

sourcevalue
npm latest dist-tag — what the advisory reads2.1.316
GCS claude-code-releases/latest — what claude update follows2.1.314
installed2.1.314
1$ npm view @anthropic-ai/claude-code dist-tags
2{ "stable": "2.1.309", "latest": "2.1.316", "next": "2.1.316" }
3
4$ curl -s .../claude-code-releases/stable # 2.1.308
5$ curl -s .../claude-code-releases/latest # 2.1.314

So claude update is behaving correctly — on the latest channel there genuinely is nothing newer than 2.1.314 — and it exits 0. Then runCommandAndVerify re-probes, still sees 2.1.314 < 2.1.316, and returns the message. Permanent loop until the GCS pointer catches up.

T3's own cached advisory (~/.t3/caches/claudeAgent.json):

1versionAdvisory.status = behind_latest
2versionAdvisory.currentVersion = 2.1.314
3versionAdvisory.latestVersion = 2.1.316
4versionAdvisory.updateCommand = ~/.local/bin/claude update
5compatibilityAdvisory.status = supported (recommendedRange >=2.1.280)

Same code path as the original report, at e9a11d4:

Why the channel-mapping fix is incomplete

Mapping autoUpdatesChannel to the matching npm dist-tag fixes the stable case, but not this one: the channel is already latest, and npm latest (2.1.316) still disagrees with GCS latest (2.1.314). Any npm dist-tag is the wrong oracle for a native install, because the native installer doesn't read npm at all. For native installs the comparison wants claude-code-releases/<channel> as its source of truth.

The second suggestion above holds up on its own, and is the cheaper half: when a native update exits 0 and the version is unchanged, treat that as "the update channel has nothing newer" rather than a failure — especially when compatibilityAdvisory.status is already supported, as it was here. Nothing was broken; the banner was the only problem.

Note on the lag

It's a pointer lag, not a missing build — claude-code-releases/2.1.316/manifest.json returns 200 with a full platform set including darwin-arm64, while the latest pointer still reads 2.1.314. claude install 2.1.316 installed cleanly and cleared the advisory. So a user can escape it manually, but only if they know the npm/GCS split exists.

Environment

macOS 27.0.1 (26A434), arm64. T3 Code (Nightly) desktop 0.1.6-nightly.20261030.3940. Claude Code 2.1.314 native (~/.local/bin/claude → ~/.local/share/claude/versions/2.1.314), autoUpdatesChannel: "latest", autoUpdates: false.

Synced from GitHub

One more data point on the claude install 2.1.316 escape above: running claude update afterward downgraded my installation back to 2.1.314 while the native latest pointer was still behind.

1Checking for updates to latest version...
2@latest is at 2.1.314 (older than 2.1.316)...
3Successfully updated from 2.1.316 to version 2.1.314

So claude update can downgrade an explicitly installed newer version when the native channel pointer lags. If T3 switches to comparing native installs against claude-code-releases/<channel>, an installed version newer than that pointer should count as current for the version advisory. T3 shouldn't offer Update now merely because those versions differ: invoking claude update under the conditions above would downgrade the install.

T3 Code (Nightly) 0.1.6-nightly.20261030.3940, macOS, native Claude Code, autoUpdatesChannel unset, autoUpdates: false.