Skip to content

permissions: make runtime config profile-backed#19391

Merged
bolinfest merged 1 commit into
pr19604from
pr19391
Apr 25, 2026
Merged

permissions: make runtime config profile-backed#19391
bolinfest merged 1 commit into
pr19604from
pr19391

Conversation

@bolinfest

@bolinfest bolinfest commented Apr 24, 2026

Copy link
Copy Markdown
Collaborator

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.

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

Copy link
Copy Markdown
Contributor

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 bolinfest force-pushed the pr19391 branch 4 times, most recently from cdbbfa4 to 48d74e7 Compare April 25, 2026 17:25
@bolinfest bolinfest enabled auto-merge (squash) April 25, 2026 17:27
@bolinfest bolinfest force-pushed the pr19391 branch 2 times, most recently from 71ce357 to bb278c3 Compare April 25, 2026 22:28
@bolinfest bolinfest changed the base branch from main to pr19604 April 25, 2026 22:46
@bolinfest bolinfest merged this pull request into pr19604 Apr 25, 2026
7 checks passed
@bolinfest bolinfest deleted the pr19391 branch April 25, 2026 22:46
@github-actions github-actions Bot locked and limited conversation to collaborators Apr 25, 2026
@bolinfest

Copy link
Copy Markdown
Collaborator Author

Ugh, this was not actually merged!

@bolinfest

Copy link
Copy Markdown
Collaborator Author

Stack repair note: this PR was marked merged by GitHub into the temporary pr19604 branch, not into main. The actual replacement PR for this runtime-config change is #19606, now stacked above the small test-only bottom PR #19604.

@bolinfest

Copy link
Copy Markdown
Collaborator Author

Re-published as #19606.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants