Summary
normalizeReasoningEffort() rejects max and ultra before the CLI is ever invoked, so
the top two reasoning tiers of the current flagship model are unreachable from the plugin.
scripts/codex-companion.mjs:71 (v1.0.6):
const VALID_REASONING_EFFORTS = new Set(["none", "minimal", "low", "medium", "high", "xhigh"]);
#485 notes the --effort hint omits these values and files it as cosmetic. The hint is
the smaller half: this Set is a hard gate, and it fails the request locally with no API
call, so raising it is a functional fix rather than a docs one.
Current levels
From codex debug models → supported_reasoning_levels, listed models only:
| model |
supported reasoning levels |
gpt-6-astra |
low, medium, high, xhigh, max, ultra |
gpt-5.6-sol |
low, medium, high, xhigh, max, ultra |
gpt-5.6-terra |
low, medium, high, xhigh, max, ultra |
gpt-5.6-luna |
low, medium, high, xhigh, max |
gpt-5.5 |
low, medium, high, xhigh |
gpt-5.4-mini |
low, medium, high, xhigh |
ultra is described in the catalog as "Maximum reasoning with automatic task delegation"
— a distinct capability, and the flagship's headline mode, not just one more notch.
Repro
$ node scripts/codex-companion.mjs task --model gpt-6-astra --effort ultra "Reply with the single word: ok"
Unsupported reasoning effort "ultra". Use one of: none, minimal, low, medium, high, xhigh.
exit 1
Verified after widening the Set
Adding max and ultra to VALID_REASONING_EFFORTS (no other change), values read from
the session rollout JSONL rather than exit codes:
| invocation |
recorded model |
recorded reasoning_effort |
result |
--model gpt-6-astra --effort ultra |
gpt-6-astra |
ultra |
exit 0, ~6 s, 17,210 tokens, no error lines |
--model gpt-5.6-luna --effort max |
gpt-5.6-luna |
max |
exit 0 |
--model gpt-5.6-luna --effort ultra |
gpt-5.6-luna |
ultra |
exit 0 |
The gate still discriminates after widening: --effort bogus is rejected locally, exit 1,
no API call.
Two things worth a maintainer's eye
1. Per-model effort validity is not enforced on this path. Row 3 is ultra on
gpt-5.6-luna, whose catalog entry stops at max. It was accepted and recorded rather
than rejected. If per-model validity is meant to hold, nothing on this path enforces it.
(The rollout shows the request carried ultra; it does not show whether the server
clamped it.)
2. none and minimal are accepted by the plugin but appear in no listed model's
supported_reasoning_levels. Same drift, opposite direction — possibly legacy values
worth pruning in the same pass.
Suggested fix
Immediate: add max and ultra to VALID_REASONING_EFFORTS, and update the three places
that spell the list out — the usage string (scripts/codex-companion.mjs:82), the error
text (:124), commands/rescue.md:3, and skills/codex-cli-runtime/SKILL.md:35.
Better: derive the set from codex debug models, cached with a static fallback. This Set
and MODEL_ALIASES (see #687) are both hardcoded copies of vocabularies the CLI already
resolves at runtime, and both have now drifted behind it. A plugin release currently pins
a model vocabulary that the API can invalidate at any time, and the user sees either a 400
or a local rejection naming values that are no longer the real set.
Environment
- Plugin
codex v1.0.6 (db52e28f4d9ded852ab3942cea316258ae4ef346)
codex-cli 0.153.4
- macOS 25.6.0 (arm64), Node v24.15.0, ChatGPT sign-in
Related: #485 (hint omission, filed as cosmetic), #687 (the MODEL_ALIASES half of the
same drift), #476 / #651 (--effort task-vs-review asymmetry).
Summary
normalizeReasoningEffort()rejectsmaxandultrabefore the CLI is ever invoked, sothe top two reasoning tiers of the current flagship model are unreachable from the plugin.
scripts/codex-companion.mjs:71(v1.0.6):#485 notes the
--efforthint omits these values and files it as cosmetic. The hint isthe smaller half: this Set is a hard gate, and it fails the request locally with no API
call, so raising it is a functional fix rather than a docs one.
Current levels
From
codex debug models→supported_reasoning_levels, listed models only:gpt-6-astragpt-5.6-solgpt-5.6-terragpt-5.6-lunagpt-5.5gpt-5.4-miniultrais described in the catalog as "Maximum reasoning with automatic task delegation"— a distinct capability, and the flagship's headline mode, not just one more notch.
Repro
Verified after widening the Set
Adding
maxandultratoVALID_REASONING_EFFORTS(no other change), values read fromthe session rollout JSONL rather than exit codes:
modelreasoning_effort--model gpt-6-astra --effort ultragpt-6-astraultra--model gpt-5.6-luna --effort maxgpt-5.6-lunamax--model gpt-5.6-luna --effort ultragpt-5.6-lunaultraThe gate still discriminates after widening:
--effort bogusis rejected locally, exit 1,no API call.
Two things worth a maintainer's eye
1. Per-model effort validity is not enforced on this path. Row 3 is
ultraongpt-5.6-luna, whose catalog entry stops atmax. It was accepted and recorded ratherthan rejected. If per-model validity is meant to hold, nothing on this path enforces it.
(The rollout shows the request carried
ultra; it does not show whether the serverclamped it.)
2.
noneandminimalare accepted by the plugin but appear in no listed model'ssupported_reasoning_levels. Same drift, opposite direction — possibly legacy valuesworth pruning in the same pass.
Suggested fix
Immediate: add
maxandultratoVALID_REASONING_EFFORTS, and update the three placesthat spell the list out — the usage string (
scripts/codex-companion.mjs:82), the errortext (
:124),commands/rescue.md:3, andskills/codex-cli-runtime/SKILL.md:35.Better: derive the set from
codex debug models, cached with a static fallback. This Setand
MODEL_ALIASES(see #687) are both hardcoded copies of vocabularies the CLI alreadyresolves at runtime, and both have now drifted behind it. A plugin release currently pins
a model vocabulary that the API can invalidate at any time, and the user sees either a 400
or a local rejection naming values that are no longer the real set.
Environment
codexv1.0.6 (db52e28f4d9ded852ab3942cea316258ae4ef346)codex-cli0.153.4Related: #485 (hint omission, filed as cosmetic), #687 (the
MODEL_ALIASEShalf of thesame drift), #476 / #651 (
--efforttask-vs-review asymmetry).