Skip to content

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

Closed

Description

@OfficiallySp

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

$ npm view @anthropic-ai/claude-code dist-tags
{ "stable": "2.1.308", "latest": "2.1.312", "next": "2.1.312" }

# T3 provider status cache (caches/claudeAgent.json)
versionAdvisory.status          = behind_latest
versionAdvisory.currentVersion  = 2.1.308
versionAdvisory.latestVersion   = 2.1.312
versionAdvisory.updateCommand   = ~/.local/bin/claude update
compatibilityAdvisory.status    = supported   (recommendedRange >=2.1.280)

# server.trace.ndjson: three update attempts, all Success, version unchanged
09:45:44Z ProviderMaintenanceRunner.runProviderUpdate 2772ms Success
09:45:59Z ProviderMaintenanceRunner.runProviderUpdate 2534ms Success
09:51:30Z ProviderMaintenanceRunner.runProviderUpdate 2609ms Success
# ~/.local/share/claude/versions/ afterwards: 2.1.292, 2.1.304, 2.1.308 (nothing new)

# after changing autoUpdatesChannel to "latest"
$ claude update
Current version: 2.1.308
Checking for updates to latest version...
Updating to 2.1.312...
Successfully updated from 2.1.308 to version 2.1.312

Related issues

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

Activity

  1. fairchild commented on Oct 31, 2026

    @fairchild

    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:

    source value
    npm latest dist-tag — what the advisory reads 2.1.316
    GCS claude-code-releases/latest — what claude update follows 2.1.314
    installed 2.1.314
    $ npm view @anthropic-ai/claude-code dist-tags
    { "stable": "2.1.309", "latest": "2.1.316", "next": "2.1.316" }
    
    $ curl -s .../claude-code-releases/stable   # 2.1.308
    $ 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):

    versionAdvisory.status         = behind_latest
    versionAdvisory.currentVersion = 2.1.314
    versionAdvisory.latestVersion  = 2.1.316
    versionAdvisory.updateCommand  = ~/.local/bin/claude update
    compatibilityAdvisory.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.

  2. cornishandy commented on Oct 31, 2026

    @cornishandy

    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.

    Checking for updates to latest version...
    @latest is at 2.1.314 (older than 2.1.316)...
    Successfully 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.

  3. juanda2222 commented on Nov 4, 2026

    @juanda2222

    I have been bugged by this a lot and have drafted a proposal here #30612: the course of action should be better messaging around the expectation of latest vs stable

  4. juliusmarminge commented on Nov 9, 2026

    @juliusmarminge
    Member

    Thanks for the detailed report. #27958, merged as 6a61904f60, compares native Claude installs against their configured native release channel, fixing the false update warning.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions