Skip to content

GPT-5.6 often serializes independent Code Mode calls; explicit batching reduced weighted usage by 27–45% #35050

Description

@MakerOfToys

What version of the Codex App are you using (From “About Codex” dialog)?

26.721.30844

What subscription do you have?

ChatGPT Pro for the personal-project tests; ChatGPT Business for the work-project tests.

What platform is your computer?

Microsoft Windows NT 10.0.26200.0 x64

What issue are you seeing?

Related to #32503, but this report adds controlled same-model benchmarks, credit-weighted usage measurements, quality comparisons, and a tested workaround across two unrelated codebases.

I began investigating this independently after noticing an unusually high number of recent complaints about Codex usage depletion. I had not personally noticed an obvious long-term reduction in my limits, so I inspected my own .codex session logs rather than assume that allowances had been silently changed.

Only after reaching the batching hypothesis and completing my initial tests did I search for similar reports and find #32503. Its author had already identified essentially the same Code Mode parallelism problem from a long observational trace, including only 5 of 739 GPT-5.6 exec cells using Promise.all. The tests below appear to provide the controlled validation that report said was still missing.

I tested two unrelated repositories:

  • one large proprietary work codebase;
  • one smaller personal finance application.

Each repository had one fixed read-only investigation task. Within each comparison, the subscription plan, repository state, task prompt, model, reasoning effort and permissions were unchanged. Only the presence of the batching instruction differed. No code was modified during the investigations.

Main results

Dataset Sample Model cycles Raw tokens Weighted usage Same-credit capacity
Large work codebase 4 batched runs vs 3 controls, High 52.1% fewer 63.1% lower 45.0% lower 81.8% more
Personal finance app 4 matched pairs, High/XHigh 54.7% fewer 52.6% lower 27.0% lower 37.0% more
Personal finance app, Max 1 matched pair, adjusted 80.4% fewer 79.5% lower 47.4% lower 90.2% more

The Max result is a single pair and needs replication. It still covered all required areas and aligned on the core conclusions, but the batched report referenced fewer unique files than its control, so I treat both its efficiency and quality result cautiously. The repeated High/XHigh results are the stronger basis for the current conclusion.

The exact improvement varied substantially by workload. I am not claiming that every Codex task will gain 37–82% more capacity.

“Weighted usage” is the Codex-credit equivalent calculated from the returned uncached-input, cached-input and output-token categories. Reasoning tokens are included in output tokens.

Most of the raw-token reduction came from repeated context processing:

  • cached input fell by 56–65% in the repeated datasets;
  • uncached input fell by 5–26%;
  • output changed by only about 0–12%.

This is consistent with batching reducing outer model round trips rather than simply reducing the amount of investigation performed.

Normal-usage observation

At work I deleted my .codex directory and allowed it to rebuild from scratch.

By July 23, the fresh logs had accumulated roughly 1,600 calls that a post-hoc Codex analysis classified as independent and batchable. Only a little over 100 had actually been grouped by the agent.

This was not part of the controlled benchmark, but it suggests that GPT-5.6 sometimes discovers batching on its own while doing so very inconsistently without concrete instructions.

Quality

I did not find an apparent systematic quality reduction.

Across the Finance comparisons:

  • both conditions covered every required investigation area;
  • the main conclusions aligned;
  • the aggregate performed 106 batched inspections versus 105 control inspections.

On the large codebase, the batched runs performed substantially more shell operations than the controls while still using much less.

Batched runs sometimes found additional useful details. Subtle quality differences may still exist, and implementation-heavy or mutation-heavy tasks may behave differently from these read-only investigations.


What steps can reproduce the bug?

  1. Choose a read-heavy repository task involving several independent searches, file reads or metadata inspections.

  2. Freeze the repository state.

  3. Start fresh GPT-5.6 Sol sessions using the same:

    • task prompt;
    • reasoning effort;
    • permissions;
    • repository state.
  4. Run one condition without custom batching guidance.

  5. Run the other with this exact instruction in either repository AGENTS.md or the Codex App custom instructions:

In Code Mode, within each bounded stage, run independent, functions.exec-available tool calls concurrently in one functions.exec call. Use await Promise.allSettled([...]) when partial results are useful, and inspect every result; use await Promise.all([...]) only when any failure should abort the batch. Keep dependencies, waits/resumes, approvals, conflicting or interdependent mutations, and adaptive investigations where each result may change the next step sequential. Do not split otherwise batchable inspections across outer tool calls.
  1. Compare the session logs:

    • outer model/tool cycles;
    • direct tool calls and exec cells;
    • nested calls per exec cell;
    • use of Promise.all or Promise.allSettled;
    • cached, uncached and output tokens;
    • task coverage and final conclusions.

The controlled repository comparisons used AGENTS.md. I also used the same instruction through app-level custom instructions and observed the same multi-call Code Mode batching pattern.

Despite using older functions.exec terminology, it reliably caused GPT-5.6 Sol to group multiple nested operations into concurrent Code Mode stages.


What is the expected behavior?

GPT-5.6 Code Mode should receive concrete guidance to:

  • group independent, non-conflicting calls into one bounded exec stage;
  • use Promise.all or Promise.allSettled for nested concurrency;
  • keep dependent, adaptive, approval-sensitive and conflicting operations sequential;
  • avoid repeated one-call exec cells when multiple independent calls are already known;
  • avoid expanding investigation scope only because more calls can be launched concurrently.

The model-facing exec description should include an example containing multiple nested tools.* calls inside Promise.all(...) or Promise.allSettled(...).

It would also help if telemetry distinguished outer model cycles from nested tool calls and showed quota-weighted usage more directly.


Additional information

GPT-5.2 through GPT-5.5 were explicitly instructed to parallelize common independent reads using multi_tool_use.parallel.

GPT-5.6 moved to the Responses Lite and Code Mode path. Native top-level parallel calls are disabled there, while JavaScript inside exec is the practical replacement. The runtime supports nested concurrency, but the shipped GPT-5.6 guidance is generic and the exec example demonstrates only a single nested call.

I may be missing an internal constraint or implementation detail, but the public source, local traces, controlled behavior and the independent findings in #32503 are consistent with an instruction/tool-interface regression during that transition.

I do not see evidence that this was an intentional allowance reduction. OpenAI added a replacement batching mechanism; the model appears not to use it reliably without concrete guidance.

I also tested several rewritten instructions using the current exec and tools.* terminology. One essentially matched the original instruction on the large codebase, but none consistently matched its Finance results. Some expanded investigation scope, while others produced one-call Promise.allSettled cells that provided little real batching. One overly aggressive variant consumed 26.8% more weighted credits than its control.

Limitations

These tests covered read-heavy repository investigations.

The large-codebase result used grouped averages rather than matched simultaneous pairs. The Max result and each revised instruction variant currently have only one pair. Model sampling, service load and differences in peripheral investigation scope remain sources of variance.

“Same-credit capacity” means more comparable completed work from the same allowance. It does not mean the allowance necessarily lasts the same additional percentage in literal wall-clock time, because the batched tasks also tend to finish faster.

Additional sanitized per-run measurements are available on request.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    appIssues related to the Codex desktop appbugSomething isn't workingmodel-behaviorIssues related to behaviors exhibited by the modeltool-callsIssues related to tool calling

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions