Skip to content

permissions: move workspace roots onto thread state#22267

Closed
bolinfest wants to merge 1 commit into
pr22266from
pr22267
Closed

permissions: move workspace roots onto thread state#22267
bolinfest wants to merge 1 commit into
pr22266from
pr22267

Conversation

@bolinfest

@bolinfest bolinfest commented May 12, 2026

Copy link
Copy Markdown
Collaborator

Why

This is the permissions migration PR split out from the original large #21250 change. The goal is to finish moving app-server and runtime behavior away from treating SandboxPolicy::WorkspaceWrite as the owner of writable workspace roots.

The invariant after this PR is:

  • a thread permission profile is server-owned: app-server clients cannot send arbitrary PermissionProfile bodies on thread lifecycle or turn APIs;
  • app-server clients can select a server-defined profile by id with permissions, and the server resolves and applies that named profile;
  • app-server clients can update workspaceRoots independently, and cwd is only a workspace root when it is explicitly present in that list;
  • SandboxPolicy::WorkspaceWrite no longer serializes its own writableRoots; old clients may still send the legacy field and the server maps it through compatibility logic.

What Changed

  • Moves workspace roots onto thread/session state and persists them through thread lifecycle, rollout reconstruction, resume, fork, and app-server responses.
  • Changes app-server v2 permission selection to use profile id strings at the API boundary, removing the selection/modification wrapper types.
  • Removes ActivePermissionProfileModification / profile modification overlay behavior and normalizes code through server-owned PermissionProfile values.
  • Makes config permission profile fields private so callers use accessors/mutators; persisted active-profile ids are only restored when the loaded effective profile still matches the profile that produced that id.
  • Stops exposing raw PermissionProfile values from thread/start, thread/resume, and thread/fork responses; clients now use activePermissionProfile, workspaceRoots, and the compatibility sandbox summary.
  • Keeps legacy app-server clients working when old sandboxPolicy / sandbox requests map to an existing named profile, including updating workspace roots when a legacy workspace-write request implies a new cwd root.
  • Updates CLI/TUI/exec response handling so remote sessions reconstruct permissions from workspaceRoots plus the legacy sandbox projection.
  • Updates sandbox summaries and /status to show effective user workspace roots, while hiding internal Codex roots such as CODEX_HOME/memories.
  • Adds an app-server in-process request boxing fix after the enlarged generated request/response graph exposed a stack overflow in typed request dispatch.
  • Fixes the rebased Windows sandbox deny-read setup path so deny-read overrides are still available when deny-write payloads are built.
  • Regenerates the app-server JSON schema and TypeScript fixtures for the v2 shape changes.

Memory Compatibility

Memory writes remain supported without making CODEX_HOME/memories a user workspace root. The runtime materializes the memory directory as an internal write grant on the effective profile, while the thread explicit workspaceRoots remains the user-visible list.

That separation is deliberate:

  • clients do not need to include the memories directory in workspaceRoots;
  • /status and sandbox summaries filter the internal memories root so users do not see it as an added workspace directory;
  • old rollouts do not need to have serialized the memories root, because the memory grant is added when the profile is materialized for the running session.

Relevant coverage includes core/src/config/config_tests.rs for memory-root preservation under explicit workspace roots, tui/src/status/tests.rs for hiding the internal memory root in /status, utils/sandbox-summary/src/sandbox_summary.rs tests for hidden writable roots, and rollout reconstruction coverage in core/src/session/rollout_reconstruction_tests.rs.

Verification Strategy

I focused local verification on the areas most likely to regress:

  • Protocol/schema shape: codex-app-server-protocol tests cover generated schema fixtures, missing optional lifecycle fields, profile-id string selection, and legacy SandboxPolicy deserialization.
  • App-server lifecycle and compatibility: the full codex-app-server crate passed earlier, and focused resume/turn tests cover named profile selection, workspace-root updates, and legacy sandbox compatibility.
  • CLI/TUI/exec clients: codex-tui app_server_session, focused /status coverage, and the codex-exec crate cover reconstructing session permissions from workspaceRoots and compatibility sandbox responses after raw PermissionProfile was removed from lifecycle responses.
  • Config/profile normalization: scoped tests and just fix cover the new private Permissions fields and accessor/mutator callsites, including the path that clears stale active-profile ids when requirements normalize the effective profile.
  • Windows deny-read setup: codex-windows-sandbox tests cover the crate that failed Windows CI after the rebase.

Stack created with Sapling. Best reviewed with ReviewStack.

@bolinfest

Copy link
Copy Markdown
Collaborator Author

