diff --git a/extensions/qa-lab/src/runtime-parity.test.ts b/extensions/qa-lab/src/runtime-parity.test.ts index 79c411c2bfe..1c926a574a8 100644 --- a/extensions/qa-lab/src/runtime-parity.test.ts +++ b/extensions/qa-lab/src/runtime-parity.test.ts @@ -138,6 +138,25 @@ describe("runtime parity", () => { expect(result.drift).toBe("none"); }); + it("runs runtime cells serially so shared QA state cannot cross-contaminate", async () => { + const events: string[] = []; + const result = await runRuntimeParityScenario({ + scenarioId: "serial", + runCell: async (runtime) => { + events.push(`start:${runtime}`); + await Promise.resolve(); + events.push(`finish:${runtime}`); + return { + scenarioStatus: "pass", + cell: makeCell(runtime), + }; + }, + }); + + expect(result.drift).toBe("none"); + expect(events).toEqual(["start:pi", "finish:pi", "start:codex", "finish:codex"]); + }); + it("classifies final-text-only differences as text-only", async () => { const result = await runRuntimeParityScenario({ scenarioId: "text-only", diff --git a/extensions/qa-lab/src/runtime-parity.ts b/extensions/qa-lab/src/runtime-parity.ts index 175cd0f8e7f..eb0c63c83ec 100644 --- a/extensions/qa-lab/src/runtime-parity.ts +++ b/extensions/qa-lab/src/runtime-parity.ts @@ -910,7 +910,8 @@ export async function runRuntimeParityScenario(params: { scenarioId: string; runCell: (runtime: RuntimeId) => Promise; }): Promise { - const [pi, codex] = await Promise.all([params.runCell("pi"), params.runCell("codex")]); + const pi = await params.runCell("pi"); + const codex = await params.runCell("codex"); const drift = classifyRuntimeParityCells({ pi: pi.cell, codex: codex.cell,