From c2aca2a256cc23b9c5326eb022be92ea440767e4 Mon Sep 17 00:00:00 2001 From: Aiden Cline Date: Fri, 3 Jul 2026 23:58:36 -0500 Subject: [PATCH] fix(ci): preserve PRs updated after review --- .../workflows/close-stale-pull-requests.yml | 49 +++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/.github/workflows/close-stale-pull-requests.yml b/.github/workflows/close-stale-pull-requests.yml index d702d8834a..6284784e23 100644 --- a/.github/workflows/close-stale-pull-requests.yml +++ b/.github/workflows/close-stale-pull-requests.yml @@ -45,14 +45,57 @@ jobs: } for (const pull of pulls) { - const updatedAt = Date.parse(pull.updated_at) + let feedbackAt = 0 + if (feedbackPulls.has(pull.number)) { + const [comments, reviews, reviewComments] = await Promise.all([ + github.paginate(github.rest.issues.listComments, { + owner, + repo, + issue_number: pull.number, + per_page: 100, + }), + github.paginate(github.rest.pulls.listReviews, { + owner, + repo, + pull_number: pull.number, + per_page: 100, + }), + github.paginate(github.rest.pulls.listReviewComments, { + owner, + repo, + pull_number: pull.number, + per_page: 100, + }), + ]) + + const feedbackTimes = [ + ...comments + .filter((comment) => comment.user?.login === process.env.REVIEWER) + .map((comment) => Date.parse(comment.updated_at)), + ...reviews + .filter((review) => review.user?.login === process.env.REVIEWER && review.submitted_at) + .map((review) => Date.parse(review.submitted_at)), + ...reviewComments + .filter((comment) => comment.user?.login === process.env.REVIEWER) + .map((comment) => Date.parse(comment.updated_at)), + ] + feedbackAt = Math.max(0, ...feedbackTimes) + } + + // Refetch after loading feedback so activity during this run cannot be missed. + const { data: currentPull } = await github.rest.pulls.get({ + owner, + repo, + pull_number: pull.number, + }) + const updatedAt = Date.parse(currentPull.updated_at) const monthStale = updatedAt < monthAgo - const feedbackStale = updatedAt < weekAgo && feedbackPulls.has(pull.number) + const feedbackStale = feedbackAt > 0 && feedbackAt < weekAgo && updatedAt <= feedbackAt if (!monthStale && !feedbackStale) continue const reason = monthStale ? "it has not been updated in 30 days" - : `it has not been updated in 7 days after feedback from @${process.env.REVIEWER}` + : `it has not been updated since feedback from @${process.env.REVIEWER} was left 7 days ago` await github.rest.issues.createComment({ owner,