Problem
In porch's review loop, when a consult lane runs but returns no parseable VERDICT, porch defaults that to REQUEST_CHANGES. Combined with a lane that can't produce a verdict (see companion: the agy/Gemini lane going off-task), this drives the review loop to iterate until max_iterations even when every working reviewer has APPROVE'd — pure churn (≈ iterations × N consults wasted per phase).
The lane-unavailable case is already handled gracefully: a missing/unauthenticated lane skips non-blockingly. The gap is the ran-but-no-verdict case — it should be treated the same as a non-blocking skip (the reviewer effectively abstained), not as a substantive REQUEST_CHANGES.
Repro (spir-987, phase_1, 2026-06-11/12)
- Codex:
APPROVE. Claude: APPROVE. build + 5 tests green.
- Gemini (agy): iter1 timed out → skipped (correct, non-blocking). iter2 ran but off-task → no VERDICT → porch scored it
REQUEST_CHANGES → loop. Reached iter3 of max_iterations=8 with nothing actually wrong.
Expected
- A consult that ran but produced no parseable verdict → treat as a non-blocking abstention/skip (log it, don't count it as REQUEST_CHANGES), matching the unavailable-lane behavior.
- Only an explicit
REQUEST_CHANGES (with findings) should block / drive another iteration.
- Optionally: surface "lane X abstained: no verdict parsed" in the consult log so it's visible, not silent.
Impact
Without this, one misbehaving lane can burn the full max_iterations budget on every phase even when consensus among working reviewers is APPROVE. Companion to the agy-off-task consult bug (filed alongside). Distinct from #753 (Codex false-alarm content) — this is about absent verdicts, not wrong ones.
Problem
In porch's review loop, when a consult lane runs but returns no parseable
VERDICT, porch defaults that toREQUEST_CHANGES. Combined with a lane that can't produce a verdict (see companion: the agy/Gemini lane going off-task), this drives the review loop to iterate untilmax_iterationseven when every working reviewer hasAPPROVE'd — pure churn (≈ iterations × N consults wasted per phase).The lane-unavailable case is already handled gracefully: a missing/unauthenticated lane skips non-blockingly. The gap is the ran-but-no-verdict case — it should be treated the same as a non-blocking skip (the reviewer effectively abstained), not as a substantive
REQUEST_CHANGES.Repro (spir-987, phase_1, 2026-06-11/12)
APPROVE. Claude:APPROVE. build + 5 tests green.REQUEST_CHANGES→ loop. Reached iter3 ofmax_iterations=8with nothing actually wrong.Expected
REQUEST_CHANGES(with findings) should block / drive another iteration.Impact
Without this, one misbehaving lane can burn the full
max_iterationsbudget on every phase even when consensus among working reviewers is APPROVE. Companion to the agy-off-task consult bug (filed alongside). Distinct from #753 (Codex false-alarm content) — this is about absent verdicts, not wrong ones.