# Provider update repair reproduction

Environment: Linux, Chromium web client, 1600 × 1000 CSS pixels, light theme. Each commit ran its own real development server and fresh T3 home, with development database seeding disabled. No projects or threads are needed for this Settings flow.

The uploaded fixture creates a disposable Codex-compatible executable. It reports a synthetic authenticated API-key account, returns no models, and never calls a model API. Its default updater exits successfully without changing its installed version. This controls the installation failure without modifying the app, its provider registry, or its update/refresh code. Latest-version discovery uses the real public native release endpoint.

## Same steps on both commits

1. Run `node provider-fixture.cjs <test-home>` before starting the app. It creates version 0.162.0 and the isolated provider settings.
2. Run `T3CODE_DEV_SEED=0 T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD=0 vp run dev --home-dir <test-home>` in that commit’s checkout. Pair a Chromium browser with its startup link and finish the welcome screen.
3. Open Settings → Providers. Select the disabled Pi row to keep unrelated installation details out of the capture. Open the update-details control beside Repair demo (the Codex fixture) and click Update now.
4. Wait for “Update command completed, but T3 Code still detects an outdated provider version.” Both commits reach this result.
5. Externally replace `<test-home>/fixture/version` with the version from the `tag_name` field at the public Codex native-channel endpoint, removing the `rust-v` prefix. The captured runs used 0.167.2. Keep the same server running and the same executable configured.
6. Click the Providers heading to dismiss the popover. Click Refresh provider status and wait for refresh to finish and the row to report v0.167.2. Click Refresh provider status again and wait for it to finish.
7. Capture the current-version row. Close Settings and capture the sidebar. On base, “Codex still needs an update” remains. On head, that warning disappears after the first repair refresh and stays absent after the second.

The current-version row itself renders the same on these commits because its update-details control disappears when current. The visible stale-result regression is the sidebar warning. The recordings show the update action, unchanged result, both refreshes, current version and final sidebar.

Final stills were accepted only after two captures at least 500 ms apart had identical pixels. Published evidence masks the environment label, fixture installation path and an unrelated model entry. Initial recording masks also cover the transient updater output where that path can appear. No bug-relevant version or final warning is masked.

AI-assisted; verified with the tests and tools listed above.
