From 505f78bd29813fbf78ed855d1da6636ff4c286d1 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Mon, 4 May 2026 16:53:20 +0000 Subject: [PATCH] ci: re-review on push, thread prior PR comments into reviewer context (#9032) * ci: re-review on push, thread prior PR comments into reviewer context - Add 'synchronize' to all three review workflow triggers so each push to a PR branch re-runs Claude/Codex/Pi. Existing cancel-in-progress concurrency groups ensure only the latest push's review actually executes. - Fetch the most recent up to 20 PR comments before each review and inject them into the prompt context so the reviewer can recognize its own previous review, focus on what changed, and avoid repeating findings the human already addressed. - Update the three review prompts (Claude, Codex, Pi) to instruct the reviewer to honor the prior-discussion section when present. Co-Authored-By: Claude Opus 4.7 (1M context) * ci: bump codex CLI to 0.128.0 for gpt-5.5 support Codex 0.117.0 rejects the gpt-5.5 model with 'requires a newer version of Codex'. 0.128.0 is the current stable release on npm. Co-Authored-By: Claude Opus 4.7 (1M context) * ci: limit synchronize re-trigger to pi review only Re-running Claude and Codex on every push gets expensive fast on busy PRs. Pi (DeepSeek-V4) is cheap enough to re-run per push, while Claude/Codex remain on opened/ready_for_review and re-trigger via slash commands. Co-Authored-By: Claude Opus 4.7 (1M context) --------- Co-authored-by: Claude Opus 4.7 (1M context) --- .claude/review-prompt.md | 1 + .github/codex/pr-review.prompt.md | 3 ++- .github/pi/pr-review.prompt.md | 3 ++- .github/workflows/codex-pr-review.yml | 30 ++++++++++++++++++++++++++- .github/workflows/pi-pr-review.yml | 30 ++++++++++++++++++++++++++- .github/workflows/pr-ready-review.yml | 22 ++++++++++++++++++++ 6 files changed, 85 insertions(+), 4 deletions(-) diff --git a/.claude/review-prompt.md b/.claude/review-prompt.md index 6814089bea..c862f2d1bc 100644 --- a/.claude/review-prompt.md +++ b/.claude/review-prompt.md @@ -19,6 +19,7 @@ Read all relevant CLAUDE.md files (root and in directories containing changed fi - Use top-level comments for general observations or praise - Only flag issues introduced by this PR, not pre-existing problems - Self-validate each finding: "Is this definitely a real issue?" If uncertain, discard it +- If the prompt includes a "Prior PR discussion" section, this PR has already been reviewed. Look for your own earlier comment, focus on what changed in the latest commits, and do not repeat findings the human already pushed back on or addressed ## Testing Instructions diff --git a/.github/codex/pr-review.prompt.md b/.github/codex/pr-review.prompt.md index f0f7619b7a..141fd52d61 100644 --- a/.github/codex/pr-review.prompt.md +++ b/.github/codex/pr-review.prompt.md @@ -9,7 +9,8 @@ Review policy: Repository context: - Read `./.github/codex/pr-review-context.md` for the PR metadata and the exact diff commands to use. -- If the context file ends with an "Additional reviewer instructions:" section, treat it as extra guidance from the human who triggered this review and follow it. +- If the context file contains an "Additional reviewer instructions:" section, treat it as extra guidance from the human who triggered this review and follow it. +- If the context file contains a "Prior PR discussion" section, this PR has already received review activity. Look for your own previous "## Codex Review" comment, take it into account, focus on what changed in the latest commits, and do not repeat findings the human already pushed back on or addressed. - Review only the changes introduced by this PR. - Read additional files only when the diff is not enough to validate a finding. - Do not modify any files. diff --git a/.github/pi/pr-review.prompt.md b/.github/pi/pr-review.prompt.md index ec9f340120..93ad730ba0 100644 --- a/.github/pi/pr-review.prompt.md +++ b/.github/pi/pr-review.prompt.md @@ -9,7 +9,8 @@ Review policy: Repository context: - Read `./.github/pi/pr-review-context.md` for PR metadata and the exact diff commands to use. -- If the context file ends with an "Additional reviewer instructions:" section, treat it as extra guidance from the human who triggered this review and follow it. +- If the context file contains an "Additional reviewer instructions:" section, treat it as extra guidance from the human who triggered this review and follow it. +- If the context file contains a "Prior PR discussion" section, this PR has already received review activity. Look for your own previous "## Pi Review (DeepSeek V4)" comment, take it into account, focus on what changed in the latest commits, and do not repeat findings the human already pushed back on or addressed. - Run those `git diff` / `git log` commands to inspect the changes — they reference the base and head SHAs of this PR. - Review only the changes introduced by this PR. Read additional files only when the diff is not enough to validate a finding. - Do not modify any files. Do not create new files outside this review. diff --git a/.github/workflows/codex-pr-review.yml b/.github/workflows/codex-pr-review.yml index 1a3e968272..79b77f842d 100644 --- a/.github/workflows/codex-pr-review.yml +++ b/.github/workflows/codex-pr-review.yml @@ -163,7 +163,7 @@ jobs: - name: Install Codex CLI if: steps.codex_config.outputs.enabled == 'true' && steps.pr.outputs.skip != 'true' - run: npm install --global @openai/codex@0.117.0 + run: npm install --global @openai/codex@0.128.0 - name: Configure file-backed Codex auth if: steps.codex_config.outputs.enabled == 'true' && steps.pr.outputs.skip != 'true' @@ -191,6 +191,17 @@ jobs: "$PR_BASE_REF" \ "+refs/pull/$PR_NUMBER/head" + - name: Fetch prior PR discussion + if: steps.codex_config.outputs.enabled == 'true' && steps.pr.outputs.skip != 'true' + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + PR_NUMBER: ${{ steps.pr.outputs.pr_number }} + run: | + gh api "repos/$REPO/issues/$PR_NUMBER/comments?per_page=100" \ + --jq '[.[] | {user: .user.login, created_at: .created_at, body: (.body | .[:4000])}] | sort_by(.created_at) | .[-20:]' \ + > prior-comments.json || echo "[]" > prior-comments.json + - name: Write Codex review context if: steps.codex_config.outputs.enabled == 'true' && steps.pr.outputs.skip != 'true' env: @@ -229,6 +240,23 @@ jobs: if (process.env.EXTRA_PROMPT && process.env.EXTRA_PROMPT.trim()) { lines.push('', 'Additional reviewer instructions:', process.env.EXTRA_PROMPT.trim()); } + if (fs.existsSync('prior-comments.json')) { + try { + const comments = JSON.parse(fs.readFileSync('prior-comments.json', 'utf8')); + if (Array.isArray(comments) && comments.length > 0) { + lines.push( + '', + 'Prior PR discussion (most recent up to 20 comments):', + '', + 'If you have already reviewed this PR (look for your own earlier "## Codex Review" comment), focus on what changed since then per the diff and respect any decisions the human made in replies. Do not re-flag findings the human already pushed back on.', + '' + ); + for (const c of comments) { + lines.push(`### @${c.user} (${c.created_at})`, '', c.body, '', '---', ''); + } + } + } catch (_) {} + } fs.writeFileSync('.github/codex/pr-review-context.md', `${lines.join('\n')}\n`); NODE diff --git a/.github/workflows/pi-pr-review.yml b/.github/workflows/pi-pr-review.yml index eba8c2bad3..d7c743fc16 100644 --- a/.github/workflows/pi-pr-review.yml +++ b/.github/workflows/pi-pr-review.yml @@ -2,7 +2,7 @@ name: Pi Auto Review on: pull_request: - types: [ready_for_review, opened] + types: [ready_for_review, opened, synchronize] workflow_call: inputs: pr_number: @@ -175,6 +175,17 @@ jobs: "$PR_BASE_REF" \ "+refs/pull/$PR_NUMBER/head" + - name: Fetch prior PR discussion + if: steps.pi_config.outputs.enabled == 'true' && steps.pr.outputs.skip != 'true' + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + PR_NUMBER: ${{ steps.pr.outputs.pr_number }} + run: | + gh api "repos/$REPO/issues/$PR_NUMBER/comments?per_page=100" \ + --jq '[.[] | {user: .user.login, created_at: .created_at, body: (.body | .[:4000])}] | sort_by(.created_at) | .[-20:]' \ + > prior-comments.json || echo "[]" > prior-comments.json + - name: Write Pi review context if: steps.pi_config.outputs.enabled == 'true' && steps.pr.outputs.skip != 'true' env: @@ -213,6 +224,23 @@ jobs: if (process.env.EXTRA_PROMPT && process.env.EXTRA_PROMPT.trim()) { lines.push('', 'Additional reviewer instructions:', process.env.EXTRA_PROMPT.trim()); } + if (fs.existsSync('prior-comments.json')) { + try { + const comments = JSON.parse(fs.readFileSync('prior-comments.json', 'utf8')); + if (Array.isArray(comments) && comments.length > 0) { + lines.push( + '', + 'Prior PR discussion (most recent up to 20 comments):', + '', + 'If you have already reviewed this PR (look for your own earlier "## Pi Review (DeepSeek V4)" comment), focus on what changed since then per the diff and respect any decisions the human made in replies. Do not re-flag findings the human already pushed back on.', + '' + ); + for (const c of comments) { + lines.push(`### @${c.user} (${c.created_at})`, '', c.body, '', '---', ''); + } + } + } catch (_) {} + } fs.writeFileSync('.github/pi/pr-review-context.md', `${lines.join('\n')}\n`); NODE diff --git a/.github/workflows/pr-ready-review.yml b/.github/workflows/pr-ready-review.yml index 78cfd41bc2..0058ffa8d9 100644 --- a/.github/workflows/pr-ready-review.yml +++ b/.github/workflows/pr-ready-review.yml @@ -99,6 +99,24 @@ jobs: echo "pr_number=$EVENT_PR_NUMBER" >> "$GITHUB_OUTPUT" fi + - name: Fetch prior PR discussion + id: prior + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + PR_NUMBER: ${{ steps.resolve.outputs.pr_number }} + run: | + gh api "repos/$REPO/issues/$PR_NUMBER/comments?per_page=100" \ + --jq '[.[] | {user: .user.login, created_at: .created_at, body: (.body | .[:4000])}] | sort_by(.created_at) | .[-20:]' \ + > prior-comments.json || echo "[]" > prior-comments.json + jq -r ' + if length == 0 then "" + else + "## Prior PR discussion (most recent up to 20 comments)\n\nIf you have already reviewed this PR (look for your own earlier comment), focus on what changed since then per the diff and respect any decisions the human made in replies. Do not re-flag findings the human already pushed back on.\n\n" + + (map("### @\(.user) (\(.created_at))\n\n\(.body)") | join("\n\n---\n\n")) + end + ' prior-comments.json > prior-comments.md + - name: Read review prompt id: review-prompt env: @@ -113,6 +131,10 @@ jobs: echo '' printf '%s\n' "$EXTRA_PROMPT" fi + if [ -s prior-comments.md ]; then + echo '' + cat prior-comments.md + fi echo 'EOF' } >> "$GITHUB_ENV"