What
claude-blocking-review.yml at line 305 evaluates the skip marker with:
grep -qF '[skip-claude-review]'
-F means fixed-string, so this requires the PR body to contain the exact literal [skip-claude-review] (bare brackets).
But the workflow's own documentation and error messages (lines 33, 333, 352–353) tell users to add:
[skip-claude-review: reason]
That form does not contain [skip-claude-review] as a substring — the ] closes after the reason. So the -qF lookup fails and the bypass does not fire.
How it bit me
On nightowlstudiollc/kebab-tax PR #1162 (pure doc PR) the claude-blocking-review job failed three times in a row with the workflow's own infrastructure error:
::error::Review did not complete (likely exceeded turn limit or timed out). No verdict rendered.
::error::Re-push to retry, or add [skip-claude-review: reason] to the PR body to bypass.
Followed the guidance literally: added [skip-claude-review: infrastructure flake — three consecutive incomplete runs on a doc-only diff] to the PR body and reran the workflow. The reran job still failed at the same step because the skip check never matched. Only when I replaced it with the bare [skip-claude-review] token did the grep match and the step exit 0 path fire.
Fix
Change the grep to match both the bare token and the documented : reason form. A permissive, regex-free fix:
grep -qF '[skip-claude-review' | grep -qE '[skip-claude-review(\]|: )'
…or a simpler single invocation:
grep -qE '\[skip-claude-review(\]|:)' <<<"$PR_BODY"
The second form matches:
[skip-claude-review] (existing behavior)
[skip-claude-review: any reason] (what the error message promises)
[skip-claude-review:] (degenerate but harmless)
Related
- All three of the error/summary message lines (33, 333, 352–353) should stay on the
: reason form — it's the better UX (forces an audit trail in the bypass). Update the grep to match that form, not the other way around.
Repro
- Create a PR that fails
claude-blocking-review for any reason (infrastructure, over-turn-limit, etc.).
- Add
[skip-claude-review: because X] to the PR body exactly as the workflow error message instructs.
gh run rerun <id> --failed the workflow.
- Observe the rerun still fails at the Claude step — the skip check never matches.
Expected: the bypass short-circuits with Verdict: SKIPPED (override in PR body).
Actual: the skip check never fires, the job reruns and fails the same way.
What
claude-blocking-review.ymlat line 305 evaluates the skip marker with:grep -qF '[skip-claude-review]'-Fmeans fixed-string, so this requires the PR body to contain the exact literal[skip-claude-review](bare brackets).But the workflow's own documentation and error messages (lines 33, 333, 352–353) tell users to add:
That form does not contain
[skip-claude-review]as a substring — the]closes after the reason. So the-qFlookup fails and the bypass does not fire.How it bit me
On nightowlstudiollc/kebab-tax PR #1162 (pure doc PR) the
claude-blocking-reviewjob failed three times in a row with the workflow's own infrastructure error:Followed the guidance literally: added
[skip-claude-review: infrastructure flake — three consecutive incomplete runs on a doc-only diff]to the PR body and reran the workflow. The reran job still failed at the same step because the skip check never matched. Only when I replaced it with the bare[skip-claude-review]token did the grep match and the stepexit 0path fire.Fix
Change the grep to match both the bare token and the documented
: reasonform. A permissive, regex-free fix:…or a simpler single invocation:
The second form matches:
[skip-claude-review](existing behavior)[skip-claude-review: any reason](what the error message promises)[skip-claude-review:](degenerate but harmless)Related
: reasonform — it's the better UX (forces an audit trail in the bypass). Update the grep to match that form, not the other way around.Repro
claude-blocking-reviewfor any reason (infrastructure, over-turn-limit, etc.).[skip-claude-review: because X]to the PR body exactly as the workflow error message instructs.gh run rerun <id> --failedthe workflow.Expected: the bypass short-circuits with
Verdict: SKIPPED (override in PR body).Actual: the skip check never fires, the job reruns and fails the same way.