Skip to content

permissions: derive compatibility policies from profiles#19392

Open
bolinfest wants to merge 1 commit intopr19391from
pr19392
Open

permissions: derive compatibility policies from profiles#19392
bolinfest wants to merge 1 commit intopr19391from
pr19392

Conversation

@bolinfest
Copy link
Copy Markdown
Collaborator

@bolinfest bolinfest commented Apr 24, 2026

Why

After #19391, PermissionProfile and the split filesystem/network policies could still be stored in parallel. That creates drift risk: a profile can preserve deny globs, external enforcement, or split filesystem entries while a cached projection silently loses those details. This PR makes the profile the runtime source and derives compatibility views from it.

What Changed

  • Removes stored filesystem/network sandbox projections from Permissions and SessionConfiguration; their accessors now derive from the canonical PermissionProfile.
  • Derives legacy SandboxPolicy snapshots from profiles only where an older API still needs that field.
  • Updates MCP connection and elicitation state to track PermissionProfile instead of SandboxPolicy for auto-approval decisions.
  • Adds semantic filesystem-policy comparison so cwd changes can preserve richer profiles while still recognizing equivalent legacy projections independent of entry ordering.
  • Updates config/session tests to assert profile-derived projections instead of parallel stored fields.

Verification

  • cargo test -p codex-core direct_write_roots
  • cargo test -p codex-core runtime_roots_to_legacy_projection
  • cargo test -p codex-app-server requested_permissions_trust_project_uses_permission_profile_intent

Stack created with Sapling. Best reviewed with ReviewStack.

Copy link
Copy Markdown
Contributor

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 1ca956eb3b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread codex-rs/codex-mcp/src/mcp/mod.rs Outdated
@bolinfest bolinfest force-pushed the pr19392 branch 2 times, most recently from 62541d0 to 32a2927 Compare April 24, 2026 16:34
@bolinfest bolinfest force-pushed the pr19391 branch 2 times, most recently from 2ec2407 to e04981b Compare April 24, 2026 16:47
@bolinfest bolinfest force-pushed the pr19392 branch 2 times, most recently from 37ef901 to f805b17 Compare April 24, 2026 17:05
@bolinfest bolinfest force-pushed the pr19391 branch 2 times, most recently from bbddc8e to c4451a1 Compare April 24, 2026 17:18
@bolinfest bolinfest force-pushed the pr19392 branch 2 times, most recently from 1b98ec5 to e8e9902 Compare April 24, 2026 19:09
bolinfest added a commit that referenced this pull request Apr 25, 2026
## Why

`ReadOnlyAccess` was a transitional legacy shape on `SandboxPolicy`:
`FullAccess` meant the historical read-only/workspace-write modes could
read the full filesystem, while `Restricted` tried to carry partial
readable roots. The partial-read model now belongs in
`FileSystemSandboxPolicy` and `PermissionProfile`, so keeping it on
`SandboxPolicy` makes every legacy projection reintroduce lossy
read-root bookkeeping and creates unnecessary noise in the rest of the
permissions migration.

This PR makes the legacy policy model narrower and explicit:
`SandboxPolicy::ReadOnly` and `SandboxPolicy::WorkspaceWrite` represent
the old full-read sandbox modes only. Split readable roots, deny-read
globs, and platform-default/minimal read behavior stay in the runtime
permissions model.

## What changed

- Removes `ReadOnlyAccess` from
`codex_protocol::protocol::SandboxPolicy`, including the generated
`access` and `readOnlyAccess` API fields.
- Updates legacy policy/profile conversions so restricted filesystem
reads are represented only by `FileSystemSandboxPolicy` /
`PermissionProfile` entries.
- Keeps app-server v2 compatible with legacy `fullAccess` read-access
payloads by accepting and ignoring that no-op shape, while rejecting
legacy `restricted` read-access payloads instead of silently widening
them to full-read legacy policies.
- Carries Windows sandbox platform-default read behavior with an
explicit override flag instead of depending on
`ReadOnlyAccess::Restricted`.
- Refreshes generated app-server schema/types and updates tests/docs for
the simplified legacy policy shape.

## Verification

- `cargo check -p codex-app-server-protocol --tests`
- `cargo check -p codex-windows-sandbox --tests`
- `cargo test -p codex-app-server-protocol sandbox_policy_`


---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/19449).
* #19395
* #19394
* #19393
* #19392
* #19391
* __->__ #19449
@bolinfest bolinfest force-pushed the pr19391 branch 2 times, most recently from 0056473 to 8fc80ac Compare April 25, 2026 00:54
@bolinfest bolinfest force-pushed the pr19392 branch 2 times, most recently from 747398e to 6c70600 Compare April 25, 2026 02:57
@bolinfest bolinfest force-pushed the pr19392 branch 2 times, most recently from 18ee441 to 0e24a60 Compare April 25, 2026 03:42
Comment thread codex-rs/core/src/session/session.rs
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants