Sub Agents are Fully Hydrating Parents Context

Ran an overnight branch coordinator in an old long horizon, large context work session. Woke up this morning to 4% usage remaining. My wife’s machine was running the same set up and she consumed half the usage I did so we started an audit.

Everything between our machines was Apples:Apples yet my machine consumed 2.6x the usage she did Token:Token. Turns out the subagents that Sol Ultra creates first hydrate their parents entire contextual history. 360 subagents hydrating a long context thread compared to 352 subagents running in a new session cost 2.6x the usage tax.

Just thought someone would like to know

I went digging (more accurately I got Codex to go digging :laughing: ) through the current Codex source after reading this, and there appears to be a very real mechanism underneath what you found.

From what I can tell, MultiAgent V2 defaults fork_turns to all, which becomes a FullHistory fork. It does filter out things such as reasoning/tool-call artefacts, so it is not literally copying every byte of the parent’s rollout, but the child does inherit the parent’s retained model/conversation history unless a narrower fork is requested.

That suddenly makes me look rather nervously at my own usage. I have multiple long-running sessions, and one thread alone had accumulated roughly 120 sub-agents last time I counted. If those have been repeatedly spawning from an increasingly mature parent context, that would explain quite a lot of what I have been seeing.

Very useful catch! This may be as much a context-topology/orchestration issue as a rate-limit issue.

Nothing to be ashamed of, use the tools to their strengths! :clap:

Couldn’t agree more … I’ve got Codex doing way more than just coding :slight_smile:

Here is a complete, pasteable baseline for ~/.codex/config.toml. It preserves maximum root-agent reasoning while preventing inherited Ultra behavior and strongly discouraging FullHistory forks.

# ~/.codex/config.toml

# Root-agent defaults.
model = "gpt-5.6-sol"
model_reasoning_effort = "max"

# Keep planning capable without enabling Ultra orchestration.
plan_mode_reasoning_effort = "high"

model_reasoning_summary = "auto"
model_verbosity = "medium"

# Conservative execution defaults. Preserve your existing values if preferred;
# these settings do not affect context hydration.
approval_policy = "on-request"
sandbox_mode = "workspace-write"

# There is currently no hard config option for the default fork_turns value.
# These instructions therefore make explicit, isolated forks the policy.
developer_instructions = """
Multi-agent delegation policy:

- Do not spawn subagents unless the task contains at least two independent workstreams and delegation materially improves the outcome.
- Every spawn_agent call must set fork_turns explicitly; never rely on its default.
- Use fork_turns: "none" by default.
- Use a small positive fork_turns value only when the child needs specific recent decisions.
- Use fork_turns: "all" only when the full retained conversation is essential to completing the delegated task.
- Never select reasoning_effort: "ultra" for a subagent.
- Subagents must not spawn further subagents unless the user explicitly requests recursive delegation.
- Reuse an existing subagent for follow-up work instead of spawning a replacement when practical.
"""

[agents]
enabled = true

# Keeps child quality equivalent to the root without inheriting Ultra's
# proactive delegation behavior.
default_subagent_model = "gpt-5.6-sol"
default_subagent_reasoning_effort = "max"

# At most two spawned-agent threads may be open concurrently.
# This excludes the primary/root thread.
max_concurrent_threads_per_session = 2

# Preserve visible interruption records.
interrupt_message = true

The important hard controls are default_subagent_reasoning_effort = "max" and the concurrency cap; explicit spawn arguments can still override the child default. The fork_turns rules are advisory because Codex currently has no configuration key that changes its FullHistory default. These keys are documented in the official Codex configuration reference and implemented in config_toml.rs.

If you intentionally want an Ultra root while preventing Ultra children, change only:

model_reasoning_effort = "ultra"

Keep:

default_subagent_reasoning_effort = "max"

That produces:

Ultra root → proactive orchestration
Max children → maximum reasoning, no inherited proactive mode

For a cheaper child tier, change these two lines:

default_subagent_model = "gpt-5.6-terra"
default_subagent_reasoning_effort = "high"

GPT-5.6’s official guidance recommends reserving max for the hardest quality-first workloads and comparing it against lower efforts for cost and latency. OpenAI model guidance

For the absolute off switch:

[agents]
enabled = false

[features]
multi_agent_v2 = false

Merge the baseline into your existing file instead of replacing it if you already have MCP servers, plugins, project trust entries, or permission profiles. Restart Codex and begin a new thread afterward; an existing resumed thread may retain its conversation-level Ultra selection.