[Bug]: Provider update result message persists after refresh, even once the provider is up to date#24330
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
- Have a provider whose in-app update ends in
unchangedstatus. In my case, standalone Codex 0.163.0 with npm latest at 0.164.0:codex updateexited 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." - Fix the installation outside T3 Code. I ran
npm i -g @openai/codex@latestand removed the standalone~/.local/bin/codexsymlink, socodex --versionnow reportscodex-cli 0.164.0. - 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.tskeeps update results in the in-memorymaintenanceActionStatesRef.applyProviderUpdateStatere-attaches that state to every refreshed snapshot inupsertProviders.- The only writer is
providerMaintenanceRunner.tsviasetProviderMaintenanceActionState. 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
| 1 | # The original failed update. Same command T3 runs for standalone Codex: |
| 2 | $ CODEX_HOME=~/.codex ~/.local/bin/codex update |
| 3 | Updating Codex via `sh -c 'curl -fsSL https://chatgpt.com/codex/install.sh | CODEX_NON_INTERACTIVE=1 sh'`... |
| 4 | curl: (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 |
| 12 | codex-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.