Superseded by the split stack starting at #22327.

@bolinfest bolinfest closed this May 12, 2026
bolinfest added a commit that referenced this pull request May 13, 2026
## Why

This is the base PR in the split stack for the permissions migration. It
isolates stack-safety work that had been mixed into the larger
permissions PR, so reviewers can evaluate the async-future changes
separately from the permissions model changes in #22267.

The main risk this addresses is large or recursive multi-agent futures
overflowing smaller runner stacks. A follow-up review also called out
that `shutdown_live_agent` must remain quiescent: callers should not
remove a live agent from tracking or release its spawn slot until the
worker loop has actually terminated.

## What Changed

- Boxes the large async futures in the multi-agent spawn, resume, and
close tool handlers.
- Boxes the `AgentControl` spawn and recursive close/shutdown paths that
can otherwise build very deep futures.
- Keeps `shutdown_live_agent` waiting for thread termination before
removing/releasing the live agent, preserving the previous shutdown
ordering while still boxing the recursive close path.

## Verification Strategy

The focused local coverage was `cargo test -p codex-core multi_agents`,
which exercises the multi-agent spawn/resume/close handlers, cascade
close/resume behavior, and the shutdown path touched by this PR.












---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/22266).
* #22330
* #22329
* #22328
* #22327
* __->__ #22266
agogo233 pushed a commit to agogo233/codex that referenced this pull request May 13, 2026
## Why

This is the base PR in the split stack for the permissions migration. It
isolates stack-safety work that had been mixed into the larger
permissions PR, so reviewers can evaluate the async-future changes
separately from the permissions model changes in openai#22267.

The main risk this addresses is large or recursive multi-agent futures
overflowing smaller runner stacks. A follow-up review also called out
that `shutdown_live_agent` must remain quiescent: callers should not
remove a live agent from tracking or release its spawn slot until the
worker loop has actually terminated.

## What Changed

- Boxes the large async futures in the multi-agent spawn, resume, and
close tool handlers.
- Boxes the `AgentControl` spawn and recursive close/shutdown paths that
can otherwise build very deep futures.
- Keeps `shutdown_live_agent` waiting for thread termination before
removing/releasing the live agent, preserving the previous shutdown
ordering while still boxing the recursive close path.

## Verification Strategy

The focused local coverage was `cargo test -p codex-core multi_agents`,
which exercises the multi-agent spawn/resume/close handlers, cascade
close/resume behavior, and the shutdown path touched by this PR.












---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/22266).
* openai#22330
* openai#22329
* openai#22328
* openai#22327
* __->__ openai#22266
agogo233 pushed a commit to agogo233/codex that referenced this pull request May 15, 2026
## Why

This is the base PR in the split stack for the permissions migration. It
isolates stack-safety work that had been mixed into the larger
permissions PR, so reviewers can evaluate the async-future changes
separately from the permissions model changes in openai#22267.

The main risk this addresses is large or recursive multi-agent futures
overflowing smaller runner stacks. A follow-up review also called out
that `shutdown_live_agent` must remain quiescent: callers should not
remove a live agent from tracking or release its spawn slot until the
worker loop has actually terminated.

## What Changed

- Boxes the large async futures in the multi-agent spawn, resume, and
close tool handlers.
- Boxes the `AgentControl` spawn and recursive close/shutdown paths that
can otherwise build very deep futures.
- Keeps `shutdown_live_agent` waiting for thread termination before
removing/releasing the live agent, preserving the previous shutdown
ordering while still boxing the recursive close path.

## Verification Strategy

The focused local coverage was `cargo test -p codex-core multi_agents`,
which exercises the multi-agent spawn/resume/close handlers, cascade
close/resume behavior, and the shutdown path touched by this PR.












---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/22266).
* openai#22330
* openai#22329
* openai#22328
* openai#22327
* __->__ openai#22266
agogo233 pushed a commit to agogo233/codex that referenced this pull request May 15, 2026
## Why

This is the base PR in the split stack for the permissions migration. It
isolates stack-safety work that had been mixed into the larger
permissions PR, so reviewers can evaluate the async-future changes
separately from the permissions model changes in openai#22267.

The main risk this addresses is large or recursive multi-agent futures
overflowing smaller runner stacks. A follow-up review also called out
that `shutdown_live_agent` must remain quiescent: callers should not
remove a live agent from tracking or release its spawn slot until the
worker loop has actually terminated.

## What Changed

- Boxes the large async futures in the multi-agent spawn, resume, and
close tool handlers.
- Boxes the `AgentControl` spawn and recursive close/shutdown paths that
can otherwise build very deep futures.
- Keeps `shutdown_live_agent` waiting for thread termination before
removing/releasing the live agent, preserving the previous shutdown
ordering while still boxing the recursive close path.

