From 2a877ad9d2ed4a30f2a0cdacd78d0840a41707c7 Mon Sep 17 00:00:00 2001 From: Dotta Date: Wed, 30 Sep 2026 20:09:35 -0500 Subject: [PATCH] fix(runner-e2e): admit explicit native active-stop candidates Co-Authored-By: Paperclip --- tests/runner-e2e/extended-harnesses.test.ts | 17 +++++++++++++++++ tests/runner-e2e/harness-env.ts | 3 ++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/runner-e2e/extended-harnesses.test.ts b/tests/runner-e2e/extended-harnesses.test.ts index 0ca6585769..f797112e07 100644 --- a/tests/runner-e2e/extended-harnesses.test.ts +++ b/tests/runner-e2e/extended-harnesses.test.ts @@ -62,6 +62,23 @@ describe("extended ACP harness qualification", () => { } } }); + it("admits all four explicit active-Stop cells only for Cursor and Copilot", () => { + const cells = selectRunnerExecutions(parseRunnerSelectors(["--suite", "native-active-stop"])); + expect(cells).toHaveLength(4); + expect(new Set(cells.map(cell => `${cell.profile.qualificationCandidate}:${cell.environment.id}`))).toEqual( + new Set(["cursor:local", "cursor:daytona", "copilot:local", "copilot:daytona"]), + ); + for (const cell of cells) { + expect(cell.suite.manualOnly).toBe(true); + expect(JSON.parse(buildRunnerE2EProcessEnvironment({ PAPERCLIP_RUNNER_ACPX_QUALIFICATION: "ambient" }, [cell]).PAPERCLIP_RUNNER_ACPX_QUALIFICATION!)) + .toEqual([{ agent: cell.profile.qualificationCandidate, model: cell.profile.model }]); + expect(() => buildRunnerE2EProcessEnvironment({}, [{ ...cell, suite: { ...cell.suite, manualOnly: false } }])).toThrow("explicit"); + expect(() => buildRunnerE2EProcessEnvironment({}, [{ ...cell, profile: { ...cell.profile, qualificationCandidate: "pi" } }])).toThrow("explicit"); + expect(() => buildRunnerE2EProcessEnvironment({}, [{ ...cell, suite: { ...cell.suite, id: "unrelated-manual-suite" } }])).toThrow("explicit"); + } + const implicit = selectRunnerExecutions(parseRunnerSelectors(["--all"])); + expect(implicit.some(cell => cell.suite.id === "native-active-stop")).toBe(false); + }); it("requires both image executable pins for remote native cases before setup", () => { const remote = runnerMatrix.filter(cell => cell.environment.id === "daytona" && ["cursor-native", "pi-native", "copilot-protection"].includes(cell.suite.id)); const valid = { PAPERCLIP_E2E_DAYTONA_NODE_SHA256: `sha256:${"a".repeat(64)}`, PAPERCLIP_E2E_DAYTONA_RUNNERD_SHA256: `sha256:${"b".repeat(64)}` }; diff --git a/tests/runner-e2e/harness-env.ts b/tests/runner-e2e/harness-env.ts index 0f4397ad70..64322b6dca 100644 --- a/tests/runner-e2e/harness-env.ts +++ b/tests/runner-e2e/harness-env.ts @@ -119,7 +119,8 @@ export function buildRunnerE2EProcessEnvironment( || execution.suite.id === "rich-acp-warm-continuity" || (execution.suite.id === "pi-native" && agent === "pi") || (execution.suite.id === "cursor-native" && agent === "cursor") - || (execution.suite.id === "copilot-protection" && agent === "copilot"); + || (execution.suite.id === "copilot-protection" && agent === "copilot") + || (execution.suite.id === "native-active-stop" && (agent === "cursor" || agent === "copilot")); if (!admittedSuite || !execution.suite.manualOnly) { throw new Error("Candidate qualification requires an explicit provider qualification suite"); }