From 63882cfd48c587156b6018cec90b322ecfa09308 Mon Sep 17 00:00:00 2001 From: Friel Date: Thu, 2 Apr 2026 00:10:22 +0000 Subject: [PATCH] fix(core): preserve unresolved fork references --- .../src/thread_rollout_truncation_tests.rs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/codex-rs/core/src/thread_rollout_truncation_tests.rs b/codex-rs/core/src/thread_rollout_truncation_tests.rs index 3420454605..ac1fcbfd6a 100644 --- a/codex-rs/core/src/thread_rollout_truncation_tests.rs +++ b/codex-rs/core/src/thread_rollout_truncation_tests.rs @@ -3,9 +3,11 @@ use crate::codex::make_session_and_context; use codex_protocol::AgentPath; use codex_protocol::models::ContentItem; use codex_protocol::models::ReasoningItemReasoningSummary; +use codex_protocol::protocol::ForkReferenceItem; use codex_protocol::protocol::InterAgentCommunication; use codex_protocol::protocol::ThreadRolledBackEvent; use pretty_assertions::assert_eq; +use tempfile::TempDir; fn user_msg(text: &str) -> ResponseItem { ResponseItem::Message { @@ -317,3 +319,25 @@ fn truncates_rollout_to_last_n_fork_turns_keeps_full_rollout_when_n_is_large() { serde_json::to_value(&rollout).unwrap() ); } + +#[tokio::test] +async fn materialize_rollout_items_for_replay_preserves_unresolved_fork_references() { + let codex_home = TempDir::new().unwrap(); + let fork_reference = RolloutItem::ForkReference(ForkReferenceItem { + rollout_path: "missing-rollout.jsonl".into(), + nth_user_message: 1, + }); + let rollout_items = vec![ + RolloutItem::ResponseItem(user_msg("u1")), + fork_reference.clone(), + RolloutItem::ResponseItem(assistant_msg("a1")), + ]; + + let materialized = + materialize_rollout_items_for_replay(codex_home.path(), &rollout_items).await; + + assert_eq!( + serde_json::to_value(&materialized).unwrap(), + serde_json::to_value(&rollout_items).unwrap() + ); +}