You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
review and adversarial-review silently ignore reasoning effort. --effort is not a recognized flag on either command, and adversarial-review omits effort when calling runAppServerTurn — even though the underlying turn/start request already accepts it and task threads it through correctly.
The net effect: the review commands always run at whatever model_reasoning_effort sits in ~/.codex/config.toml, and there is no way to raise effort for a review specifically. For users who treat the adversarial review as their pre-merge quality gate, this is the one place extra reasoning is most worth paying for, and it's the one place they can't buy it.
This is also silent — no "unknown flag" error. ... adversarial-review --effort xhigh is accepted and runs at the config default, which reads as if it worked.
Evidence (v1.0.6)
--model is threaded end-to-end; --effort is missing at every touchpoint on this path.
1. --effort is not parsed — scripts/codex-companion.mjs:714
Compare handleTask (:764), which has valueOptions: ["model", "effort", "cwd", "prompt-file"] and normalizes via normalizeReasoningEffort.
2. The call site doesn't forward it — scripts/codex-companion.mjs:742
executeReviewRun({
cwd,base: options.base,scope: options.scope,model: options.model,// <-- no effort
...
})
3. adversarial-review drops it into a call that supports it — scripts/codex-companion.mjs:411
constresult=awaitrunAppServerTurn(context.repoRoot,{
prompt,model: request.model,sandbox: "read-only",// <-- no effortoutputSchema: readOutputSchema(REVIEW_SCHEMA),onProgress: request.onProgress});
…but runAppServerTurn (scripts/lib/codex.mjs:1139) already forwards effort to turn/start:
client.request("turn/start",{
threadId,input: buildTurnInput(prompt),model: options.model??null,effort: options.effort??null,// always null on the review pathoutputSchema: options.outputSchema??null});
So effort arrives as null and the server falls back to the config default.
Two different problems
adversarial-review — straightforward fix. It already routes through runAppServerTurn → turn/start, which accepts effort. Adding "effort" to valueOptions, normalizing it with the existing normalizeReasoningEffort, and passing it through the two call sites should be sufficient.
review (native) — needs a maintainer call. It goes through runAppServerReview → review/start, whose params are { threadId, delivery, target } — no effort field. Model is applied at startThread, but buildThreadParams (lib/codex.mjs:63) doesn't carry effort either. Does thread/start accept a reasoning effort upstream? If so, the fix is symmetric with model. If not, the limitation is worth documenting, because right now it's indistinguishable from a bug.
Expected: flag rejected, or the run honours xhigh.
Actual: flag silently ignored; the run uses model_reasoning_effort from ~/.codex/config.toml.
Why the usual workarounds don't apply
No effort-suffixed model slugs.models_cache.json lists gpt-5.6-sol / -terra / -luna, gpt-5.5, gpt-5.4(-mini), gpt-5.3-codex-spark, codex-auto-review — none encode an effort level, so --model can't stand in for --effort.
A [profiles.reviewer] block doesn't work. The companion drives the app-server protocol directly and never passes --profile or reads a profile name, so a reviewer profile is inert config. (This is the same root cause as feat: allow selecting a Codex profile for companion-launched jobs #251, which asks for profile propagation.)
That leaves editing the global model_reasoning_effort as the only lever — which also changes effort for task runs and for the user's interactive Codex sessions, since it's the same file.
Related
Feature: support default model and effort settings in /codex:setup #44 — asks to persist default model/effort via /codex:setup. Its premise is that these flags exist per-command today ("have to repeat these flags every time they run /codex:rescue, /codex:review, or /codex:adversarial-review") — for the two review commands, they don't. Fixing this issue is arguably a prerequisite.
Summary
reviewandadversarial-reviewsilently ignore reasoning effort.--effortis not a recognized flag on either command, andadversarial-reviewomitseffortwhen callingrunAppServerTurn— even though the underlyingturn/startrequest already accepts it andtaskthreads it through correctly.The net effect: the review commands always run at whatever
model_reasoning_effortsits in~/.codex/config.toml, and there is no way to raise effort for a review specifically. For users who treat the adversarial review as their pre-merge quality gate, this is the one place extra reasoning is most worth paying for, and it's the one place they can't buy it.This is also silent — no "unknown flag" error.
... adversarial-review --effort xhighis accepted and runs at the config default, which reads as if it worked.Evidence (v1.0.6)
--modelis threaded end-to-end;--effortis missing at every touchpoint on this path.1.
--effortis not parsed —scripts/codex-companion.mjs:714Compare
handleTask(:764), which hasvalueOptions: ["model", "effort", "cwd", "prompt-file"]and normalizes vianormalizeReasoningEffort.2. The call site doesn't forward it —
scripts/codex-companion.mjs:7423.
adversarial-reviewdrops it into a call that supports it —scripts/codex-companion.mjs:411…but
runAppServerTurn(scripts/lib/codex.mjs:1139) already forwards effort toturn/start:So
effortarrives asnulland the server falls back to the config default.Two different problems
adversarial-review— straightforward fix. It already routes throughrunAppServerTurn→turn/start, which acceptseffort. Adding"effort"tovalueOptions, normalizing it with the existingnormalizeReasoningEffort, and passing it through the two call sites should be sufficient.review(native) — needs a maintainer call. It goes throughrunAppServerReview→review/start, whose params are{ threadId, delivery, target }— no effort field. Model is applied atstartThread, butbuildThreadParams(lib/codex.mjs:63) doesn't carry effort either. Doesthread/startaccept a reasoning effort upstream? If so, the fix is symmetric withmodel. If not, the limitation is worth documenting, because right now it's indistinguishable from a bug.Repro
Expected: flag rejected, or the run honours
xhigh.Actual: flag silently ignored; the run uses
model_reasoning_effortfrom~/.codex/config.toml.Why the usual workarounds don't apply
models_cache.jsonlistsgpt-5.6-sol/-terra/-luna,gpt-5.5,gpt-5.4(-mini),gpt-5.3-codex-spark,codex-auto-review— none encode an effort level, so--modelcan't stand in for--effort.[profiles.reviewer]block doesn't work. The companion drives the app-server protocol directly and never passes--profileor reads a profile name, so a reviewer profile is inert config. (This is the same root cause as feat: allow selecting a Codex profile for companion-launched jobs #251, which asks for profile propagation.)That leaves editing the global
model_reasoning_effortas the only lever — which also changes effort fortaskruns and for the user's interactive Codex sessions, since it's the same file.Related
/codex:setup. Its premise is that these flags exist per-command today ("have to repeat these flags every time they run/codex:rescue,/codex:review, or/codex:adversarial-review") — for the two review commands, they don't. Fixing this issue is arguably a prerequisite.Happy to send a PR for the
adversarial-reviewhalf if that framing is agreeable.Environment
codex@openai-codexv1.0.6codex-cli0.144.1