GPT-5.5 Codex reasoning-token clustering at 516/1034/1552 may be leading to degraded performance on complex tasks
Summary
I found an aggregate pattern in Codex token_count metadata: gpt-5.5 responses disproportionately land at exactly reasoning_output_tokens = 516, with additional fixed-boundary spikes around 1034 and 1552.
This appears model-specific and coincides with lower overall reasoning-token intensity, which may help explain degraded performance on complex/high-stakes Codex tasks.
This is related to openai/codex#29353, which reported a task-level reproduction where gpt-5.5 runs ending at exactly 516 reasoning tokens returned the wrong answer. This issue adds aggregate evidence across a larger Feb-Jun window.
I am not claiming this proves hidden chain-of-thought truncation. The narrower claim is that Codex telemetry shows a GPT-5.5-specific fixed-token clustering anomaly that looks consistent with thresholded reasoning-budget behavior.
Environment
- Product: Codex
- Model most implicated:
gpt-5.5 - Data source: Codex
token_countmetadata - Time window analyzed: Feb 1-Jun 27, 2026 UTC
- Related issue: openai/codex#29353
Evidence
<!-- linear:table-colwidths:400,400 -->
| Metric | Value |
| -- | -- |
| Response-level token records analyzed | 390,195 |
| Sessions represented | 865 |
| Exact reasoning_output_tokens = 516 events | 3,363 |
| GPT-5.5 share of all responses | 19.3% |
| GPT-5.5 share of exact-516 events | 82.0% |
| GPT-5.5 exact-516 / >=516 ratio | 44.0% |
| Non-GPT-5.5 exact-516 / >=516 ratio | 1.3% |
Model-level result:
<!-- linear:table-colwidths:266,266,266 -->
| Model | Response records | Exact 516 / >=516 |
| -- | -- | -- |
| gpt-5.5 | 75,401 | 44.0% |
| gpt-5.4 | 25,214 | 19.8% |
| gpt-5.2 | 247,575 | 0.34% |
| gpt-5.3-codex | 13,333 | 0.0% |
| gpt-5.3-codex-spark | 26,179 | 0.0% |
Monthly exact-516 clustering increased sharply:
<!-- linear:table-colwidths:400,400 -->
| Month | Exact 516 / >=516 |
| -- | -- |
| Feb 2026 | 0.11% |
| Mar 2026 | 2.45% |
| Apr 2026 | 4.25% |
| May 2026 | 53.30% |
| Jun 2026 | 35.84% |
At the same time, overall reasoning-token intensity decreased:
<!-- linear:table-colwidths:266,266,266 -->
| Month | Mean reasoning tokens | P90 reasoning tokens |
| -- | -- | -- |
| Feb 2026 | 268.1 | 772 |
| Mar 2026 | 256.8 | 723 |
| Apr 2026 | 228.7 | 669 |
| May 2026 | 106.9 | 344 |
| Jun 2026 | 168.5 | 515 |
Why this looks suspicious
The anomaly is not simply higher reasoning-token usage overall. Mean and P90 reasoning-token intensity fell from February-April to May-June, while exact-516 clustering rose sharply.
The clustering is also not evenly distributed across models. gpt-5.5 accounts for only 19.3% of responses but 82.0% of exact-516 events. Its exact-516 / >=516 ratio is about 33.6x higher than the non-GPT-5.5 baseline.
The fixed values are also notable: 516, 1034, and 1552 look like repeated threshold boundaries rather than a naturally varying reasoning-token distribution.
Expected behavior
Reasoning-token counts for complex Codex tasks should vary naturally with task complexity and should not disproportionately cluster at exact fixed values for one model family.
Actual behavior
gpt-5.5 responses cluster heavily at exactly 516 reasoning tokens, with related spikes around 1034 and 1552. This pattern is much weaker or absent in several other models.
Ask
Could the Codex team investigate whether gpt-5.5 has a reasoning-budget, routing, truncation, fallback, or scheduler behavior that causes responses to terminate around 516/1034/1552 reasoning tokens?
If this is expected behavior, it would be useful to know whether exact 516 indicates a normal stopping point, a budget cap, a degraded tier, or another internal threshold.
Useful internal validation checks:
- Query
token_countevents withreasoning_output_tokensby model. - Compare exact-value counts for
0,516,1034, and1552. - Compute
count(reasoning_output_tokens = 516) / count(reasoning_output_tokens >= 516)by model and day. - Compare
gpt-5.5againstgpt-5.2,gpt-5.4, and Codex-specific variants. - Replay matched complex tasks across GPT-5.2 and GPT-5.5 with quality evals, especially separating exact-516 responses from longer-reasoning responses.
183 Comments
Potential duplicates detected. Please review them and close your issue if it is a duplicate.
Powered by Codex Action
I've been facing the same issue and am very frustrated as well
meet same problem, desire openAI to feedback!
This is a much more data driven report than the previous one
I agree, the previous one was closed for no reason. I hope this takes their attention
Exactly — this matches what I found, and it's clearly not an isolated case. I shared my initial finding on Reddit earlier (Half of Your High-Stakes Codex Requests May Be Silently Downgraded by Truncated Reasoning), and it's great that you've now dug deeper with model-specific and monthly data.
I've added a link to this GitHub issue in that Reddit post, so readers can cross-reference and upvote here.
Thanks for the thorough testing!
Same issue
Same issue
same problem
Same issue
same issue
You should post this on the official OpenAI forums too:
https://forum.openai.com/
https://community.openai.com/
Those are more likely than Github to be seen by people who actually have the authority to investigate or escalate model-quality issues internally.
same issue
same issue
Adding this instruction to AGENTS.md can alleviate this issue for 5.5xhigh:
Spend time on thinking; you do not need to use the commentary channel to report progress to me.
yes, same issue
same issue
The effect is very limited.
Looking forward to an official fix for this issue.
same issue
Same Issue
same issue
I'm experiencing the exact same reasoning truncation issue, which severely degrades the model's performance on my complex coding tasks.
Its completely unusable! It cannot be that I pay 200$ a month and select XHigh but it gets outperformed by a free-tier chinese model...
I dont want any resets. They are collecting dust because of this.
Stop handing them out if you cant handle the capacity.
Id rather have -50% less usage if it meant the model actually spent any time thinking at all.
Same issue
Same issue.
an effective mitigation measure is to modify the system prompt(Share intermediary updates in
commentarychannel.) toor directly use the gpt-5.2-codex prompt
system prompt does not manage juice value
Same issue, it's for $200?
Same issue, edit system prompt can relieve a bit
Because of this issue, I haven't been able to use Codex for any real work for quite a while now.
If this doesn't get fixed, I don't see any reason to keep paying for the subscription.
It's pretty disappointing that GPT-5.5 xhigh is now delivering a worse experience than some budget open-source models.
This is outright fraud!!!
YES LITERALLY THIS. Gpt-5.5xhigh thinking for only 30 seconds regularly is abysmal. Im holding for gpt5.6 and see if this issue is resolved, otherwise ill shift my team too.
The same test question, when asked in Opencode, achieves a 100% accuracy rate, but in Codex, the accuracy drops to nearly 0%. I don't know what the OpenAI team is doing. This is clearly not an issue of model intelligence—a single system prompt can ruin an entire model.
Same issue.
Same issue.
Related data point for this issue: I observed a path-dependent high rate of telemetry-reported
reasoning_output_tokens=0in Codex Desktop GUI sessions undergpt-5.5 / xhigh, while comparable CLIexecreplays did not show the same zero-rate.Environment
0.142.5gpt-5.5xhighvscodeexecI understand the GUI and CLI paths are not identical execution environments. The point is that the anomaly appears path-dependent: prominent in Desktop GUI /
vscode, absent or much weaker in CLI /execreplays using the same displayed model and effort.Broader local aggregate
Across local Codex session JSONL files, without printing prompts, assistant messages, session IDs, local paths, or filenames:
token_countrecords scanned: 45,499gpt-5.5 / xhigh, pre-compaction:reasoning_output_tokens=0: 1,297gpt-5.5 / xhigh, post-compaction:reasoning_output_tokens=0: 7,680gpt-5.4 / xhigh, pre-compaction:reasoning_output_tokens=0: 120execgpt-5.5 / xhigh, pre-compaction:reasoning_output_tokens=0: 0One GUI thread before first compaction
I focused on the segment before first compaction to reduce confounding from context summarization or replay effects.
token_countrecords: 139reasoning_output_tokens=0: 60Completed-turn grouping:
reasoning_output_tokens=0: 56CLI replay comparison:
516, 1034, 2070, 1552token_countrecords, zero-rate 0%, median reasoning tokens 516, mean 885.9, max 2890Why this is not just short acknowledgements
For the 56 telemetry-reported zero-reasoning completed GUI turns before compaction:
Additional pattern:
| GUI completed turns before compaction | Count |
| --- | ---: |
| telemetry-reported
reasoning_output_tokens=0| 56 || zero-reasoning turns with a visible
reasoningresponse item | 1 / 56 || zero-reasoning turns with tool calls | 0 / 56 |
Timing / output-size comparison:
The assistant text length medians are close, while timing differs sharply. Output length alone does not explain the high zero-rate.
I am not claiming that
reasoning_output_tokens=0proves no internal reasoning occurred. The issue is the large path-dependent discrepancy: GUI completed turns show a high telemetry-reported zero-rate underxhigh, while comparable CLI replays do not.Potential areas to investigate:
token_counttelemetry under-reportingxhighI am not attaching raw session JSONL because it contains private conversation content, local paths, session IDs, and other user-specific data. The numbers above are aggregated from local Codex session telemetry.
I reproduced this issue using https://github.com/haowang02/codex-candy-eval.
Environment
$ codex --version
codex-cli 0.142.5
python3 codex_candy_eval.py -m gpt-5.5 -r xhigh -n 5
Results
Run set 1:
Run set 2:
Aggregate
This looks strongly correlated: low fixed reasoning-token buckets, especially 516, produce confident but incorrect answers, while successful runs consistently use much larger reasoning budgets.
This is especially concerning because the command explicitly requests gpt-5.5 with xhigh reasoning, yet many complex reasoning attempts appear to finalize after exactly 516 reasoning tokens.
Could OpenAI clarify whether 516 and 1034 are intentional reasoning budget tiers, fallback behavior, load-shedding, or a truncation/streaming bug?
Same issue. I routinely use Codex for complex bioinformatics data analysis and tool dev and get really disappointed because gpt-5.5 xhigh reasoning effort has been deteriorating for the past couple of months. Already downgraded from $200 to $100 Pro plan and now seriously considering canceling subscription.
This is really serious. Especially if this is not a bug but a feature.
I am also affected, this is not cool and will not continue the pro sub.
I am also affected, Max 20x subscription is very expensive for me, I am really disappointed if this is not a bug.
<img width="1600" height="900" alt="Image" src="https://github.com/user-attachments/assets/8f873805-3bca-4d4c-97e2-720c854505e9" />
Independent reproduction from two machines (different workloads, same ChatGPT-plan account family). I parsed local Codex session logs (
~/.codex/sessions/**/*.jsonl), takinglast_token_usage.reasoning_output_tokensfrom eachtoken_countevent with non-nullinfo, attributed to the session's current model.Machine A (54 sessions, Apr–Jun 2026, gpt-5.5 only):
| Model | Records | Mean reasoning tokens | exact-516 / ≥516 |
| --- | ---: | ---: | ---: |
| gpt-5.5 | 5,964 | 180 | 50.1% |
Machine B (430 sessions, May–Jul 2026, mixed models):
| Model | Records | Mean reasoning tokens | exact-516 / ≥516 |
| --- | ---: | ---: | ---: |
| gpt-5.5 | 20,219 | 170 | 47.9% |
| gpt-5.4 | 3,921 | 463 | 13.1% |
| gpt-5.4-mini | 33 | 1,659 | 7.7% (n=13, noise) |
Both machines land close to the 44.0% reported here for gpt-5.5, with gpt-5.4 elevated but ~3–4× lower — same ordering as the OP's data.
One additional observation not in the OP: the spikes form an arithmetic ladder with step 518, not just the three values reported. Top repeated exact values ≥400:
516, 1034, 1552, 2070, 2588, 3106 — six rungs, each exactly 518 apart. A naturally varying reasoning-token distribution doesn't produce an evenly spaced comb like this; it looks like reasoning is being terminated at quantized block boundaries (516 + n×518), consistent with the thresholded reasoning-budget hypothesis.
Also matching the OP's intensity observation: on the same machine and overlapping tasks, gpt-5.5's mean reasoning tokens (170) is roughly a third of gpt-5.4's (463).
Analysis script (stdlib-only Python) available if useful for others to reproduce.
affected here too with candy eval:
Shot | reasoning_output_tokens | final answer
-- | -- | --
1 | 516 | 21
2 | 516 | 24, wrong
3 | 516 | 18, wrong
4 | 516 | 25, wrong
5 | 516 | 18, wrong
I'm affected too with 100$ plan
5-shot results:
┌─────┬─────────────────────────┬──────────────┐
│ Run │ reasoning_output_tokens │ final answer │
├─────┼─────────────────────────┼──────────────┤
│ 1 │ 516 │ 21 ✅ │
├─────┼─────────────────────────┼──────────────┤
│ 2 │ 516 │ 23 ❌ │
├─────┼─────────────────────────┼──────────────┤
│ 3 │ 516 │ 27 ❌ │
├─────┼─────────────────────────┼──────────────┤
│ 4 │ 516 │ 16 ❌ │
├─────┼─────────────────────────┼──────────────┤
│ 5 │ 516 │ 23 ❌ │
└─────┴─────────────────────────┴──────────────┘
I'm affected too with 2 x 200$ Plan..
Is the freeride finally over?
Reproduces here with gpt-5.5 but all runs get the correct answer with gpt-5.4.
user-vV3XhezUrPWzLBc4F3sjbF9C
Confirmed here too, it's been getting really bad the last two days.
Thank you OpenAI!
GPT 5.4
Note: Codex/GPT works great for my workflows overall, and I am not reporting this because I am personally stuck. I just have a fairly large local session-log dataset, so I am sharing the aggregates in case they are useful for debugging.
Summary:
reasoning_output_tokens = 516events: 3,426gpt-5.5share of all records: 66.6%gpt-5.5share of exact-516 events: 84.8%gpt-5.5exact 516 / >=516: 21.7%gpt-5.5exact 516 / >=516: 9.1%Model-level stats:
| Model | Records | Sessions | Mean reasoning tokens | P90 | Exact 516 | >=516 | Exact 516 / >=516 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
gpt-5.5| 125,900 | 4,225 | 191.1 | 516 | 2,906 | 13,365 | 21.7% ||
gpt-5.4| 19,266 | 434 | 326.3 | 834 | 519 | 3,561 | 14.6% ||
gpt-5.3-codex| 15,869 | 367 | 256.4 | 704 | 1 | 2,130 | 0.0% ||
codex-auto-review| 27,867 | 136 | 14.0 | 30 | 0 | 2 | 0.0% |Effort-level stats:
| Effort | Model | Records | Sessions | Mean reasoning tokens | Exact 516 | >=516 | Exact 516 / >=516 |
| --- | --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
xhigh|gpt-5.5| 125,854 | 4,223 | 191.2 | 2,905 | 13,363 | 21.7% ||
medium|gpt-5.5| 46 | 2 | 62.0 | 1 | 2 | 50.0% ||
xhigh|gpt-5.4| 18,841 | 268 | 330.5 | 511 | 3,536 | 14.5% ||
medium|gpt-5.4| 425 | 166 | 142.9 | 8 | 25 | 32.0% ||
low|codex-auto-review| 27,867 | 136 | 14.0 | 0 | 2 | 0.0% |Fixed-value counts:
| Model | =516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
|
gpt-5.5| 2,906 | 574 | 214 | 106 | 48 | 28 ||
gpt-5.4| 519 | 90 | 35 | 19 | 24 | 6 ||
gpt-5.3-codex| 1 | 2 | 0 | 0 | 0 | 0 |Monthly deduped
gpt-5.5stats:| Month | Records | Sessions | Mean reasoning tokens | P90 | Exact 516 | >=516 | Exact 516 / >=516 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 2026-04 | 21,295 | 33 | 120.2 | 381 | 565 | 1,494 | 37.8% |
| 2026-05 | 94,415 | 3,602 | 203.3 | 516 | 1,933 | 10,433 | 18.5% |
| 2026-06 | 10,190 | 594 | 226.7 | 531 | 408 | 1,438 | 28.4% |
One split that may be useful for internal debugging:
| Originator | Model | Records | Sessions | Exact 516 | >=516 | Exact 516 / >=516 |
| --- | --- | ---: | ---: | ---: | ---: | ---: |
|
codex-tui|gpt-5.5| 52,476 | 61 | 1,535 | 3,826 | 40.1% ||
codex_exec|gpt-5.5| 73,424 | 4,164 | 1,371 | 9,539 | 14.4% |My results (pro plan; 5.5 high):
Exactly the samenproblem on xhigh 5.5
5.4 for some reason doesnt face the same problem for me
Adding another local aggregate. This reproduces in my Codex session telemetry, using only aggregate metadata and not publishing raw session JSONL.
Environment / source:
codex-tui,codex_exec, subagentstoken_countmetadata:pro~/.codex/sessions/**/*.jsonlplus~/.codex/archived_sessions/*.jsonlevent_msg.payload.type == "token_count"andpayload.info.last_token_usage.reasoning_output_tokenspayload.info = null, and did not usetotal_token_usage.reasoning_output_tokensbecause it is cumulative within a sessionMethodology notes:
turn_contextin the same JSONL streamOverall result:
| Scope | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| all parsed records | 204,959 | 1,425 | 139.5 | 416 | 4,937 | 15,686 | 31.47% | 566 | 235 | 97 | 44 | 21 |
By model:
| Model | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
gpt-5.5| 203,215 | 1,399 | 138.5 | 414 | 4,934 | 15,460 | 31.91% | 566 | 235 | 96 | 44 | 21 ||
gpt-5.3-codex-spark| 1,682 | 20 | 252.9 | 601 | 0 | 217 | 0.00% | 0 | 0 | 1 | 0 | 0 ||
gpt-5.4| 61 | 5 | 259.4 | 516 | 3 | 9 | 33.33% | 0 | 0 | 0 | 0 | 0 |The
gpt-5.4sample is too small in my local data to treat as a useful control, but thegpt-5.3-codex-sparkcontrast is at least directionally consistent with the model-specific pattern reported above.By effort for
gpt-5.5:| Model / effort | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
gpt-5.5/xhigh| 198,922 | 1,181 | 138.9 | 415 | 4,829 | 15,166 | 31.84% | 549 | 230 | 91 | 44 | 19 ||
gpt-5.5/high| 2,348 | 105 | 153.2 | 406 | 40 | 198 | 20.20% | 10 | 5 | 5 | 0 | 2 ||
gpt-5.5/medium| 1,916 | 119 | 86.1 | 235 | 64 | 95 | 67.37% | 7 | 0 | 0 | 0 | 0 |Monthly
gpt-5.5 / xhigh:| Month | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 2026-05 | 75,996 | 374 | 133.0 | 400 | 1,929 | 5,464 | 35.30% | 196 | 72 | 24 | 14 | 8 |
| 2026-06 | 118,959 | 705 | 138.6 | 417 | 2,738 | 9,188 | 29.80% | 332 | 149 | 54 | 23 | 10 |
| 2026-07 | 3,967 | 105 | 261.2 | 516 | 162 | 514 | 31.52% | 21 | 9 | 13 | 7 | 1 |
Origin/source split for all models:
| Origin/source | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| Codex Desktop / redacted source category | 85,981 | 406 | 114.1 | 330 | 1,507 | 5,057 | 29.80% |
| Codex Desktop /
vscode| 48,958 | 162 | 152.0 | 466 | 1,329 | 4,278 | 31.07% ||
codex-tui/cli| 36,640 | 98 | 140.0 | 442 | 1,038 | 3,036 | 34.19% ||
codex-tui/ redacted source category | 23,483 | 290 | 160.0 | 446 | 711 | 1,891 | 37.60% || Codex Desktop /
exec| 9,456 | 437 | 247.5 | 617 | 342 | 1,381 | 24.76% ||
codex_exec/exec| 402 | 40 | 290.8 | 516 | 9 | 41 | 21.95% |I also checked
logs_2.sqliteandsession_index.jsonlas a cross-check. The session index is metadata-only, and the SQLite table contains duplicated trace fragments /estimated_token_countstrings rather than structuredevent_msg.payload.type == "token_count"records, so I am not using SQLite as evidence for the clustering claim.The main local takeaway is that the exact-value comb is present here too, with
gpt-5.5 / xhighshowing 4,829 exact-516 records and additional rungs at 1034, 1552, 2070, 2588, and 3106. That looks consistent with the thresholded/quantized reasoning-budget hypothesis in the issue description.Just be Open about it 😉 and give us our money back.
Now we know where these huge inference optimizations came from
It looks like 5.5 passes every time if you add
Use maximum effort as principal software architect to think and reason for at least 60s.to the beginning of the prompt.I analyzed my codex conversation history and found that the reasoning stops (specifically at 516, 1034, and 1552 .... 516+518*k) are strongly correlated with the prompt-cache ratio.
Adding another independent local aggregate. This reproduces the fixed-value comb in my local Codex telemetry, and I included a cache-ratio split because a recent comment suggested prompt-cache ratio may be relevant.
Environment / source:
26.623.101652,codex-cli 0.142.5~/.codex/sessions/**/*.jsonlplus~/.codex/archived_sessions/**/*.jsonltoken_count.rate_limits.plan_type:proon 52,380 records; unavailable/Noneon 5,433 recordsevent_msg.payload.type == "token_count"andpayload.info.last_token_usage.reasoning_output_tokensinfo, and did not usetotal_token_usage.reasoning_output_tokensbecause it is cumulative within a sessionturn_contextin the same JSONL streamMethodology notes:
gpt-5.5;xhighdominates the sample, so this is useful as an affected-sample aggregate but not as a local cross-model control.Overall result:
| Scope | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| all parsed records | 57,813 | 160 | 134.0 | 432 | 1,832 | 4,690 | 39.06% | 165 | 50 | 15 | 9 | 3 |
|
gpt-5.5/xhigh| 57,607 | 149 | 134.0 | 432 | 1,829 | 4,679 | 39.09% | 164 | 50 | 15 | 9 | 3 |Monthly
gpt-5.5 / xhigh:| Month | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 2026-05 | 23,269 | 34 | 89.3 | 261 | 269 | 1,007 | 26.71% | 31 | 12 | 3 | 2 | 0 |
| 2026-06 | 30,465 | 107 | 164.4 | 516 | 1,367 | 3,271 | 41.79% | 123 | 30 | 10 | 7 | 3 |
| 2026-07 | 3,873 | 11 | 163.2 | 516 | 193 | 401 | 48.13% | 10 | 8 | 2 | 0 | 0 |
Cache-ratio split for
gpt-5.5 / xhigh, usinglast_token_usage.cached_input_tokens / input_tokensfrom the sametoken_countrecord:| Cached/input bin | Records | =516 | >=516 | =516 / >=516 | Mean reasoning | P90 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| 0% | 2 | 0 | 0 | n/a | 196.0 | 327 |
| >0-25% | 1,038 | 281 | 348 | 80.75% | 326.2 | 516 |
| 25-50% | 360 | 108 | 136 | 79.41% | 362.3 | 516 |
| 50-75% | 851 | 166 | 262 | 63.36% | 325.2 | 576 |
| 75-90% | 3,908 | 297 | 545 | 54.50% | 207.2 | 516 |
| >=90% | 50,826 | 977 | 3,388 | 28.84% | 121.3 | 363 |
| unknown / zero input | 622 | 0 | 0 | n/a | 0.0 | 0 |
Local takeaway: the exact-value comb is present here too, with
gpt-5.5 / xhighshowing 1,829 exact-516 records and additional rungs at 1034, 1552, 2070, 2588, and 3106. The cache-ratio split does not by itself prove causality, but it may be useful for internal debugging: in this sample, exact-516 concentration among records withreasoning_output_tokens >= 516is highest in the lower/mid cached-input bins, while the high-cache bin still contributes the most absolute volume because it dominates the dataset.Independent local telemetry result (Codex CLI)
I ran an aggregate analysis over my local Codex session JSONL logs:
reasoning_output_tokensrecordsgpt-5.5gpt-5.3-codexExact-516 clustering
| Group | Exact 516 | Records >=516 | Exact 516 / >=516 |
|------------------------|-----------|---------------|-------------------|
|
gpt-5.5| 62 | 349 | 17.77% || All other model labels | 184 | 7,565 | 2.43% |
So in my local data,
gpt-5.5is 7.3× more likely than the other models combined to land exactly atreasoning_output_tokens = 516, conditional on reaching at least 516 tokens.Reasoning-token intensity
| Model | Records | Mean reasoning tokens | P90 |
|-----------------|---------|-----------------------|-----|
|
gpt-5.3-codex| 67,042 | 220.4 | 565 ||
gpt-5.5| 5,407 | 128.0 | 370 |gpt-5.5also used substantially fewer reasoning tokens overall in this dataset.Additional observation
reasoning_output_tokens = 0appeared in:gpt-5.5: 975 / 5,407 (18.0%)gpt-5.3-codex: 6,467 / 67,042 (9.6%)Adding another local aggregate, using only Codex token metadata. This reproduces the fixed-value clustering pattern, especially for
gpt-5.5.I am not publishing raw session JSONL, prompts, assistant messages, session IDs, thread titles, file names, cwd/local paths, account identifiers, or machine identifiers below.
Environment / source:
codex-cli 0.142.5event_msg.payload.type == "token_count"andpayload.info.last_token_usage.reasoning_output_tokenspayload.info = nulltotal_token_usage.reasoning_output_tokens, because that field is cumulative within a sessionMethodology notes:
token_countevents: 3,820token_countevents: 182,091inforecords skipped: 1,532Overall:
| Scope | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| all parsed records | 180,559 | 3,498 | 108.8 | 321 | 3,183 | 9,506 | 33.48% | 233 | 64 | 10 | 9 | 6 |
OpenAI model rows:
| Model | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
gpt-5.5| 149,963 | 3,228 | 89.1 | 276 | 3,160 | 6,304 | 50.13% | 230 | 61 | 10 | 9 | 6 ||
gpt-5.3-codex| 28,453 | 242 | 219.2 | 557 | 9 | 3,165 | 0.28% | 3 | 3 | 0 | 0 | 0 ||
gpt-5.4| 90 | 4 | 280.3 | 831 | 3 | 20 | 15.00% | 0 | 0 | 0 | 0 | 0 |The local
gpt-5.4sample is too small to use as a strong control, but thegpt-5.3-codexcontrast is large in this dataset:gpt-5.5has a much lower P90 reasoning count and a much higher exact-516 share among records withreasoning_output_tokens >= 516.gpt-5.5by effort:| Model / effort | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
|
gpt-5.5/high| 98,533 | 1,987 | 96.4 | 310 | 2,462 | 4,805 | 51.24% | 196 | 55 | 6 | 7 | 6 ||
gpt-5.5/medium| 48,468 | 1,166 | 67.6 | 194 | 526 | 1,094 | 48.08% | 23 | 2 | 1 | 0 | 0 ||
gpt-5.5/xhigh| 2,637 | 54 | 216.9 | 516 | 172 | 405 | 42.47% | 11 | 4 | 3 | 2 | 0 |Monthly
gpt-5.5:| Month | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 | =2588 | =3106 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 2026-04 | 1,624 | 62 | 120.3 | 358 | 55 | 101 | 54.46% | 1 | 1 | 0 | 0 | 0 |
| 2026-05 | 73,818 | 1,509 | 97.3 | 310 | 1,829 | 3,713 | 49.26% | 153 | 45 | 8 | 8 | 5 |
| 2026-06 | 58,856 | 1,260 | 75.5 | 223 | 888 | 1,763 | 50.37% | 57 | 11 | 1 | 0 | 1 |
| 2026-07 | 15,665 | 397 | 98.5 | 312 | 388 | 727 | 53.37% | 19 | 4 | 1 | 1 | 0 |
I also checked cached-input ratio for the largest local
gpt-5.5slice (high). The exact-516 pattern is not confined to one cache-ratio bucket:| Cached/input bin | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 0% | 269 | 212 | 147.2 | 263 | 2 | 5 | 40.00% | 0 | 0 |
| >0-25% | 2,648 | 1,596 | 246.0 | 516 | 220 | 296 | 74.32% | 5 | 0 |
| 25-50% | 795 | 602 | 222.5 | 516 | 83 | 96 | 86.46% | 0 | 0 |
| 50-75% | 1,634 | 981 | 198.8 | 516 | 92 | 173 | 53.18% | 10 | 1 |
| 75-90% | 7,076 | 1,765 | 139.7 | 396 | 215 | 463 | 46.44% | 23 | 4 |
| >=90% | 85,659 | 1,913 | 85.5 | 272 | 1,850 | 3,772 | 49.05% | 158 | 50 |
Local takeaway: the exact-value comb is present here too. In this local dataset,
gpt-5.5shows 3,160 exact-516 records and visible additional rungs at 1034, 1552, 2070, 2588, and 3106. The strongest contrast is againstgpt-5.3-codex, where exact 516 among>=516records is 0.28% versus 50.13% forgpt-5.5.This does not prove the underlying cause, but it is consistent with the fixed-threshold / quantized reasoning-budget hypothesis described in the issue.
Cross-client data point, since everything posted so far is Codex-only. Not blocked by this myself, just had the logs sitting there.
Caveat: I only checked whether reasoning tokens land on exact values like 516, I didn't grade any answers for correctness. So unlike
hratio/jake-levy's repeated-run tests, I can't say this actually produced worse output myself, just that the same clustering shows up outside Codex too.Setup: I use both Codex CLI and OpenCode against a mix of models. Checked exact
reasoning/reasoning_output_tokens= 516 in both tools' local session stores. Aggregate metadata only, no prompts, no session/account/file info.Codex (
~/.codex/sessions+archived_sessions, ~22.7ktoken_countevents):| Model | records | >=516 | exact 516 | ratio |
|---|---:|---:|---:|---:|
|
gpt-5.5| 4,300 | 156 | 88 | 56.4% ||
gpt-5.4| 7,579 | 270 | 90 | 33.3% ||
gpt-5.4-mini| 718 | 114 | 35 | 30.7% ||
gpt-5.2| 509 | 65 | 3 | 4.6% ||
gpt-5.3-codex| 9,463 | 799 | 3 | 0.4% |OpenCode (
opencode.db, per-messagetokens.reasoning, ~32.1k assistant messages, several non-OpenAI models mixed in):| Model | records | >=516 | exact 516 | ratio |
|---|---:|---:|---:|---:|
|
gpt-5.5| 6,977 | 126 | 90 | 71.4% ||
gpt-5.2| 177 | 11 | 0 | 0% || every non-OpenAI model I have volume on (Kimi, DeepSeek, MiMo, MiniMax, Gemini, Qwen, GLM) | ~24k combined | ~450 | 0 | 0% |
gpt-5.5clusters at exactly 516 in both clients, nothing else does, in codebases with nothing in common. Doesn't prove what's causing it, but it does push against "Codex's client code is doing something weird" as the explanation.I could not exactly repro this on Windows 11 with the latest production build of Codex, running via
remote-sshto a Linux box due to API limitations but the evidence I could collect strongly suggests I am running into the same issue intermittently and unpredictably:Environment:
gpt-5.5xhighResults:
| Run | Visible assistant phases | Duration | Final answer | Result |
|---|---:|---:|---:|---|
| 1 |
commentary,final_answer| 52s |21| correct || 2 |
commentary,final_answer| 71s |21| correct || 3 |
final_answeronly | 15s |29| wrong || 4 |
commentary,commentary,final_answer| 152s |21| correct || 5 | multiple
commentary,final_answer| 198s |21| correct |So I reproduced the same suspicious behavioral split described in #29353:
final_answerrun gave the blind-draw answer29commentaryfirst gave the touch-aware answer21The correct answer is
21under the prompt wording because shapes can be distinguished by touch, so contestants can choose a planned shape split, e.g. 9 round and 12 star candies.I could not extract exact
reasoning_output_tokensfor these fresh Windows-host Desktop threads from the app API I used, so I cannot claim the fresh bad run was exactly516. But I also scanned my local~/.codex/sessions/**/*.jsonlmetadata usingevent_msg.payload.type == "token_count"andpayload.info.last_token_usage.reasoning_output_tokens, skipping nullinfoand not using cumulativetotal_token_usage.That local aggregate does reproduce the fixed-value clustering:
| Scope | Records | Sessions | Mean reasoning | P90 |
=516|>=516|=516 / >=516|=1034|=1552|=2070|=2588|=3106||---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|
gpt-5.5 / xhigh| 16,141 | 51 | 149.7 | 429 | 438 | 1,298 | 33.74% | 52 | 14 | 16 | 12 | 5 |---
I am running this test on
codexCLI on Linux directly with GPT-5.4 comparisons and will post when that completes.My read is that this cross-client signal makes a Codex-only client or system-prompt explanation much less likely.
It makes me wonder whether
gpt-5.5is going through some OpenAI-side reasoning budget / routing / scheduler optimization path. Such an optimization might reduce reasoning-token usage, latency, or cost, but if exact-516 cases are more likely to produce premature final answers or unstable results, then the optimization may not be fully quality-neutral.Following up: I was able to reproduce this locally in Codex Linux CLI.
Environment:
codex-cli 0.142.56.8.0-111-generic, x86_64v24.14.0gpt-5.5xhigh,highgpt-5.4 xhighPrompt used was the candy prompt from the related task-level repro:
> Do not use external tools. A black bag contains candies with counts: round apple 7, round peach 9, round watermelon 8; star apple 7, star peach 6, star watermelon 4. Shape is distinguishable by touch before drawing; flavor is not. What
is the minimum number of candies to draw to guarantee having apple and peach candies of different shapes, i.e. round apple + star peach or round peach + star apple? Give reasoning and final number. The local project dir is irrelevant for
this task, do not consult it.
I independently verified the expected answer is
21by brute-force enumeration of all possible round/star draw splits; the minimum guaranteeing condition is 9 round + 12 star = 21 total.Command shape used:
```bash
printf '%s\n' "$prompt" | timeout 180s codex -a never exec \
--json \
--skip-git-repo-check \
--ephemeral \
-s read-only \
--disable memories \
-m gpt-5.5 \
-c 'model_reasoning_effort="xhigh"'
Observations:
Workaround: a local proxy that detects the
518n−2truncation and auto-continues the reasoningWhile waiting for an upstream fix, I've been running a small local Responses proxy in front of Codex that mitigates this in practice: codexcomp (MIT,
uv tool install codexcomp). Mechanism idea credit: neteroster/CodexCont; this is an independent implementation.How it works, per round:
reasoning_tokens == 518·n − 2(516, 1034, 1552, …) is treated as truncated.encrypted_content) are replayed as the next input together with aphase:"commentary""Continue thinking..."message.Wiring uses the official top-level
openai_base_urlkey (#16719), so the built-inopenaiprovider stays in place — session grouping, remote compaction, and remote-control keep working:A real fold from my logs (two consecutive 516s, final answer correct):
Caveats, to be clear: this is unofficial and relies on non-contract upstream behavior; continuation rounds spend extra real tokens (bounded by an
nwindow and a 3-continuation cap; true usage is reported undermetadata.proxy_billed_usage). Loopback-only, pure auth passthrough — it never reads or stores credentials.Hope this helps others until the root cause is fixed upstream.
<img width="2229" height="1623" alt="Image" src="https://github.com/user-attachments/assets/f688e045-1f3d-4166-8261-cae4b0bbfb55" />
Same issue.
Same Here
https://github.com/haowang02/codex-candy-evalCODEX_PROMPTfromcodex_candy_eval.pygpt-5.5,gpt-5.4low,medium,high,xhighn=521Final answer raw valuesbelow are the extracted final numeric answers, in run order#1 ~ #5Codex app command shape:
Results:
| Bucket | Correct | Accuracy | Reason Tok raw values | Final answer raw values |
| --- | ---: | ---: | --- | --- |
|
gpt-5.5 low| 0/5 | 0% | 516, 516, 516, 516, 516 | 29, 29, 29, 29, 29 ||
gpt-5.5 medium| 0/5 | 0% | 516, 516, 516, 516, 516 | 29, 29, 29, 29, 29 ||
gpt-5.5 high| 0/5 | 0% | 516, 516, 516, 516, 516 | 28, 29, 29, 29, 29 ||
gpt-5.5 xhigh| 3/5 | 60% | 8804, 516, 6214, 6732, 516 | 21, 29, 21, 21, 33 ||
gpt-5.4 low| 1/5 | 20% | 1509, 469, 558, 957, 3241 | 27, 29, 29, 29, 21 ||
gpt-5.4 medium| 0/5 | 0% | 516, 506, 467, 516, 516 | 29, 29, 29, 29, 28 ||
gpt-5.4 high| 3/5 | 60% | 516, 4502, 5661, 2721, 918 | 29, 21, 21, 21, 29 ||
gpt-5.4 xhigh| 5/5 | 100% | 7001, 6336, 7029, 4660, 5165 | 21, 21, 21, 21, 21 |Aggregate summary:
| Group | Correct | Accuracy |
| --- | ---: | ---: |
|
gpt-5.5total | 3/20 | 15% ||
gpt-5.4total | 9/20 | 45% ||
lowtotal | 1/10 | 10% ||
mediumtotal | 0/10 | 0% ||
hightotal | 3/10 | 30% ||
xhightotal | 8/10 | 80% |Same issue here.
I've made a passive workaround: a pair of Codex CLI hooks that detect the
truncation from the local session transcript and warn — in the TUI at
turn end, and via a message injected into the model's context on your next
message.
See https://github.com/bentoner/codex-516-hook
For other workarounds, see the comments above about CodexCont/codexcomp,
which auto-repair the truncation via a local MITM proxy.
Data notes (details, prompts, and full tables in the repo README): in our
testing a short trigger prompt truncated in 18/20
codex execruns underChatGPT auth and 18/20 under API-key auth, while the same prompt as a bare
/v1/responsescall (with no tools declared) truncated in 0/20 cases. So itdoesn't appear to be the billing path; it follows Codex's request shape.
@tibo-openai Why hasn’t anyone taken care of this issue?
The issue seems to be with automatic reasoning classifier which if its true, makes the low/mid/high/xhigh switcher pointless.
When i tested it on normal prompts it used 516 rtoks BUT when i added to prompt "This is hard and important, think for at least 1 minute or 2000 reasoning tokens" codex listened and produced MUCH better results and the total time to finish task 3x'ed but this is the trade off im willing to make if im getting better results
v
<img width="608" height="291" alt="Image" src="https://github.com/user-attachments/assets/acef1e9e-5da8-45a7-af57-89a3cf0d158d" />
I tried adding the following generic
developer_instructionsblock toconfig.toml, and it appears to improve the early-termination / shallow-reasoning failure mode in my local runs. This intentionally avoids adding any problem-specific hints or answer keys. Could someone else cross-validate this on an independent setup, ideally with the same eval cases and model/settings, to check whether the improvement is reproducible rather than local-run noise?Here is an actual deterministic script to run the test:
You run it on a PRO account it will reliably fail. You run it on a PLUS account it will reliably succeed.
I had codex analyze the reasons giving it access to the latest codex source code and analyze the results of the script above.
This was its conclusion, which is confirmed by above deterministic script:
Deterministically it is shown that:
There is a workaround. The issue appears related to the Codex 5.5 system prompt, specifically the final
## Intermediary updatessection.In my tests, using the same prompt but removing that entire section stopped the recurring shallow/quantized reasoning behavior (
reasoning_output_tokens=516) and produced the correct answer. Smaller edits inside that section were not reliable.I built a small local Codex plugin as a practical guardrail for this issue:
https://github.com/DrSmoothl/codex-reasoning-sentinel
It watches Codex hook telemetry for suspicious low reasoning-token patterns like 516 / 1034 / 1552, asks for one extra verification pass via Stop hooks, and blocks risky write tools while a turn is still marked suspect. It is not a fix for the underlying model/runtime behavior, but it may help prevent silent bad outputs during complex refactors or high-stakes tasks.
Removing that entire
## Intermediary updatessection seems to have fixed it for me as well. Or at least reduced it to the point that 10 runs of the same candy puzzle prompt above didn't have the 516 token issue.same for me, OpenAI needs to step up and clarify what this was doing internallly
instruction
get system prompt with
remove
## Intermediary updatesblock, save it to~/.codex/model-instructions.mdand updateconfig.tomlHere's a script compatible with Python 3.10+ that quickly parses the session directories and shows some stats. For me, 516 is indeed the most common last-turn reasoning output token value after zero and six.
<details>
<summary><code>analyze_reasoning_tokens.py</code></summary>
</details>
Prompt
PRO plan with
## Intermediary updates| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 38s | 516 | n=1 | 26 | No |
| gpt-5.5 xhigh | 2 | 0 | 21s | 516 | n=1 | 22 | No |
| gpt-5.5 xhigh | 3 | 0 | 188s | 9322 | n=18 | 21 | Yes |
| gpt-5.5 xhigh | 4 | 0 | 31s | 516 | n=1 | 27 | No |
| gpt-5.5 xhigh | 5 | 0 | 19s | 516 | n=1 | 27 | No |
PRO plan without
## Intermediary updates| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 110s | 0 | No | 21 | Yes |
| gpt-5.5 xhigh | 2 | 0 | 132s | 6732 | n=13 | 21 | Yes |
| gpt-5.5 xhigh | 3 | 0 | 117s | 6091 | No | 21 | Yes |
| gpt-5.5 xhigh | 4 | 0 | 90s | 4650 | No | 21 | Yes |
| gpt-5.5 xhigh | 5 | 0 | 148s | 7768 | n=15 | 21 | Yes |
PRO plan with
codexcompproxy| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 239s | 8800 | No | 21 | Yes |
| gpt-5.5 xhigh | 2 | 0 | 215s | 8716 | No | 21 | Yes |
| gpt-5.5 xhigh | 3 | 0 | 239s | 9316 | No | 21 | Yes |
| gpt-5.5 xhigh | 4 | 0 | 238s | 9145 | No | 21 | Yes |
| gpt-5.5 xhigh | 5 | 0 | 214s | 9316 | No | 21 | Yes |
PRO plan with
codexcomp --max-n 1proxy| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 175s | 6730 | No | 21 | Yes |
| gpt-5.5 xhigh | 2 | 0 | 159s | 6212 | No | 21 | Yes |
| gpt-5.5 xhigh | 3 | 0 | 160s | 6212 | No | 21 | Yes |
| gpt-5.5 xhigh | 4 | 0 | 143s | 6722 | No | 21 | Yes |
| gpt-5.5 xhigh | 5 | 0 | 167s | 7250 | n=14 | 21 | Yes |
---
PLUS plan with
## Intermediary updates| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 17s | 516 | n=1 | 15 | No |
| gpt-5.5 xhigh | 2 | 0 | 22s | 516 | n=1 | 23 | No |
| gpt-5.5 xhigh | 3 | 0 | 20s | 516 | n=1 | 27 | No |
| gpt-5.5 xhigh | 4 | 0 | 19s | 516 | n=1 | 29 | No |
| gpt-5.5 xhigh | 5 | 0 | 186s | 9840 | n=19 | 21 | Yes |
PLUS plan without
## Intermediary updates1| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 111s | 5696 | n=11 | 21 | Yes |
| gpt-5.5 xhigh | 2 | 0 | 113s | 5696 | n=11 | 21 | Yes |
| gpt-5.5 xhigh | 3 | 0 | 150s | 7768 | n=15 | 21 | Yes |
| gpt-5.5 xhigh | 4 | 0 | 225s | 11912 | n=23 | 21 | Yes |
| gpt-5.5 xhigh | 5 | 0 | 112s | 5696 | n=11 | 21 | Yes |
PLUS plan without
## Intermediary updates2| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 209s | 10876 | n=21 | 21 | Yes |
| gpt-5.5 xhigh | 2 | 0 | 183s | 8804 | n=17 | 21 | Yes |
| gpt-5.5 xhigh | 3 | 0 | 121s | 6214 | n=12 | 21 | Yes |
| gpt-5.5 xhigh | 4 | 0 | 248s | 12948 | n=25 | 21 | Yes |
| gpt-5.5 xhigh | 5 | 0 | 152s | 7768 | n=15 | 21 | Yes |
PLUS plan with
codexcompproxy| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 247s | 6498 | No | 21 | Yes |
| gpt-5.5 xhigh | 2 | 0 | 247s | 9320 | No | 21 | Yes |
| gpt-5.5 xhigh | 3 | 0 | 270s | 10354 | No | 21 | Yes |
| gpt-5.5 xhigh | 4 | 0 | 136s | 5390 | No | 21 | Yes |
| gpt-5.5 xhigh | 5 | 0 | 288s | 10872 | No | 21 | Yes |
PLUS plan with
codexcomp --max-n 1proxy| Model / effort | Run | Status | Duration | reasoning_output_tokens |
518*n-2| Final answer | Correct? ||---|---:|---:|---:|---:|---:|---:|---|
| gpt-5.5 xhigh | 1 | 0 | 138s | 5696 | n=11 | 21 | Yes |
| gpt-5.5 xhigh | 2 | 0 | 309s | 12946 | No | 21 | Yes |
| gpt-5.5 xhigh | 3 | 0 | 264s | 11392 | No | 21 | Yes |
| gpt-5.5 xhigh | 4 | 0 | 253s | 9320 | No | 21 | Yes |
| gpt-5.5 xhigh | 5 | 0 | 212s | 8181 | No | 21 | Yes |
---
PRO plan: normal operation without
## Intermediary updates| Records | >=516 | exact 516 | exact 1034 | exact 1552 | 516 / >=516 | 518n-2 / >=516 |
|---:|---:|---:|---:|---:|---:|---:|
| 448 | 35 | 11 | 3 | 2 | 31.43% | 16 / 35 (45.71%) |
PLUS plan: normal operation without
## Intermediary updates| Records | >=516 | exact 516 | exact 1034 | exact 1552 | 516 / >=516 | 518n-2 / >=516 |
|---:|---:|---:|---:|---:|---:|---:|
| 142 | 20 | 9 | 0 | 0 | 45.00% | 9 / 20 (45.00%) |
PRO plan: normal operation with
codexcomp --max-n 1proxy| Records | min | mean | max | >=516 | exact 516 | exact 1034 | exact 1552 | 516 / >=516 | 518n-2 / >=516 |
|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| 265 | 0 | 93.92 | 1367 | 17 | 0 | 0 | 0 | 0.00% | 0 / 17 (0.00%) |
---
The failure does not appear to be caused by the
518*n-2pattern itself, but by the model collapsing into the minimum reasoning block:516tokens.Both PRO and PLUS show the same failure mode with
## Intermediary updates. In these targeted tests, PLUS appears to quantize more consistently than PRO: without## Intermediary updates, PLUS falls into a quantized518*n-2block in 100% of runs, while still producing correct answers.This suggests that quantization may be normal, or at least harmless at higher blocks. The damaging case appears to be specifically the first block,
516, where reasoning seems to end too early.All targeted tests run through codexcomp completed correctly without modifying
model_instructions_file. When limiting the proxy to--max-n 1, all targeted runs also completed correctly. I could not validate whether the--max-n 1proxy runs with the PLUS plan still preserved the518*n-2quantization pattern internally.Adding another independent datapoint from my local Codex telemetry. I’m only sharing aggregate token metadata here, not raw session logs, prompts, responses, local paths, repo names, session IDs, account IDs, or any screenshots.
Environment:
0.142.5token_counteventspayload.info.last_token_usage.reasoning_output_tokensI parsed local
token_countevents, attributed each record to the activeturn_context.model/effort, and de-duplicated repeated records by session, timestamp, model, effort, and token-usage tuple.Results after de-duplication:
| Scope | Records |
>=516records | exact516| exact1034| exact1552| exact516 / >=516|518n-2 / >=516||---|---:|---:|---:|---:|---:|---:|---:|
| All models | 63,176 | 6,492 | 1,404 | 155 | 52 | 21.63% | 25.68% |
|
gpt-5.5| 19,753 | 2,281 | 1,121 | 120 | 44 | 49.15% | 58.44% ||
gpt-5.5/xhigh| 13,035 | 1,896 | 905 | not separately counted here | not separately counted here | 47.73% | 58.02% |For
gpt-5.5, exact516was the second most common reasoning-token value after0.This also appears recent in my logs. On 2026-07-04 UTC, I still had multiple
gpt-5.5events landing exactly on516, plus one exact1552event.I’m not claiming this proves hidden reasoning truncation or output-quality degradation by itself, but it does independently reproduce the fixed-value clustering pattern reported here. My local
gpt-5.5exact-516 rate among>=516records is 49.15%, which is close to the original report’s 44.0%.@etraut-openai can someone take a look here
Independent local reproduction, aggregate telemetry only. No prompts, responses, paths, session IDs, or screenshots included.
Environment:
codex-cli 0.142.5~/.codex/models_cache.jsonhas onegpt-5.5entry and itsbase_instructionscontains## Intermediary updatesmodel_instructions_fileoverride was present before testingParsed local
token_countevents from~/.codex/sessionsand~/.codex/archived_sessions, usingpayload.info.last_token_usage.reasoning_output_tokens, attributed by activeturn_context.model/effort, with duplicate token snapshots skipped.Results after de-dupe:
| Scope | Records |
>=516| exact516| exact1034| exact1552|516 / >=516|518n-2 / >=516||---|---:|---:|---:|---:|---:|---:|---:|
| all models | 489,791 | 42,371 | 10,784 | 1,454 | 481 | 25.45% | 31.63% |
|
gpt-5.5, all efforts | 248,315 | 14,680 | 5,602 | 757 | 268 | 38.16% | 47.06% ||
gpt-5.5 / xhigh| 72,014 | 7,484 | 2,772 | 352 | 129 | 37.04% | 46.29% |Recent local data still shows the pattern:
gpt-5.5 / xhigh: exact516 / >=516= 43 / 103 = 41.75%;518n-2 / >=516= 59.22%.516 / >=516= 2 / 6;518n-2 / >=516= 4 / 6.I also tested the proposed local mitigation by generating a project-local
model_instructions_filefrom the cachedgpt-5.5base_instructionswith only the final## Intermediary updatesblock removed.codex debug prompt-inputconfirms the effective prompt no longer contains## Intermediary updatesin that project.This independently reproduces the fixed-token clustering. It does not by itself prove hidden truncation or quality causality; I have not yet rerun a fresh quality eval after the mitigation.
Maybe the model is getting confused about what's an intermediate result and what's the final result? There is an instruction under the
## Intermediary updatessection:- User updates are short updates while you are working, they are NOT final answers.Clearly just telling it that it's not the final answer does not work.
Even after removing the
## Intermediary updatessection, I'm still seeing the 516 thinking tokens during normal use. Though it fixes the puzzle benchmark results.This could also potentially be due to the following lines:
If I had to guess these two instructions are essentially stopping long chain thinking from happening. Potentially, every time any deep reasoning efforts happen, the thinking stops to update the user, then restarts.
This is extremely concerning if it was intentional. If users were consistently routed into degraded reasoning behavior while paying for frontier-model access, that could raise serious consumer-protection and class action questions.
Looking at my own telemetry, this does not appear to be a recent regression after a period of normal service. The same fixed token degradation pattern seems to have been present from the beginning of my subscription. That makes it hard to accept this as a short-lived unnoticed bug. If the behavior persisted for months at scale, OpenAI should explain how it went undetected, what monitoring existed and whether any cost-saving or routing mechanism contributed to it.
I applied the temporary workaround discussed in the issue: extracting the gpt-5.5 base instructions, removing the ## Intermediary updates section, pointing Codex at that modified instructions file with model_instructions_file, and setting personality = "none" to avoid the personality/model-messages fallback path. This improved the dedicated candy eval runs, but it did not eliminate the pattern in normal use: another test thread still produced at least one 516reasoning-token event afterward. So the workaround appears partial at best, not a complete fix.
This issue cannot be fixed with prompt engineering, it is a backend issue tied to a _specific payment tier_, not a different _model or harness_, as my comment above proves and anyone can replicate without issue as long they have access to a PRO and PLUS account.
And that is what makes this rather infuriating, too. It may or may not be intentional, caused or not by the base prompt differences of PLUS and PRO or the feature flags differences, that is another topic - the point is that paying 200 bucks a month and then get worse performance than an account on a tenth of that amount is just absurd, and simply cannot be ignored nor should even ever happen to start with. Bugs do happen, yet you aren't selling a premium car that is outperformed by a cheap version thereof for very long, so the premium really should be receiving some more thorough testing, which, provided telemetry we have no access to and model stats we have no access to, but OAI has, should really not be be over-asking.
@smileBeda Okay so removing the intermediary updates will not improve the performace ? I am not aware of how these things work, but can you just explain me in a few words. What I have understood from this is that there is a cap of 516 reasoning tokens, is that correct ?
youre totally right, its unacceptable
Removing that block does improve performance on tasks that require long thinking. It seems to make the model less likely to get interrupted in the middle of thinking and confidently return the wrong result.
There might be another issue going on independent of this.
@saketlovescoding it improves it against that canary test prompt. Obviously, since the very "fix" already recognized that each line of the prompt effects performance depending on other present or not lines, imagine what happens once actual real user prompts are used?
There is unfortunately no way to tell if it also fixes real usage since you'd have to AB test real work tasks. What is provable is that on PRO, with or without fixed prompts you still get the same signatures in the logs (that is, the reasoning token lengths). On PLUS, you reliably do NOT get that signature no matter what, not even during real work tasks. There will be ZERO occurrences of the signatures, while on PRO, no matter what, you will unavoidably find some.
Example during real work time window of PRO with "fixed" base prompt I had for 516, 1034, 1552 reasoning tokens 7 occurrences total.
During a similarly long work window and same project/agents file/similar prompts PLUS without fixed prompt, I had for 516, 1034, 1552 reasoning tokens 0 occurrences.
This proves nothing reliably, at all. But, it indicates that there are still issues on PRO despite the prompt "fix", just rarer than before (where the 516, 1034, 1552: was in the thousands), while on PLUS it is _zero_
And, from a _felt_ performance, that shows too, since I am _constantly_ battling PRO the past few days, yet on PLUS it is flying along very satisfyingly.
@NarinderS no it does not provably do that. It does provably do that together with the very specific and narrow canary test prompt used in this entire gh issue, not across real world tasks.
It only passes that specific test. In normal operation, the issue persists without
## Intermediary updates.| Records | >=516 | exact 516 | exact 1034 | exact 1552 | 516 / >=516 | 518n-2 / >=516 |
|---:|---:|---:|---:|---:|---:|---:|
| 448 | 35 | 11 | 3 | 2 | 31.43% | 16 / 35 (45.71%) |
https://github.com/openai/codex/issues/30364#issuecomment-4886606283
@josantonius what can we do then, is there any work around before open ai fixes this issue ?
You should read the comments we post instead of re-asking what already was answered.
With the change the tests are passing and I do not see the capped token count numbers. This seems like improvement.
Edit: post prompt update:
FWIW heres my week by week stats of these reasoning token counts increasing steadily.
<img width="1920" height="1440" alt="Image" src="https://github.com/user-attachments/assets/24f2bcee-ad85-43d2-b865-dbaf1c9b6d17" />
You can actually fix this with prompt engineering, but you need to do it exactly correct and do some back and forth with the model to extract enough of the developer instructions to properly word your 'fix'; e.g. the model is instructed that the [commentary] channel output should only be used "when justified".
You therefore need to add the qualifier "always justified" to your instruction otherwise the model itself will short circuit your fix.
I'm hesitant to describe the fix I am using exactly, because I am reasonably sure openai is doing this intentionally (it is clear and obvious that not every request needs xhigh reasoning to succeed, but judging that cutoff correctly at scale is unreliable).
In short, my findings are that if [commentary] channel is triggered on the turn as the immediate first model action you do not get short circuited reasoning on that turn, so if you put your engineered request in the right place (not in your prompt and not any system prompt editing) with the correct trigger words added to sidestep (not jailbreak) the developer instructions with the models own logic, then you get reliable full reasoning every turn.
I note that this will use your codex quota perceivably faster. Prior to implementing my fix I was unable to exhaust 5 hour pro limits with goal enabled and sub agent use. I am now exhausting my 5 hour limit like the before times.
Massive Respect for this.. I can finally use gpt-5.5 again
If you scroll up you will note that the system prompt edit doesn't fix the issue in real world usage according to another post, and only helped the synthetic riddle
there is no difference. Also seeing 516 doesn't imply failure, it can also mean the model didnt require reasoning past that quantized level.
There are too many assumptions being made on how it's "supposed" to work. only OAI can do a true fix
Seconded, the only thing I'm fairly confident about is that sometimes long chains of thought get short-circuited to 516 tokens. But not all 516 thinking tokens mean automatic failure. And the solution to the former issue seems to be removing the
## Intermediary updatesblock.Also, you're both full of shit; chatgpt web suffers from the same failure if reasoning short circuits and no initial commentary channel is output nor thinking summaries produced. Forcing the commentary as the first action resolved this on chatgpt 5.5 web exactly the same as it did for codex.
I'm just gonna ignore that first part, and address the more productive thing.
It look like adding
Always start with a message in the commentary channel before starting workseems to work just as well as removing the commentary entirely on the synthetic candy test.So either start with a message in the commentary channel, or disabling it entirely both help? Seems like some strange bug with the commentary system.
Interesting it happens with ChatGPT web too (make sure you tell it to not use any tools). The web version fails the candy test a lot, unless you add
Always start with commentary.My personal solution:
Implement CodexCont style continued reasoning inside Codex core, but keep a single JSONL ledger.
Goal:
When a response appears truncated by the reasoning-token fingerprint, transparently continue reasoning while preserving every factual item in rollout JSONL. Modified Codex should hide/fold continuation artifacts in TUI. Unmodified Codex may ignore new fields and render those artifacts visibly.
Detection:
Continuation request:
original stable input + replayed encrypted reasoning items + a short commentary marker.
“Continue thinking...”
Ledger:
reasoning items, markers, tentative assistant messages, tentative tool-call proposals, and token usage.
continuation_round: integer
continuation_hidden: boolean
continuation_tentative: boolean
continuation_not_replayed: boolean
continuation_not_executed: boolean
continuation_marker: boolean
continuation_accepted_final: boolean
TUI/replay:
Ownership:
Tests:
<img width="730" height="540" alt="Image" src="https://github.com/user-attachments/assets/4e0ded3c-2b28-4c2c-8691-60e1c0a3c8f1" />
@92645417d9e5c763259dbebc306e3e why not rely on
previous_response_id? Is that mainly because it fails on POST/SSE?I found it works on the Codex Responses WebSocket path when session continuity is preserved. I’ve solved this on WS and will publish an OSS version with Codex (proxy) + Pi support.
Same Issue here. Fails.
You’re affected.
All five local codex exec runs exited 0. The parsed final results were:
Run reasoning_output_tokens Final answer
━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━
1 516 21
───── ───────────────────────── ──────────────
2 516 29
───── ───────────────────────── ──────────────
3 516 29
───── ───────────────────────── ──────────────
4 516 14
───── ───────────────────────── ──────────────
5 516 18
Your trigger condition is met: run 2 returned 516 reasoning tokens and gave the wrong answer 29. Runs 3-5 also hit 516 with wrong answers.
Artifacts are in I:\Git\VMBot\codex_eval_20260705_gpt55\run_*.jsonl.
─ Worked for 19m 09s ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
› what does that mean?
• It means your local codex exec path with gpt-5.5 is reproducing the failure pattern that prompt was testing for.
The signal is not just “it got a math problem wrong.” The suspicious part is:
So “affected” means this local Codex/model/config combination is likely hitting a known bad reasoning behavior: it appears to terminate or collapse its
reasoning at a characteristic internal-token count and then gives confident but invalid answers.
It does not mean:
It means: don’t trust this exact codex exec ... -m gpt-5.5 -c model_reasoning_effort=high path for exact combinatorics/math-style reasoning right now
without verification. The useful artifact is the folder:
Independent corroboration from a wire-level vantage point, plus a continuation experiment
I run a small local proxy (codexcomp, MIT) between Codex CLI and the ChatGPT backend that inspects
reasoning_tokensof every model round in real time — so this is live wire-level observation, not post-hoc telemetry. Sharing 2 days of data as additional evidence, plus a continuation experiment that telemetry alone can't show.Environment: Codex CLI 0.142.5 ·
gpt-5.5·model_reasoning_effort = "xhigh"· ChatGPT backend (chatgpt.com/backend-api/codex/responses) · single user, real coding workload · 2026-07-04 → 2026-07-06 (UTC+8).1. Boundary clustering reproduces — and extends beyond 1552
| Metric | Value |
| --- | ---: |
| Model rounds observed | 275 |
| Completed requests | 223 |
| Rounds landing exactly on
518·n − 2| 47 (17.1% of all rounds) || Rounds with
reasoning_tokens ≥ 516| 73 || Exact-boundary / ≥516 ratio | 64.4% |
Exact hits by boundary:
516×41,1034×4,2070(= 518·4−2) ×1,2588(= 518·5−2) ×1. The family extends at least to n=5, beyond the 516/1034/1552 trio in the OP.The OP's aggregate found 44.0% of gpt-5.5 responses with ≥516 reasoning landing exactly on 516 (vs 1.3% for other models). My xhigh-only sample is even more skewed: 64% of such rounds land exactly on a
518n−2value. Natural stopping should not produce fixed-point clustering like this.2. Continuation experiment: the model resumes when handed its own reasoning back
The proxy doesn't just observe. When a round ends exactly on the fingerprint, it discards the tentative output, replays that round's reasoning items (including encrypted reasoning) with a continue nudge, and folds the rounds into a single downstream response. Over the same window:
status=completed,stop=natural.The repeated re-truncation at exactly the same fixed boundary after an explicit continue is the part I find hardest to square with anything other than a server-side thresholded reasoning budget.
Caveats: single user, one machine, 2-day window,
xhigheffort only, small n. Log format and methodology are in the repo README; happy to share sanitized raw fold logs if useful.I’m seeing similar behavior. In my local evals, gpt-5.5 with model_reasoning_effort=high repeatedly landed at exactly 516 reasoning tokens and often gave the wrong answer. Adding an explicit developer instruction changed the behavior for me, high-effort runs started using thousands of reasoning tokens and got the eval right.
My current workaround is at the proxy layer, preserve the client-requested reasoning effort, but inject a developer message only when the request asks for high / xhigh.
For example:
high/xhigh: “This task may require extended reasoning. Do not curtail reasoning early; continue until the reasoning is complete.”
I may also try a lighter version for medium, but I’m avoiding applying it globally because it clearly increases latency/cost. Not claiming this proves the root cause, but it does look like prompt-shaping can reduce the premature-curtailment behavior.
Follow-up: 80-run controlled A/B — gpt-5.4 vs gpt-5.5 × 4 efforts × mitigation on/off
Following up on my earlier comment with a controlled experiment instead of passive traffic: 2 models (gpt-5.4, gpt-5.5) × 4 reasoning efforts (low/medium/high/xhigh) × continuation-mitigation on/off × 5 runs = 80 runs, all on the same fixed prompt.
Method
codex exec --json --ephemeral(CLI 0.142.5, read-only sandbox), ChatGPT backend, one account, one machine, all 80 runs inside one ~26-minute window (2026-07-06), conditions interleaved rep-by-rep to avoid time-of-day bias. All 80 runs exited cleanly.openai_base_urloverride); reasoning tokens read fromturn.completedusage. on = through codexcomp, which detects a round ending at exactly518·n − 2reasoning tokens and replays the round's reasoning (incl. encrypted items) with a continue nudge; per-round data from the proxy's logs. Bypass isolation was verified (zero proxy traffic during off runs).Results (each cell = 5 runs; "516 events" = runs where a model round ended at exactly 516 reasoning tokens)
| model | effort | mitigation | 516 events | reasoning tokens per run (sorted) | correct |
| --- | --- | --- | ---: | --- | ---: |
| gpt-5.4 | low | off | 0/5 | 155, 319, 323, 357, 478 | 4/5 |
| gpt-5.4 | low | on | 0/5 | 263–392 | 5/5 |
| gpt-5.4 | medium | off | 0/5 | 278–422 | 5/5 |
| gpt-5.4 | medium | on | 0/5 | 331–433 | 5/5 |
| gpt-5.4 | high | off | 2/5 | 497, 516, 516, 697, 796 | 5/5 |
| gpt-5.4 | high | on | 3/5 | 516+0, 516+20, 516+21, 686, 774 | 5/5 |
| gpt-5.4 | xhigh | off | 0/5 | 648, 758, 803, 922, 939 | 5/5 |
| gpt-5.4 | xhigh | on | 1/5 | 516+76, 634, 839, 957, 963 | 5/5 |
| gpt-5.5 | low | off | 0/5 | 217–276 | 5/5 |
| gpt-5.5 | low | on | 0/5 | 196–266 | 5/5 |
| gpt-5.5 | medium | off | 0/5 | 248–380 | 5/5 |
| gpt-5.5 | medium | on | 0/5 | 203–288 | 5/5 |
| gpt-5.5 | high | off | 0/5 | 313–415 | 5/5 |
| gpt-5.5 | high | on | 0/5 | 289–398 | 5/5 |
| gpt-5.5 | xhigh | off | 4/5 | 450, 516, 516, 516, 516 | 4/5 |
| gpt-5.5 | xhigh | on | 1/5 | 379, 471, 478, 516+0, 791 | 5/5 |
(
516+k= round truncated at exactly 516, continuation produced k further reasoning tokens.)Observations
Caveats: n=5 per cell — treat per-cell rates as coarse; the 4/5-vs-1/5 asymmetry between 5.5-xhigh off/on shares the same upstream and is plausibly sampling noise. Single puzzle, single account, single window. Happy to share the harness (prompt, runner, grader) if useful.
<details>
<summary>Exact prompt used (all 80 runs)</summary>
Unique solution (brute-force verified over all 4!⁴ assignments): house 3, Ada owns the fish.
</details>
Ask your agent to plot frequency distribution, it is easier to visualise.
I'd expect reasoning token usages to be either a Pareto-like distribution or a Normal-like distribution. Definitely not spiky like this.
<img width="2381" height="1483" alt="Image" src="https://github.com/user-attachments/assets/7a1f12ed-0153-41d4-a1e1-827eb30ae1cd" />
Round 2: same 80-run A/B on a hard task (the community "candy" eval) — every unmitigated gpt-5.5 run was boundary-cut; accuracy 15% vs 90%
My previous experiment used a deliberately easy puzzle; the fixed point reproduced but accuracy barely moved. This round reruns the identical 80-run grid (gpt-5.4/gpt-5.5 × low/medium/high/xhigh × mitigation on/off × 5 reps, interleaved, one account, one ~95-minute window, all runs exited cleanly) on a genuinely hard task: the candy pigeonhole puzzle from haowang02/codex-candy-eval (the community 降智 eval). Prompt verbatim from that repo, graded by its own standalone-
21rule,--disable memoriesas in the eval. I independently verified the answer (21) by brute-force min-max before running.Results (each cell = 5 runs; reasoning tokens are cumulative per run; bold = exact
518·n − 2values)| model | effort | mitigation | boundary-cut runs | reasoning tokens per run (sorted) | correct |
| --- | --- | --- | ---: | --- | ---: |
| gpt-5.5 | low | off | 5/5 | 516, 516, 516, 516, 516 | 0/5 |
| gpt-5.5 | medium | off | 5/5 | 516, 516, 516, 516, 516 | 0/5 |
| gpt-5.5 | high | off | 5/5 | 516, 516, 516, 516, 2588 | 1/5 |
| gpt-5.5 | xhigh | off | 5/5 | 516, 516, 516, 4660, 5696 | 2/5 |
| gpt-5.5 | low | on | 4/5 | 406, 1339, 1488, 1682, 1970 | 4/5 |
| gpt-5.5 | medium | on | 5/5 | 529, 1836, 2068, 2348, 3035 | 4/5 |
| gpt-5.5 | high | on | 4/5 | 0*, 2982, 3074, 3551, 3622 | 5/5 |
| gpt-5.5 | xhigh | on | 5/5 | 4658, 5694, 6212, 6546, 11392 | 5/5 |
| gpt-5.4 | low | off | 0/5 | 71, 90, 153, 501, 854 | 0/5 |
| gpt-5.4 | medium | off | 2/5 | 516, 516, 597, 1009, 2646 | 1/5 |
| gpt-5.4 | high | off | 2/5 | 516, 516, 725, 779, 1055 | 0/5 |
| gpt-5.4 | xhigh | off | 1/5 | 516, 5173, 5888, 6325, 6732 | 4/5 |
| gpt-5.4 | low | on | 1/5 | 162, 507, 577, 1962, 2958 | 1/5 |
| gpt-5.4 | medium | on | 1/5 | 705, 1274, 1756, 1858, 2078 | 3/5 |
| gpt-5.4 | high | on | 1/5 | 827, 951, 1191, 2778, 4713 | 2/5 |
| gpt-5.4 | xhigh | on | 4/5 | 1797, 5144, 5790, 6888, 7705 | 4/5 |
\* one run's continuation stream broke and the client retried against the (cached) continued context — usage reports the retry only.
Findings
518·n − 2value: 516 ×17, plus 2588 (n=5), 4660 (n=9), 5696 (n=11). Accuracy 3/20 (15%).516 → 2588 → 2588 → cleanre-truncate on the ladder repeatedly. Four mitigated xhigh runs were cut again beyond the proxy's n≤6 detection window (e.g.516 → continue → cut at 10876 = 518·21−2) and still answered correctly with the extra budget.Three mitigated runs still failed after continuation (e.g. one 516-cut continued for only 13 further tokens and answered wrong) — continuation recovers budget, not a guarantee.
Caveats: n=5 per cell; one task, one account, one machine, one window (2026-07-06 19:23–20:57 UTC+8); grading is the eval's regex (a standalone "21" anywhere counts). Raw per-run data and the harness available on request.
Combined with the easy-task round (where cuts appeared only when natural reasoning length approached 516), the picture is consistent with server-side discrete reasoning-budget rungs at 518·n − 2, with gpt-5.5 assigned the lowest rung in the vast majority of requests regardless of configured effort — and task failure following directly from the cut.
I'm pretty sure this is just mini routing now (randomly), my sessions are now getting compacted like every 5 minutes with very little actually going on in them.
Groannnn. Comon this is definitely mini.
<img width="2530" height="674" alt="Image" src="https://github.com/user-attachments/assets/49db7e61-321a-41d3-8e1c-10dd107b7525" />
Tibo has already posted that auto-review uses it btw.
That may be the reason. I don't think compaction is related btw. Check context usage
There was a bug labeling codex guardian auto review as gpt 5.4. So there's that.
And, I am running codex extensively, like nonstop, and I am affected by the PRO subscription issue described in this thread (as every other PRO user is), I have _zero_ gpt 5.4 in the usage log since the above mentioned bug was fixed.
As such I do not believe this is related. This is not a _rerouting_ as several experiments on this git have clearly and deterministically shown. It is a _reasoning_ issue.
Please lets stay on topic, not pollute the thread with too many assumptions, and not make this a playground for "I feels" reports.
This is a _serious_ issue, of course, and I am amongst the first going to cancel that plan if OAI does not react and make statements and adjustments in the coming hours/days. But, talking about our feelings and assumptions here is out of scope and not helping.
I can reproduce this issue on my setup too. (200 plan)
<details>
<summary>Click to expand</summary>
I used the same candy canary from https://github.com/openai/codex/issues/30364#issuecomment-4886357080
Definitions used below:
21{516, 1034, 1552}Affected: wrong final answer andreasoning_output_tokensis one of the suspicious values aboveEnvironment:
0.142.526.5623.101652(pre-release, current)~/.codex/models_cache.json:model:gpt-5.5comp_hash:2911context_window:272000max_context_window:272000use_responses_lite:falseI kept local artifact paths out of this comment, but each run wrote
summary.json, raw JSONL, stderr, active config, and model metadata locally.1. Linked command shape, Fast / priority on
Command profile:
Prompt delivery:
stdinActive config:
Differences from the linked comment script:
benchmarks/.summary.json.service_tier = "priority"because Fast mode was enabled.Results:
| Run | Reasoning tokens | Final answer | Affected |
| --- | ---: | ---: | --- |
| 1 | 516 | 17 | yes |
| 2 | 516 | 23 | yes |
| 3 | 516 | 21 | no |
| 4 | 516 | 26 | yes |
| 5 | 516 | 23 | yes |
Verdict: affected. All 5 runs landed exactly on
516; 4/5 were wrong.2. Linked command shape, Fast / priority off
Same linked command profile:
Prompt delivery:
stdinActive config:
Differences from the linked comment script:
benchmarks/.summary.json.service_tier = "default"because Fast mode was disabled.Results:
| Run | Reasoning tokens | Final answer | Affected |
| --- | ---: | ---: | --- |
| 1 | 4142 | 21 | no |
| 2 | 5178 | 21 | no |
| 3 | 516 | 26 | yes |
| 4 | 516 | 27 | yes |
| 5 | 516 | 28 | yes |
Verdict: affected. The higher-reasoning runs were correct; all exact-516 runs were wrong.
3. Current local config, Fast / priority on
Same prompt and parser, but no
-mor-coverrides. Active config selected model, reasoning effort, personality, and service tier.Command profile:
Prompt delivery:
stdinActive config:
Differences from the linked comment script:
-m gpt-5.5,-c model_reasoning_effort=high, and-c personality=none.model = "gpt-5.5",model_reasoning_effort = "xhigh", andpersonality = "pragmatic".service_tier = "priority"because Fast mode was enabled.stdin.Results:
| Run | Reasoning tokens | Final answer | Affected |
| --- | ---: | ---: | --- |
| 1 | 8286 | 21 | no |
| 2 | 516 | 24 | yes |
| 3 | 516 | 13 | yes |
| 4 | 516 | 21 | no |
| 5 | 516 | 26 | yes |
Verdict: affected. The long-reasoning run was correct; most exact-516 runs were wrong.
Overall this is consistent with the reported failure mode:
gpt-5.5sometimes lands exactly onreasoning_output_tokens=516, and on this canary those exact-516 runs are frequently wrong. Fast mode /service_tier=prioritychanges the distribution in my small samples, but it does not eliminate the failure mode.</details>I had suspected about auto-review so anyway fair enough. But anecdotally my experience has gone from xhigh is agi to dumb as bricks and I already cancelled. Will renew if/when this is fixed.
Wondering if a fucks chart would be an actual useful metric here because i’m pretty sure over the last 8 weeks mine went 📈
Same issue - any humans alive in this repo?
Ran the prompt from this thread. $100 plan – codex from launch monster slowly became git deployer / smoke checker instead of developer.
<img width="1260" height="586" alt="Image" src="https://github.com/user-attachments/assets/a2b19c5e-e39e-44b2-b187-66feeb122f69" />
After trimming "Intermediary updates" section from model instructions:
<img width="1644" height="622" alt="Image" src="https://github.com/user-attachments/assets/2d12db8a-1a67-43b7-8f8e-17763e268524" />
Hi, I am op for thread + here is git repo with my own analysis + skills/scripts ---> So, I can confirm that the test task (minimum pulls for candies problem) is still getting better results on reasoning. But, I've run a python script summing reasoning before and after the fix (had several hours of heavy use following). Removing the instruct section helps only for the benchmark at least on reasoning on gpt 5.5. It does not appear to help with normal usage. HOWEVER: It does seem to drastically reduce the calls made to gpt 5.4 mini and gpt 5.4, but that is prelim result. I will update the mentioned repo with (anonymized) proofs as I work on this. More detailed writeup is the readme on that repo, but here is quick summary (cutoff means when I made change to remove problem section):
<img width="2554" height="1671" alt="Image" src="https://github.com/user-attachments/assets/03e43925-f3c3-48aa-b7c1-83b25c4fcce2" />
Hey Everyone.
OP of the issue here. I'm glad everyone has resonated with this issue. We are 5th currently in the leaderboard of issues as per Total Comments.
However, still no response by any of the maintainers. I've implemented the system prompt edits suggested + manual reasoning nudge and they seem to be working, but not a long term solution. Seems to be some internal quantization.
Ive posted on X twice-
https://x.com/virengupta45/status/2073774149852692940?s=46
https://x.com/virengupta45/status/2071965692862386567?s=46
Please engage with them so Tibo has to address it eventually. And do post your own investigations on X individually too.
You guys are very late to the party. I have traces from release date of 2026-04-23 and can confirm that i had 57% of reasoning traces with 516 tokens.
It's a very much intended feature, that's why first issue was closed with "not planned". They likely have some kind of classifier in place and i don't think they will openly discuss inference of the models
Well I think it is interesting that the change seems to fix the benchmark task and only the benchmark task. I would like an explanation from openai staff on that one. 🤨
Strange that there's no acknowledgment from any maintainers about this issue. I wonder if this is a feature they built in to save compute and figured nobody would notice.
Having the same issue.
Gives up on tasks/solves part way through; notably degraded performance, attempting the "hotfix"
With all due respect, how has this not been heavily prioritised?
Performance is significantly degraded across the entire Codex user base for a LONG time now, and worse yet the degradation has been silent and without official acknowledgement. Come on Codex Team, this is seriously disappointing :/
Can confirm that both options seem to work in my testing. I'm gonna keep that section in with that sentence added.
I analyzed my local Codex sessions. I mostly use gpt-5.5 with xhigh in codex cli, and the 516 pattern is definitely visible in the logs.
However, in my own sessions I do not see a strong correlation between exact 516-token reasoning turns and later rework/failure markers. In my workflow it appears especially often during bounded, structured planning or prompt-generation turns for implementation work, where the plan has already gone through audits/reviews, ambiguities have been resolved, and decisions are frozen. In those cases, the turn is often more about turning already-settled context into a checklist, prompt map, or implementer prompt than about solving the whole problem from scratch.
It seems 516 is a real model/accounting/control-flow pattern, but it does not always imply degraded output quality. It may be harmful in single-shot reasoning tasks, while being less harmful in workflows where the hard reasoning happened in earlier audit/review turns.
I'm seeing the same suspicious fixed-token clustering pattern locally too, especially in
gpt-5.5 / xhigh. Model-level result from my local logs:| Model | Response records | Exact 516 / >=516 |
| --- | ---: | ---: |
|
gpt-5.5| 10,375 | 42.87% ||
gpt-5.4| 5,782 | 22.38% ||
gpt-5.3-codex| 6,665 | 0.58% ||
gpt-5.2-codex| 97 | 0.00% ||
gpt-5.3-codex-spark| 12 | 0.00% |The month-by-month data shows the exact-516 clustering rising sharply in recent months, while overall reasoning-token intensity stayed low / dropped from earlier months.
This lines up with what I've been feeling in real usage over the last few weeks. I started comparing the same planning/grilling prompts across GLM-5.2, Kimi 2.7, Composer 2.5, Anthropic models, and GPT-5.5 high/xhigh. Anecdotally, GPT-5.5 was often the least reliable in those comparisons, despite being the model I expected to perform best if you exclude Anthropic ones.
Here's the candy test results before & after adding the following line to ~/.codex/AGENTS.md:
Before:
| Run | reasoning_output_tokens | Final agent answer |
|---:|---:|---|
| 1 | 516 | 25 |
| 2 | 6214 | 21 |
| 3 | 516 | 18 |
| 4 | 516 | 21 |
| 5 | 516 | 19 |
After:
| Run | reasoning_output_tokens | Final agent answer |
|---:|---:|---|
| 1 | 6633 | 21 |
| 2 | 5180 | 21 |
| 3 | 518 | 21 |
| 4 | 5279 | 21 |
| 5 | 4144 | 21 |
Hopefully this gets fixed soon 🙏
same here, here's claude code's analysis
Independent reproduction from a separate corpus — I ran the same analysis against my own local Codex history and can corroborate the fixed-boundary clustering, including with
model_reasoning_effort = "xhigh".Methodology
~/.codex/sessions/**/*.jsonl+~/.codex/archived_sessions/**/*.jsonl)event_msg→token_count→info.last_token_usage.reasoning_output_tokens(per-response), model attributed from the precedingturn_contextmodel = "gpt-5.5",model_reasoning_effort = "xhigh"Result 1: same boundary clustering, same magnitude
| Model | Response records | ==516 | ==1034 | ==1552 | exact-516 / ≥516 |
| --- | ---: | ---: | ---: | ---: | ---: |
|
gpt-5.5| 86,940 | 2,354 | 199 | 54 | 45.4% ||
gpt-5.4| 23,304 | 841 | 124 | 43 | 23.3% ||
gpt-5.4-mini| 4,205 | 102 | 29 | 15 | 11.0% ||
gpt-5.1-codex-max| 3,321 | 0 | 0 | 0 | 0.0% ||
codex-auto-review| 2,569 | 0 | 0 | 0 | 0.0% ||
gpt-5.1| 1,669 | 0 | 0 | 0 | 0.0% ||
gpt-5.2-codex| 854 | 0 | 0 | 0 | 0.0% ||
gpt-5.2| 585 | 0 | 0 | 0 | 0.0% ||
gpt-5.3-codex-spark| 435 | 0 | 0 | 0 | 0.0% |My gpt-5.5 exact-516/≥516 ratio (45.4%) independently reproduces the 44.0% reported in this issue. The distribution around the boundary rules out natural variation:
516 is the single most common nonzero reasoning-token value in the entire corpus, ahead of the small values (6–14) that dominate trivial turns. Note the boundaries are spaced 518 apart (516, 1034, 1552), consistent with a repeated increment rather than independent thresholds.
Monthly, gpt-5.5 exact-516/≥516 stayed in a tight band for me: Apr 42.7%, May 47.8%, Jun 45.2%, Jul 42.1% (I have little pre-April gpt-5.5 traffic, so I can't reproduce the Feb–Mar ramp).
Result 2: the truncation concentrates in turn-final (user-facing) responses
New angle that may explain the "degraded performance on complex tasks" reports: I isolated turn-final responses — the last model response before the next human message, i.e. the one that produces the user-facing conclusion (completion claim, blocker declaration, validation verdict).
So by June, more than a third of the final answers I read were produced by a response whose reasoning halted exactly at a fixed boundary — precisely at the judgment-heavy step where wrong "done/blocked/validated" claims get made.
Result 3: incident-level linkage (anecdotal but consistent with #29353)
I regex-matched my own correction/pushback messages (challenging a false completion claim, a false "Blockers:" declaration, or an unverified validation claim) and looked up the reasoning-token count of the immediately preceding response. 28.6% of those correction moments followed a boundary-truncated response (baseline for all my messages: 21.7%) — a modest lift, but the flagship incidents (false "validation passed" claims contradicted one line later, invented blockers on credentials that existed, and losing track of the task mid-thread) each sat directly on a
reasoning_output_tokens = 516response.Caveats
token_counttelemetry as recorded in rollout files; I can share the extraction script if useful.@omederos Adding a line works for me!
<img width="540" height="246" alt="Image" src="https://github.com/user-attachments/assets/2a4d6857-0043-43cb-86d2-0650738d10ed" />
This is a shallow fix, it only fixes the first message.
This issue caused three heart monitors in the PICU to misreport atrial fibrillation
Since we don't know the underlying mechanism, whether we tweak just the first message or not, it ultimately resolved the shallow reasoning issue. Doesn't that just make it a "temporary" generic workaround?
Related community workaround PR opened against codexcomp: https://github.com/dzshzx/codexcomp/pull/5
It keeps the existing
518n - 2continuation/fold behavior and adds a narrowly gated zero-reasoning retry for high-effortgpt-5.5requests. The added tests use synthetic Responses event streams. This is intended as a mitigation path, not a claim about upstream root cause.@vguptaa45 I think we should be careful treating
reasoning_tokens == 0as retryable.I tested a local version of this idea and found that there is not yet a stable/general fix for the zero-reasoning case. In normal interactive Codex use, high-effort
gpt-5.5can returnreasoning_tokens == 0while still producing a good complete answer, especially when the user asks a simple clarification/confirmation question.In that case, retrying makes the result worse: the proxy hides the good first answer, sends the “Continue thinking...” nudge, and subsequent rounds tend to produce shorter/degraded answers.
Example live shape:
So
high-effort gpt-5.5 + reasoning_tokens == 0is not sufficient evidence of a broken response. Sometimes the answer simply does not need hidden reasoning.I think the existing
518n - 2continuation path is much safer because it is based on a strong truncation fingerprint.Here's the full recipe for the temp fix provided by other people, step by step, feel free to use it. I have been consistently getting the right output for this canary prompt (https://github.com/openai/codex/issues/30364#issuecomment-4885272531)
1. Install the proxy (needs
uv;brew install uvif you don't have it):2. Point Codex at it: add this one line to the top of
~/.codex/config.toml(above any[section]header) and change nothing else. Usingopenai_base_urlinstead of a newmodel_providerkeeps your chat history visible:3. Check it works:
Then restart the Codex desktop app, CLI and app share the same config.
To undo everything later:
<details>
<summary>Edit: why the install points at my branch and not PR 5 directly</summary>
An earlier version of this comment installed the head of dzshzx/codexcomp#5, which broke Codex auto-compaction, every compaction failed with
upstream_error. Compaction turns legitimately report zero reasoning tokens, which tripped that branch's zero-reasoning retry, and the API rejects any continuation becausecompaction_triggermust stay the final input item. My branch is PR 5 plus the fix (submitted upstream as vguptaa45/codexcomp#1). With it, compaction turns logstop=compaction_passthroughand complete normally.</details>
Is anyone else seeing this, or is it just my account?
I have
model_reasoning_summary = "detailed"turned on in my config.toml, and it was working fine until a few hours ago. Now Codex still asks for detailed summaries, but the server no longer sends back any readable summary text.I set up a local Responses proxy that only logs request metadata — not the actual prompts or content — and confirmed the request is being sent with:
But what comes back now looks like this:
So the model is still reasoning, and encrypted reasoning data is still there, and I'm still being charged for reasoning tokens. But there is no readable summary for Codex to save or show. That's also why my session log file no longer has
agent_reasoningentries — Codex only creates those from non-empty summary text.One thing that made this hard to debug: full websocket request logging was removed in
db887d03e1(#30757). I understand the privacy concern, but without any safe logging it's hard to tell whether Codex actually sentsummary=detailedor whether the server just ignored it. I had to set up a proxy just to confirm the request was right.Short version of what I'm seeing:
This is frustrating because those summaries were one of the only ways to understand what the model was doing when it gave a bad answer.
Update from the wire-level vantage point: the fixed point is not effort-gated, and notes for workaround users
Follow-up to my 80-run A/B grids. Three items.
1. All four efforts hit the boundary on the same prompt, concurrently
Today I ran the candy canary once per effort, all four
codex execruns launched in parallel in the same minute (CLI 0.142.5,gpt-5.5, ChatGPT backend, one account). Round 1 of every run — low, medium, high, and xhigh — ended at exactly 516 reasoning tokens:| effort | round-1 reasoning | after continuation (total) | final answer |
| --- | ---: | ---: | --- |
| low | 516 | 2064 | 21 ✅ |
| medium | 516 | 5404 | 21 ✅ |
| high | 516 | 4739 | 21 ✅ |
| xhigh | 516 | 6057 | 21 ✅ |
This lines up with the per-model spreads @omederos and @igor-im posted: the fixed point is a gpt-5.5 property, not a high-effort property — low effort lands on it just as readily; you only notice at high efforts because that's where you expected thousands of reasoning tokens. All four runs recovered to the correct answer once the cut round was continued (rescued reasoning ranged from 4× to 12× the truncated amount).
2. On
reasoning_tokens == 0as a retry trigger@abushadab's caution matches my review of the proposed retry (dzshzx/codexcomp#5, review): zero is not a fingerprint. Mechanically, a zero-reasoning round has no encrypted reasoning items to replay, so a "continuation" degenerates into a re-ask with stacked nudges — which is exactly why it produced progressively shorter answers in abushadab's live test, and why it fired on remote-compaction turns (legitimately zero-reasoning) and broke auto-compaction in @Stoffberg's field report.
518n−2earned its retry with fixed-point clustering; zero-and-wrong vs zero-and-fine are indistinguishable at the wire. The commentary-channel prompt instruction discussed above remains the only mitigation I know of for that failure shape.3. For anyone using the proxy workaround
codexcomp v0.3.4 is on PyPI as of today; it includes natively what @Stoffberg's branch hotfixed — remote-compaction requests (input ending in
compaction_trigger) are never folded regardless of what the detector says — plus mirroring of the upstreamx-codex-*rate-limit response headers that the proxy previously dropped. So the plain official install now suffices for his step-by-step recipe:Thanks @Stoffberg for the field report — a compaction turn failing under a zero-reasoning retry was exactly the evidence that settled the review above.
As before: this is a mitigation, not a claim about root cause. The
518n−2quantization is upstream's to fix, and this thread still has no official acknowledgement.Adding one more data point because it may help distinguish two different “cache” discussions here (prompt-cache ratio vs the local model metadata cache).
Environment:
codex-cli 0.142.5gpt-5.5,model_reasoning_effort=xhighLocal A/B observation:
~/.codex/models_cache.jsonwritable / allowed to refresh:Minimum: 11 candiesreasoning_output_tokens=516~/.codex/models_cache.jsonbackup and set that file read-only:21reasoning_output_tokensin the thousands (6732and9175on two runs)Interpretation: on this machine, letting the local
models_cache.jsonrefresh was enough to reintroduce the exact 516-token wrong-answer failure mode. Restoring and locking the known-good cache removed it for the candy eval. This does not prove the whole issue is onlymodels_cache.json, and it is separate from the prompt-cache-ratio telemetry correlation, but it suggests at least one reproducible failure path is coming through refreshed cached model metadata/base instructions.Practical test that matched this locally: unlock
models_cache.json, rerun the candy eval, observe 516 + wrong answer; restore/lock the prior cache, rerun, observe correct 21 with much higher reasoning tokens.@dzshzx I opened a broader reliability PR here: https://github.com/dzshzx/codexcomp/pull/6
It includes the work I’ve been testing locally around Codex WebSocket/state handling, safer hidden continuations, better cleanup/cancellation, zero-reasoning retry removal, and metadata-only diagnostics/health checks.
The main goal is to make
codexcompmore reliable for real interactive Codex sessions, whereprevious_response_id, incremental WS turns, continuation folding, and upstream truncation behavior all interact.I'm having the same issue. Has codex responded to this issue. My codex client keeps ignoring my agents.md file and model instructions pretty much constantly, and I think that this is the core issue.
when I ran my tests i got 516 every single time. Even after adding some terminology to prevent this as written in this thread im getting 516 tokens
did a cleanroom on this, this is a good working solution, my result below (only few turns so far, but so far so good)
It's not just going through the proxy — the proxy has already rescued this very thread. In real traffic since wiring: 2 folds, and they're both from minutes ago, back-to-back in one request: round 1 truncated at 516 → continuation also truncated at 516 → second continuation finished the thought. That's the
reasoning = 1098response in your thread's rollout at 15:41:46 (516 + 516 + 66 to finish) — a double-amputated response that, without the proxy, would have shipped its conclusion on ~516 tokens of thinking. You would have read that answer.So, summary of what's observable right now:
MAX_CONTINUE=3bound.tail ~/.codex/fold_proxy/proxy.log— onedone:line per response;continue (lines are folds in action.@Stoffberg Thank you so much, this works incredibly well.
codexcomp v0.3.4 proxy works well for me, at least for today.
Thanks @dzshzx, @Stoffberg
edit: shared a bit more details in https://github.com/openai/codex/issues/30364#issuecomment-4908844165 below
what does "works well" mean?
Have you guys actually run real world tasks over several hours, and had a deterministic analysis on the reasoning tokens done over those inferences during the "fixed" time?
Or did you just do a canary test and assumed it to be fixed? Have you _zero_ low reasoning responses (unless its a synthetic turn) like you should, like you would have on a PLUS account?
Specifics would help on the case.
This tracks the performance of Codex CLI + GPT 5.5 xhigh on SWE bench pro, and apparently there is no degradation that that particular benchmark: https://marginlab.ai/trackers/codex/
🤷♂️
I also ran some informal tests on this https://huggingface.co/datasets/meituan-longcat/AMO-Bench and ran into the same issues. Seems like these kinds of tasks are hit the hardest by this issue.
You cannot show degradation if the thing is not on a PRO account friend. Have you missed the fact that this affects only a certain level of accounts? PLUS users are not affected. Those websites use the API anyway, which, in my tests... _did_ show the issue, but with a weird pattern (affected in "batches" rather than evenly distributed). Which might explain that degradation oscillation on the reports you link to. In case you did not not notice those reports vary by a whopping 17+% in pass rate the past month alone and 40+% over all time.
Actually if you study those charts there you can see that the degradation is tracked, it is there for all to see.
Models increase, yet performance not. Go and compare that with Claude's historical track. Then you will see what I mean
If you have access to Plus vs Pro go ahead and run those for us then and share the results 🙏. It would be interesting to see if the proxy fix improves real SWE tasks as well.
The benchmark is public: https://marginlab.ai/explorers/swe-bench-pro/
@smileBeda Apologies, I didn’t post specifics earlier because they mostly line up with what others have already reported.
On the candy eval with high reasoning, I get 516 reasoning tokens across 5/5 attempts without the proxy, with 0% accuracy every time. With the proxy, I can push it to around 4,000-5,000 reasoning tokens in up to 4/5 attempts (up to 80% accuracy after several runs, emphasis on up to).
So not claiming this is a fix, but it is clearly better than what I was seeing before. More importantly, I can feel the difference in the consistency of Codex output on my actual tasks, though I haven’t pushed anything past 20 minutes today. Just sharing the experience in case someone is still on the fence, feeling frustrated, and hasn’t tried anything yet.
The oscillation is expected. LLMs are not deterministic. Claude shows the same oscillation, and this is the reason why there is a statistical significance threshold that the results have to cross to be considered viable. This is basic statistics which you are misunderstanding
This is not a sign of degradation as you claim, it's a sign that you did not do your research, and you don't know what you're talking about
You could have easily looked up benchmarks released by OpenAI themselves, these are the expected results:
(sources https://openai.com/index/introducing-gpt-5-4/, https://openai.com/index/introducing-gpt-5-5/)
Notice that it did not go up by much, which explains the relatively flat trend between GPT model releases. Compare that to Claude:
Which explains why that benchmark shows clear trends upwards between Claude model releases.
You keep claiming that PLUS users are not affected, but you have presented no compelling data.
---
The results in this benchmark don't mean that there is no degradation, but it could be that in multi-turn tasks, like SWE, the later thinking blocks end up correcting the earlier degraded ones. But with one-shot tasks like the candy test, the degraded thinking block is much more damaging.
So yes, the candy test is valuable, and is an easy way to reproduce this issue.
Also the proxy solution has been performing well in my own tests, hopefully the codex team fixes this issue soon.
Follow-up from the same local machine as my earlier aggregate: the pattern is still present in records after that comment, including after my Codex Desktop app updated.
Environment / source delta:
2026-07-05T01:49:39Zthrough2026-07-07T22:15:41Z26.623.141536,codex-cli 0.142.5models_cache.jsonmetadata forgpt-5.5:comp_hash=2911,context_window=272000,max_context_window=272000,use_responses_lite=falsetoken_countmetadata only; no prompts, assistant messages, session IDs, thread names, local paths, file names, or cwd values includedturn_contextattribution still showscomp_hash=2911; parsedmodel_context_windowin the token events is258400Post-comment aggregate:
| Scope | Records | Sessions | Mean reasoning | P90 | =512 | >=512 | =512 / >=512 | =516 | >=516 | =516 / >=516 | =1034 | =1552 | =2070 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| all after cutoff | 1,202 | 22 | 204.4 | 516 | 1 | 183 | 0.55% | 88 | 180 | 48.89% | 8 | 3 | 1 |
|
gpt-5.5 / xhigh| 1,160 | 20 | 191.5 | 516 | 1 | 170 | 0.59% | 84 | 167 | 50.30% | 8 | 3 | 1 ||
gpt-5.4 / xhigh| 42 | 2 | 559.0 | 1,325 | 0 | 13 | 0.00% | 4 | 13 | 30.77% | 0 | 0 | 0 |Daily split:
| Date UTC | Records | Sessions | Mean reasoning | P90 | =516 | >=516 | =516 / >=516 | =1034 | =1552 |
| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
| 2026-07-05 | 356 | 3 | 137.3 | 435 | 13 | 29 | 44.83% | 1 | 0 |
| 2026-07-06 | 432 | 15 | 247.7 | 516 | 34 | 77 | 44.16% | 1 | 2 |
| 2026-07-07 | 414 | 7 | 216.9 | 516 | 41 | 74 | 55.41% | 6 | 1 |
Small note: I saw one fresh
reasoning_output_tokens=512record, which is why I checked both512and516. In this local post-comment window,512does not look like a replacement boundary;516remains the dominant fixed point by far, with smaller rungs at1034,1552, and2070.Local takeaway: on this machine, the fixed-value pattern persisted after the earlier comment and after the Desktop app version changed, while the
gpt-5.5model metadata still reportscomp_hash=2911.I've updated the test results here: https://github.com/openai/codex/issues/30364#issuecomment-4886606283
So PRO and PLUS users are both affected? Thanks for the data.
Thats not what I’ve seen in _extensive and deterministic_ tests using real world data as well as dummy tests. These approaches have been shared above. Also historical data of plus vs pro was analysed.
Plus is NOT affected by this on my tests - it reliably did not produce a _single_ failure.
I submitted in-product Codex feedback with session/log sharing for this issue.
Feedback/session ID: 019f3053-7f43-76b0-af62-4e7863889c05
The session includes local repeated canary runs showing gpt-5.5 high clustering at 516 reasoning tokens, wrong answers on the canary, comparison against gpt-5.4 xhigh, and the user impact: I’m currently reluctant to use my paid Codex plan for complex work because I can’t trust that full reasoning was applied without manually inspecting telemetry.
I'm on the Pro $100 monthly plan.
this thread only applies to subsrcription, api does seem to have bucketing but on all my testing it never went below ~1500
so likely they are running api so not really getting hit by this
here's my, didnt do too much todayu, but seems to work well
Here's today's full usage analysis (all times local, UTC−5).
Proxy health — up 10h, zero operational failures
stop=natural— nothing ever hit themax_continue=3cap or the 15-min deadline, so the loop-guard has never had to intervene.Folds — 9 requests folded, 10 truncations caught
| when | what happened |
|---|---|
| 09:08–09:12 (×7) | validation-wave folds (my experiment traffic) |
| 10:41 | real work, thread 019f321e: double-fold — 516 → 516 → finished, delivered as one 1,098-token response |
| 13:51 | real traffic: 516-truncation caught, continuation finished immediately |
The headline number: rung-truncated responses reaching Codex
| segment | responses | rung finals |
|---|---|---|
| organic, before wiring (<09:55) | 37 | 4 (10.8%) — 08:56, 09:40, 09:45, 09:46, all 516 |
| organic, after wiring | 30+ | 0 (0.0%) |
| experiment wave (09:00–09:40, via proxy) | 106 | 0 |
That 10.8% morning rate is right in line with the historical 5.5 baseline, and it went to zero at the moment of wiring. (Note: the big block of 82 rung finals in UTC-day terms was yesterday evening's control-wave experiment, not today's organic use.)
Volume and tokens (local today)
20 sessions active, 173 rollout responses. Organic traffic: ~67 responses, 14.5k reasoning tokens, 32.4k output tokens, ~8.7M input of which ~91% cache hits. Fold overhead so far is negligible — the two real folds re-billed roughly one extra round of input each.
Personally, I do not think cost optimization or automatic routing is inherently the problem.
From OpenAI's perspective, it may not be sustainable to process every request through the most expensive reasoning path all the time. If GPT-5.5 is significantly more expensive than GPT-5.4, then routing simple questions or tasks that do not require deep reasoning to a cheaper model or lower-effort path can be a reasonable product decision.
However, I think the core issue here is not whether routing exists. The issue is transparency around what the user believes they selected versus what they actually received.
If a user selects
gpt-5.5withxhighreasoning, or if the UI/CLI presents the request as being handled that way, the user will naturally expect that level of reasoning quality. But if the response repeatedly appears to stop around a specific reasoning-token boundary, such as 516, and that pattern is strongly correlated with wrong answers or shallow reasoning, users will inevitably start asking whether the selected model and effort level were really applied.Smart routing for cost control can be reasonable. But in that case, the product should make the following clear:
xhigheffort may be reducedIn other words, I understand that routing or reasoning-budget adjustments may be necessary as a tradeoff to avoid much higher prices. But if a user believes they are using
5.5 xhighwhile the request is silently handled through a shallower reasoning path, that looks less like cost optimization and more like a trust problem.The best direction, in my opinion, would be transparency rather than silent limitation: default to smart routing, but allow users to explicitly force full/highest reasoning when needed, with the quota or cost impact clearly shown.
I've updated the test results here: https://github.com/openai/codex/issues/30364#issuecomment-4886606283
@dzshzx, after a
516-triggered continuation, a second round withreasoning_tokens=0can be treated asclean, so the folded response still reaches Codex with total reasoning516.Observed with
--max-n 1:That run still produced an incorrect final answer. Should reason=0 after a truncation-triggered continuation be handled as non-clean?
@josantonius Confirmed, and thanks for the precise repro — that was a real gap. Your read matches the code: a continuation round that answered with
reasoning_tokens=0was classified as clean, so the fold could still deliver a 516-total response.codexcomp v0.3.5 treats that case as a stalled nudge: after a truncation-triggered continuation, a round that comes back with zero reasoning tokens is re-nudged instead of accepted, sharing the same
--max-continuebudget (default 3). If every retry stalls, the last round's answer is still delivered — never dropped — withproxy_stopped_reason: "max_continue"and the per-round breakdown undermetadata.proxy_rounds, so the outcome stays observable.Round-1 zero-reasoning responses are deliberately untouched: a standalone response with 0 reasoning tokens can be a legitimate complete answer (your PRO run 1 without
## Intermediary updatesis an example of exactly that). The stall signal only means something after a confirmed518n−2truncation where the model was explicitly nudged to continue thinking.pip install -U codexcomp(oruv tool upgrade codexcomp). If you get a chance to re-run the--max-n 1scenario, I'd be interested in whether the retry recovers real reasoning or exhausts the budget —proxy_roundswill show it either way.@dzshzx I haven’t run the candies test, but with normal usage the fix is already noticeable. Thanks for fixing it so quickly, great work!
v0.3.4| Records | min | mean | max | >=516 | exact 516 | exact 1034 | exact 1552 | 516 / >=516 | 518n-2 / >=516 |
|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| 507 | 0 | 105.08 | 2584 | 24 | 8 | 0 | 1 | 33.33% | 9 / 24 (37.50%) |
v0.3.5| Records | min | mean | max | >=516 | exact 516 | exact 1034 | exact 1552 | 516 / >=516 | 518n-2 / >=516 |
|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| 265 | 0 | 93.92 | 1367 | 17 | 0 | 0 | 0 | 0.00% | 0 / 17 (0.00%) |
Even with --max-n 1, the improvement is already clear: better consistency and fewer odd failures. I’ll keep testing without limiting it to n1 and see how it goes.
Same issue, this is unacceptable.
5.5 was insufferable the last weeks and now I know why.
not sure if "last few weeks" would fit this issue
to add some more context
verified same pattern on 2 machines with Team plan (mainly using extra usage)
Quite the same problem.
Hope to fix this quickly.
Controlled 5-shot reproduction + effort-level controls — codex-cli 0.143.0 (brew, current), macOS, ChatGPT account,
gpt-5.5.Probe: a closed-form adversarial-drawing puzzle (correct answer 21, verifiable by hand), run via:
Initial 5-shot, identical settings (2026-07-09 14:09–14:11 UTC):
| run | reasoning_output_tokens | output_tokens | final answer |
|---|---|---|---|
| 1 | 516 | 750 | 21 ✓ |
| 2 | 516 | 856 | 29 ✗ |
| 3 | 516 | 749 | 23 ✗ |
| 4 | 516 | 844 | 20 ✗ |
| 5 | 516 | 1,099 | 26 ✗ |
All five pinned at exactly 516 despite varying output lengths (749–1,099); 4/5 wrong. The wrong-answer transcripts visibly run out of thinking mid-argument (run 5 contradicts itself twice before guessing).
Controls ~10 minutes later (14:19–14:21 UTC), same machine/account/CLI:
| run | effort | reasoning_output_tokens | answer |
|---|---|---|---|
| low ×2 | low | 516, 516 | 21 ✓ / 28 ✗ |
| medium ×2 | medium | 516, 516 | 18 ✗ / 21 ✓ |
| high (repeat) | high | 6,102 | 21 ✓ |
Two observations that may help triage:
Also tried isolating by model:
gpt-5andgpt-5.5-codexare rejected on ChatGPT accounts (400), so no cross-model control was possible from this plan.Thread ids from the affected window, in case they help server-side lookup:
019f4736-7ef0-7731-8887-96582769d8ee,019f4736-bc20-73e1-8a1a-5ada9d3172f8,019f4737-02f7-7f32-a4c4-df0c092de935,019f4737-4e4c-7101-9a0d-4d018cc44a93,019f4737-94cc-7130-bc55-012bd5c93a40; healthy control:019f473f-2fa1-7762-b6ea-f9bae4a31269. Full--jsonevent streams available on request.my view of this, that it actually a good thing. As serving llm inference is one of the hardest thing in computing (that actually comes after serving the internet at the 1990s -1995 to 2005, which was a harder task, as it was the first stage where the people making the magic happen - had to lay the grounds and specification as far as the science of things advanced in the last 180 years)
point is the service SLA of openai is very high, and the service quality has being noticeable changed - and its a very impressive thing - despite without the magic happening from the various chemical and semiconductor industry, and their bets and their investments (two different things)
I personally think, for the people who paid for the 20$ or 100$ (I am sure even the 8$ plan is also very fairly respected in terms of usage amount -- I assume from a Data Scientist point of view, you should actually aim to collect more from those users as they are casual - and could be maybe a student which I think is a good thing that the casual user - has a statement in the quality of data - even after the first baby steps where the model keep repeating itself - and doesnt understand very basic english) , I think codex does aim for very high amount of usage Plus, Pro users are able to get (subtracting if there is a very usage bug that causes over usage), but look at this, this way, they never took more than 40%
as per the issue I think most users would report the model is still very capable, I actually predict things going the right directs even in the next few days as of posting this comment. and we dont actually know if Sol , Terra and Luna , are bigger models or the same size. Today it should be launch, those models... as per 9-july-2026 a lot of changes regarding telemtry, api, some technical bugs, so things are going very well despite some truth the proclaimed issue (the counter argument is, that its with in reason, and you still going to get good usage out of it unless you encounter weird glitch that consume too much - which the user shouldnt be blamed if he was to encounter it)
a lot things related - for token rationing. non of this would have made possible if historically 2 years - chatgpt faced one of the hardest issues of being able to provide chats. as per nature, by nature we learn subscription based things are very hard, most people buy a new iphone every 1-2 years - and the margins are not really that big (despite phone stores buying a lot of stock) it being a selling stocks. I personally think its better not to be the only company and being called big tobacco, I also think we are going to see a good changes 50% improvement in the ways we generate electricity (despite Nuclear, Electrical, and chemistry are all indurstries that deeply influence each other)
This issue has really ruined my experience; I hope it gets fixed soon.
~
gpt-5.6-terra lowis not affected, tested with candies prompt~You on a PRO account?
@smileBeda im currently using free tier
5.5 is affected there
@apyrr and how is this related to the issue even remotely?
The issue is affecting PRO users, not PLUS, not Free, not API users.
@smileBeda I tested PRO, PLUS and free - all affected when using 5.5
Then we have more issues than just reasoning being capped.
Because I did _extensive_ tests on a PLUS account and it is 100% not affected.
This means (if your findings are accurate), the issue appears based on specific accounts - possibly flags or similar classification.
I can share videos of PLUS going though properly while PRO fails. Repeatedly and replicably.
Your report also contradicts the earlier findings of _all_ models affected, now suddenly supposedly it is only 5.5?
I have my doubts but will of course assume there is more to it than we know in this case.
Quick and dirty testing results:
gpt-5.6-terra xhigh is affected. I'm seeing some 516 thinking token runs with the wrong answer, also strangely I saw 316 and 353 thinking tokens with the wrong answer as well, which I never saw with 5.5.
Edit 1:
gpt-5.6-sol xhigh same behavior. I just saw worse runs with only 280 and 279 thinking tokens and the wrong answer.
This was on a fresh codex install with no config changes or proxy. This sucks.
Edit 2:
Removing intermediary commentary might help, but maybe not compared to how much it helped with 5.5.
I don't see many 516 thinking tokens, but still too many wrong answers.
Also the system prompt changed for 5.6, so that should be taken into account.
pro reasoning mode:
https://developers.openai.com/api/docs/guides/reasoning#reasoning-mode
I submitted/collected additional local Codex session evidence in session:
019f3053-7f43-76b0-af62-4e7863889c05
This session includes fresh 2026-07-09 canary tests for gpt-5.6-sol, gpt-5.6-terra, and gpt-5.6-luna. Results: Sol high was 5/5 correct with no 516 cluster; Terra high had a wrong 516-token run; Luna high had two wrong 516-token runs.
Following up on https://github.com/openai/codex/issues/30364#issuecomment-4908844165
I think I no longer need a proxy for gpt-5.6-sol. Previously, all 5 attempts on the candy eval with 5.5 failed (all blocked at 516 reasoning tokens). 5.6 Sol (high) completes every attempt with 1,500-2,000 reasoning tokens allocated.
gpt-5.6-terra and gpt-5.6-luna are dumb as bricks, though. Terra (high) used 200-300 reasoning tokens and failed every attempt. Luna (high) was typically capped at around 500 (not exactly 516), with the same result.
Try more than 5 runs with
gpt-5.6-sol xhigh. I had 5/5 successes, until I ran another 10 just to be sure, and had one failure with 388 thinking tokens with the wrong answer. Smells like an adaptive thinking related issue, but it's rare.Also I'm getting less of these issues than before,
gpt-5.6-sol xhighworks much better on the candy eval now compared to 6 hours ago.@NarinderS Maybe I'm lucky, but no failures after 10 attempts on xhigh. I think I'll focus on work now before they "optimize" this model as well. 😅
FWIW, tried it with the full suite of 5.6 agents:
Evaluation criterion
Each shot below is shown as final answer / reasoning_output_tokens.
Results
I cannot confirm this, tested on
5.6-sol-max5 out of 5 correct and no low reasoning shortcuts.
Others above also confirmed this to be solved.
---
Needless to say that the story here should not be over. 5.5 is still very much alive and kicking and clearly capped. OAI has to take a stance on this and explain what is happening, instead, we are faced with corporate silence. This is not exactly trust-inducing since the very same could happen any moment with new models, without anyone even realizing due to the otherwise sheer quality of these models. Still it is what we buy, and kind of expect to receive: a high reasoning model.
The issue persists.
I tested GPT-5.6 Sol across 125 runs. The results are shown below. For the detailed test parameters and analysis, see the attachments.
| Reasoning effort | Runs | Correct | Accuracy | Continuations | Continuation rate | Avg. latency (s) | Avg. reasoning tokens |
| ---------------- | ---: | ------: | -------: | ------------: | ----------------: | ---------------: | --------------------: |
| Light | 25 | 25 | 100.00% | 4 | 16.00% | 45.980 | 1027.40 |
| Medium | 25 | 24 | 96.00% | 6 | 24.00% | 54.167 | 1409.76 |
| High | 25 | 24 | 96.00% | 6 | 24.00% | 76.543 | 2154.44 |
| Extra High | 25 | 25 | 100.00% | 13 | 52.00% | 125.676 | 3805.00 |
| Max | 25 | 25 | 100.00% | 14 | 56.00% | 171.892 | 5365.27 |
I used CodexComp to continue truncated responses. Of the 125 test runs, 43 required continuation. Of these, 36 ran for two rounds and 7 ran for three rounds, producing 50 additional continuation rounds in total.
The table below counts hits on fixed reasoning-token truncation breakpoints by model round, not by response or additional round. A single response can hit a breakpoint in multiple rounds, so the total number of breakpoint-hit rounds is 67.
| Reasoning tokens at truncation | n | Rounds hitting breakpoint |
| -----------------------------: | --: | ------------------------: |
| 516 | 1 | 14 |
| 1034 | 2 | 14 |
| 1552 | 3 | 4 |
| 2070 | 4 | 7 |
| 2588 | 5 | 6 |
| 3106 | 6 | 4 |
| 3624 | 7 | 4 |
| 4142 | 8 | 1 |
| 4660 | 9 | 2 |
| 5178 | 10 | 1 |
| 5696 | 11 | 6 |
| 6214 | 12 | 1 |
| 6732 | 13 | 2 |
| 7768 | 15 | 1 |
GPT-5.6 Sol Candy Test Analysis Report.md
GPT-5.6 Sol Candy Test Results.md
Its not all you can eat Baff'e
I recomend you try and stick to GPT Terra - medium
for most task you will also enjoy the better speed