diff --git a/tests/runner-e2e/run-observations.ts b/tests/runner-e2e/run-observations.ts index c7be8dec07..f8883ad6b0 100644 --- a/tests/runner-e2e/run-observations.ts +++ b/tests/runner-e2e/run-observations.ts @@ -37,13 +37,38 @@ export function isControlPlaneGovernedResponseWait( if (accepted.length !== 1) return false; const envelope = record(accepted[0]?.payload?.prpEvent); const result = record(record(envelope.payload).result); + const continuation = record(result.continuation); + const idempotencyKey = continuation.idempotencyKey; + if ( + typeof idempotencyKey !== "string" || + !idempotencyKey.startsWith("interaction-response:") + ) { + return false; + } + const interactionId = idempotencyKey.slice("interaction-response:".length); + if (!interactionId) return false; + const interactionRef = `interaction:${interactionId}`; + const hasEvidence = + Array.isArray(result.evidence) && + result.evidence.some((value) => record(value).ref === interactionRef); + const hasInteractionArtifact = + Array.isArray(result.artifacts) && + result.artifacts.some((value) => { + const artifact = record(value); + return ( + artifact.kind === "issue_thread_interaction" && + artifact.ref === interactionRef + ); + }); return ( envelope.schema === "paperclip.prp.event.v1" && envelope.eventType === "run.result.accepted" && envelope.sourceKind === "control_plane" && result.schema === "paperclip.run_result.v1" && result.reportedWorkDisposition === "yielded" && - record(result.continuation).kind === "response_wake" + continuation.kind === "response_wake" && + hasEvidence && + hasInteractionArtifact ); } diff --git a/tests/runner-e2e/support.test.ts b/tests/runner-e2e/support.test.ts index 71e1387f1f..e310b98640 100644 --- a/tests/runner-e2e/support.test.ts +++ b/tests/runner-e2e/support.test.ts @@ -314,7 +314,17 @@ describe("runner E2E run observations", () => { result: { schema: "paperclip.run_result.v1", reportedWorkDisposition: "yielded", - continuation: { kind: "response_wake" }, + evidence: [{ ref: "interaction:pending" }], + artifacts: [ + { + kind: "issue_thread_interaction", + ref: "interaction:pending", + }, + ], + continuation: { + kind: "response_wake", + idempotencyKey: "interaction-response:pending", + }, }, }, }, @@ -334,6 +344,24 @@ describe("runner E2E run observations", () => { }, ]), ).toBe(false); + expect( + isControlPlaneGovernedResponseWait([ + { + ...event, + payload: { + prpEvent: { + ...event.payload.prpEvent, + payload: { + result: { + ...event.payload.prpEvent.payload.result, + artifacts: [], + }, + }, + }, + }, + }, + ]), + ).toBe(false); expect( isControlPlaneGovernedResponseWait([ event,