Codex Encrypts Multi-Agent v2 Prompts: What You Can No Longer Read
Codex PR #26210 turned MultiAgentV2 spawn_agent, send_message and followup_task text into ciphertext. Which models get v2 by default in Codex 0.164.0, what the July plaintext PR changed, and how to keep a readable sub-agent trail.
Takeaway: If Codex runs sub-agents on GPT-6, GPT-6.1 Sol or GPT-5.6 Sol/Terra, you can’t read the task text the parent sends them. Those models default to Multi-Agent V2, and V2 stores the message from spawn_agent, send_message and followup_task only as ciphertext that Codex can’t decrypt locally. Setting features.multi_agent_v2 = false does not opt you out. The model’s catalog entry overrides it. The bug report (#28058) is still open as of October 23, 2026, with no maintainer response. A July PR added a plaintext path, but whether you get it is decided per call, not by you.
What changed, and what has happened since
- June 5, 2026, PR #26210 (“Encrypt multi-agent v2 message payloads”): Responses encrypts the
messageargument the model returns, Codex forwards only that ciphertext, and Responses “decrypts it internally for the recipient model.” Locally,InterAgentCommunication.contentis empty, and the task text exists only inencrypted_content. Multi-agent v1 was not changed. - July 14, PR #33030:
list_agentsnow returns only each agent’s name and status. It no longer shows the last task message, which was one more place you could see what an agent had been told. - July 28, PR #35845 (“Support plaintext collaboration tool messages”): when a function call arrives with an empty
encrypted_function_argslist, Codex deliversspawn_agent/send_message/followup_taskas structured plaintext. In the PR’s words, it will “retain encrypted delivery otherwise.” Plaintext arguments are redacted from tool and communication logs, and the metadata is stripped for non-OpenAI providers. One commenter on #28058 reads this as mainly enabling third-party models, with the server still deciding which form each call uses. That is a community reading, not an OpenAI statement. - Still being reproduced: users on #28058 report ciphertext-only parent and child histories on Codex desktop with the bundled CLI 0.151.0-alpha.7.2 (September 1) and on CLI 0.154.0 with
gpt-5.6-sol(September 14). The thread has 40 comments, the most recent from October 13, and none from a maintainer. The current release is Codex 0.164.0 (October 23).
Which models use V2 (the encrypted path)
How Codex picks the version, from multi_agent_version_for_model in codex-rs/core/src/config/mod.rs:
features.multi_agent_v2 = trueforces V2.[agents] enabled = falseturns sub-agents off entirely.- Otherwise, the model catalog’s
multi_agent_versiondecides. - Only if the catalog doesn’t set one do the feature flags apply, and the collab feature gives you V1.
So multi_agent_v2 = false only matters for models whose catalog entry has no version. Community member Alek2077 reported this precedence on #28058 in July. Here is the catalog bundled with the rust-v0.164.0 tag (codex-rs/models-manager/models.json):
| Model | multi_agent_version | Sub-agent task text |
|---|---|---|
| gpt-6-astra, gpt-6.1-sol, gpt-6-sol, gpt-6-luna | v2 | Encrypted |
| gpt-5.6-sol, gpt-5.6-terra | v2 | Encrypted |
| gpt-daybreak-blue-latest, gpt-daybreak-red-latest | v2 | Encrypted |
| gpt-5.6-luna | v1 | Readable |
| gpt-5.5 | not set (falls back to features) | Readable on v1 |
That’s the catalog shipped in the client. Codex can also load a catalog from OpenAI at runtime, so check your own sessions instead of relying on this table.
How to check your own sessions
- Run
codex --version. Anything after 0.137.0 has the encryption path (#28058 dates it from builds after 0.137.0). - Open the rollout files under
~/.codex/sessions/and search forspawn_agent. If themessagevalue is an opaque blob instead of a sentence, you’re on V2 with encryption. - In the child’s history, the
NEW_TASKentry shows a readable sender and recipient header followed byencrypted_content, which matches the September 14 report on #28058. - For any audit job, read
encrypted_contentonly to confirm a message existed.contentis empty, and nothing on your machine can decrypt it.
Keeping a readable trail
These are listed from least to most effort. None of them is an official OpenAI recommendation.
- Use a model whose catalog entry is v1 or unset. In the table above, that’s gpt-5.6-luna (v1) or gpt-5.5 (no entry). Sub-agents then use V1, and the task text stays readable in the rollout.
- Turn sub-agents off with
[agents] enabled = falsein~/.codex/config.toml, and run any parallel work as separatecodex execprocesses whose prompts you write yourself. - Override the catalog.
model_catalog_jsonis aconfig.tomlkey that points to a JSON model catalog, applied at startup. On #28058, ignatremizov describes forcing the GPT-5.6 family to v1 by keeping a custom catalog withmulti_agent_versionchanged. I haven’t tested this. The file needs the full catalog format (“must contain at least one model”), so start from a copy ofmodels.jsonfor your Codex version and repeat that after every upgrade. - Build your own orchestration on the app-server API, or maintain a fork. On #28058, ignatremizov posted an A/B recording in which a fork with the V2 tool switched to plaintext showed the exact
spawn_agenttask. That fork isn’t upstream. - Use a different harness. In Claude Code, sub-agent prompts are readable in the local transcript. Our head-to-head compares the two under autonomy.
Troubleshooting and FAQ
I set features.multi_agent_v2 = false and the messages are still encrypted. That’s expected for any model whose catalog entry says v2. See the version-selection order above.
Can I decrypt encrypted_content on my machine? No. By the PR’s design, Responses encrypts the content and decrypts it for the recipient model. No local key exists.
Does PR #35845 mean it’s fixed? Only partly. Codex can now deliver plaintext when the call carries the empty-encrypted_function_args marker, but encrypted delivery remains the default otherwise, and #28058 is still open. Reports from September show ciphertext on 0.151 and 0.154.
Why can’t I type into a V2 child agent directly? That’s a separate change. On #28058, a user links #33885 / PR #33841: V2 thread-spawn children reject direct input, so corrections have to go through the parent, as another encrypted message.
Is multi-agent v1 affected? No. PR #26210 leaves v1 unchanged.
Why did OpenAI do this? OpenAI hasn’t said. On the Hacker News thread (425 points and 249 comments as of October 23), the leading theory is protecting orchestration prompts from competitors who might train on them, the same logic as hiding raw reasoning traces. That is speculation.
Related
- How to switch to GPT-6.1 Sol, one of the models on the V2 path
- How to switch to GPT-5.6
- OpenAI Codex record and replay
- How to use Codex Security, a different Codex CLI for vulnerability scanning
Sources
- openai/codex PR #26210: Encrypt multi-agent v2 message payloads (merged June 5, 2026)
- openai/codex PR #33030: Remove task messages from
list_agentsoutput (merged July 14, 2026) - openai/codex PR #35845: Support plaintext collaboration tool messages (merged July 28, 2026)
- openai/codex Issue #28058: Regression: encrypted MultiAgentV2 messages remove readable task audit trail (open, checked October 23, 2026)
- openai/codex source at
rust-v0.164.0:codex-rs/models-manager/models.json,codex-rs/core/src/config/mod.rsandcodex-rs/config/src/config_toml.rs - Hacker News: Codex starts encrypting sub-agent prompts
Source: openai/codex PR #26210