diff --git a/codex-rs/core/src/rollout/truncation.rs b/codex-rs/core/src/rollout/truncation.rs index f389d4ed81..58b5e19f89 100644 --- a/codex-rs/core/src/rollout/truncation.rs +++ b/codex-rs/core/src/rollout/truncation.rs @@ -4,6 +4,7 @@ //! interpreting them via `event_mapping::parse_turn_item(...)`. use crate::compact::COMPACT_USER_MESSAGE_MAX_TOKENS; +use crate::compact::is_summary_message; use crate::event_mapping; use crate::truncate::TruncationPolicy; use crate::truncate::approx_token_count; @@ -138,7 +139,12 @@ fn effective_user_turns(items: &[RolloutItem]) -> Vec { user_turns = match &compacted.replacement_history { Some(replacement) => user_turns_from_replacement(replacement, idx), None => { - let mut selected = select_user_turns_for_compaction(&user_turns); + let eligible: Vec = user_turns + .iter() + .filter(|turn| !is_summary_message(&turn.text)) + .cloned() + .collect(); + let mut selected = select_user_turns_for_compaction(&eligible); let summary = if compacted.message.is_empty() { "(no summary available)".to_string() } else { @@ -210,6 +216,7 @@ pub(crate) fn apply_rollbacks_to_rollout(items: &[RolloutItem]) -> Vec = turns.iter().map(|turn| turn.text.clone()).collect(); + assert_eq!(texts, vec!["u1".to_string(), "u2".to_string(), summary_two]); + } + #[test] fn effective_user_turns_use_placeholder_when_summary_empty() { let rollout_items = vec![