[App] Reasoning-effort picker cannot override project .codex/config.toml default
What version of the Codex App are you using?
Codex Desktop 26.715.61943 (bundled codex-cli 0.145.0-alpha.27)
What subscription do you have?
Not specified. This appears to be a local configuration-precedence/UI issue rather than an account entitlement issue.
What platform is your computer?
macOS 26.5.1 (25F80), Apple Silicon (arm64)
What issue are you seeing?
The reasoning-effort picker cannot override a project-scoped default from .codex/config.toml.
When the trusted project config contains:
model = "gpt-5.6-sol"
model_reasoning_effort = "high"
selecting Extra High in the composer briefly changes the displayed selection, but it immediately snaps back to High. A task started afterward uses High.
GPT-5.6 Sol exposes xhigh as a supported reasoning level, so the selected model supports the requested effort.
The project-scoped setting should initialize the default for the project. An explicit selection in the composer should remain a task/thread-level override instead of being replaced by the project default during a configuration refresh.
The behavior suggests the desktop picker may be persisting or rereading a lower-precedence configuration value instead of retaining the explicit composer selection as a higher-precedence task override.
What steps can reproduce the bug?
- Open a trusted project in Codex Desktop.
- Add a project-scoped
.codex/config.toml:
``toml``
model = "gpt-5.6-sol"
model_reasoning_effort = "high"
- Start a new task or return to the composer.
- Open the model/reasoning picker.
- Select GPT-5.6 Sol / Extra High.
- Observe that the picker briefly displays Extra High and then changes back to High.
- Submit a prompt.
- Observe that the task runs with High reasoning.
What is the expected behavior?
An explicit composer selection should override the project default for the current task or thread:
- The picker should remain on Extra High.
- The next task/turn should use
model_reasoning_effort = "xhigh". - The project
.codex/config.tomlshould remain the default for new tasks where the user does not make an explicit picker selection.
Additional information
Removing model_reasoning_effort from the project-scoped config allows the picker to be used as a workaround.
No logs, session transcript, internal project paths, source code, or other project data are attached.
https://github.com/user-attachments/assets/c4d16748-15a8-4fa9-865a-dab0e2d79329
1 Comment
I traced this to a missing typed override on the app-server API:
turn/startaccepts a temporaryeffort, butthread/startdoes not. That leaves a new-task picker with no explicit thread-scoped field and encourages persistingmodel_reasoning_effortto user config, where a higher-precedence project config can immediately shadow it.I prepared a focused fix that:
thread/start.effortto the v2 protocol;config.tomlor config precedence;highplus requestedxhigh, asserting that the new thread usesxhigh.The protocol suite passes (266/266), and the focused app-server regression passes. The commit is available here for review: https://github.com/angjelkom/codex/commit/b4e923e1c7
Because the repository accepts external PRs by invitation only, would a maintainer be open to this approach and invite a PR? The desktop client would then need to pass the new
effortfield from its picker.