From 7f83004583981967492ff8cf3de4443be77c0839 Mon Sep 17 00:00:00 2001 From: neil-marcellini Date: Thu, 6 Aug 2026 19:22:00 -0700 Subject: [PATCH 1/5] Skip AI reviews when they already ran for the PR head commit --- .github/workflows/claude-review.yml | 84 ++++++++++++++++++----------- .github/workflows/codex-review.yml | 28 ++++++++-- 2 files changed, 77 insertions(+), 35 deletions(-) diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index 9a9142650fa0..83a44d03126d 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -3,23 +3,31 @@ name: PR Reviews with Claude Code permissions: contents: read pull-requests: write + statuses: write on: pull_request_target: types: [opened, ready_for_review] + issue_comment: + types: [created] concurrency: - group: claude-review-${{ github.event.pull_request.html_url }} + group: >- + claude-review-${{ + github.event_name == 'pull_request_target' && github.event.pull_request.html_url || + github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude review') && github.event.issue.html_url || + github.run_id + }} cancel-in-progress: true jobs: review: - if: | - github.event.pull_request.draft != true - && !contains(github.event.pull_request.title, 'Revert') + if: >- + (github.event_name == 'pull_request_target' && github.event.pull_request.draft != true && !contains(github.event.pull_request.title, 'Revert')) || + (github.event_name == 'issue_comment' && github.event.issue.pull_request && contains(github.event.comment.body, '@claude review')) runs-on: blacksmith-2vcpu-ubuntu-2404 env: - PR_NUMBER: ${{ github.event.pull_request.number }} + PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }} steps: - name: Checkout uses: useblacksmith/checkout@1c9394c220d293645707b625ba9d79685f093a8f # v1 @@ -28,9 +36,9 @@ jobs: id: gate uses: ./.github/actions/javascript/isAuthorizedContributor with: - PR_NUMBER: ${{ github.event.pull_request.number }} - ACTOR: ${{ github.event.pull_request.user.login }} - ACTOR_ASSOCIATION: ${{ github.event.pull_request.author_association }} + PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }} + ACTOR: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.user.login || github.event.comment.user.login }} + ACTOR_ASSOCIATION: ${{ github.event_name == 'pull_request_target' && github.event.pull_request.author_association || github.event.comment.author_association }} GITHUB_TOKEN: ${{ github.token }} OS_BOTIFY_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} @@ -53,25 +61,34 @@ jobs: if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' uses: ./.github/actions/composite/setupNode - - name: Filter paths - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' - uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1 - id: filter - with: - filters: | - code: - - 'src/**' - docs: - - 'docs/**/*.md' - - 'docs/**/*.csv' - - name: Setup Claude review toolkit if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' id: toolkit - uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@2b751e9a86d8690f53443cce0ce886079eccea76 + uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@798cfb2277f46bff2bc86dd52c97f790fd25193a - - name: Mark review as in progress + - name: Check for an existing review of this commit if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' + id: skip + env: + GH_TOKEN: ${{ github.token }} + run: shouldSkipReview.sh "$PR_NUMBER" "ai-review/claude" + + - name: Filter paths + if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' + id: filter + env: + GH_TOKEN: ${{ github.token }} + run: | + gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json files --jq '.files[].path' > changed-files.txt + if grep -q '^src/' changed-files.txt; then + echo "code=true" >> "$GITHUB_OUTPUT" + fi + if grep -qE '^docs/.*\.(md|csv)$' changed-files.txt; then + echo "docs=true" >> "$GITHUB_OUTPUT" + fi + + - name: Mark review as in progress + if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' env: GH_TOKEN: ${{ github.token }} run: | @@ -79,45 +96,50 @@ jobs: - name: Run Claude Code (code) id: code-review - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.filter.outputs.code == 'true' + if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' && steps.filter.outputs.code == 'true' uses: anthropics/claude-code-action@4d7e1f0cd85743fdc93b1c8040ab54395da024e2 # v1.0.149 with: display_report: 'true' anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} github_token: ${{ secrets.GITHUB_TOKEN }} allowed_non_write_users: '*' - prompt: '/review-code-pr REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number }}' + prompt: '/review-code-pr REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }}' claude_args: | --model claude-opus-4-8 --effort xhigh --allowedTools "Task,Glob,Grep,Read,Bash(gh pr diff:*),Bash(gh pr view:*),Bash(check-compiler.sh:*)" --json-schema '${{ steps.toolkit.outputs.schema_json }}' - name: Post code review results - if: | - steps.set-authorized.outputs.IS_AUTHORIZED == 'true' - && steps.code-review.outcome == 'success' - && steps.filter.outputs.code == 'true' + if: steps.code-review.outcome == 'success' env: GH_TOKEN: ${{ github.token }} STRUCTURED_OUTPUT: ${{ steps.code-review.outputs.structured_output }} run: postCodeReviewResults.sh "$PR_NUMBER" - name: Run Claude Code (docs) - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.filter.outputs.docs == 'true' + id: docs-review + if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' && steps.filter.outputs.docs == 'true' uses: anthropics/claude-code-action@4d7e1f0cd85743fdc93b1c8040ab54395da024e2 # v1.0.149 with: display_report: 'true' anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} github_token: ${{ secrets.GITHUB_TOKEN }} allowed_non_write_users: '*' - prompt: '/review-helpdot-pr REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number }}' + prompt: '/review-helpdot-pr REPO: ${{ github.repository }} PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }}' claude_args: | --model claude-opus-4-8 --effort high --allowedTools "Task,Glob,Grep,Read,Bash(gh pr comment:*),Bash(gh pr diff:*),Bash(gh pr view:*),mcp__github_inline_comment__create_inline_comment" + - name: Record review completion + if: steps.code-review.outcome == 'success' || steps.docs-review.outcome == 'success' + env: + GH_TOKEN: ${{ github.token }} + HEAD_SHA: ${{ steps.skip.outputs.head_sha }} + run: recordReviewComplete.sh "$HEAD_SHA" "ai-review/claude" "Reviewed at this commit - comment @claude review to re-run" + - name: Remove in-progress indicator - if: always() && steps.set-authorized.outputs.IS_AUTHORIZED == 'true' + if: always() && steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' env: GH_TOKEN: ${{ github.token }} run: | diff --git a/.github/workflows/codex-review.yml b/.github/workflows/codex-review.yml index 8c34d67b1349..7651943be2c2 100644 --- a/.github/workflows/codex-review.yml +++ b/.github/workflows/codex-review.yml @@ -39,6 +39,7 @@ jobs: contents: read pull-requests: read issues: write + statuses: write env: PR_NUMBER: ${{ case(github.event_name == 'pull_request_target', github.event.pull_request.number, github.event.issue.number) }} ACTOR: ${{ case(github.event_name == 'pull_request_target', github.event.pull_request.user.login, github.event.comment.user.login) }} @@ -60,8 +61,20 @@ jobs: GITHUB_TOKEN: ${{ github.token }} OS_BOTIFY_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} - - name: Add review in progress reaction + - name: Setup Claude review toolkit + if: steps.gate.outputs.IS_AUTHORIZED == 'true' + uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@798cfb2277f46bff2bc86dd52c97f790fd25193a + + - name: Check for an existing review of this commit if: steps.gate.outputs.IS_AUTHORIZED == 'true' + id: skip + env: + GH_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ env.PR_NUMBER }} + run: shouldSkipReview.sh "$PR_NUMBER" "ai-review/codex" + + - name: Add review in progress reaction + if: steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v7 env: PR_NUMBER: ${{ env.PR_NUMBER }} @@ -87,7 +100,7 @@ jobs: }); - name: Build Codex prompt from PR diff - if: steps.gate.outputs.IS_AUTHORIZED == 'true' + if: steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' env: GH_TOKEN: ${{ github.token }} GH_REPO: ${{ github.repository }} @@ -119,7 +132,7 @@ jobs: } > prompt.txt - name: Run Codex review - if: steps.gate.outputs.IS_AUTHORIZED == 'true' + if: steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' id: codex uses: openai/codex-action@e0fdf01220eb9a88167c4898839d273e3f2609d1 # v1 with: @@ -156,8 +169,15 @@ jobs: body, }); + - name: Record review completion + if: steps.codex.outcome == 'success' + env: + GH_TOKEN: ${{ github.token }} + HEAD_SHA: ${{ steps.skip.outputs.head_sha }} + run: recordReviewComplete.sh "$HEAD_SHA" "ai-review/codex" "Reviewed at this commit - comment /codex-review to re-run" + - name: Remove review in progress reaction - if: always() && steps.gate.outputs.IS_AUTHORIZED == 'true' + if: always() && steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v7 env: PR_NUMBER: ${{ env.PR_NUMBER }} From eca623b7447cfec0d52619447a4fb0d0ebdea5e5 Mon Sep 17 00:00:00 2001 From: neil-marcellini Date: Thu, 6 Aug 2026 19:43:24 -0700 Subject: [PATCH 2/5] Name the marker status ai-review-completed so it is not read as a review result --- .github/workflows/claude-review.yml | 6 +++--- .github/workflows/codex-review.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index 83a44d03126d..713e5e86cd61 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -64,14 +64,14 @@ jobs: - name: Setup Claude review toolkit if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' id: toolkit - uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@798cfb2277f46bff2bc86dd52c97f790fd25193a + uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@096f415ac7bb77cae9189d1061350563def00a99 - name: Check for an existing review of this commit if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' id: skip env: GH_TOKEN: ${{ github.token }} - run: shouldSkipReview.sh "$PR_NUMBER" "ai-review/claude" + run: shouldSkipReview.sh "$PR_NUMBER" "ai-review-completed/claude" - name: Filter paths if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' @@ -136,7 +136,7 @@ jobs: env: GH_TOKEN: ${{ github.token }} HEAD_SHA: ${{ steps.skip.outputs.head_sha }} - run: recordReviewComplete.sh "$HEAD_SHA" "ai-review/claude" "Reviewed at this commit - comment @claude review to re-run" + run: recordReviewComplete.sh "$HEAD_SHA" "ai-review-completed/claude" "Reviewed at this commit - comment @claude review to re-run" - name: Remove in-progress indicator if: always() && steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' diff --git a/.github/workflows/codex-review.yml b/.github/workflows/codex-review.yml index 7651943be2c2..9c9dafb5d989 100644 --- a/.github/workflows/codex-review.yml +++ b/.github/workflows/codex-review.yml @@ -63,7 +63,7 @@ jobs: - name: Setup Claude review toolkit if: steps.gate.outputs.IS_AUTHORIZED == 'true' - uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@798cfb2277f46bff2bc86dd52c97f790fd25193a + uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@096f415ac7bb77cae9189d1061350563def00a99 - name: Check for an existing review of this commit if: steps.gate.outputs.IS_AUTHORIZED == 'true' @@ -71,7 +71,7 @@ jobs: env: GH_TOKEN: ${{ github.token }} PR_NUMBER: ${{ env.PR_NUMBER }} - run: shouldSkipReview.sh "$PR_NUMBER" "ai-review/codex" + run: shouldSkipReview.sh "$PR_NUMBER" "ai-review-completed/codex" - name: Add review in progress reaction if: steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' @@ -174,7 +174,7 @@ jobs: env: GH_TOKEN: ${{ github.token }} HEAD_SHA: ${{ steps.skip.outputs.head_sha }} - run: recordReviewComplete.sh "$HEAD_SHA" "ai-review/codex" "Reviewed at this commit - comment /codex-review to re-run" + run: recordReviewComplete.sh "$HEAD_SHA" "ai-review-completed/codex" "Reviewed at this commit - comment /codex-review to re-run" - name: Remove review in progress reaction if: always() && steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' From ded2c3aab06856382baa323cf3921ec500ec9fe9 Mon Sep 17 00:00:00 2001 From: neil-marcellini Date: Tue, 22 Sep 2026 15:58:08 -0700 Subject: [PATCH 3/5] Page the changed-file list so large PRs are filtered correctly gh pr view --json files runs a GraphQL query capped at 100 files and does not paginate, so on a PR with more changed files the paths that decide whether the code or docs review runs could fall outside the list and the review would be skipped with no error. The REST files endpoint under gh api --paginate returns the full list. Also writes the list to RUNNER_TEMP instead of the checked-out working tree. --- .github/workflows/claude-review.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index aa61f1dc28e1..5d8ed0a24f69 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -81,11 +81,13 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - gh pr view "$PR_NUMBER" --repo "$GITHUB_REPOSITORY" --json files --jq '.files[].path' > changed-files.txt - if grep -q '^src/' changed-files.txt; then + # gh pr view --json files is a GraphQL query capped at 100 files with no pagination, + # so a large PR would silently lose the paths that decide whether a review runs. + gh api --paginate "/repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/files" --jq '.[].filename' > "$RUNNER_TEMP/changed-files.txt" + if grep -q '^src/' "$RUNNER_TEMP/changed-files.txt"; then echo "code=true" >> "$GITHUB_OUTPUT" fi - if grep -qE '^docs/.*\.(md|csv)$' changed-files.txt; then + if grep -qE '^docs/.*\.(md|csv)$' "$RUNNER_TEMP/changed-files.txt"; then echo "docs=true" >> "$GITHUB_OUTPUT" fi - name: Mark review as in progress From 477efcfa00b97db56617b5015d731f2d1cde8317 Mon Sep 17 00:00:00 2001 From: neil-marcellini Date: Mon, 28 Sep 2026 12:27:03 -0700 Subject: [PATCH 4/5] Leave the Codex workflow unchanged since it is being deleted --- .github/workflows/codex-review.yml | 31 ++++-------------------------- 1 file changed, 4 insertions(+), 27 deletions(-) diff --git a/.github/workflows/codex-review.yml b/.github/workflows/codex-review.yml index 60794eccb415..8c34d67b1349 100644 --- a/.github/workflows/codex-review.yml +++ b/.github/workflows/codex-review.yml @@ -39,7 +39,6 @@ jobs: contents: read pull-requests: read issues: write - statuses: write env: PR_NUMBER: ${{ case(github.event_name == 'pull_request_target', github.event.pull_request.number, github.event.issue.number) }} ACTOR: ${{ case(github.event_name == 'pull_request_target', github.event.pull_request.user.login, github.event.comment.user.login) }} @@ -61,22 +60,8 @@ jobs: GITHUB_TOKEN: ${{ github.token }} OS_BOTIFY_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} - - name: Setup Claude review toolkit - if: steps.gate.outputs.IS_AUTHORIZED == 'true' - uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@54bfb8923d4f94c3cb209bfbad362fca9f0816f5 - with: - rules_directory: .claude/skills/app-coding-standards/rules - - - name: Check for an existing review of this commit - if: steps.gate.outputs.IS_AUTHORIZED == 'true' - id: skip - env: - GH_TOKEN: ${{ github.token }} - PR_NUMBER: ${{ env.PR_NUMBER }} - run: shouldSkipReview.sh "$PR_NUMBER" "ai-review-completed/codex" - - name: Add review in progress reaction - if: steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' + if: steps.gate.outputs.IS_AUTHORIZED == 'true' uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v7 env: PR_NUMBER: ${{ env.PR_NUMBER }} @@ -102,7 +87,7 @@ jobs: }); - name: Build Codex prompt from PR diff - if: steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' + if: steps.gate.outputs.IS_AUTHORIZED == 'true' env: GH_TOKEN: ${{ github.token }} GH_REPO: ${{ github.repository }} @@ -134,7 +119,7 @@ jobs: } > prompt.txt - name: Run Codex review - if: steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' + if: steps.gate.outputs.IS_AUTHORIZED == 'true' id: codex uses: openai/codex-action@e0fdf01220eb9a88167c4898839d273e3f2609d1 # v1 with: @@ -171,16 +156,8 @@ jobs: body, }); - - name: Record review completion - if: steps.codex.outcome == 'success' - env: - GH_TOKEN: ${{ github.token }} - HEAD_SHA: ${{ steps.skip.outputs.head_sha }} - STATUS_CONTEXT: ${{ steps.skip.outputs.context }} - run: recordReviewComplete.sh "$HEAD_SHA" "$STATUS_CONTEXT" "Reviewed at this commit - comment /codex-review to re-run" - - name: Remove review in progress reaction - if: always() && steps.gate.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' + if: always() && steps.gate.outputs.IS_AUTHORIZED == 'true' uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v7 env: PR_NUMBER: ${{ env.PR_NUMBER }} From bcb767466082b33cc96e0b45a77201ef2b19e6ed Mon Sep 17 00:00:00 2001 From: neil-marcellini Date: Tue, 29 Sep 2026 10:14:00 -0700 Subject: [PATCH 5/5] Apply review concurrency only after the commenter is authorized --- .github/workflows/claude-review.yml | 49 +++++++++++------------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index 5d8ed0a24f69..20a92f1ccfad 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -11,23 +11,14 @@ on: issue_comment: types: [created] -concurrency: - group: >- - claude-review-${{ - github.event_name == 'pull_request_target' && github.event.pull_request.html_url || - github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude review') && github.event.issue.html_url || - github.run_id - }} - cancel-in-progress: true - jobs: - review: + authorize: if: >- (github.event_name == 'pull_request_target' && github.event.pull_request.draft != true && !contains(github.event.pull_request.title, 'Revert')) || (github.event_name == 'issue_comment' && github.event.issue.pull_request && contains(github.event.comment.body, '@claude review')) runs-on: blacksmith-2vcpu-ubuntu-2404 - env: - PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }} + outputs: + IS_AUTHORIZED: ${{ steps.gate.outputs.IS_AUTHORIZED }} steps: - name: Checkout uses: useblacksmith/checkout@0647fdbab2614a5eb86d2971070e325060d91056 # v1.7.0 @@ -42,41 +33,39 @@ jobs: GITHUB_TOKEN: ${{ github.token }} OS_BOTIFY_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} - - name: Set review authorized - id: set-authorized - run: | - if [ "${{ steps.gate.outputs.IS_AUTHORIZED }}" = "true" ]; then - echo "IS_AUTHORIZED=true" >> "$GITHUB_OUTPUT" - else - echo "IS_AUTHORIZED=false" >> "$GITHUB_OUTPUT" - fi - + review: + needs: authorize + if: needs.authorize.outputs.IS_AUTHORIZED == 'true' + # Set on this job, after authorization, so an unauthorized "@claude review" comment cannot cancel a running review + concurrency: + group: claude-review-${{ github.event.pull_request.html_url || github.event.issue.html_url }} + cancel-in-progress: true + runs-on: blacksmith-2vcpu-ubuntu-2404 + env: + PR_NUMBER: ${{ github.event.pull_request.number || github.event.issue.number }} + steps: - name: Checkout repository - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' uses: useblacksmith/checkout@0647fdbab2614a5eb86d2971070e325060d91056 # v1.7.0 with: fetch-depth: 1 - name: Setup Node - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' uses: ./.github/actions/composite/setupNode - name: Setup Claude review toolkit - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' id: toolkit uses: Expensify/GitHub-Actions/.github/actions/claude-review-toolkit@54bfb8923d4f94c3cb209bfbad362fca9f0816f5 with: rules_directory: .claude/skills/app-coding-standards/rules - name: Check for an existing review of this commit - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' id: skip env: GH_TOKEN: ${{ github.token }} run: shouldSkipReview.sh "$PR_NUMBER" "ai-review-completed/claude" - name: Filter paths - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' + if: steps.skip.outputs.skip != 'true' id: filter env: GH_TOKEN: ${{ github.token }} @@ -91,7 +80,7 @@ jobs: echo "docs=true" >> "$GITHUB_OUTPUT" fi - name: Mark review as in progress - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' + if: steps.skip.outputs.skip != 'true' env: GH_TOKEN: ${{ github.token }} run: | @@ -99,7 +88,7 @@ jobs: - name: Run Claude Code (code) id: code-review - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' && steps.filter.outputs.code == 'true' + if: steps.skip.outputs.skip != 'true' && steps.filter.outputs.code == 'true' uses: anthropics/claude-code-action@4d7e1f0cd85743fdc93b1c8040ab54395da024e2 # v1.0.149 with: display_report: 'true' @@ -121,7 +110,7 @@ jobs: - name: Run Claude Code (docs) id: docs-review - if: steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' && steps.filter.outputs.docs == 'true' + if: steps.skip.outputs.skip != 'true' && steps.filter.outputs.docs == 'true' uses: anthropics/claude-code-action@4d7e1f0cd85743fdc93b1c8040ab54395da024e2 # v1.0.149 with: display_report: 'true' @@ -143,7 +132,7 @@ jobs: run: recordReviewComplete.sh "$HEAD_SHA" "$STATUS_CONTEXT" "Reviewed at this commit - comment @claude review to re-run" - name: Remove in-progress indicator - if: always() && steps.set-authorized.outputs.IS_AUTHORIZED == 'true' && steps.skip.outputs.skip != 'true' + if: always() && steps.skip.outputs.skip != 'true' env: GH_TOKEN: ${{ github.token }} run: |