## Verification Strategy

The focused local coverage was `cargo test -p codex-core multi_agents`,
which exercises the multi-agent spawn/resume/close handlers, cascade
close/resume behavior, and the shutdown path touched by this PR.












---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/22266).
* openai#22330
* openai#22329
* openai#22328
* openai#22327
* __->__ openai#22266
dkropachev pushed a commit to dkropachev/codex that referenced this pull request Jun 9, 2026
## Why

This is the base PR in the split stack for the permissions migration. It
isolates stack-safety work that had been mixed into the larger
permissions PR, so reviewers can evaluate the async-future changes
separately from the permissions model changes in openai#22267.

The main risk this addresses is large or recursive multi-agent futures
overflowing smaller runner stacks. A follow-up review also called out
that `shutdown_live_agent` must remain quiescent: callers should not
remove a live agent from tracking or release its spawn slot until the
worker loop has actually terminated.

## What Changed

- Boxes the large async futures in the multi-agent spawn, resume, and
close tool handlers.
- Boxes the `AgentControl` spawn and recursive close/shutdown paths that
can otherwise build very deep futures.
- Keeps `shutdown_live_agent` waiting for thread termination before
removing/releasing the live agent, preserving the previous shutdown
ordering while still boxing the recursive close path.

## Verification Strategy

The focused local coverage was `cargo test -p codex-core multi_agents`,
which exercises the multi-agent spawn/resume/close handlers, cascade
close/resume behavior, and the shutdown path touched by this PR.












---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/22266).
* openai#22330
* openai#22329
* openai#22328
* openai#22327
* __->__ openai#22266
AIALRA-0 pushed a commit to AIALRA-0/codex-turn-engine that referenced this pull request Jun 10, 2026
## Why

This is the base PR in the split stack for the permissions migration. It
isolates stack-safety work that had been mixed into the larger
permissions PR, so reviewers can evaluate the async-future changes
separately from the permissions model changes in openai#22267.

The main risk this addresses is large or recursive multi-agent futures
overflowing smaller runner stacks. A follow-up review also called out
that `shutdown_live_agent` must remain quiescent: callers should not
remove a live agent from tracking or release its spawn slot until the
worker loop has actually terminated.

## What Changed

- Boxes the large async futures in the multi-agent spawn, resume, and
close tool handlers.
- Boxes the `AgentControl` spawn and recursive close/shutdown paths that
can otherwise build very deep futures.
- Keeps `shutdown_live_agent` waiting for thread termination before
removing/releasing the live agent, preserving the previous shutdown
ordering while still boxing the recursive close path.

## Verification Strategy

The focused local coverage was `cargo test -p codex-core multi_agents`,
which exercises the multi-agent spawn/resume/close handlers, cascade
close/resume behavior, and the shutdown path touched by this PR.












---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/22266).
* openai#22330
* openai#22329
* openai#22328
* openai#22327
* __->__ openai#22266
AIALRA-0 pushed a commit to AIALRA-0/codex-turn-engine that referenced this pull request Jun 10, 2026
## Why

This is the base PR in the split stack for the permissions migration. It
isolates stack-safety work that had been mixed into the larger
permissions PR, so reviewers can evaluate the async-future changes
separately from the permissions model changes in openai#22267.

The main risk this addresses is large or recursive multi-agent futures
overflowing smaller runner stacks. A follow-up review also called out
that `shutdown_live_agent` must remain quiescent: callers should not
remove a live agent from tracking or release its spawn slot until the
worker loop has actually terminated.

## What Changed

- Boxes the large async futures in the multi-agent spawn, resume, and
close tool handlers.
- Boxes the `AgentControl` spawn and recursive close/shutdown paths that
can otherwise build very deep futures.
- Keeps `shutdown_live_agent` waiting for thread termination before
removing/releasing the live agent, preserving the previous shutdown
ordering while still boxing the recursive close path.

## Verification Strategy

The focused local coverage was `cargo test -p codex-core multi_agents`,
which exercises the multi-agent spawn/resume/close handlers, cascade
close/resume behavior, and the shutdown path touched by this PR.












---
[//]: # (BEGIN SAPLING FOOTER)
Stack created with [Sapling](https://sapling-scm.com). Best reviewed
with [ReviewStack](https://reviewstack.dev/openai/codex/pull/22266).
* openai#22330
* openai#22329
* openai#22328
* openai#22327
* __->__ openai#22266
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant