From 277dd15df3f5764dd32200c3d1acb0b7efa930c9 Mon Sep 17 00:00:00 2001 From: Charles Cunningham Date: Wed, 11 Feb 2026 12:47:12 -0800 Subject: [PATCH] tests: add pre-turn context-diff compaction snapshots --- codex-rs/core/tests/suite/compact.rs | 100 ++++++++++++---- codex-rs/core/tests/suite/compact_remote.rs | 110 ++++++++++++++---- ...t__manual_compact_with_history_shapes.snap | 9 +- ...nual_compact_without_prev_user_shapes.snap | 7 +- ...__compact__mid_turn_compaction_shapes.snap | 8 +- ...action_context_window_exceeded_shapes.snap | 7 +- ..._compaction_including_incoming_shapes.snap | 12 +- ...te_manual_compact_with_history_shapes.snap | 9 +- ...nual_compact_without_prev_user_shapes.snap | 9 +- ...te__remote_mid_turn_compaction_shapes.snap | 9 +- ...te_pre_turn_compaction_failure_shapes.snap | 7 +- ..._compaction_including_incoming_shapes.snap | 10 +- 12 files changed, 213 insertions(+), 84 deletions(-) diff --git a/codex-rs/core/tests/suite/compact.rs b/codex-rs/core/tests/suite/compact.rs index 7248423ddc..8f3afaea9b 100644 --- a/codex-rs/core/tests/suite/compact.rs +++ b/codex-rs/core/tests/suite/compact.rs @@ -28,6 +28,7 @@ use core_test_support::test_codex::test_codex; use core_test_support::wait_for_event; use core_test_support::wait_for_event_match; use std::collections::VecDeque; +use std::path::PathBuf; use core_test_support::responses::ResponsesRequest; use core_test_support::responses::ev_assistant_message; @@ -66,6 +67,8 @@ const DUMMY_FUNCTION_NAME: &str = "test_tool"; const DUMMY_CALL_ID: &str = "call-multi-auto"; const FUNCTION_CALL_LIMIT_MSG: &str = "function call limit push"; const POST_AUTO_USER_MSG: &str = "post auto follow-up"; +const PRETURN_CONTEXT_DIFF_CWD_MARKER: &str = "PRETURN_CONTEXT_DIFF_CWD"; +const PRETURN_CONTEXT_DIFF_CWD: &str = "/tmp/PRETURN_CONTEXT_DIFF_CWD"; pub(super) const COMPACT_WARNING_MESSAGE: &str = "Heads up: Long threads and multiple compactions can cause the model to be less accurate. Start a new thread when possible to keep threads small and targeted."; @@ -198,8 +201,8 @@ fn normalize_shape_text(text: &str) -> String { if text.starts_with("# AGENTS.md instructions for ") { return "".to_string(); } - if text.starts_with("") { - return "".to_string(); + if let Some(env_context) = normalize_environment_context_for_shape(text) { + return env_context; } if text.contains("") { return "".to_string(); @@ -208,6 +211,25 @@ fn normalize_shape_text(text: &str) -> String { text.replace('\n', "\\n") } +fn normalize_environment_context_for_shape(text: &str) -> Option { + if !text.starts_with("") { + return None; + } + let cwd = text.lines().find_map(|line| { + let trimmed = line.trim(); + let cwd = trimmed.strip_prefix("")?.strip_suffix("")?; + Some(if cwd.contains(PRETURN_CONTEXT_DIFF_CWD_MARKER) { + PRETURN_CONTEXT_DIFF_CWD_MARKER.to_string() + } else { + "".to_string() + }) + }); + Some(match cwd { + Some(cwd) => format!(""), + None => ">".to_string(), + }) +} + fn message_text_for_shape(item: &Value) -> String { item.get("content") .and_then(Value::as_array) @@ -310,12 +332,13 @@ fn request_input_shape(request: &ResponsesRequest) -> String { .join("\n") } -fn sectioned_request_shapes(sections: &[(&str, &ResponsesRequest)]) -> String { - sections +fn sectioned_request_shapes(scenario: &str, sections: &[(&str, &ResponsesRequest)]) -> String { + let sections = sections .iter() .map(|(title, request)| format!("## {title}\n{}", request_input_shape(request))) .collect::>() - .join("\n\n") + .join("\n\n"); + format!("Scenario: {scenario}\n\n{sections}") } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] @@ -3121,6 +3144,20 @@ async fn snapshot_request_shape_pre_turn_compaction_including_incoming_user_mess .expect("submit user input"); wait_for_event(&codex, |ev| matches!(ev, EventMsg::TurnComplete(_))).await; } + codex + .submit(Op::OverrideTurnContext { + cwd: Some(PathBuf::from(PRETURN_CONTEXT_DIFF_CWD)), + approval_policy: None, + sandbox_policy: None, + windows_sandbox_level: None, + model: None, + effort: None, + summary: None, + collaboration_mode: None, + personality: None, + }) + .await + .expect("override turn context"); let image_url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR4nGNgYAAAAAMAASsJTYQAAAAASUVORK5CYII=" .to_string(); codex @@ -3147,15 +3184,22 @@ async fn snapshot_request_shape_pre_turn_compaction_including_incoming_user_mess let follow_up_shape = request_input_shape(&requests[3]); insta::assert_snapshot!( "pre_turn_compaction_including_incoming_shapes", - sectioned_request_shapes(&[ - ("Local Compaction Request", &requests[2]), - ("Local Post-Compaction History Layout", &requests[3]), - ]) + sectioned_request_shapes( + "Pre-turn auto-compaction with a context override emits the context diff in the compact request while the incoming user message is still excluded on main.", + &[ + ("Local Compaction Request", &requests[2]), + ("Local Post-Compaction History Layout", &requests[3]), + ] + ) ); assert!( compact_shape.contains(""), "expected compact request to include summarization prompt" ); + assert!( + compact_shape.contains(PRETURN_CONTEXT_DIFF_CWD_MARKER), + "expected compact request to include pre-turn context diff" + ); assert!( !compact_shape.contains("USER_THREE"), "current main behavior excludes incoming user message from pre-turn compaction input" @@ -3262,10 +3306,13 @@ async fn snapshot_request_shape_pre_turn_compaction_context_window_exceeded() { let include_attempt_shape = request_input_shape(&requests[1]); insta::assert_snapshot!( "pre_turn_compaction_context_window_exceeded_shapes", - sectioned_request_shapes(&[( - "Local Compaction Request (Incoming User Excluded on main)", - &requests[1] - ),]) + sectioned_request_shapes( + "Pre-turn auto-compaction context-window failure on main: compaction request excludes the incoming user message and the turn errors.", + &[( + "Local Compaction Request (Incoming User Excluded on main)", + &requests[1] + ),] + ) ); assert!( @@ -3333,10 +3380,13 @@ async fn snapshot_request_shape_mid_turn_continuation_compaction() { let follow_up_shape = request_input_shape(&requests[2]); insta::assert_snapshot!( "mid_turn_compaction_shapes", - sectioned_request_shapes(&[ - ("Local Compaction Request", &requests[1]), - ("Local Post-Compaction History Layout", &requests[2]), - ]) + sectioned_request_shapes( + "Mid-turn continuation compaction after tool output: compact request includes tool artifacts and follow-up request includes the summary.", + &[ + ("Local Compaction Request", &requests[1]), + ("Local Post-Compaction History Layout", &requests[2]), + ] + ) ); assert!( compact_shape.contains("function_call_output"), @@ -3396,7 +3446,10 @@ async fn snapshot_request_shape_manual_compact_without_previous_user_messages() let follow_up_shape = request_input_shape(&requests[0]); insta::assert_snapshot!( "manual_compact_without_prev_user_shapes", - sectioned_request_shapes(&[("Local Post-Compaction History Layout", &requests[0]),]) + sectioned_request_shapes( + "Manual /compact with no prior user turn behaves as a no-op and follow-up turn carries only canonical initial context plus the new user message.", + &[("Local Post-Compaction History Layout", &requests[0]),] + ) ); assert!( !follow_up_shape.contains(""), @@ -3470,10 +3523,13 @@ async fn snapshot_request_shape_manual_compact_with_previous_user_messages() { let follow_up_shape = request_input_shape(&requests[2]); insta::assert_snapshot!( "manual_compact_with_history_shapes", - sectioned_request_shapes(&[ - ("Local Compaction Request", &requests[1]), - ("Local Post-Compaction History Layout", &requests[2]), - ]) + sectioned_request_shapes( + "Manual /compact with prior user history compacts existing history and the follow-up turn includes the compact summary plus new user message.", + &[ + ("Local Compaction Request", &requests[1]), + ("Local Post-Compaction History Layout", &requests[2]), + ] + ) ); assert!( compact_shape.contains("USER_ONE"), diff --git a/codex-rs/core/tests/suite/compact_remote.rs b/codex-rs/core/tests/suite/compact_remote.rs index f9abdb3f51..a8cf41468a 100644 --- a/codex-rs/core/tests/suite/compact_remote.rs +++ b/codex-rs/core/tests/suite/compact_remote.rs @@ -1,6 +1,7 @@ #![allow(clippy::expect_used)] use std::fs; +use std::path::PathBuf; use anyhow::Result; use codex_core::CodexAuth; @@ -42,6 +43,8 @@ fn estimate_compact_payload_tokens(request: &responses::ResponsesRequest) -> i64 } const DUMMY_FUNCTION_NAME: &str = "test_tool"; +const PRETURN_CONTEXT_DIFF_CWD_MARKER: &str = "PRETURN_CONTEXT_DIFF_CWD"; +const PRETURN_CONTEXT_DIFF_CWD: &str = "/tmp/PRETURN_CONTEXT_DIFF_CWD"; fn summary_with_prefix(summary: &str) -> String { format!("{SUMMARY_PREFIX}\n{summary}") @@ -66,8 +69,8 @@ fn normalize_shape_text(text: &str) -> String { if text.starts_with("# AGENTS.md instructions for ") { return "".to_string(); } - if text.starts_with("") { - return "".to_string(); + if let Some(env_context) = normalize_environment_context_for_shape(text) { + return env_context; } if text.contains("") { return "".to_string(); @@ -76,6 +79,25 @@ fn normalize_shape_text(text: &str) -> String { text.replace('\n', "\\n") } +fn normalize_environment_context_for_shape(text: &str) -> Option { + if !text.starts_with("") { + return None; + } + let cwd = text.lines().find_map(|line| { + let trimmed = line.trim(); + let cwd = trimmed.strip_prefix("")?.strip_suffix("")?; + Some(if cwd.contains(PRETURN_CONTEXT_DIFF_CWD_MARKER) { + PRETURN_CONTEXT_DIFF_CWD_MARKER.to_string() + } else { + "".to_string() + }) + }); + Some(match cwd { + Some(cwd) => format!(""), + None => ">".to_string(), + }) +} + fn message_text_for_shape(item: &Value) -> String { item.get("content") .and_then(Value::as_array) @@ -178,12 +200,16 @@ fn request_input_shape(request: &responses::ResponsesRequest) -> String { .join("\n") } -fn sectioned_request_shapes(sections: &[(&str, &responses::ResponsesRequest)]) -> String { - sections +fn sectioned_request_shapes( + scenario: &str, + sections: &[(&str, &responses::ResponsesRequest)], +) -> String { + let sections = sections .iter() .map(|(title, request)| format!("## {title}\n{}", request_input_shape(request))) .collect::>() - .join("\n\n") + .join("\n\n"); + format!("Scenario: {scenario}\n\n{sections}") } #[tokio::test(flavor = "multi_thread", worker_threads = 2)] @@ -1515,6 +1541,21 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_including_incoming_us .await; for user in ["USER_ONE", "USER_TWO", "USER_THREE"] { + if user == "USER_THREE" { + codex + .submit(Op::OverrideTurnContext { + cwd: Some(PathBuf::from(PRETURN_CONTEXT_DIFF_CWD)), + approval_policy: None, + sandbox_policy: None, + windows_sandbox_level: None, + model: None, + effort: None, + summary: None, + collaboration_mode: None, + personality: None, + }) + .await?; + } codex .submit(Op::UserInput { items: vec![UserInput::Text { @@ -1540,10 +1581,17 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_including_incoming_us let follow_up_shape = request_input_shape(&requests[2]); insta::assert_snapshot!( "remote_pre_turn_compaction_including_incoming_shapes", - sectioned_request_shapes(&[ - ("Remote Compaction Request", &compact_request), - ("Remote Post-Compaction History Layout", &requests[2]), - ]) + sectioned_request_shapes( + "Remote pre-turn auto-compaction with a context override emits the context diff in the compact request while excluding the incoming user message on main.", + &[ + ("Remote Compaction Request", &compact_request), + ("Remote Post-Compaction History Layout", &requests[2]), + ] + ) + ); + assert!( + compact_shape.contains(PRETURN_CONTEXT_DIFF_CWD_MARKER), + "expected remote compact request to include pre-turn context diff" ); assert!( !compact_shape.contains("USER_THREE"), @@ -1640,10 +1688,13 @@ async fn snapshot_request_shape_remote_pre_turn_compaction_failure_stops_without let include_attempt_shape = request_input_shape(&include_attempt_request); insta::assert_snapshot!( "remote_pre_turn_compaction_failure_shapes", - sectioned_request_shapes(&[( - "Remote Compaction Request (Incoming User Excluded on main)", - &include_attempt_request - ),]) + sectioned_request_shapes( + "Remote pre-turn auto-compaction parse failure on main: compaction request excludes the incoming user message and the turn stops.", + &[( + "Remote Compaction Request (Incoming User Excluded on main)", + &include_attempt_request + ),] + ) ); assert!( !include_attempt_shape.contains("USER_TWO"), @@ -1721,10 +1772,13 @@ async fn snapshot_request_shape_remote_mid_turn_continuation_compaction() -> Res let follow_up_shape = request_input_shape(&requests[1]); insta::assert_snapshot!( "remote_mid_turn_compaction_shapes", - sectioned_request_shapes(&[ - ("Remote Compaction Request", &compact_request), - ("Remote Post-Compaction History Layout", &requests[1]), - ]) + sectioned_request_shapes( + "Remote mid-turn continuation compaction after tool output: compact request includes tool artifacts and follow-up request includes the summary.", + &[ + ("Remote Compaction Request", &compact_request), + ("Remote Post-Compaction History Layout", &requests[1]), + ] + ) ); assert!( compact_shape.contains("function_call_output"), @@ -1787,10 +1841,13 @@ async fn snapshot_request_shape_remote_manual_compact_without_previous_user_mess let follow_up_shape = request_input_shape(&follow_up_request); insta::assert_snapshot!( "remote_manual_compact_without_prev_user_shapes", - sectioned_request_shapes(&[ - ("Remote Compaction Request", &compact_request), - ("Remote Post-Compaction History Layout", &follow_up_request), - ]) + sectioned_request_shapes( + "Remote manual /compact with no prior user turn still issues a compact request on main; follow-up turn carries canonical context and new user message.", + &[ + ("Remote Compaction Request", &compact_request), + ("Remote Post-Compaction History Layout", &follow_up_request), + ] + ) ); assert!( !follow_up_shape.contains(""), @@ -1873,10 +1930,13 @@ async fn snapshot_request_shape_remote_manual_compact_with_previous_user_message let follow_up_shape = request_input_shape(&requests[1]); insta::assert_snapshot!( "remote_manual_compact_with_history_shapes", - sectioned_request_shapes(&[ - ("Remote Compaction Request", &compact_request), - ("Remote Post-Compaction History Layout", &requests[1]), - ]) + sectioned_request_shapes( + "Remote manual /compact with prior user history compacts existing history and follow-up includes compact summary plus new user message.", + &[ + ("Remote Compaction Request", &compact_request), + ("Remote Post-Compaction History Layout", &requests[1]), + ] + ) ); assert!( compact_shape.contains("USER_ONE"), diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_with_history_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_with_history_shapes.snap index d14cf00986..e507b79ecc 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_with_history_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_with_history_shapes.snap @@ -1,12 +1,13 @@ --- source: core/tests/suite/compact.rs -assertion_line: 3086 -expression: "sectioned_request_shapes(&[(\"Local Compaction Request\", &requests[1]),\n(\"Local Post-Compaction History Layout\", &requests[2]),])" +expression: "sectioned_request_shapes(\"Manual /compact with prior user history compacts existing history and the follow-up turn includes the compact summary plus new user message.\",\n&[(\"Local Compaction Request\", &requests[1]),\n(\"Local Post-Compaction History Layout\", &requests[2]),])" --- +Scenario: Manual /compact with prior user history compacts existing history and the follow-up turn includes the compact summary plus new user message. + ## Local Compaction Request 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:message/assistant:FIRST_REPLY 05:message/user: @@ -14,7 +15,7 @@ expression: "sectioned_request_shapes(&[(\"Local Compaction Request\", &requests ## Local Post-Compaction History Layout 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:message/user: 05:message/user:USER_TWO diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_without_prev_user_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_without_prev_user_shapes.snap index 0c382c0008..b21b68af5b 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_without_prev_user_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact__manual_compact_without_prev_user_shapes.snap @@ -1,10 +1,11 @@ --- source: core/tests/suite/compact.rs -assertion_line: 3015 -expression: "sectioned_request_shapes(&[(\"Local Post-Compaction History Layout\",\n&requests[0]),])" +expression: "sectioned_request_shapes(\"Manual /compact with no prior user turn behaves as a no-op and follow-up turn carries only canonical initial context plus the new user message.\",\n&[(\"Local Post-Compaction History Layout\", &requests[0]),])" --- +Scenario: Manual /compact with no prior user turn behaves as a no-op and follow-up turn carries only canonical initial context plus the new user message. + ## Local Post-Compaction History Layout 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user: diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact__mid_turn_compaction_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact__mid_turn_compaction_shapes.snap index 30519d5e71..4472ea863d 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact__mid_turn_compaction_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact__mid_turn_compaction_shapes.snap @@ -1,11 +1,13 @@ --- source: core/tests/suite/compact.rs -expression: "sectioned_request_shapes(&[(\"Local Compaction Request\", &requests[1]),\n(\"Local Post-Compaction History Layout\", &requests[2]),])" +expression: "sectioned_request_shapes(\"Mid-turn continuation compaction after tool output: compact request includes tool artifacts and follow-up request includes the summary.\",\n&[(\"Local Compaction Request\", &requests[1]),\n(\"Local Post-Compaction History Layout\", &requests[2]),])" --- +Scenario: Mid-turn continuation compaction after tool output: compact request includes tool artifacts and follow-up request includes the summary. + ## Local Compaction Request 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:function_call/ 05:function_call_output: @@ -14,6 +16,6 @@ expression: "sectioned_request_shapes(&[(\"Local Compaction Request\", &requests ## Local Post-Compaction History Layout 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:message/user: diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_context_window_exceeded_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_context_window_exceeded_shapes.snap index ae0431cc40..c2452c67fa 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_context_window_exceeded_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_context_window_exceeded_shapes.snap @@ -1,12 +1,13 @@ --- source: core/tests/suite/compact.rs -assertion_line: 2878 -expression: "sectioned_request_shapes(&[(\"Local Compaction Request (Incoming User Excluded on main)\",\n&requests[1]),])" +expression: "sectioned_request_shapes(\"Pre-turn auto-compaction context-window failure on main: compaction request excludes the incoming user message and the turn errors.\",\n&[(\"Local Compaction Request (Incoming User Excluded on main)\",\n&requests[1]),])" --- +Scenario: Pre-turn auto-compaction context-window failure on main: compaction request excludes the incoming user message and the turn errors. + ## Local Compaction Request (Incoming User Excluded on main) 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:message/assistant:FIRST_REPLY 05:message/user: diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap index 102e2b055b..e8bb19a4cd 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact__pre_turn_compaction_including_incoming_shapes.snap @@ -1,22 +1,24 @@ --- source: core/tests/suite/compact.rs -assertion_line: 2763 -expression: "sectioned_request_shapes(&[(\"Local Compaction Request\", &requests[2]),\n(\"Local Post-Compaction History Layout\", &requests[3]),])" +expression: "sectioned_request_shapes(\"Pre-turn auto-compaction with a context override emits the context diff in the compact request while the incoming user message is still excluded on main.\",\n&[(\"Local Compaction Request\", &requests[2]),\n(\"Local Post-Compaction History Layout\", &requests[3]),])" --- +Scenario: Pre-turn auto-compaction with a context override emits the context diff in the compact request while the incoming user message is still excluded on main. + ## Local Compaction Request 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:message/assistant:FIRST_REPLY 05:message/user:USER_TWO 06:message/assistant:SECOND_REPLY -07:message/user: +07:message/user: +08:message/user: ## Local Post-Compaction History Layout 00:message/developer: 01:message/user: -02:message/user: +02:message/user: 03:message/user:USER_ONE 04:message/user:USER_TWO 05:message/user: diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_with_history_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_with_history_shapes.snap index 311fa2d7c0..5814c71c3a 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_with_history_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_with_history_shapes.snap @@ -1,12 +1,13 @@ --- source: core/tests/suite/compact_remote.rs -assertion_line: 1879 -expression: "sectioned_request_shapes(&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &requests[1]),])" +expression: "sectioned_request_shapes(\"Remote manual /compact with prior user history compacts existing history and follow-up includes compact summary plus new user message.\",\n&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &requests[1]),])" --- +Scenario: Remote manual /compact with prior user history compacts existing history and follow-up includes compact summary plus new user message. + ## Remote Compaction Request 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:message/assistant:REMOTE_MANUAL_FIRST_REPLY @@ -14,6 +15,6 @@ expression: "sectioned_request_shapes(&[(\"Remote Compaction Request\", &compact 00:message/user:USER_ONE 01:message/developer: 02:message/user: -03:message/user: +03:message/user:> 04:message/user: 05:message/user:USER_TWO diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_without_prev_user_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_without_prev_user_shapes.snap index 5ec4a77b0b..4e4c7098ca 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_without_prev_user_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_manual_compact_without_prev_user_shapes.snap @@ -1,15 +1,16 @@ --- source: core/tests/suite/compact_remote.rs -assertion_line: 1793 -expression: "sectioned_request_shapes(&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &follow_up_request),])" +expression: "sectioned_request_shapes(\"Remote manual /compact with no prior user turn still issues a compact request on main; follow-up turn carries canonical context and new user message.\",\n&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &follow_up_request),])" --- +Scenario: Remote manual /compact with no prior user turn still issues a compact request on main; follow-up turn carries canonical context and new user message. + ## Remote Compaction Request 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> ## Remote Post-Compaction History Layout 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_shapes.snap index 2c7b1b0e68..979c122b15 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_mid_turn_compaction_shapes.snap @@ -1,12 +1,13 @@ --- source: core/tests/suite/compact_remote.rs -assertion_line: 1727 -expression: "sectioned_request_shapes(&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &requests[1]),])" +expression: "sectioned_request_shapes(\"Remote mid-turn continuation compaction after tool output: compact request includes tool artifacts and follow-up request includes the summary.\",\n&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &requests[1]),])" --- +Scenario: Remote mid-turn continuation compaction after tool output: compact request includes tool artifacts and follow-up request includes the summary. + ## Remote Compaction Request 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:function_call/ 05:function_call_output: @@ -15,5 +16,5 @@ expression: "sectioned_request_shapes(&[(\"Remote Compaction Request\", &compact 00:message/user:USER_ONE 01:message/developer: 02:message/user: -03:message/user: +03:message/user:> 04:message/user: diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_failure_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_failure_shapes.snap index 9b3d1a69aa..2cac4940b1 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_failure_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_failure_shapes.snap @@ -1,11 +1,12 @@ --- source: core/tests/suite/compact_remote.rs -assertion_line: 1646 -expression: "sectioned_request_shapes(&[(\"Remote Compaction Request (Incoming User Excluded on main)\",\n&include_attempt_request),])" +expression: "sectioned_request_shapes(\"Remote pre-turn auto-compaction parse failure on main: compaction request excludes the incoming user message and the turn stops.\",\n&[(\"Remote Compaction Request (Incoming User Excluded on main)\",\n&include_attempt_request),])" --- +Scenario: Remote pre-turn auto-compaction parse failure on main: compaction request excludes the incoming user message and the turn stops. + ## Remote Compaction Request (Incoming User Excluded on main) 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:message/assistant:REMOTE_FIRST_REPLY diff --git a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap index 64501010e8..48346aebab 100644 --- a/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap +++ b/codex-rs/core/tests/suite/snapshots/all__suite__compact_remote__remote_pre_turn_compaction_including_incoming_shapes.snap @@ -1,16 +1,18 @@ --- source: core/tests/suite/compact_remote.rs -assertion_line: 1546 -expression: "sectioned_request_shapes(&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &requests[2]),])" +expression: "sectioned_request_shapes(\"Remote pre-turn auto-compaction with a context override emits the context diff in the compact request while excluding the incoming user message on main.\",\n&[(\"Remote Compaction Request\", &compact_request),\n(\"Remote Post-Compaction History Layout\", &requests[2]),])" --- +Scenario: Remote pre-turn auto-compaction with a context override emits the context diff in the compact request while excluding the incoming user message on main. + ## Remote Compaction Request 00:message/developer: 01:message/user: -02:message/user: +02:message/user:> 03:message/user:USER_ONE 04:message/assistant:REMOTE_FIRST_REPLY 05:message/user:USER_TWO 06:message/assistant:REMOTE_SECOND_REPLY +07:message/user: ## Remote Post-Compaction History Layout 00:message/user:USER_ONE @@ -18,6 +20,6 @@ expression: "sectioned_request_shapes(&[(\"Remote Compaction Request\", &compact 02:message/user:USER_THREE 03:message/developer: 04:message/user: -05:message/user: +05:message/user: 06:message/user: 07:message/user:USER_THREE