Skip to content

ci(security-review): the required security-review check reported pass in 16s on #2287 while both reviewer jobs failed — a required gate that can fail open #2337

Description

@kyle-sexton

The required security-review / security-review check reported pass in 16 seconds on PR #2287
while, per the authoring session, claude-review and claude-security-review both failed on
infrastructure
. #2287 was a ~700-line rewrite of strip_literals inside
plugins/guardrails/hooks/block-hook-bypass.sh — a change to a security guard, which is the worst
possible place for a review gate to misreport.

It merged with that green check.

Why 16 seconds is the tell

Same gate, same repo, same day, on comparable PRs from this batch:

PR security-review / security-review What it reviewed
#2287 pass, 16s ~700-line guard rewrite (strip_literals, mark-based operand association)
#2322 pass, 2m42s awk port of check-listing-budget.sh
#2308 pass, 2m3s context-guard hysteresis
#2224 pass, 1m26s guardrails scratch-root carve-out
#2234 pass, 1m36s claude-config / claude-memory

A 16-second pass on the largest security-relevant diff of the batch is not a review that ran and
found nothing.

What the API shows, and where the investigation stopped

gh run view 31558511903 --json jobs reports both jobs success with zero failed steps, so the
underlying reviewer failure is invisible at job level. That is consistent with a workflow that
swallows the reviewer's non-zero exit and reports success regardless — but it is not yet proven,
and this issue should not be closed on the inference.

The investigation was cut short by the GitHub API rate limit (5,000/hr, shared across every
concurrent agent and tool). Resume here:

Why this is high severity

  • It is a required status check. Branch protection treats it as the security gate, and a
    ruleset requiring it is the reason a human can merge without reading the diff.
  • A gate that fails open is worse than no gate, because it manufactures assurance. This is
    precisely the defect class the batch that found it kept finding inside the plugins — a control
    that reports a state it did not establish — now sitting in the CI that guards them.
  • It is silent. Nothing in the PR UI distinguishes a 16-second false pass from a real one; the only
    reason this surfaced is that the authoring session happened to observe the reviewer jobs failing
    and said so in its report.

Immediate consequence, independent of the fix

PR #2287's merged diff should be reviewed by a human. It is the one substantive change in this
batch that may have shipped with no security review at all. (PR #2325's security review did
complete with no findings, but that covers only the residual release-number sweep, not #2287.)

Related

Provenance

Severity: HIGH · Provenance: observed by the authoring session, partially verified here
(timing comparison and --json jobs confirmed; root cause not confirmed)
Origin: handoff-inbox batch 4, wave-2 orchestration

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions