fix(claude-blocking-review): distinct skip reasons + SHA-scoped skip marker (v3.1.0) - #93
Merged
Merged
Conversation
added 2 commits
August 7, 2026 15:33
…marker #86: each skip path (workflow-self-modification, doc-only diff, Dependabot-authored PR) now writes its own skip/skip_reason output pair, so the "Check review verdict" step logs the path that actually fired instead of a hardcoded "Doc-only skip" message regardless of cause. #88: the [skip-claude-review] escape hatch can now be scoped to a specific commit via [skip-claude-review sha=<short-sha>: reason], matched against github.event.pull_request.head.sha with a minimum 7-character prefix requirement. Unscoped markers (no sha=) continue to work exactly as before, unconditionally, for backward compatibility. A scoped marker that doesn't match the current head SHA now emits a visible ::notice:: instead of silently doing nothing. Documented in the workflow header and README that gh run rerun (not a new push) is the correct way to make a freshly-added scoped marker take effect, since a new commit changes the head SHA and correctly invalidates the old scope. Both changes are additive — v3.1.0. zizmor findings on this file (artipacked, template-injection, known-vulnerable-actions, ref-version-mismatch x2) are all pre-existing on main, unrelated to this diff — confirmed by diffing zizmor's output against the pre-change file. Skipped per this repo's documented SKIP=zizmor convention for pre-existing findings outside the changed lines. Closes #86, Closes #88 Claude-Session: https://claude.ai/code/session_0143Nf4sXqnTp2Kx3LNbMvBA
…ith sha= scoping The "Minimize PASS review comment" step's escape-hatch detection still used the pre-#88 regex, which doesn't match the new [skip-claude-review sha=...] form. Flagged by the pre-push whole-codebase review as #91. Replace the regex-only check with the same unscoped/scoped-match logic used in "Check review verdict": an unscoped marker or a sha=-scoped marker matching the current head means nothing to minimize (no review ran); a scoped marker that does NOT match the current head must fall through to normal minimize logic, since in that case a real review did run and may have posted a PASS comment. Closes #91 Claude-Session: https://claude.ai/code/session_0143Nf4sXqnTp2Kx3LNbMvBA
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements Part A1 of the reusable-workflows plan: two bug fixes to
claude-blocking-review.yml, bumping to v3.1.0.#86 — misleading skip log message. The
Check review verdictstep's short-circuit for skip paths used a single hardcoded "Doc-only skip" message regardless of which of three skip paths actually fired (workflow-self-modification, doc-only diff, Dependabot PR). Each skip path now writes its ownskip/skip_reasonoutput pair, and the verdict-check step logs the actual reason that fired.#88 — unscoped skip marker silently bypasses all future runs.
[skip-claude-review: reason]in the PR body was checked live with no scoping — once added, it silently bypassed every subsequent run on that PR, including runs against later, never-reviewed commits.Fix (per the plan's adversarially-reviewed redesign, not the issue's original simpler suggestion):
[skip-claude-review sha=<short-sha>: reason], matched againstgithub.event.pull_request.head.sha(notgithub.sha, which is a synthetic merge-commit SHA onpull_requestevents) with a minimum 7-character prefix requirement to prevent a trivial bypass likesha=a.sha=-scoped marker that doesn't match the current head SHA now emits a visible::notice::(with both SHAs) instead of silently doing nothing.gh run rerun <run-id>on the existing failed/blocked run — not a new commit/push, since a new push changes the head SHA and correctly invalidates a SHA-scoped marker (intentional anti-staleness behavior).A second commit fixes the same escape-hatch check in the "Minimize PASS review comment" step, which the pre-push whole-codebase review caught was still using the pre-#88 regex and wouldn't recognize the new
sha=-scoped form (closes #91, filed automatically by that review).Both changes are additive/non-breaking — existing unscoped markers behave identically. Bumped to v3.1.0.
Changes
.github/workflows/claude-blocking-review.yml:skip_reasonoutput added to all three skip-detection branches (workflow-self-mod, doc-only, Dependabot)Check review verdictstep reads per-pathskip_reasonand logs the actual causegithub.event.pull_request.head.sha)::notice::emitted when a scoped marker exists but doesn't match current headgh run rerunrecovery procedureREADME.md: escape-hatch section expanded with thesha=syntax, scoping behavior, and thegh run rerun-not-a-new-commit guidanceVerification
yamllint(clean)shellcheck -S info(only pre-existing-styleSC2312info notes, matching the file's established idiom)Tagging / release
Per repo convention (confirmed via
git log/tag dates:v3.0.0/v3were both created immediately after PR #62 merged, pointing at the merge commit onmain), tagging happens after merge — not part of this PR. After merge, will createv3.1.0+ move floatingv3to it, and a matching GitHub Release with notes covering both fixes.Closes #86
Closes #88
https://claude.ai/code/session_0143Nf4sXqnTp2Kx3LNbMvBA