[Bug]: Provider update result message persists after refresh, even once the provider is up to date#24330

opened18d agobyJjimmyylavoie

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/server

Steps to reproduce

  1. Have a provider whose in-app update ends in unchanged status. In my case, standalone Codex 0.163.0 with npm latest at 0.164.0: codex update exited 0 without installing anything (see #23937 for the same family of cases), so T3 recorded "Update command completed, but T3 Code still detects an outdated provider version."
  2. Fix the installation outside T3 Code. I ran npm i -g @openai/codex@latest and removed the standalone ~/.local/bin/codex symlink, so codex --version now reports codex-cli 0.164.0.
  3. In T3 Code, open the environment's provider settings and press Refresh providers.

Expected behavior

The refresh picks up the new version. Since the provider is no longer outdated, the old update result no longer applies and should be cleared or hidden.

Actual behavior

After the refresh, the Codex row shows the new version correctly, but the stale update message is still there underneath:

0.164.0 · Latest 0.164.0 Update command completed, but T3 Code still detects an outdated provider version.

The message stays until the server restarts. The same mechanism keeps "Provider updated." under Claude indefinitely. That one is harmless but shows the state is never retired.

Cause, as far as I can tell (main @ eeda2cb):

  • ProviderRegistry.ts keeps update results in the in-memory maintenanceActionStatesRef.
  • applyProviderUpdateState re-attaches that state to every refreshed snapshot in upsertProviders.
  • The only writer is providerMaintenanceRunner.ts via setProviderMaintenanceActionState. Nothing clears the entry on refresh. It is only removed when the instance disappears (syncLiveSources) or when a new update sets a new state.

So a refresh replaces the version data but keeps the verdict computed against the old version.

One possible direction, which I'd leave to maintainers: drop a terminal unchanged/failed update state once a refreshed snapshot is no longer outdated, or record the installed version alongside the state and ignore the state when the version changes.

The message contradicts the version shown right above it. It suggests the update is still broken and invites another attempt.

Impact

Cosmetic issue

Version or commit

T3 Code 0.1.2-nightly.20261022.3526 (code paths above confirmed unchanged on main @ eeda2cb)

Environment

macOS 26.5 (Apple Silicon), T3 Code desktop (Nightly), viewed from the T3 Code iOS app over Tailscale. Provider: Codex CLI 0.164.0 (npm global, /opt/homebrew prefix).

Logs or stack traces

shell
1# The original failed update. Same command T3 runs for standalone Codex:
2$ CODEX_HOME=~/.codex ~/.local/bin/codex update
3Updating Codex via `sh -c 'curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh'`...
4curl: (56) The requested URL returned error: 404
5
6🎉 Update ran successfully! Please restart Codex.
7# exit=0, version unchanged (0.163.0)
8
9# After switching to npm:
10$ which codex && codex --version
11/opt/homebrew/bin/codex
12codex-cli 0.164.0

Screenshots, recordings, or supporting files

1-before-refresh-stale-message.jpg 2-after-server-restart.png

Workaround

Restart the T3 Code server. The update state lives only in memory, so after a restart the next refresh no longer re-attaches it. Verified: after the desktop app respawned the backend and I refreshed providers, both rows showed only " · Latest ", with no update message.