diff --git a/packages/paperclip-runner/runner/crates/runner-core/tests/codex_provider.rs b/packages/paperclip-runner/runner/crates/runner-core/tests/codex_provider.rs index 3d9fcab756..0010ae6051 100644 --- a/packages/paperclip-runner/runner/crates/runner-core/tests/codex_provider.rs +++ b/packages/paperclip-runner/runner/crates/runner-core/tests/codex_provider.rs @@ -1286,24 +1286,31 @@ fn ambiguous_or_dead_replacement_start_preserves_result_not_exit_authority() { provider .start_turn("Accept replacement work before failing.", &config.cwd) .expect_err("the accepted replacement turn has no valid response"); - let ambiguous_start_exit = (0..64).find_map(|_| { - match provider - .poll() - .expect("poll exit after ambiguous replacement start") - { - Some(CodexProviderEvent::Exited { - success, - completed_turn_authoritative, - completion_reconciles_exit, - .. - }) => Some(( - success, - completed_turn_authoritative, - completion_reconciles_exit, - )), - _ => None, - } - }); + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(5); + let ambiguous_start_exit = (0..) + .take_while(|_| std::time::Instant::now() < deadline) + .find_map(|_| { + match provider + .poll() + .expect("poll exit after ambiguous replacement start") + { + Some(CodexProviderEvent::Exited { + success, + completed_turn_authoritative, + completion_reconciles_exit, + .. + }) => Some(( + success, + completed_turn_authoritative, + completion_reconciles_exit, + )), + Some(_) => None, + None => { + std::thread::sleep(std::time::Duration::from_millis(1)); + None + } + } + }); assert_eq!( ambiguous_start_exit, Some((false, true, false)), @@ -1427,44 +1434,51 @@ fn ambiguous_replacement_turn_adopts_one_later_completion_identity() { let mut replacement_started = false; let mut replacement_completed = false; - let replacement_exit = (0..128).find_map(|_| { - match provider - .poll() - .expect("poll evidence for accepted replacement turn") - { - Some(CodexProviderEvent::Notification { method, params }) - if method == "turn/started" => + let deadline = std::time::Instant::now() + std::time::Duration::from_secs(5); + let replacement_exit = (0..) + .take_while(|_| std::time::Instant::now() < deadline) + .find_map(|_| { + match provider + .poll() + .expect("poll evidence for accepted replacement turn") { - assert_eq!( - params.pointer("/turn/id").and_then(Value::as_str), - Some("provider-turn-2") - ); - replacement_started = true; - None + Some(CodexProviderEvent::Notification { method, params }) + if method == "turn/started" => + { + assert_eq!( + params.pointer("/turn/id").and_then(Value::as_str), + Some("provider-turn-2") + ); + replacement_started = true; + None + } + Some(CodexProviderEvent::Notification { method, params }) + if method == "turn/completed" => + { + assert_eq!( + params.pointer("/turn/id").and_then(Value::as_str), + Some("provider-turn-2") + ); + replacement_completed = true; + None + } + Some(CodexProviderEvent::Exited { + success, + completed_turn_authoritative, + completion_reconciles_exit, + .. + }) => Some(( + success, + completed_turn_authoritative, + completion_reconciles_exit, + )), + Some(_) => None, + None => { + std::thread::sleep(std::time::Duration::from_millis(1)); + None + } } - Some(CodexProviderEvent::Notification { method, params }) - if method == "turn/completed" => - { - assert_eq!( - params.pointer("/turn/id").and_then(Value::as_str), - Some("provider-turn-2") - ); - replacement_completed = true; - None - } - Some(CodexProviderEvent::Exited { - success, - completed_turn_authoritative, - completion_reconciles_exit, - .. - }) => Some(( - success, - completed_turn_authoritative, - completion_reconciles_exit, - )), - _ => None, - } - }); + }); assert!( replacement_started, "the replacement identity should be established before replaying its output for {label}"