Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/claude-issue-to-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ concurrency:

jobs:
work:
uses: HarperFast/ai-review-prompts/.github/workflows/_claude-issue-to-pr.yml@441d2a310cb360adf419d3546dd27566164f1ec2 # main 2026-06-09 (post #58: Opus for :bug/:test, efficiency guidance)
uses: HarperFast/ai-review-prompts/.github/workflows/_claude-issue-to-pr.yml@be549ad08aa6d34b909ea8b542a7ffebdaae1e81 # main 2026-08-25 (#90 cost gates: draft skip, mechanical-diff skip, effort-by-size, debounce; #89 defaults; #88 lenses)
with:
# Same SHA as the `uses:` ref above. See the comment in
# claude-mention.yml for why the duplication is unavoidable.
ai-review-prompts-ref: 441d2a310cb360adf419d3546dd27566164f1ec2
ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81
repo-specific-conventions: |
## Harper core notes

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/claude-mention.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ concurrency:

jobs:
mention:
uses: HarperFast/ai-review-prompts/.github/workflows/_claude-mention.yml@6463b3da6326f0ca4646fb6b5139c2ecf92130f6 # main 2026-05-06 (post #11/#12/#14)
uses: HarperFast/ai-review-prompts/.github/workflows/_claude-mention.yml@be549ad08aa6d34b909ea8b542a7ffebdaae1e81 # main 2026-08-25 (#90 cost gates: draft skip, mechanical-diff skip, effort-by-size, debounce; #89 defaults; #88 lenses)
with:
# Same SHA as the `uses:` ref above. The reusable uses this to
# check out HarperFast/ai-review-prompts (parse + auth scripts)
Expand All @@ -34,7 +34,7 @@ jobs:
# introspect their own ref (`github.workflow_ref` resolves to
# the CALLER's ref in `workflow_call` context), and `uses: …@<ref>`
# is parsed literally so we can't interpolate a variable.
ai-review-prompts-ref: 6463b3da6326f0ca4646fb6b5139c2ecf92130f6
ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81
repo-specific-conventions: |
## Harper core notes

Expand Down
26 changes: 13 additions & 13 deletions .github/workflows/claude-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,15 @@ on:
pull_request:
# `labeled` admits the `claude-review` label gesture for
# bot-authored PRs (renovate, dependabot). See ai-review-prompts#38.
types: [opened, synchronize, reopened, labeled]
types: [opened, synchronize, reopened, ready_for_review, labeled]
Comment thread
heskew marked this conversation as resolved.

concurrency:
group: claude-review-${{ github.event.pull_request.number }}
# NOTE: this predicate and the review job's `if:` must stay textually
# in sync — GitHub Actions YAML has no anchors to share them.
# Ineligible events (per the review job's opt-in gate) get a unique
# run_id group so they can never cancel an in-flight eligible review —
# workflow-level cancel-in-progress fires before job `if:` is evaluated.
group: claude-review-${{ github.event.pull_request.number }}-${{ ((github.event.action == 'labeled' && github.event.label.name == 'claude-review') || (github.event.action != 'labeled' && vars.CLAUDE_ALWAYS_ON == 'true') || (github.event.action == 'ready_for_review' && contains(github.event.pull_request.labels.*.name, 'claude-review'))) && 'eligible' || github.run_id }}
cancel-in-progress: true

jobs:
Expand All @@ -32,8 +37,11 @@ jobs:
# label. The reusable's authorize job still owns WHO is admitted.
# Note: the `claude-review` label name is matched there too —
# `_claude-review.yml`'s authorize `if:`, not in this caller.
if: ${{ vars.CLAUDE_ALWAYS_ON == 'true' || github.event.action == 'labeled' }}
uses: HarperFast/ai-review-prompts/.github/workflows/_claude-review.yml@4b59dc0ddb15aff517884127b58204f79193b4f2 # main 2026-08-20 (#86 reliable review evidence, context, and run binding)
# `ready_for_review` is admitted when the PR still carries the
# opt-in label, so a draft opted in via `claude-review` resumes
# review when it flips ready even with CLAUDE_ALWAYS_ON unset.
if: ${{ (github.event.action == 'labeled' && github.event.label.name == 'claude-review') || (github.event.action != 'labeled' && vars.CLAUDE_ALWAYS_ON == 'true') || (github.event.action == 'ready_for_review' && contains(github.event.pull_request.labels.*.name, 'claude-review')) }}
uses: HarperFast/ai-review-prompts/.github/workflows/_claude-review.yml@be549ad08aa6d34b909ea8b542a7ffebdaae1e81 # main 2026-08-25 (#90 cost gates: draft skip, mechanical-diff skip, effort-by-size, debounce; #89 defaults; #88 lenses)
# Caller-side permissions at the calling-job level (NOT workflow-
# level — that placement caps the reusable's per-job grants below
# what they need and breaks the workflow at startup; see
Expand All @@ -60,15 +68,7 @@ jobs:
# introspect their own ref (`github.workflow_ref` resolves to the
# CALLER's ref in `workflow_call` context), and `uses: …@<ref>`
# is parsed literally so we can't interpolate a variable.
ai-review-prompts-ref: 4b59dc0ddb15aff517884127b58204f79193b4f2
# CANARY (2026-07-11): run this repo's Claude reviews on Sonnet 5
# while the fleet default stays claude-sonnet-4-6. Every ai-review-log
# entry records `Model:`, so calibration can compare sonnet-5 vs
# sonnet-4-6 verdict mix directly — watch the severity-deflation rate
# (Sonnet 5 follows blocker-only instructions more literally; known
# code-review-harness effect). Promote to the reusable's default or
# revert based on the next calibration cycle.
model: claude-sonnet-5
ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81
review-layers: |
universal
harper/common
Expand Down
15 changes: 10 additions & 5 deletions .github/workflows/gemini-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,17 @@ on:
# `labeled` admits the `gemini-review` opt-in gesture. `vars.*`
# can't be read in `on:` (only in a job `if:`), so the trigger
# lists the union and the `review` job gates on GEMINI_ALWAYS_ON.
types: [opened, synchronize, reopened, labeled]
types: [opened, synchronize, reopened, ready_for_review, labeled]

