Skip to content

permissions: make runtime config profile-backed#19391

Open
bolinfest wants to merge 1 commit intomainfrom
pr19391
Open

permissions: make runtime config profile-backed#19391
bolinfest wants to merge 1 commit intomainfrom
pr19391

Conversation

@bolinfest
Copy link
Copy Markdown
Collaborator

@bolinfest bolinfest commented Apr 24, 2026

Why

PermissionProfile is now the canonical permissions shape after #19231 because it can distinguish Managed, Disabled, and External enforcement while also carrying filesystem rules that legacy SandboxPolicy cannot represent cleanly. Core config and session state still needed to accept profile-backed permissions without forcing every profile through the strict legacy bridge, which rejected valid runtime profiles such as direct write roots.

What Changed

  • Adds Permissions.permission_profile and SessionConfiguration.permission_profile as constrained runtime state, while keeping sandbox_policy as a legacy compatibility projection.
  • Introduces profile setters that keep PermissionProfile, split filesystem/network policies, and legacy SandboxPolicy projections synchronized.
  • Uses a compatibility projection for requirement checks and legacy consumers instead of rejecting profiles that cannot round-trip through SandboxPolicy exactly.
  • Updates config loading, config overrides, session updates, turn context plumbing, prompt permission text, sandbox tags, and exec request construction to carry profile-backed runtime permissions.
  • Preserves configured deny-read entries and glob_scan_max_depth when command/session profiles are narrowed.
  • Adds PermissionProfile::read_only() and PermissionProfile::workspace_write() presets that match legacy defaults.

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: 0250e437c9

ℹ️ 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/tools/src/tool_config.rs Outdated
@bolinfest bolinfest force-pushed the pr19391 branch 8 times, most recently from 3044a7c to 975ced4 Compare April 24, 2026 18:08
@bolinfest bolinfest changed the base branch from main to pr19414 April 24, 2026 18:08
@bolinfest bolinfest force-pushed the pr19414 branch 2 times, most recently from 095bb44 to efc4b60 Compare April 24, 2026 19:09
@bolinfest bolinfest force-pushed the pr19391 branch 2 times, most recently from 90bf568 to 47da6db Compare April 24, 2026 20:19
bolinfest added a commit that referenced this pull request Apr 24, 2026
## Why

The profile conversion path still required a `cwd` even when it was only
translating a legacy `SandboxPolicy` into a `PermissionProfile`. That
made profile producers invent an ambient `cwd`, which is exactly the
anchoring we are trying to remove from permission-profile data. A legacy
workspace-write policy can be represented symbolically instead: `:cwd =
write` plus read-only `:project_roots` metadata subpaths.

This PR creates that cwd-free base so the rest of the stack can stop
threading cwd through profile construction. Callers that actually need a
concrete runtime filesystem policy for a specific cwd still have an
explicitly named cwd-bound conversion.

## What Changed

- `PermissionProfile::from_legacy_sandbox_policy` now takes only
`&SandboxPolicy`.
- `FileSystemSandboxPolicy::from_legacy_sandbox_policy` is now the
symbolic, cwd-free projection for profiles.
- The old concrete projection is retained as
`FileSystemSandboxPolicy::from_legacy_sandbox_policy_for_cwd` for
runtime/boundary code that must materialize legacy cwd behavior.
- Workspace-write profiles preserve `CurrentWorkingDirectory` and
`ProjectRoots` special entries instead of materializing cwd into
absolute paths.

## Verification

- `cargo check -p codex-protocol -p codex-core -p
codex-app-server-protocol -p codex-app-server -p codex-exec -p
codex-exec-server -p codex-tui -p codex-sandboxing -p
codex-linux-sandbox -p codex-analytics --tests`
- `just fix -p codex-protocol -p codex-core -p codex-app-server-protocol
-p codex-app-server -p codex-exec -p codex-exec-server -p codex-tui -p
codex-sandboxing -p codex-linux-sandbox -p codex-analytics`




---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/19414).
* #19395
* #19394
* #19393
* #19392
* #19391
* __->__ #19414
Base automatically changed from pr19414 to main April 24, 2026 20:42
@bolinfest bolinfest force-pushed the pr19391 branch 2 times, most recently from 46f2411 to c8f8161 Compare April 24, 2026 21:31
@bolinfest bolinfest changed the base branch from main to pr19449 April 24, 2026 21:31
@bolinfest bolinfest force-pushed the pr19391 branch 2 times, most recently from f5c6803 to 69e51b2 Compare April 24, 2026 23:33
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
Base automatically changed from pr19449 to main April 25, 2026 00:17
@bolinfest bolinfest force-pushed the pr19391 branch 2 times, most recently from 0056473 to 8fc80ac Compare April 25, 2026 00:54
@bolinfest bolinfest requested a review from viyatb-oai April 25, 2026 01:03
@bolinfest bolinfest force-pushed the pr19391 branch 6 times, most recently from aacd108 to 2cc36a1 Compare April 25, 2026 04:23
@bolinfest bolinfest force-pushed the pr19391 branch 3 times, most recently from 61bde65 to cdbbfa4 Compare April 25, 2026 16:17
@bolinfest bolinfest enabled auto-merge (squash) April 25, 2026 17:27
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.

3 participants