From b97f3ce7c7120bce828d24a3ad019e77cf86d7c3 Mon Sep 17 00:00:00 2001 From: Dotta Date: Thu, 1 Oct 2026 11:20:58 -0500 Subject: [PATCH] test(runner): preserve idempotent receiver result retries Verify identical tool-result retries emit one sidecar resolution while changed payloads, operations, and error status remain rejected. Co-Authored-By: Paperclip --- .../tests/acpx_provider_session.rs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/paperclip-runner/runner/crates/runner-core/tests/acpx_provider_session.rs b/packages/paperclip-runner/runner/crates/runner-core/tests/acpx_provider_session.rs index e42e7a29083..2a3406fb6e3 100644 --- a/packages/paperclip-runner/runner/crates/runner-core/tests/acpx_provider_session.rs +++ b/packages/paperclip-runner/runner/crates/runner-core/tests/acpx_provider_session.rs @@ -273,7 +273,26 @@ fn check_tool_receiver_admission(oversized: bool) { assert!(session.state().pending_tool("call-admission").is_some()); session.deliver_tool_result(&result).unwrap(); assert!(!session.state().has_pending_tools()); - assert!(session.deliver_tool_result(&result).is_err()); + session + .deliver_tool_result(&result) + .expect("an identical receipt retry must be idempotent"); + let mut changed_payload = result.clone(); + changed_payload.result = json!({"id":"another-issue"}); + let mut changed_operation = result.clone(); + changed_operation.operation_id = "issues.write".to_owned(); + let mut changed_error = result.clone(); + changed_error.is_error = true; + for conflicting in [changed_payload, changed_operation, changed_error] { + let error = session + .deliver_tool_result(&conflicting) + .unwrap_err() + .to_string(); + assert!( + error.contains("conflicting duplicate tool result"), + "{error}" + ); + } + assert!(!session.state().has_pending_tools()); } session.shutdown("admission test complete").unwrap(); let rows: Vec = std::fs::read_to_string(&journal)