From 39bdd9ecd1b550fee744e5c2ba4c37ac7bddb7af Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Tue, 25 Aug 2026 16:05:22 -0700 Subject: [PATCH 1/4] =?UTF-8?q?ci:=20adopt=20ai-review-prompts=20#89=20?= =?UTF-8?q?=E2=80=94=20sonnet-5/xhigh/96-turn=20defaults;=20drop=20the=20s?= =?UTF-8?q?onnet-5=20canary=20override?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump every ai-review-prompts pin (claude-review, gemini-review, claude-mention, claude-issue-to-pr, validate-caller-workflows) to 8401fe1, which raises the fleet defaults: claude-sonnet-5 model, --effort xhigh, 96-turn review budget (mention 96, issue-to-pr 100), 30m timeouts. The claude-review model: claude-sonnet-5 canary override is now the fleet default, so it comes out. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S94XethbGXpAb4DRKMD4kt --- .github/workflows/claude-issue-to-pr.yml | 4 ++-- .github/workflows/claude-mention.yml | 4 ++-- .github/workflows/claude-review.yml | 12 ++---------- .github/workflows/gemini-review.yml | 4 ++-- .github/workflows/validate-caller-workflows.yml | 4 ++-- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/.github/workflows/claude-issue-to-pr.yml b/.github/workflows/claude-issue-to-pr.yml index ba9bc2ef69..40ef7e29ee 100644 --- a/.github/workflows/claude-issue-to-pr.yml +++ b/.github/workflows/claude-issue-to-pr.yml @@ -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@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) 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: 8401fe113e229d8842283c67e99457b862ab3b89 repo-specific-conventions: | ## Harper core notes diff --git a/.github/workflows/claude-mention.yml b/.github/workflows/claude-mention.yml index 56853acd73..17f8495448 100644 --- a/.github/workflows/claude-mention.yml +++ b/.github/workflows/claude-mention.yml @@ -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@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) with: # Same SHA as the `uses:` ref above. The reusable uses this to # check out HarperFast/ai-review-prompts (parse + auth scripts) @@ -34,7 +34,7 @@ jobs: # introspect their own ref (`github.workflow_ref` resolves to # the CALLER's ref in `workflow_call` context), and `uses: …@` # is parsed literally so we can't interpolate a variable. - ai-review-prompts-ref: 54d9e61c9c827d19e34229a5c460773a9fb080a0 + ai-review-prompts-ref: 8401fe113e229d8842283c67e99457b862ab3b89 repo-specific-conventions: | ## Harper core notes diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index 77d438c5ff..d18775f2a4 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -33,7 +33,7 @@ jobs: # 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) + uses: HarperFast/ai-review-prompts/.github/workflows/_claude-review.yml@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) # 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 @@ -60,15 +60,7 @@ jobs: # introspect their own ref (`github.workflow_ref` resolves to the # CALLER's ref in `workflow_call` context), and `uses: …@` # 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: 8401fe113e229d8842283c67e99457b862ab3b89 review-layers: | universal harper/common diff --git a/.github/workflows/gemini-review.yml b/.github/workflows/gemini-review.yml index 46462868b6..f7f18b4946 100644 --- a/.github/workflows/gemini-review.yml +++ b/.github/workflows/gemini-review.yml @@ -52,7 +52,7 @@ jobs: # 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) + uses: HarperFast/ai-review-prompts/.github/workflows/_gemini-review.yml@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) # 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 @@ -70,7 +70,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: …@` is literal. - ai-review-prompts-ref: 4b59dc0ddb15aff517884127b58204f79193b4f2 + ai-review-prompts-ref: 8401fe113e229d8842283c67e99457b862ab3b89 review-layers: | universal harper/common diff --git a/.github/workflows/validate-caller-workflows.yml b/.github/workflows/validate-caller-workflows.yml index bc820f47c9..c1c1f03337 100644 --- a/.github/workflows/validate-caller-workflows.yml +++ b/.github/workflows/validate-caller-workflows.yml @@ -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@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) 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: 8401fe113e229d8842283c67e99457b862ab3b89 From 86edd69e7a17cfbc3cfc8d331a66ecc61973ba36 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Tue, 25 Aug 2026 16:37:38 -0700 Subject: [PATCH 2/4] =?UTF-8?q?ci:=20advance=20the=20pin=20to=20post-#87?= =?UTF-8?q?=20main=20=E2=80=94=20picks=20up=20#88's=20lenses=20and=20the?= =?UTF-8?q?=20#85/#87=20calibration=20edits?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S94XethbGXpAb4DRKMD4kt --- .github/workflows/claude-issue-to-pr.yml | 4 ++-- .github/workflows/claude-mention.yml | 4 ++-- .github/workflows/claude-review.yml | 4 ++-- .github/workflows/gemini-review.yml | 4 ++-- .github/workflows/validate-caller-workflows.yml | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/claude-issue-to-pr.yml b/.github/workflows/claude-issue-to-pr.yml index 40ef7e29ee..1f818433e5 100644 --- a/.github/workflows/claude-issue-to-pr.yml +++ b/.github/workflows/claude-issue-to-pr.yml @@ -22,11 +22,11 @@ concurrency: jobs: work: - uses: HarperFast/ai-review-prompts/.github/workflows/_claude-issue-to-pr.yml@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) + uses: HarperFast/ai-review-prompts/.github/workflows/_claude-issue-to-pr.yml@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) 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: 8401fe113e229d8842283c67e99457b862ab3b89 + ai-review-prompts-ref: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 repo-specific-conventions: | ## Harper core notes diff --git a/.github/workflows/claude-mention.yml b/.github/workflows/claude-mention.yml index 17f8495448..03ac48ff37 100644 --- a/.github/workflows/claude-mention.yml +++ b/.github/workflows/claude-mention.yml @@ -24,7 +24,7 @@ concurrency: jobs: mention: - uses: HarperFast/ai-review-prompts/.github/workflows/_claude-mention.yml@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) + uses: HarperFast/ai-review-prompts/.github/workflows/_claude-mention.yml@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) with: # Same SHA as the `uses:` ref above. The reusable uses this to # check out HarperFast/ai-review-prompts (parse + auth scripts) @@ -34,7 +34,7 @@ jobs: # introspect their own ref (`github.workflow_ref` resolves to # the CALLER's ref in `workflow_call` context), and `uses: …@` # is parsed literally so we can't interpolate a variable. - ai-review-prompts-ref: 8401fe113e229d8842283c67e99457b862ab3b89 + ai-review-prompts-ref: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 repo-specific-conventions: | ## Harper core notes diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index d18775f2a4..9d6fc3d9aa 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -33,7 +33,7 @@ jobs: # 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@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) + uses: HarperFast/ai-review-prompts/.github/workflows/_claude-review.yml@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) # 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 @@ -60,7 +60,7 @@ jobs: # introspect their own ref (`github.workflow_ref` resolves to the # CALLER's ref in `workflow_call` context), and `uses: …@` # is parsed literally so we can't interpolate a variable. - ai-review-prompts-ref: 8401fe113e229d8842283c67e99457b862ab3b89 + ai-review-prompts-ref: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 review-layers: | universal harper/common diff --git a/.github/workflows/gemini-review.yml b/.github/workflows/gemini-review.yml index f7f18b4946..8404e7e419 100644 --- a/.github/workflows/gemini-review.yml +++ b/.github/workflows/gemini-review.yml @@ -52,7 +52,7 @@ jobs: # 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@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) + uses: HarperFast/ai-review-prompts/.github/workflows/_gemini-review.yml@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) # 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 @@ -70,7 +70,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: …@` is literal. - ai-review-prompts-ref: 8401fe113e229d8842283c67e99457b862ab3b89 + ai-review-prompts-ref: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 review-layers: | universal harper/common diff --git a/.github/workflows/validate-caller-workflows.yml b/.github/workflows/validate-caller-workflows.yml index c1c1f03337..5f500f364d 100644 --- a/.github/workflows/validate-caller-workflows.yml +++ b/.github/workflows/validate-caller-workflows.yml @@ -27,9 +27,9 @@ on: jobs: validate: - uses: HarperFast/ai-review-prompts/.github/workflows/_validate-caller-workflows.yml@8401fe113e229d8842283c67e99457b862ab3b89 # main 2026-08-25 (#89 fleet turn/effort/model defaults: sonnet-5, xhigh, 96 turns) + uses: HarperFast/ai-review-prompts/.github/workflows/_validate-caller-workflows.yml@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) 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: 8401fe113e229d8842283c67e99457b862ab3b89 + ai-review-prompts-ref: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 From f9351d54bcbd2788931d84cd58537d742a31be67 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Tue, 25 Aug 2026 19:06:08 -0700 Subject: [PATCH 3/4] ci: adopt ai-review-prompts #90 cost gates (pin be549ad) + ready_for_review trigger Draft PRs skip review until flipped ready (label still opts one in), mechanical diffs skip pre-run, reasoning effort scales with diff size (60/high, 1500/xhigh, else max), synchronize runs debounce 120s. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S94XethbGXpAb4DRKMD4kt --- .github/workflows/claude-issue-to-pr.yml | 4 ++-- .github/workflows/claude-mention.yml | 4 ++-- .github/workflows/claude-review.yml | 6 +++--- .github/workflows/gemini-review.yml | 6 +++--- .github/workflows/validate-caller-workflows.yml | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/claude-issue-to-pr.yml b/.github/workflows/claude-issue-to-pr.yml index 1f818433e5..a42bb06bb9 100644 --- a/.github/workflows/claude-issue-to-pr.yml +++ b/.github/workflows/claude-issue-to-pr.yml @@ -22,11 +22,11 @@ concurrency: jobs: work: - uses: HarperFast/ai-review-prompts/.github/workflows/_claude-issue-to-pr.yml@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) + 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: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 + ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81 repo-specific-conventions: | ## Harper core notes diff --git a/.github/workflows/claude-mention.yml b/.github/workflows/claude-mention.yml index 03ac48ff37..a19072a1bf 100644 --- a/.github/workflows/claude-mention.yml +++ b/.github/workflows/claude-mention.yml @@ -24,7 +24,7 @@ concurrency: jobs: mention: - uses: HarperFast/ai-review-prompts/.github/workflows/_claude-mention.yml@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) + 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) @@ -34,7 +34,7 @@ jobs: # introspect their own ref (`github.workflow_ref` resolves to # the CALLER's ref in `workflow_call` context), and `uses: …@` # is parsed literally so we can't interpolate a variable. - ai-review-prompts-ref: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 + ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81 repo-specific-conventions: | ## Harper core notes diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index 9d6fc3d9aa..1edfcfdb96 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -18,7 +18,7 @@ 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] concurrency: group: claude-review-${{ github.event.pull_request.number }} @@ -33,7 +33,7 @@ jobs: # 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@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) + 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 @@ -60,7 +60,7 @@ jobs: # introspect their own ref (`github.workflow_ref` resolves to the # CALLER's ref in `workflow_call` context), and `uses: …@` # is parsed literally so we can't interpolate a variable. - ai-review-prompts-ref: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 + ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81 review-layers: | universal harper/common diff --git a/.github/workflows/gemini-review.yml b/.github/workflows/gemini-review.yml index 8404e7e419..eb4feb5cd5 100644 --- a/.github/workflows/gemini-review.yml +++ b/.github/workflows/gemini-review.yml @@ -32,7 +32,7 @@ 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 @@ -52,7 +52,7 @@ jobs: # 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@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) + 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 @@ -70,7 +70,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: …@` is literal. - ai-review-prompts-ref: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 + ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81 review-layers: | universal harper/common diff --git a/.github/workflows/validate-caller-workflows.yml b/.github/workflows/validate-caller-workflows.yml index 5f500f364d..3d11870bd6 100644 --- a/.github/workflows/validate-caller-workflows.yml +++ b/.github/workflows/validate-caller-workflows.yml @@ -27,9 +27,9 @@ on: jobs: validate: - uses: HarperFast/ai-review-prompts/.github/workflows/_validate-caller-workflows.yml@4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 # main 2026-08-25 (#89 fleet turn/effort/model defaults; #88 sibling + cannot-fail-test lenses; #85/#87 calibration) + 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: 4632c5d93dae1e6548e6c30c5ced8fb2df69f4e5 + ai-review-prompts-ref: be549ad08aa6d34b909ea8b542a7ffebdaae1e81 From f25a92b6c35b19ac7702098f45e88f32059a1036 Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Wed, 26 Aug 2026 08:00:58 -0700 Subject: [PATCH 4/4] ci: admit ready_for_review on label-opted PRs in opt-in mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit kriszyp review finding on the pin-bump PR: with *_ALWAYS_ON unset, the caller gate admitted only labeled events, so a PR opted in by label while draft never resumed review when flipped ready — the event died at the caller gate. Admit ready_for_review when the opt-in label is still present. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_01S94XethbGXpAb4DRKMD4kt --- .github/workflows/claude-review.yml | 5 ++++- .github/workflows/gemini-review.yml | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/claude-review.yml b/.github/workflows/claude-review.yml index 1edfcfdb96..ebb021868a 100644 --- a/.github/workflows/claude-review.yml +++ b/.github/workflows/claude-review.yml @@ -32,7 +32,10 @@ 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' }} + # `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: ${{ vars.CLAUDE_ALWAYS_ON == 'true' || github.event.action == 'labeled' || (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 diff --git a/.github/workflows/gemini-review.yml b/.github/workflows/gemini-review.yml index eb4feb5cd5..272e609d08 100644 --- a/.github/workflows/gemini-review.yml +++ b/.github/workflows/gemini-review.yml @@ -51,7 +51,9 @@ 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' }} + # `ready_for_review` is admitted when the PR still carries the + # opt-in label — mirrors claude-review.yml. + if: ${{ vars.GEMINI_ALWAYS_ON == 'true' || github.event.action == 'labeled' || (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