Skip to content

claude-blocking-review: skip-marker grep mismatch (error message says [skip-claude-review: reason], grep only matches bare [skip-claude-review]) #38

Description

@twistedmelonman

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

  1. Create a PR that fails claude-blocking-review for any reason (infrastructure, over-turn-limit, etc.).
  2. Add [skip-claude-review: because X] to the PR body exactly as the workflow error message instructs.
  3. gh run rerun <id> --failed the workflow.
  4. 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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions