# fix\(providers\): allow a separate CLI path for updates · PR \#23890 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/23890)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: open

Source repository: Unavailable fork

Source branch: fix/provider-maintenance-path

Target branch: main

Head commit: f80a5b3c6b002f906d030d50816ccf4aafa3ef1c

[Discussion and reviews](https://git.cafe/pingdotgg/t3code/pull/23890)

[Commits](https://git.cafe/pingdotgg/t3code/pull/23890/commits?format=markdown)

[Files changed](https://git.cafe/pingdotgg/t3code/pull/23890/diffs?format=markdown)

## Description

---

## Problem

When Codex or Claude's Binary path points to a launcher for routing or account setup, Update now resolves installation ownership from that launcher. It can disable the update action or invoke the launcher with `update`, even though the underlying CLI has a supported installation. A launcher that expects session configuration can fail when invoked for maintenance.

## Changes

Add an optional **Maintenance binary path** for Codex and Claude. Sessions keep their configured Binary path; version advisories and Update now resolve the explicitly selected CLI through the existing installation resolver. For example, a session can use `~/bin/codex-launcher` while updates target `~/.local/bin/codex`.

The drivers expand the maintenance path on the destination server. Existing installation ownership checks, fresh resolution, update locks and verification through the session binary remain in place. An empty override uses the session binary again; a missing explicit path yields no update action. The shared settings schema exposes the option in web/desktop Settings, and the user guide explains how to configure or clear it. Mobile uses the same server-side update execution; its account settings do not expose this advanced path.

## Scope and approval

This uses CONTRIBUTING.md's focused configuration route for an established capability: choosing which installed executable the existing Codex/Claude updater maintains. It addresses launcher-backed provider updates without adding a provider, installer, update scheduler or new default behavior. The contract, two driver call sites, shared resolver, regression and user guide all support that one option. Searches for existing maintenance-path and launcher-update reports found no matching open PR or issue.

## Evidence

A disposable fixture used a runtime wrapper that rejects `update` but forwards `--version` to a native CLI. This is fixture execution on macOS, not a live provider upgrade:

```text
Default updater: runtime-wrapper -> exit 9
Explicit updater: native-package-tool update
native updater executed
Runtime executable: runtime-wrapper --version -> 2.0.0
Missing override update action: null
Blank override updater: runtime-wrapper
```

The regression asserts the maintenance executable/arguments independently from the runtime wrapper, refusal of a missing override, and fallback when it is cleared. The original regression failed before the resolver change because it selected the wrapper instead of the native executable.

The shared settings form was checked in headless Chromium with synthetic launcher/native paths. The before capture uses upstream `11adcb0e`; the after capture uses this patch. Both provider overrides could be entered and cleared while their Binary paths stayed on the launchers. These are component fixtures using the real form and stylesheet, not full-app or packaged-desktop captures. The [fixture and reproduction notes](https://github.com/Karl-VonRichter/t3code/releases/tag/pr-maintenance-binary-path-20261023) are attached separately from the source patch.

**Before**

![Before: Codex and Claude settings have a runtime binary path only](https://github.com/Karl-VonRichter/t3code/releases/download/pr-maintenance-binary-path-20261023/t3-provider-maintenance-before.png)

**After**

![After: Codex and Claude can maintain their native CLIs while keeping launcher paths](https://github.com/Karl-VonRichter/t3code/releases/download/pr-maintenance-binary-path-20261023/t3-provider-maintenance-after.png)

## Tests

On head `f80a5b3c6b002f906d030d50816ccf4aafa3ef1c`, rebased onto upstream `11adcb0e25a04785f70d01c3f2a858889683007e`:

- `vp run check:changed 11adcb0e25a04785f70d01c3f2a858889683007e` passed formatting, lint, Knip, generated GraphQL checks, type checks for 29 affected packages and 88 tests in three files.
- The disposable resolver/executable fixture above passed; it updated only its temporary native CLI state and left the configured runtime wrapper in use.
- A temporary browser fixture passed on both revisions; the patched revision verified entry/clearing for both maintenance paths with unchanged session launcher paths. The fixture is attached with the screenshots, not committed.
- Full-app settings navigation, native Windows/Linux execution and a packaged desktop build were not verified. The new shell-fixture regression uses the existing Windows skip boundary.

Model: GPT-6.1-sol. Harness: Codex, running in T3 Code.

