Retiring approval_policy="untrusted" without deprecation weakens the execution-approval boundary
Summary
Codex 0.149.0 retired approval_policy = "untrusted" in #39630 and now refuses to start when an existing configuration contains it:
``text``
Error loading configuration: approval_policy = "untrusted" is no longer supported; remove this setting
Simply removing the setting is not a neutral migration. For a project configured with trust_level = "trusted", the effective default becomes on-request, which provides a materially weaker command-
execution approval boundary.
This is a breaking security-policy change shipped without a deprecation period, without an equivalent replacement, without migration guidance in the prominent release notes, and while the official
documentation still describes untrusted as valid and recommends it for this use case.
## Previous security boundary
With:
```toml
default_permissions = "readonly-net"
approval_policy = "untrusted"
approvals_reviewer = "user"
[permissions.readonly-net]
extends = ":read-only"
[permissions.readonly-net.network]
enabled = true
[permissions.readonly-net.network.domains]
"*" = "allow"
[projects."/path/to/project"]
trust_level = "trusted"
```
the policy provided two separate controls:
- The permission profile constrained filesystem and network access.
- The
untrustedapproval policy required approval before executing commands outside the known-safe command set.
This meant repository scripts, build tools, dependency hooks, arbitrary executables, and commands with external execution paths could not run merely because they fit within the OS sandbox.
## Boundary degradation after removal
The error tells users to remove the setting. In a trusted project, doing that selects on-request.
Under on-request, commands that fit inside the active permission profile may run without approval. approvals_reviewer = "user" does not restore the previous behavior; it only controls who reviews
actions already classified as requiring approval.
In the example above, read-only filesystem enforcement remains, but arbitrary code can potentially execute with:
- read access granted by the permission profile;
- unrestricted outbound network access; and
- no approval prompt merely because the command is not known-safe.
That is a meaningful security-boundary degradation. Read-only protection prevents modification, but it does not prevent sensitive-data disclosure. Repository-controlled code or a compromised
dependency may be able to read accessible credentials or configuration and send them over the network.
Before:
``text``
Known-safe command?
├─ Yes: run within the sandbox
└─ No: require user approval
After following the instructed migration:
``text``
Can the command run within the sandbox?
├─ Yes: it may run automatically
└─ No: request additional permission or fail
These are not equivalent security postures.
Marking every project trust_level = "untrusted" is also not an equivalent migration. According to #39630, untrusted projects now request approval for every command unless an exec-policy rule allows
it. That is stricter than the retired policy, must be configured per project, and changes the meaning of project trust to compensate for the removal of a global approval policy.
## No reasonable deprecation process
PR #39630 was merged on August 20, 2026 and included directly in 0.149.0.
Retiring a public security control in a single release by turning previously valid configuration into a startup failure—without first warning users, documenting a migration, or providing a
behaviorally equivalent replacement—is not a reasonable deprecation strategy.
For a security-sensitive setting, the startup error is especially problematic because its only remediation is:
> remove this setting
It does not warn that removal may weaken the execution-approval boundary. It does not explain that trusted projects will fall back to on-request. It does not point to an equivalent supported
configuration because no equivalent appears to exist.
This retirement process makes no sense from either a compatibility or a security perspective. A normal process would include:
- A deprecation warning for at least one release.
- Documentation of the precise behavioral difference.
- An equivalent supported migration path.
- Automatic migration where possible.
- A prominent breaking-change notice before enforcement.
## Missing from the prominent release notes
The change is present only as an entry deep in the generated full changelog:
- #39630 — “Retire the untrusted approval policy”
It is absent from the curated New Features, Bug Fixes, and Documentation sections of the 0.149.0 release notes.
A change that invalidates existing configuration and alters a security boundary should be called out prominently as a breaking change, not left as one line among the generated commit list.
## Official documentation still says it is valid
At the time of filing, current official documentation still treats untrusted as supported:
- The configuration reference lists
approval_policyvalues includinguntrusted:
https://developers.openai.com/codex/config-reference/
- “Agent approvals & security” documents
--ask-for-approval untrusted, describes its known-safe behavior, and provides an explicitconfig.tomlexample:
https://learn.chatgpt.com/docs/agent-approvals-security
The documentation therefore directs users to configure a value that current Codex rejects at startup.
## Reproduction
- Install a Codex version that supports
approval_policy = "untrusted". - Add this to
~/.codex/config.toml:
``toml``
approval_policy = "untrusted"
- Upgrade to Codex CLI 0.149.0.
- Run:
``sh``
codex resume
- Observe:
``text``
Error loading configuration: approval_policy = "untrusted" is no longer supported; remove this setting
## Requested resolution
Please consider:
- Restore
untrustedtemporarily and emit a deprecation warning. - Provide a supported replacement that preserves its actual semantics:
- run a limited known-safe command set automatically;
- require user approval for other command execution;
- keep this independent of filesystem/network sandbox restrictions.
- Add an explicit migration warning explaining that removing the setting selects
on-requestfor trusted projects and weakens the approval boundary. - Document the change prominently under “Breaking changes” in the 0.149.0 release.
- Correct all official documentation before removing support.
- Establish and document a deprecation policy for security-relevant configuration.
## References
7 Comments
+1 for restoring it, as there is no replacement for people who don't use the sandbox and thus do not rely on the sandbox elicitations
+1 I have the same problem, I didnt even followed the steps of the user, I just opened yesterday chatgpt app as usual and the error showed up :(. I dont understand how to fix it too, I just use chatgpt day by day so I haven't configured anything complex or something that would lead to this behavior.
I hope it can be fixed soon
<img width="740" height="287" alt="Image" src="https://github.com/user-attachments/assets/2b26d245-0bf1-4232-8c0a-c1cd044bce55" />
UPDATE:
I asked another AI and I could fix it !
As the OP stated, this is AFAICT not an equivalent configuration. "on-request" lets the agent (not the harness) decide whether to ask for permission to perform actions / edit files / etc. This then would lead to a less secure state. So while it does let you continue working with Codex, it does not IMHO solve the issue.
+1 This seems like a significant problem to me — at least, bigger than the nonexistent response to it would seem to suggest it. The lack of response and lack of community discussion is troublesome. The most popular LLM degrades user security and control with no warning and just expects all users, even ones who care about security and control, to go along with it... or stop using ChatGPT. I don't want to do either so hopefully it's fixed.
I have the same problem. The ChatGPT app doesn't fully start and shows the error message, and the Visual Studio Code extension doesn't start either (even without an error message).
I also see an issue with this change, as it changes the security behavior without providing a migration path, and there doesn't seem to be an equivalent option anymore. The only alternative appears to be making it unnecessarily strict by requiring approval for every command.
It's also unclear why this change was made in the first place.
I don't know what to do now, as none of the available options match the behavior I had before. The current options are either too permissive or too restrictive.
Even before this change, the harness lacked an option for a very simple but very effective security model of
run what's pre-approved, ask user confirmation for everything else. That was simply not possible due to the whole security model requiring a sandbox dependency. This change does not make it better, on the contrary, it makes it worse.I came across your Codex issue around the retirement of approval_policy="untrusted". Your point about preserving a clear boundary between what an agent can execute automatically and what requires explicit approval really stood out to me.
I've been working with JigsawML, and it has made me think about a related part of the AI-coding problem: as coding agents become capable of making more changes autonomously, it's becoming increasingly important to understand what actually changed in the codebase and what those changes affect across the architecture.
Your issue is focused on the execution/security boundary, while we're looking at the visibility and architectural-impact side of AI-assisted development.
I'm curious, as you use Codex more extensively, do you also find it becoming harder to quickly understand the architectural impact of changes an agent makes?