From bd5daad79a2fd2bed016fa00498ae80b5ec2e93a Mon Sep 17 00:00:00 2001 From: Dallin Romney Date: Fri, 31 Jul 2026 14:13:53 +0800 Subject: [PATCH] fix(release): accept legacy zero skipped runtime summaries (#116429) --- scripts/validate-qa-runtime-pair-summary.mjs | 6 +++- .../validate-qa-runtime-pair-summary.test.ts | 28 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/scripts/validate-qa-runtime-pair-summary.mjs b/scripts/validate-qa-runtime-pair-summary.mjs index f8eaaca46c32..82bad799f3ec 100644 --- a/scripts/validate-qa-runtime-pair-summary.mjs +++ b/scripts/validate-qa-runtime-pair-summary.mjs @@ -207,9 +207,13 @@ export function validateQaRuntimePairSummary(summary, options = {}) { failed: 0, skipped, }; + const requiredCountKeys = ["total", "passed", "failed"]; + const skippedCountMatches = + summary.counts?.skipped === skipped || (skipped === 0 && summary.counts?.skipped === undefined); if ( !isRecord(summary.counts) || - Object.entries(expectedCounts).some(([key, value]) => summary.counts[key] !== value) + requiredCountKeys.some((key) => summary.counts[key] !== expectedCounts[key]) || + !skippedCountMatches ) { throw new Error("runtime-pair summary counts do not match validated scenario evidence"); } diff --git a/test/scripts/validate-qa-runtime-pair-summary.test.ts b/test/scripts/validate-qa-runtime-pair-summary.test.ts index d334c0ce7e74..b19e7dc6f121 100644 --- a/test/scripts/validate-qa-runtime-pair-summary.test.ts +++ b/test/scripts/validate-qa-runtime-pair-summary.test.ts @@ -162,6 +162,34 @@ describe("frozen QA runtime-pair summary validation", () => { }); }); + it("accepts an older all-passing summary that omitted zero skipped count", () => { + const fixture = summary([scenario({ name: "legacy passing", status: "pass" })]); + delete (fixture.counts as { skipped?: number }).skipped; + + expect(validateQaRuntimePairSummary(fixture)).toEqual({ + total: 1, + passed: 1, + failed: 0, + skipped: 0, + }); + }); + + it("requires skipped count when validated evidence contains skips", () => { + const fixture = summary([ + scenario({ + name: "tracked gap", + status: "skip", + codexStatus: "skip", + codexDetails: "known-harness-gap exec: tracked", + }), + ]); + delete (fixture.counts as { skipped?: number }).skipped; + + expect(() => validateQaRuntimePairSummary(fixture)).toThrow( + "counts do not match validated scenario evidence", + ); + }); + it("accepts a tracked Codex harness gap kept advisory by the current classifier", () => { const advisoryGap = scenario({ name: "tracked advisory gap",