[App] Reasoning-effort picker cannot override project .codex/config.toml default

Open 💬 1 comment Opened Jul 21, 2026 by angjelkom

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?

  1. Open a trusted project in Codex Desktop.
  2. Add a project-scoped .codex/config.toml:

``toml
model = "gpt-5.6-sol"
model_reasoning_effort = "high"
``

  1. Start a new task or return to the composer.
  2. Open the model/reasoning picker.
  3. Select GPT-5.6 Sol / Extra High.
  4. Observe that the picker briefly displays Extra High and then changes back to High.
  5. Submit a prompt.
  6. 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.toml should 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

View original on GitHub ↗

1 Comment

angjelkom · 1 month ago

I traced this to a missing typed override on the app-server API: turn/start accepts a temporary effort, but thread/start does not. That leaves a new-task picker with no explicit thread-scoped field and encourages persisting model_reasoning_effort to user config, where a higher-precedence project config can immediately shadow it.

I prepared a focused fix that:

  • adds optional thread/start.effort to the v2 protocol;
  • applies it as an in-memory request override above project config without changing config.toml or config precedence;
  • regenerates the JSON/TypeScript schemas and documents the behavior; and
  • adds an integration test reproducing project high plus requested xhigh, asserting that the new thread uses xhigh.

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 effort field from its picker.