fix(review): a review with a control that did not run stops a merge
Operator decision 2026-10-06. Before, a WARN that existed only because a reviewer or engine never reported (e.g. /security-review without an origin remote) mapped to verdict-gate exit 0, so a review nobody performed in full was green. Now `missing-reviewer:` / `unattributable-payload` in the JSON block's allow_blocked_by is exit 2 (could not decide, never green); a WARN for a MAJOR or a set-aside finding still passes with its reasons. A 1.1 review must carry allow_blocked_by. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
40f6ae1177
commit
22e792ce19
7 changed files with 72 additions and 14 deletions
|
|
@ -168,7 +168,8 @@ required sections (`## Executive Summary`, `## Coverage`, `## Declined to
|
|||
Judge` with `None.` and `Trimmed: 0`, `## Remediation Summary`), each saying
|
||||
"No diff between {before_sha} and {after_sha}; nothing to review.", and the
|
||||
trailing block `{"verdict": "ALLOW", "counts": {"BLOCKER": 0, "MAJOR": 0,
|
||||
"MINOR": 0, "SUGGESTION": 0}, "findings": []}` — without it the verdict gate
|
||||
"MINOR": 0, "SUGGESTION": 0}, "allow_blocked_by": [], "findings": []}` —
|
||||
without it the verdict gate
|
||||
cannot back the ALLOW and exits 2. There is nothing for the Phase 4.7 engine
|
||||
to review, so its absence does not withhold ALLOW here. Skip Phases 4–7.
|
||||
Continue to Phase 8 (validate + stats).
|
||||
|
|
@ -594,9 +595,12 @@ Exit 0 = ALLOW or WARN; exit 1 = BLOCK; exit 2 = the gate could not decide
|
|||
(missing verdict, a verdict the file contradicts — in its JSON block, its
|
||||
`## Findings (BLOCKER)` section or its finding-id list — a JSON block that is
|
||||
not the last fence or has the wrong shape, two verdict lines, unreadable
|
||||
file) — **never green**. It takes exactly one file. On exit 0 with WARN,
|
||||
`--json` also returns `warn_reasons` (the JSON block's `allow_blocked_by`);
|
||||
print them. Capture the exit code as `gate_exit` and print it in Phase 9 exactly
|
||||
file) — **never green**. A WARN that exists because a reviewer or engine
|
||||
did not run (`missing-reviewer:` / `unattributable-payload` in
|
||||
`allow_blocked_by`) is also exit 2: a review not performed in full stops a
|
||||
merge (operator decision 2026-10-06). It takes exactly one file. On exit 0
|
||||
with WARN, `--json` also returns `warn_reasons` (the JSON block's
|
||||
`allow_blocked_by`); print them. Capture the exit code as `gate_exit` and print it in Phase 9 exactly
|
||||
as returned. This is the command that later stops a merge or a release on
|
||||
BLOCK; `/trekreview` reports it and never overrides it.
|
||||
|
||||
|
|
@ -715,7 +719,7 @@ After the write succeeds, print:
|
|||
**Annotation HTML:** file://{$ANNOT_HTML}
|
||||
**Scope:** {before_sha}..{after_sha} ({reviewed_files_count} files)
|
||||
**Verdict:** {BLOCK | WARN | ALLOW}
|
||||
**Gate:** verdict-gate exit {gate_exit} ({0 = ALLOW/WARN | 1 = BLOCK | 2 = could not decide — not green})
|
||||
**Gate:** verdict-gate exit {gate_exit} ({0 = ALLOW/WARN | 1 = BLOCK | 2 = could not decide, or a control did not run — not green})
|
||||
**Engine:** /code-review {delivered N | not run: reason} · /security-review {delivered N | not run: reason}
|
||||
|
||||
### Counts
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue