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@54d9e61c9c827d19e34229a5c460773a9fb080a0 # main 2026-07-24 (#79: deep path / :bug,:test escalation -> claude-opus-5)
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: 54d9e61c9c827d19e34229a5c460773a9fb080a0
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@54d9e61c9c827d19e34229a5c460773a9fb080a0 # main 2026-07-24 (#79: deep path / :bug,:test escalation -> claude-opus-5)
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: 54d9e61c9c827d19e34229a5c460773a9fb080a0
ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81
repo-specific-conventions: |
## Harper core notes

Expand Down
29 changes: 16 additions & 13 deletions .github/workflows/claude-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,18 @@ 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 is deliberately NARROWER than the review job's
# `if:` — the cancelling set must be a subset of the running set.
# ready_for_review runs review (job gate) but never cancel: their
# authorization is author-based, so on a bot-authored PR they could
# kill a labeler-authorized run and then be rejected themselves.
# 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')) && 'eligible' || github.run_id }}
cancel-in-progress: true

jobs:
Expand All @@ -32,8 +40,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 +71,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
18 changes: 13 additions & 5 deletions .github/workflows/gemini-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,20 @@ 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]
Comment thread
heskew marked this conversation as resolved.

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 is deliberately NARROWER than the review job's
# `if:` — the cancelling set must be a subset of the running set.
# ready_for_review runs review (job gate) but never cancel: their
# authorization is author-based, so on a bot-authored PR they could
# kill a labeler-authorized run and then be rejected themselves.
# 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')) && 'eligible' || github.run_id }}
cancel-in-progress: true

jobs:
Expand All @@ -51,8 +57,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@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 — 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 +78,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: 4b59dc0ddb15aff517884127b58204f79193b4f2
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@4b59dc0ddb15aff517884127b58204f79193b4f2 # main 2026-08-20 (#86 reliable review evidence, context, and run binding)
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: 4b59dc0ddb15aff517884127b58204f79193b4f2
ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81
Loading