Skip to content

core: derive active permission profiles#18277

Merged
bolinfest merged 1 commit intomainfrom
pr18277
Apr 22, 2026
Merged

core: derive active permission profiles#18277
bolinfest merged 1 commit intomainfrom
pr18277

Conversation

@bolinfest
Copy link
Copy Markdown
Collaborator

@bolinfest bolinfest commented Apr 17, 2026

Why

Permissions should not store a separate PermissionProfile that can drift from the constrained SandboxPolicy and network settings. The active profile needs to be derived from the same constrained values that already honor requirements.toml.

What changed

This adds derivation of the active PermissionProfile from the constrained runtime permission settings and exposes that derived value through config snapshots and thread state. The app-server can then report the active profile without introducing a second source of truth.

Verification

  • cargo test -p codex-core --test all permissions_messages -- --nocapture
  • cargo test -p codex-core --test all request_permissions -- --nocapture

Stack created with Sapling. Best reviewed with ReviewStack.

@bolinfest bolinfest force-pushed the pr18277 branch 2 times, most recently from 20d17a1 to 5a57cef Compare April 17, 2026 19:33
@bolinfest bolinfest requested a review from a team as a code owner April 20, 2026 17:09
@bolinfest bolinfest force-pushed the pr18276 branch 2 times, most recently from e206a39 to 7d5612c Compare April 20, 2026 18:35
@bolinfest bolinfest force-pushed the pr18277 branch 2 times, most recently from 5ae72d8 to 8618f64 Compare April 21, 2026 06:18
@bolinfest bolinfest force-pushed the pr18276 branch 2 times, most recently from 24faa00 to 5b7a782 Compare April 21, 2026 17:27
@bolinfest bolinfest force-pushed the pr18277 branch 2 times, most recently from 6846eef to e702982 Compare April 22, 2026 00:09
bolinfest added a commit that referenced this pull request Apr 22, 2026
## Why

#18275 anchors session-scoped `:cwd` and `:project_roots` grants to the
request cwd before recording them for reuse. Relative deny glob entries
need the same treatment. Without anchoring, a stored session permission
can keep a pattern such as `**/*.env` relative, then reinterpret that
deny against a later turn cwd. That makes the persisted profile depend
on the cwd at reuse time instead of the cwd that was reviewed and
approved.

## What changed

`intersect_permission_profiles` now materializes retained
`FileSystemPath::GlobPattern` entries against the request cwd, matching
the existing materialization for cwd-sensitive special paths.

Materialized accepted grants are now deduplicated before deny retention
runs. This keeps the sticky-grant preapproval shape stable when a
repeated request is merged with the stored grant and both `:cwd = write`
and the materialized absolute cwd write are present.

The preapproval check compares against the same materialized form, so a
later request for the same cwd-relative deny glob still matches the
stored anchored grant instead of re-prompting or rejecting.

Tests cover both the storage path and the preapproval path: a
session-scoped `:cwd = write` grant with `**/*.env = none` is stored
with both the cwd write and deny glob anchored to the original request
cwd, cannot be reused from a later cwd, and remains preapproved when
re-requested from the original cwd after merging with the stored grant.

## Verification

- `cargo test -p codex-sandboxing policy_transforms`
- `cargo test -p codex-core --lib
relative_deny_glob_grants_remain_preapproved_after_materialization`
- `cargo clippy -p codex-sandboxing --tests -- -D
clippy::redundant_clone`
- `cargo clippy -p codex-core --lib -- -D clippy::redundant_clone`

---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/18867).
* #18288
* #18287
* #18286
* #18285
* #18284
* #18283
* #18282
* #18281
* #18280
* #18279
* #18278
* #18277
* #18276
* __->__ #18867
@bolinfest bolinfest force-pushed the pr18276 branch 3 times, most recently from 9d11c77 to 39310e7 Compare April 22, 2026 02:57
Base automatically changed from pr18276 to main April 22, 2026 03:22
@bolinfest bolinfest merged commit 0fef35d into main Apr 22, 2026
25 checks passed
@bolinfest bolinfest deleted the pr18277 branch April 22, 2026 05:11
@github-actions github-actions Bot locked and limited conversation to collaborators Apr 22, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants