Codex Desktop ignores `plan_mode_reasoning_effort` when entering Plan mode, while CLI applies it correctly
What version of the Codex App are you using (From “About Codex” dialog)?
Not captured at the time of filing.
What subscription do you have?
Not captured at the time of filing.
What platform is your computer?
macOS
What issue are you seeing?
Codex Desktop does not apply plan_mode_reasoning_effort when switching a thread into Plan mode.
My config contains:
model_reasoning_effort = "medium"
plan_mode_reasoning_effort = "xhigh"
With this setup:
- In Codex CLI, entering Plan mode correctly switches the reasoning effort from the global/default value to the Plan-mode override (
xhigh). - In Codex Desktop, entering Plan mode does not switch the reasoning effort accordingly.
- I can visually confirm in the Desktop UI that the reasoning level remains
mediumafter entering Plan mode, instead of switching toxhigh.
So the same configuration works in CLI but not in the Desktop app.
What steps can reproduce the bug?
- Set the following in
~/.codex/config.toml:
model_reasoning_effort = "medium"
plan_mode_reasoning_effort = "xhigh"
- Open Codex CLI and enter Plan mode.
- Observe that Plan mode uses the configured override (
xhigh). - Open Codex Desktop with the same config.
- Enter Plan mode in a thread.
- Observe in the Desktop UI that the reasoning level remains
mediuminstead of switching toxhigh.
What is the expected behavior?
When plan_mode_reasoning_effort is explicitly set, Codex Desktop should apply that value on entering Plan mode, the same way Codex CLI does.
In this example, entering Plan mode should switch reasoning effort from medium to xhigh, and the Desktop UI should reflect that change.
Additional information
This looks like a Desktop-specific config/application bug rather than a request for a new feature, because the config key already exists and the CLI respects it.
The issue is specifically that Desktop and CLI behave differently for the same configuration.
If useful, I can also provide:
- exact Codex Desktop version
- exact macOS version / architecture
- screenshot or screen recording showing the reasoning level before and after entering Plan mode
- session ID from in-app feedback
8 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
didnt know it existed
okay thanks, I will use it
@aaudin90 are you able to replicate it in the IDE too ?
Only in Codex Desktop
Still reproducible on macOS 26.6.1 with Codex Desktop 26.730.61639 (bundled codex-cli 0.147.0-alpha.1.2) and Codex CLI 0.147.0.
Config:
I confirmed this from the recorded turn context, not only from the visible selector:
collaboration_mode = plan,reasoning_effort = ultra, and effectiveeffort = ultra.collaboration_mode = plan, but bothreasoning_effortand effectiveeffortremainhigh.So Desktop is not applying the Plan-mode override, while TUI applies the same config correctly.
Still reproducible on a newer Codex Desktop build.
Environment:
26.814.41407(bundle6720)0.148.0-alpha.1526.5.2, arm64gpt-5.6-solConfig:
I reproduced this in a fresh, non-forked thread. After explicitly switching to Plan mode and submitting a prompt, the recorded turn context was:
The global config still contained
plan_mode_reasoning_effort = "xhigh"at the time of the turn. This confirms the Desktop app is entering Plan mode but is not applying the Plan-mode reasoning override; the thread-level/defaultmediumeffort remains effective.No project-level model or reasoning override was present.
Yeah, wait, what? This is surprising. It's hard for me to switch away from the TUI/CLI when this isn't working yet lmao
I had some extra GitHub copilot usage, so why not, maybe this is good; copilot suggested tagging four OpenAI devs, but that feels spammy, so I'll just tag one:
---------
The following is generated with copilot+ GPT-5.6-sol
Follow-up from Codex, posting on behalf of @ariccio. I traced this against current
main(5bf0ba3dd65952f8e37abbb7b535ee88841e2793).This looks like a small app-server parity gap rather than a Desktop-rendering-only problem.
Root cause
The config value reaches core correctly:
Config::plan_mode_reasoning_effortis loaded fromconfig.toml.turn/start.collaborationMode.The divergent path is in:
codex-rs/app-server/src/request_processors/turn_processor.rsTurnRequestProcessor::build_thread_settings_overridesTurnRequestProcessor::normalize_collaboration_modeAt present, app-server normalization fills only the collaboration mode's built-in developer instructions:
It does not apply
thread.config().await.plan_mode_reasoning_effort.Consequently, if Desktop sends its currently displayed/default effort in the Plan collaboration settings—e.g.
medium—that value is accepted and becomes both:The TUI does not have this behavior because it overlays the configured Plan override immediately before submission in
submit_user_message_with_modeand while switching masks.Suggested patch
Apply the Plan-mode config override at the shared app-server collaboration-mode normalization boundary. This covers both
turn/startandthread/settings/update, keeps the fix independent of Desktop client implementation details, and causes the existingthread/settings/updatednotification to report the effective value back to the UI.I would deliberately put this in
build_thread_settings_overrides, not in Desktop and not in Responses request construction:preview_thread_settings_overridesvalidates the final effective combination.Regression test
The existing Plan-mode app-server test currently sends
reasoning_effort: None, which does not reproduce Desktop’s important case: the client supplies the global/default effort in the Plan mask.Add a test that configures global
low, Planhigh, then deliberately submits Plan mode withmedium. The effective notification and Responses request must both usehigh.The test will also need:
A second focused test for
plan_mode_reasoning_effort = "none"would be useful because the documented semantics distinguish explicitnonefrom an unset override. I would not block the minimal fix on that if existing config/TUI tests already sufficiently protect the enum semantics.Expected behavior after the patch
Given:
and a Desktop request containing:
app-server should resolve and report:
Leaving Plan mode remains unchanged. If the Plan override is unset, the client/built-in Plan preset continues to determine the effort.
Validation
Likely owners
Based on the relevant history, the most directly relevant people appear to be:
4c1744afb22383ae61bebf7feb19a24eedc970df, which introducedplan_mode_reasoning_effortand the TUI overlay semantics.turn/startwork.plan_mode_reasoning_effortas a session-static default in app-server.@ charley-oai and @ aibrahim-oai are probably the two highest-signal tags for confirming intended semantics; @ pakrym-oai is likely the best app-server implementation reviewer.
The important semantic question is whether an explicit configured Plan override is intended to dominate a client-supplied Plan preset effort. The TUI already does exactly that in both mode switching and submission, so this patch makes app-server match the established behavior rather than defining a new precedence rule.