feat(code-review): synchronous GitHub-mode verifier dispatch + loud missing-verifier signal (FEA-3154) - #180
Merged
Conversation
…issing-verifier signal (FEA-3154) Applies the v3.6.0 reviewer hardening to the stage_23 verifier fleet. Bumps code-review 3.6.0 -> 3.7.0. stage_23 (skill code-review:verify-findings) spawned every verifier with run_in_background: true + blocking TaskOutput in BOTH modes — the pattern v3.6.0 proved unsafe under headless claude -p (the turn can end before the blocking collection is issued, so the process exits and verdicts never land). Worse for verifiers: stage_23 is on_failure: continue, so a missing output degrades SILENTLY to pending_verification[], which _compute_canonical_verdict does not read — a BLOCKING finding whose verifier died could ship APPROVED. - verify-findings/SKILL.md: MODE branch — github synchronous one-at-a-time, local parallel background + blocking TaskOutput; headless warning. - commands/start.md: stage_23 note + Verifier Fleet walker guard mirroring stage_20 (ban watcher/sleep/polling/turn-end substitutes). - cmd_verify_consolidate: in github mode, emit ONE aggregate coverage:verifier-missing-output gap (HIGH, required: false -> NEEDS_ATTENTION) when a BLOCKING/HIGH finding has no verifier output. New optional --mode on verify-consolidate, wired at stage_24a. - Tests: TestFEA3154VerifierDispatchContracts prose-contract class + behavioral cmd_verify_consolidate/cmd_finalize_result cases; regenerated the 3 declarative-config snapshots (only the --mode addition). Full code-review suite green (1175 passed), ruff + pyright clean. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ier-github-sync # Conflicts: # CHANGELOG.md # plugins/code-review/.claude-plugin/plugin.json
mikeangstadt
approved these changes
Jul 16, 2026
mikeangstadt
left a comment
Collaborator
There was a problem hiding this comment.
Solid. The synchronous-primary + coverage-gap-defense split is the right shape, and I traced the loud path end to end: gap lands in coverage_gaps.json, finalize reads it, Rule 3 escalates the HIGH gap to NEEDS_ATTENTION so a dead-verifier BLOCKING/HIGH can't ship APPROVED. Contracts are all in sync (skill, start.md, cli.json, stages.json wired at stage_24a, snapshots, version bump). One tiny doc nit inline, not blocking.
…producer (FEA-3154 review) Address review: _append_to_coverage_gaps docstring listed only arbitrate-budget and derive-spawn-spec; verify-consolidate (stage_24a) is now a third writer. Doc-only. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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
Applies the merged v3.6.0 reviewer-fleet hardening (#179 / FEA-3085) to the verifier fleet (
stage_23_verify_findings). Bumpscode-review3.6.0 → 3.7.0. Implements PLN-1334 (approved).stage_23(skillcode-review:verify-findings) spawned every verifier withrun_in_background: true+ blockingTaskOutputin both modes — the exact pattern v3.6.0 proved unsafe under headlessclaude -p, where the orchestrator can end its turn before issuing the blocking collection, so the process exits (terminal_reason: "completed") and verifier verdicts never land. This is worse for verifiers than reviewers:stage_23ison_failure: continue, so a missing output degrades silently topending_verification[], which_compute_canonical_verdictdoes not read — a BLOCKING finding whose verifier died could shipAPPROVED.Changes:
skills/verify-findings/SKILL.md— MODE branch: github mode dispatches verifiers synchronously one-at-a-time (run_in_background: false, wait for each Task response before the next), local mode keeps parallel background + blockingTaskOutput; adds a headless-mode warning. Synchronous dispatch keeps the headless turn alive by construction (each Task is itself the pending call).commands/start.md— stage_23 stage-note sync clause + a Verifier Fleet walker guard mirroring the stage_20 guard (bans watcher files / sleep loops / polling loops / turn-ending waits).cmd_verify_consolidate— defense-in-depth: in github mode, when ≥1 BLOCKING/HIGH finding has no verifier output, emit one aggregatecoverage:verifier-missing-outputcoverage-gap finding (severity: HIGH,required: false) →_compute_canonical_verdictescalates toNEEDS_ATTENTION(mirrors the existing "verifier uncertain → human triages, not silent approval" semantics). New_make_unverified_findings_gaphelper; new optional--modeonverify-consolidate, wired atstage_24a_verify_consolidate(same{mode}tokenfinalize-resultalready uses). Gap id continues past any pre-existingcoverage_gaps.jsonentries (no collision with stage_20b'scoverage-verifier_f*).TestFEA3154VerifierDispatchContractsprose-contract class (mirrors FEA-2162) + behavioralcmd_verify_consolidate/cmd_finalize_resultcases (github HIGH emits gap + end-to-end finalize assertsvalidation_errors == []andNEEDS_ATTENTION; local/MEDIUM/deferred-budget negatives; count aggregation; index continuation). Regenerated the 3 declarative-config snapshots (only the--modeaddition).Net-new github-synchronous verifier behavior — not a revert (pre-v3.5.0 verifiers were background in both modes).
Reviewed pre-PR by an adversarial Codex deep review (multi-worker: verdict/schema/prose/id-index lanes) and a
/code-review --depth deeppass — both APPROVED with no BLOCKING/HIGH/MEDIUM findings. Their two test-depth suggestions (count aggregation, index continuation) are included.Feature Flags
N/A — plugin behavior change, no runtime flag.
--modeonverify-consolidateis optional and back-compatible (omitted →mode=None→ no signal, prior behavior).Breaking changes
None. Omitting
--modepreserves prior behavior. Trade-offs: github verifier stage wall-clock becomes sum-of-verifiers (was slowest-of, but that path was unreliable); a missing github verifier for a BLOCKING/HIGH finding now escalates the verdict toNEEDS_ATTENTIONinstead of a possible silentAPPROVED.Test plan
uv run --frozen --group dev pytest plugins/code-review/tools/python/test_code_review_helpers.py→ 1177 passeduv run ruff check .→ cleanuv run pyright→ 0 errors, 0 warnings--modeaddition/code-review --depth deepsubagent → both APPROVED🤖 Generated with Claude Code