From e74ed61a69fbdd8b3a8f15dd6456bc3140246e33 Mon Sep 17 00:00:00 2001 From: Dotta Date: Sat, 3 Oct 2026 00:00:29 -0500 Subject: [PATCH] test: match historical hosted native prerequisite repair Co-Authored-By: Paperclip --- tests/runner-e2e/native-completion-admission.test.ts | 4 +++- tests/runner-e2e/native-completion-checks.mjs | 7 ++++++- tests/runner-e2e/native-completion-checks.test.mjs | 12 +++++++++++- .../runner-e2e/native-completion-source-contract.mjs | 4 ++-- .../native-completion-source-contract.test.mjs | 4 ++-- 5 files changed, 24 insertions(+), 7 deletions(-) diff --git a/tests/runner-e2e/native-completion-admission.test.ts b/tests/runner-e2e/native-completion-admission.test.ts index 5fd847c2dc..7a9b1ef820 100644 --- a/tests/runner-e2e/native-completion-admission.test.ts +++ b/tests/runner-e2e/native-completion-admission.test.ts @@ -40,9 +40,11 @@ describe("native completion credential-free admission", () => { expect(spawn).toHaveBeenCalledTimes(1); }); it("retains credential-free prerequisites inside the exact campaign root and verifies them", () => { + const sourceSha = "c".repeat(40); + vi.stubEnv("PAPERCLIP_RUNNER_E2E_SOURCE_SHA", sourceSha); vi.stubEnv("OPENAI_API_KEY", "secret"); vi.stubEnv("UNLISTED_PROVIDER_CREDENTIAL", "secret"); spawn.mockReturnValueOnce({ status: 0 } as ReturnType); - spawn.mockReturnValueOnce({ status: 0, stdout: '{"passed":true}' } as ReturnType); + spawn.mockReturnValueOnce({ status: 0, stdout: JSON.stringify({ passed: true, sourceSha }) } as ReturnType); const receipt = prepareNativeCompletionPreflight(campaignDirectory); expect(receipt).toMatch(/^\/fixture\/results\/gha-1-1-native-completion\.fixture\/native-completion-prerequisites\/[^/]+\/preflight.json$/); expect(spawn.mock.calls[1]?.[1]).toContain(`--verify=${receipt}`); diff --git a/tests/runner-e2e/native-completion-checks.mjs b/tests/runner-e2e/native-completion-checks.mjs index 42830407a4..7d326e3bec 100644 --- a/tests/runner-e2e/native-completion-checks.mjs +++ b/tests/runner-e2e/native-completion-checks.mjs @@ -71,6 +71,11 @@ export function gradeNativeCompletionDiscovery(output, exitCode) { rows.every(row => row.length === 6 && row[1] === "native-completion" && row[2] === "native" && row[4]?.trim() && row[5]?.trim()), executionIds: ids, expectedCells: 6, expectedTurns: 6, maximumAttemptsPerCell: 1 }; } +/** capture() stores compact provenance JSON on its first line, then diagnostics. */ +export function gradeNativeCompletionHostedRunnerdEvidence(text, expected) { + try { return JSON.stringify(JSON.parse(text.split(/\r?\n/, 1)[0])) === JSON.stringify(expected); } + catch { return false; } +} export function gradeNativeCompletionRustCarrier(output, exitCode) { return exitCode === 0 && /^test provider_events::tests::preserves_closed_compatibility_terminal_tool_identity \.\.\. ok$/m.test(output) && /test result: ok\. 1 passed; 0 failed;/.test(output); @@ -199,7 +204,7 @@ export function main(args = process.argv.slice(2)) { throw new Error("Missing passing retained Rust terminal-tool carrier calibration."); if (id === "NC-hosted-runnerd" && (retained.executed !== false || retained.calibration !== "not_executed" || retained.total !== 0 || retained.passedTests !== 0 || - JSON.stringify(JSON.parse(text.split("\n\n")[0])) !== JSON.stringify(report.setup.runnerdProvenance))) + !gradeNativeCompletionHostedRunnerdEvidence(text, report.setup.runnerdProvenance))) throw new Error("Hosted runnerd reuse must retain exact binary proof and report Rust calibration not executed."); if (id === "NC-manifest" && manifestCommands(env).some(run => run.status !== 0)) throw new Error("Generated native capability manifests are stale."); diff --git a/tests/runner-e2e/native-completion-checks.test.mjs b/tests/runner-e2e/native-completion-checks.test.mjs index 07d15db189..36ca65c0c7 100644 --- a/tests/runner-e2e/native-completion-checks.test.mjs +++ b/tests/runner-e2e/native-completion-checks.test.mjs @@ -4,7 +4,7 @@ import { mkdtempSync, writeFileSync, rmSync } from "node:fs"; import { join } from "node:path"; import { tmpdir } from "node:os"; import { - nativeCompletionGates, gradeNativeCompletionGate, gradeNativeCompletionDiscovery, gradeNativeCompletionRustCarrier, + nativeCompletionGates, gradeNativeCompletionGate, gradeNativeCompletionDiscovery, gradeNativeCompletionRustCarrier, gradeNativeCompletionHostedRunnerdEvidence, assertNativeCompletionPreflightReceipt, assertRetainedNativeCompletionEvidence, nativeCompletionPrerequisiteEnvironment, NATIVE_COMPLETION_PREFLIGHT_SCHEMA, NATIVE_COMPLETION_CELL_IDS, NATIVE_COMPLETION_COMMAND_GATE_IDS, nativeCompletionCommandGateIds, } from "./native-completion-checks.mjs"; @@ -170,3 +170,13 @@ for (const [name, mutate] of [ r.gates.sort((a,b) => a.id === "NC-hosted-runnerd" ? 1 : b.id === "NC-hosted-runnerd" ? -1 : 0); mutate(r); assert.throws(() => assertNativeCompletionPreflightReceipt(r,c)); }); + +test("hosted runnerd evidence verifies the exact compact JSON capture before its diagnostic line", () => { + const proof = hostedFixture().c.runnerdProvenance; + const capture = `${JSON.stringify(proof)}\nRust unit calibration must be qualified by the separate exact-source local receipt and normal CI.`; + assert.equal(gradeNativeCompletionHostedRunnerdEvidence(capture, proof), true); + assert.equal(gradeNativeCompletionHostedRunnerdEvidence(capture.replace("\n", "\r\n"), proof), true); + assert.equal(gradeNativeCompletionHostedRunnerdEvidence(capture, { ...proof, binarySha256: "f".repeat(64) }), false); + assert.equal(gradeNativeCompletionHostedRunnerdEvidence(`not-json\n${JSON.stringify(proof)}`, proof), false); + assert.equal(gradeNativeCompletionHostedRunnerdEvidence("", proof), false); +}); diff --git a/tests/runner-e2e/native-completion-source-contract.mjs b/tests/runner-e2e/native-completion-source-contract.mjs index ae2a5e73da..6c6ea682ab 100644 --- a/tests/runner-e2e/native-completion-source-contract.mjs +++ b/tests/runner-e2e/native-completion-source-contract.mjs @@ -8,8 +8,8 @@ export const NATIVE_COMPLETION_SOURCE_CONTRACT = { "baseSha": "59c07ede72dc08b8aba149a01cc11e0b7a204621", "archiveSha": "9138f570c341c251a5727c32d6615ce238bc8e03", "shallowParentAnchors": { - "candidate": "b603222b8496c234b64c0642ca3ca4d5d8990318", - "historical": "e68a7edc569f73ba1eb26b5a47f6a22ce536babc" + "candidate": "0a9c5a75164cd0b02115ff12273aadb6a86c9464", + "historical": "00a761b967f9f73b0f45069c0ba828fae277a76e" }, "variants": { "candidate": { diff --git a/tests/runner-e2e/native-completion-source-contract.test.mjs b/tests/runner-e2e/native-completion-source-contract.test.mjs index 3030499172..d6044b2b51 100644 --- a/tests/runner-e2e/native-completion-source-contract.test.mjs +++ b/tests/runner-e2e/native-completion-source-contract.test.mjs @@ -67,8 +67,8 @@ test("native source contract binds exactly five production and six variant asser assert.equal(original.baseSha, "59c07ede72dc08b8aba149a01cc11e0b7a204621"); assert.equal(original.archiveSha, "9138f570c341c251a5727c32d6615ce238bc8e03"); assert.deepEqual(original.shallowParentAnchors, { - candidate: "b603222b8496c234b64c0642ca3ca4d5d8990318", - historical: "e68a7edc569f73ba1eb26b5a47f6a22ce536babc", + candidate: "0a9c5a75164cd0b02115ff12273aadb6a86c9464", + historical: "00a761b967f9f73b0f45069c0ba828fae277a76e", }); assert.ok(!NATIVE_COMPLETION_SOURCE_FILES.some(file => file.includes("stock-harness") || file.endsWith("issue-documents.md"))); });