The Sol Ultra Swarm Trap
We unpack a Codex Desktop swarm gone wild: hundreds of spawned agents, a 130 GB memory spike, and why the Sol Ultra profile silently gets inherited by every child agent. Then we walk through practical fixes, from exposing hidden schema metadata to limiting fork history and capping agent nesting depth.
Chapter 1
The Sol Ultra Swarm Trap
Ethan Park
So, Maya, I- I- I was looking through the GitHub tracker last night, and I stumbled on this issue, number 33390, that is just... it is an absolute horror story for anyone running local development. This developer was running a routine repository audit, right? Just scanning some code, and they triggered a multi-agent swarm. Before they knew it, this thing had spawned 328 spawn_agent tool calls, spinning up 386 distinct thread IDs. And the kicker? Codex Desktop consumed 130.58 GB of memory.
Maya
One hundred and thirty gigabytes? On- on a local machine? That's not a memory leak, Ethan, that's a hostile takeover! I mean, most high-end developer setups, like a beefy MacBook Pro, max out at 24 or maybe 36 gigs. A 24-gig Mac would just melt trying to swap that much data to the SSD.
Ethan Park
Oh, it did. It brought the entire system to a grinding halt. Just endless macOS out-of-memory alerts. But the really wild part isn't just the sheer scale of the swarm. It's *why* it got so heavy. It turns out, under the hood, there's this feature called the Multi-Agent V2 runtime. And if your main parent agent is running on the "Sol Ultra" profile... you know, with the model_reasoning_effort set to "ultra"... it silently, and I mean completely silently, upgrades every single spawned sub-agent to that exact same Sol Ultra profile.
Maya
Wait. So if the parent is pulling out the heavy-duty, expensive reasoning model, every little helper agent it spawns to, say, read a single file or regex a string, also gets upgraded to Sol Ultra? Even if you explicitly configured them to be lightweight?
Ethan Park
Exactly. It completely bypasses your local agent configurations. So you think you're spinning up a bunch of cheap, quick helper agents, but instead you've got three hundred and eighty-six mini-Einstein minds running at maximum effort. And if you're hooked up to your ChatGPT Plus or custom enterprise API keys, those token quotas? Vanished. Gone in minutes.
Maya
That is terrifying. It's like calling a team of specialized surgeons just to hand you a band-aid. But why is it doing this? Is it just a bug, or is there some weird architectural decision behind it?
Ethan Park
It's actually a schema-constraint issue. See, in Multi-Agent V2, OpenAI tried to prevent token bloat. The old default schema for collaboration.spawn_agent had all these fields where you could specify the agent_type, the model, the reasoning_effort. But they stripped all those arguments out to save context window tokens. And to make matters worse, there's this parameter called fork_turns which defaults to "all". That means when a sub-agent is spawned, it gets a full-history fork of the parent's conversation. Because it's a full fork, the runtime just rejects any manual model overrides you try to pass it, and it forces the child to inherit that heavy Sol Ultra profile from its parent.
Maya
Ah, I see. So because it wants to carry over the whole conversation history, it- it basically says, "Well, I have to keep using the same massive engine to understand this context." And you're left with a 130-gigabyte memory footprint. It's a complete trap.
Chapter 2
Taming the Swarms with Schema Control
Ethan Park
It really is. But the good news is, there are actually ways to fight back and re-tame these swarms. You don't have to just sit there and watch your system memory evaporate.
Maya
Okay, spill. How do we break this inheritance chain? Because I am not letting an agent spawn three hundred sub-agents on my watch.
Ethan Park
Well, the first step is exposing those hidden overrides. There's a hidden feature flag in your configuration file. If you open up your config at ~/.codex/config.toml, you need to go to the section and set hide_spawn_agent_metadata = false. By default, this is set to true, which is what hides the metadata and breaks model selection. If you set it to false, it restores what developers are calling "v1 parity." It forces the schema to actually expose those advanced arguments to the model, so the parent model can actually see and select cheaper specialist models, like gpt-5.6-luna, instead of defaulting to Sol Ultra every time.
Maya
Oh, interesting. So by exposing that metadata, you're giving the master model the option to say, "Hey, this is a simple task, let's use the lightweight Luna model instead of the heavy-duty Sol." But what about that fork_turns issue you mentioned? The whole "all history" inheritance thing?
Ethan Park
Right. To fix that, you have to look at your workspace instructions. If you inject fork_turns = "none" into your instructions, it tells Codex to spawn a fresh, clean specialist sub-agent. No conversation history baggage. And when it's a fresh agent, it actually honors your custom agent profiles under .codex/agents/*.toml—meaning you can explicitly set a lower reasoning effort there, and it will actually stick.
Maya
Okay, so fork_turns = "none" is like giving the sub-agent amnesia so it doesn't bring the whole family history with it, which lets it run lightweight. That makes total sense. But what if a swarm just goes completely rogue? Like, is there a panic button? A way to just say, "No, you cannot go deeper than one level of nesting"?
Ethan Park
Yes, absolutely. And honestly, if you're running headless automation or CI/CD pipelines, you *have* to set this. You can use the CLI configuration option agents.max_depth = 0. Or, if you're running a specific command, you can pass it inline like codex exec --config agents.max_depth=0. What this does is it hard-stops any recursive nesting. If an agent tries to delegate a task to another agent, the system blocks it and forces Codex to fall back to serial execution. It essentially clips the wings of the swarm before it can even start.
Maya
Oh, thank goodness. That is a massive relief for automated pipelines. But while we're talking about updates, didn't they just roll out some quick fixes in the latest versions to address some of this stuff?
Ethan Park
They did! Version 0.144.6 brought a really important hotfix for model metadata. They corrected the context windows for the GPT-5.6 suite—specifically the Sol, Terra, and Luna models—to exactly 272,000 tokens. Before this, the system was getting confused about how much context it could handle, which was causing its own set of routing headaches.
Maya
Mm, 272,000 tokens is a lot of room, so having that metadata corrected is huge for stability. I also noticed they updated the TUI—the terminal user interface—with a new /usage credit redemption screen. It actually displays your credit types and their expiration dates now, so you don't accidentally burn through your high-priority Ultra credits on a massive, unintended debug session.
Ethan Park
Yeah, that visibility is key when you're managing costs. And on the safety front, they also pushed a patch in v0.144.5 that expands the dangerous-command filtering. It catches a lot more variations of the rm command, so even if a rogue agent swarm gets out of hand, it's blocked from doing any serious damage to your local file system.
Maya
Well, that's reassuring. I'd prefer my agents not to delete my entire hard drive while they're busy eating up a hundred and thirty gigabytes of RAM. Alright, I'm going to go flip that hide_spawn_agent_metadata flag right now. Good talking to you, Ethan!
Ethan Park
Yeah, definitely check that config. Talk soon, Maya.