From 7c8d77bfd49cddf382428a8778a426a6437dd523 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 30 Sep 2026 18:20:03 -0700 Subject: [PATCH] fix(pr): stop expiring completed ClawSweeper reviews after twelve hours (#162249) The landing gate treated a completed ClawSweeper review older than twelve hours as missing and forced a fresh bot review before merge-run even when head and findings were unchanged. Review age no longer matters: the gate requires a completed review marker, keeps the future-dated and conflicting-marker checks, and keeps the SHA-mismatch warning. --- scripts/pr-lib/clawsweeper-review-gate.mjs | 7 ++----- test/scripts/clawsweeper-review-gate.test.ts | 7 ++++++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/scripts/pr-lib/clawsweeper-review-gate.mjs b/scripts/pr-lib/clawsweeper-review-gate.mjs index 66388bd568e0..240573f2fe2f 100644 --- a/scripts/pr-lib/clawsweeper-review-gate.mjs +++ b/scripts/pr-lib/clawsweeper-review-gate.mjs @@ -73,9 +73,6 @@ for (const comment of pages.flat()) { if (age < -5 * 60_000) { fail("trusted review completion is materially future-dated."); } - if (age >= 12 * 60 * 60_000) { - continue; - } const evidence = { commentId: comment.id, reviewedAt: fields.reviewedAt, @@ -88,7 +85,7 @@ for (const comment of pages.flat()) { } if (completions.length === 0) { - fail("completed review is missing or expired."); + fail("completed review is missing."); } completions.sort( (a, b) => b.reviewedMs - a.reviewedMs || b.evidence.commentId - a.evidence.commentId, @@ -102,7 +99,7 @@ if (new Set(newest.map((candidate) => candidate.signature)).size !== 1) { const selected = newest[0].evidence; if (selected.reviewedSha !== headSha) { console.error( - `ClawSweeper review gate warning: reviewed SHA ${selected.reviewedSha} differs from current head ${headSha}; review is under 12 hours old.`, + `ClawSweeper review gate warning: reviewed SHA ${selected.reviewedSha} differs from current head ${headSha}.`, ); } process.stdout.write(`${JSON.stringify(selected)}\n`); diff --git a/test/scripts/clawsweeper-review-gate.test.ts b/test/scripts/clawsweeper-review-gate.test.ts index 30a4ac11e19a..e13cc11e4fd1 100644 --- a/test/scripts/clawsweeper-review-gate.test.ts +++ b/test/scripts/clawsweeper-review-gate.test.ts @@ -59,7 +59,6 @@ describe("ClawSweeper review completion gate", () => { ["duplicate attribute", [reviewComment({ attributes: " sha=" + head })]], ["malformed source revision", [reviewComment({ sourceRevision: "not-a-revision" })]], ["missing lease", [reviewComment({ leaseOwner: "unknown" })]], - ["expired boundary", [reviewComment({ reviewedAt: ago(12 * 60 * 60_000) })]], ["future dated", [reviewComment({ reviewedAt: ago(-6 * 60_000) })]], ])("rejects %s evidence", (_name, comments) => { const result = run(comments); @@ -67,6 +66,12 @@ describe("ClawSweeper review completion gate", () => { expect(result.stderr).toContain("ClawSweeper review gate failed:"); }); + it("accepts a completion older than twelve hours", () => { + const result = run([reviewComment({ reviewedAt: ago(36 * 60 * 60_000) })]); + expect(result.status, result.stderr).toBe(0); + expect(JSON.parse(result.stdout)).toMatchObject({ commentId: 1, reviewedSha: head }); + }); + it("selects the newest valid completion and ignores a queued refresh", () => { const newer = reviewComment({ id: 2,