diff --git a/codex-rs/core/src/tasks/review.rs b/codex-rs/core/src/tasks/review.rs index 738d33c52..5c2e8d08b 100644 --- a/codex-rs/core/src/tasks/review.rs +++ b/codex-rs/core/src/tasks/review.rs @@ -16,6 +16,7 @@ use tokio_util::sync::CancellationToken; use crate::codex::Session; use crate::codex::TurnContext; use crate::codex_delegate::run_codex_conversation_one_shot; +use crate::protocol::SandboxPolicy; use crate::review_format::format_review_findings_block; use crate::review_format::render_review_output_text; use crate::state::TaskKind; @@ -77,6 +78,7 @@ async fn start_review_conversation( ) -> Option> { let config = ctx.client.config(); let mut sub_agent_config = config.as_ref().clone(); + sub_agent_config.sandbox_policy = SandboxPolicy::new_read_only_policy(); // Run with only reviewer rubric — drop outer user_instructions sub_agent_config.user_instructions = None; // Avoid loading project docs; reviewer only needs findings diff --git a/codex-rs/core/tests/suite/review.rs b/codex-rs/core/tests/suite/review.rs index 7216e1925..b3a52cfa5 100644 --- a/codex-rs/core/tests/suite/review.rs +++ b/codex-rs/core/tests/suite/review.rs @@ -573,6 +573,10 @@ async fn review_input_isolated_from_parent_history() { review_prompt, "user message should only contain the raw review prompt" ); + assert!( + env_text.contains("read-only"), + "review environment context must run with read-only sandbox" + ); // Ensure the REVIEW_PROMPT rubric is sent via instructions. let instructions = body["instructions"].as_str().expect("instructions string");