concurrency:
# Different group key from claude-review so the two providers can run
# in parallel on the same PR. cancel-in-progress is per-group, so a
# synchronize push cancels the in-flight Gemini run without touching
# the Claude run (and vice versa).
group: gemini-review-${{ github.event.pull_request.number }}
# NOTE: this predicate and the review job's `if:` must stay textually
# in sync — GitHub Actions YAML has no anchors to share them.
# Ineligible events get a unique run_id group — see claude-review.yml.
group: gemini-review-${{ github.event.pull_request.number }}-${{ ((github.event.action == 'labeled' && github.event.label.name == 'gemini-review') || (github.event.action != 'labeled' && vars.GEMINI_ALWAYS_ON == 'true') || (github.event.action == 'ready_for_review' && contains(github.event.pull_request.labels.*.name, 'gemini-review'))) && 'eligible' || github.run_id }}
cancel-in-progress: true

jobs:
Expand All @@ -51,8 +54,10 @@ jobs:
# (CODEOWNERS trust set; the labeler, not the author, on `labeled`).
# Note: the `gemini-review` label name is matched there too —
# `_gemini-review.yml`'s authorize `if:`, not in this caller.
if: ${{ vars.GEMINI_ALWAYS_ON == 'true' || github.event.action == 'labeled' }}
uses: HarperFast/ai-review-prompts/.github/workflows/_gemini-review.yml@9cf49d23cb046ecd6c87f3bba86dc3338d6998fb # main 2026-06-29 (#70 week-of-06-22 calibration + #71 prompt-ref tracking; on 1bbc562 = #67 + #69)
# `ready_for_review` is admitted when the PR still carries the
# opt-in label — mirrors claude-review.yml.
if: ${{ (github.event.action == 'labeled' && github.event.label.name == 'gemini-review') || (github.event.action != 'labeled' && vars.GEMINI_ALWAYS_ON == 'true') || (github.event.action == 'ready_for_review' && contains(github.event.pull_request.labels.*.name, 'gemini-review')) }}
uses: HarperFast/ai-review-prompts/.github/workflows/_gemini-review.yml@be549ad08aa6d34b909ea8b542a7ffebdaae1e81 # main 2026-08-25 (#90 cost gates: draft skip, mechanical-diff skip, effort-by-size, debounce; #89 defaults; #88 lenses)
# Caller-side permissions at the calling-job level (NOT workflow-
# level — that placement caps the reusable's per-job grants below
# what they need and breaks the workflow at startup; see
Expand All @@ -70,7 +75,7 @@ jobs:
# duplication is unavoidable: reusable workflows can't introspect
# their own ref (`github.workflow_ref` resolves to the CALLER's
# ref in workflow_call context), and `uses: …@<ref>` is literal.
ai-review-prompts-ref: 9cf49d23cb046ecd6c87f3bba86dc3338d6998fb
ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81
review-layers: |
universal
harper/common
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/validate-caller-workflows.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ on:

jobs:
validate:
uses: HarperFast/ai-review-prompts/.github/workflows/_validate-caller-workflows.yml@6463b3da6326f0ca4646fb6b5139c2ecf92130f6 # main 2026-05-06 (post #11/#12/#14)
uses: HarperFast/ai-review-prompts/.github/workflows/_validate-caller-workflows.yml@be549ad08aa6d34b909ea8b542a7ffebdaae1e81 # main 2026-08-25 (#90 cost gates: draft skip, mechanical-diff skip, effort-by-size, debounce; #89 defaults; #88 lenses)
with:
# Same SHA as the `uses:` ref above — the reusable uses this
# to check out the validator script at the matching version.
# Same SHA-twice pattern as the other caller workflows.
ai-review-prompts-ref: 6463b3da6326f0ca4646fb6b5139c2ecf92130f6
ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81
Loading