[App] Allow the model picker to override project-scoped model defaults
What variant of Codex are you using?
Codex App (macOS desktop)
What feature would you like to see?
Treat model and model_reasoning_effort in a trusted project's .codex/config.toml as defaults for new tasks, while allowing an explicit selection in the composer model picker to override those defaults for the current task or thread.
Current behavior
When a project-scoped .codex/config.toml contains a model default, selecting another available model in the desktop app briefly updates the picker, but the selection immediately snaps back to the project-configured model. The picker appears interactive even though its selection cannot take effect.
Requested behavior
- Use the project-scoped
modelandmodel_reasoning_effortvalues when the user does not make an explicit selection. - Treat an explicit composer selection as a task/thread-level override.
- Do not rewrite the project configuration when applying the temporary override.
- When a project setting is intentionally authoritative and cannot be overridden, disable the affected picker control and show that the value comes from
.codex/config.toml.
This would preserve reproducible project defaults while still allowing users to choose a faster, cheaper, or more capable model for a specific task.
Additional information
Reproduction
- Open a trusted local project in the Codex desktop app.
- Add a project-scoped configuration:
model = "gpt-5.6-sol"
model_reasoning_effort = "medium"
- Open the model picker below the composer.
- Select another available model or reasoning level.
- Observe that the picker briefly changes and then returns to the project-configured value.
Expected result
The explicit picker selection remains active for the current task/thread. The project configuration remains unchanged and continues to provide the default for tasks where no explicit selection is made.
Environment
- ChatGPT desktop app: 26.721.81911 (build 5973)
- Bundled codex-cli: 0.146.0-alpha.3.1
- macOS: 26.5.1 (25F80)
Related issues
- #14008 — same root cause; closed with a suggestion to file a separate feature request for the UX improvement
- #10875 — model selection immediately reverts to the default model
- #34535 — analogous open issue for
model_reasoning_effort
Removing model and model_reasoning_effort from the project-scoped config allows the picker to work, but removes the ability to define project defaults.
2 Comments
Windows/WSL confirmation with an additional configuration-path collision and timing evidence.
Environment:
OpenAI.Codex_26.803.10989.0_x64__2p2nqsd0c76g026.803.81509/home/<wsl-user>The project-root choice is significant: for this project, the WSL user config
is also located at the exact path the project sees as:
It contains:
The Windows Desktop config is a separate file under
C:\Users\<user>\.codex\config.toml.Observed behavior:
/home/<user>project.gpt-5.6-sol / high.sol / mediumafter roughly 60-100 ms.gpt-5.5 / mediumdefault, so this is not specific to GPT-5.6 or to model entitlement.Desktop logging and a read-only config monitor show that the click is not being rejected:
Three repeated
sol/highselections all completedconfig/batchWritesuccessfully. During a later controlled sequence, the Windows config successfully changed through:while the WSL config remained
gpt-5.6-sol / mediumthroughout. At one point the UI had already snapped back tomediumeven though the Windows config still persistedsol/high.This strongly suggests a state-precedence/reconciliation race rather than model unavailability:
config/batchWrite;mediumsnapshot can overwrite the composer's explicit selection;The official current config reference says explicit model/reasoning choices for a new thread should override defaults, and project config should behave as a configuration layer rather than making an apparently enabled picker ineffective.
Suggested regression case:
~/.codex/config.tomland<project>/.codex/config.tomlresolve to the same path.model_reasoning_effort = "medium"in the WSL/home config.highin the new-task composer.A temporary workaround is to remove
modelandmodel_reasoning_effortfrom the project-visible config, but that also removes the desired WSL/user default and does not solve the product-level precedence problem.Windows-native confirmation (no WSL) on the current Codex desktop build.
Environment
26.818.8289.0codex-cli 0.149.0-alpha.4.326200.9168, x64Configuration and observed behavior
User config sets the intended default:
A trusted project config had this higher-precedence override:
With that project open, selecting another available model in the composer immediately snapped back to GPT-5.6 Sol / Ultra. This reproduced with multiple alternatives rather than one unavailable model.
The desktop log recorded the picker/default write as
newModel=gpt-5.6-sol newEffort=xhigh, while the active task metadata resolved tomodel=gpt-5.6-sol effort=ultrafrom the project layer. The UI gave no indication that a project config layer had overridden the explicit selection.Expected behavior: Sol / Extra High can initialize the composer as the default, but an explicit model selection should persist for that task. If project-scoped values are intentionally authoritative, the picker should be disabled or identify the forcing config layer instead of briefly accepting the click and silently reverting.
Local workaround: change or remove the project-level
model_reasoning_effortoverride so it no longer conflicts with the intended global default.