# 1. CLI-aware parallel review with top-tier triage

**Status:** Accepted · 2025 · Amended 2026-04 (CLI-aware reviewer set) · Amended 2026-07 (v10.6.0: Fable 5 restored - Reviewer 1 and triage run on Fable on Claude Code; Copilot CLI pins Opus. "Opus" below reads as "the top tier of the day")

## Context

Code review is the phase where the pipeline most commonly ships wrong work. A
single reviewer model - whether Opus, Sonnet, or GPT - systematically misses
certain failure classes and hallucinates others. Worse, reviewer output tends
to be noisy: style nitpicks, out-of-scope findings, and repeated observations
across diffs.

We need a review stage that:

1. Catches real bugs and security issues reliably.
2. Doesn't block on false positives.
3. Doesn't inflate token cost to the point the pipeline becomes unaffordable.

## Decision

Phase 4 runs **reviewers in parallel** on the same diff. The reviewer set is
determined by the host CLI, because GPT-5.4 is only natively reachable from
Copilot CLI - Claude Code has no first-class GPT bridge, and round-tripping
would add latency without improving signal.

**Claude Code (2 parallel reviewers):**

- **Opus** - deep security and architecture focus
- **Sonnet** - quality, correctness, naming

**Copilot CLI (3 parallel reviewers):**

- **Opus** - deep security and architecture focus
- **GPT-5.4** - edge cases and cross-provider diversity
- **Sonnet** - quality, correctness, naming

Their raw findings are then passed to a **separate Opus triage agent** that
classifies each finding as `accepted`, `deferred`, or `rejected`. Only
`accepted` blocking items loop back to Phase 3 for rework.

Deterministic gates (build, lint, test, secret scan) run before any AI
reviewer is invoked - no point paying for review on code that doesn't build.

## Consequences

Positive:

- Three different model lineages each catch a different slice of issues.
- The triage pass filters the noise that individual reviewers can't filter
  about themselves - it has scope context from Phase 1/2 that single reviewers
  don't carry.
- Hallucinated findings get rejected instead of looping the pipeline forever.
- `validate-triage.mjs` enforces the triage output contract at runtime; a
  malformed triage blocks progression with explicit error codes.

Negative / costs:

- On Copilot CLI, running three reviewers costs ~3× the review-phase tokens
  vs. one reviewer. On Claude Code the 2-reviewer set costs ~2×. Offset: the
  failure rate would otherwise force more Phase 3 re-runs, which are much
  more expensive.
- Triage agent introduces a single point of failure; validator + fallback
  (treat all findings as accepted after double-failure) bounds the damage.
- Cross-provider (GPT) dependency on Copilot CLI - if the provider is down,
  the pipeline continues with 2 reviewers (Opus + Sonnet) and a warning.
- Cross-CLI asymmetry: Copilot CLI catches a slice of failures (edge cases
  via GPT diversity) that Claude Code's 2-model set misses. Accepted as a
  tradeoff against platform reachability.

## Alternatives Considered

**Single reviewer (Opus only):** simpler, cheaper, but misses edge cases
the other model lineages catch. Trialed in early v2 - noticeable false
negatives on concurrency bugs.

**Two reviewers + no triage:** cheaper still. Rejected because the raw
finding noise overwhelmed Phase 3 loops in early experiments.

**Tournament / voting:** all 3 reviewers, majority wins per finding. Too
many false positives still slipped through majority vote when the same
hallucination appeared in 2/3 reviewers (convergent failure mode).
