# composer-2.5 as the code-review GATE — replay vs opus baseline (live data)

_Date: 2026-06-25 · cursor-agent `--model composer-2.5`, cold, READ-ONLY · rig: replay the EXACT opus gate prompt over the EXACT reviewed git state, grade composer findings vs the existing opus findings. NO opus re-run (baselines reused). k=3 per unit._

## Question
Owner: is composer (cursor-agent) as good as opus at catching WAVE BUGS as a reviewer? Can it hold the review GATE in a cheap-coder orchestrator flow? Money/logic findings specifically.

## Method (defensible-signal, not parity-cert)
- Opus is the standing gate for all `/cursor-orchestrator` tasks — its findings are the ground-truth baseline (reused, never re-run).
- For each unit: reconstruct the PRE-FIX reviewed commit (verified by citation-match: the finding's evidence lands at its cited line AND the next commit fixes it), `git worktree add --detach` at that commit, dispatch composer with the IDENTICAL opus gate prompt (symmetric leak — fair head-to-head), k=3 cold rolls.
- Grade each roll by MECHANISM-match (same defect, any severity), not wording/severity. Per-roll recall + union. A GATE runs ONCE → per-roll (and worst-roll) is the gate-relevant number; union flatters a stochastic reviewer.
- Self-graded (no opus grader spawned, per owner constraint). Rubric = file + defect mechanism.

## Units (3, spanning type + prompt-sharpness)
| unit | repo | type | reviewed state | opus baseline |
|---|---|---|---|---|
| ws-e refunds | trance-shop-israel | money/payments | `3303122f..db370f78` | 11 (1 P0 / 7 P1 / 3 P2) |
| clawback w1 | mw-affill-clawback | money/payments | `cae4e62d9..35a8b84f0` | 5 (1 P1 / 4 P2) |
| wave1 sec-scan | multideal | auth/security (SSRF/turnstile) | `245f5dcf1..4970278ec` | 5 (5 P2) |

## RESULT — per-roll recall (mechanism-match)
| unit | roll1 | roll2 | roll3 | per-roll mean | union | worst-roll danger |
|---|---|---|---|---|---|---|
| ws-e | 7/11 | 7/11 | 7/11 | **64%** | 10/11 | **P0 over-credit MISSED in roll3, downgraded to P1 in roll2 → P0 surfaces at P0 only 1/3** |
| clawback | 3/5 | 5/5 | 4/5 | **80%** | 5/5 | latent P1 (uuid) caught 3/3 (handed by sharp checklist) |
| wave1 | 3/5 | 3/5 | 5/5 | **73%** | 5/5 | turnstile-stale-comment + test-gap each 1/3 |

## The two axes that decide composer's recall

**1. Difficulty axis (within a single prompt).** Composer is bimodal:
- **Surface / spec-conformance / clear-on-read** findings → **3/3 reliable** (ws-e: exclude-refunded-items, swallowed-error, dead-route, missing-tests, button-no-res.ok; clawback: test-mock-masks-bug, e2e-skips-path; wave1: decrypt-before-guard, captureCaught-I/O, bracket-comment).
- **Latent correctness** (idempotency-key collision, transaction atomicity, concurrency race, ticket-type over-scope, severity-stale comment) → **~1/3, ROTATING** — each roll catches a different ⅓. Union of 3 recovers ~all; a single pass misses ~30%.

**2. Prompt-sharpness axis (across prompts).** Latent recall is HINT-DEPENDENT:
- ws-e prompt gave SOFT "key requirements" → latent findings ~1/3.
- clawback prompt HANDED each suspect in a `MUST explicitly verify and rule on each:` checklist ("UUID aggregateId… does this throw at runtime?") → the latent P1 jumped to **3/3**.
- → composer reviews a sharp enumerated checklist reliably; cold-hunts latent defects stochastically.

## Other behaviors
- **Severity escalation:** composer rates harder than opus (clawback uuid P1→P0 2/3; wave1 decrypt-order P2→P1). Slightly alarmist, not a recall problem.
- **Novel plausible catches opus did NOT report (un-adjudicated):** multi-vendor split routed to `vendorSplits[0]` (ws-e ×2 rolls); Neon `tickets.status` not synced with worker ledger (ws-e); drizzle CHECK not mirrored in schema (ws-e); compressed IPv6 link-local/ULA not blocked (wave1 — a real SSRF gap); defer-to-nothing clawback loop (clawback 3/3). Composer has real breadth, not just noise.
- **Cost/latency:** ~100–162 s/roll, rc=0 all 9 rolls, no grok fallback. cursor-sub (flat), not metered.

## VERDICT — how to use composer as a reviewer
- **NOT a sole single-pass gate on latent correctness.** ws-e is decisive: the load-bearing money P0 surfaces at P0 only 1/3 of single runs — a once-running gate lets it through ~⅓ of the time. Same disqualifier shape as north (RESULT 11 turnstile 1/3), but composer is materially stronger (per-roll 64–80% vs north's noisy single-bug 1/3).
- **Gate-worthy IF the prompt is a sharp, enumerated MUST-verify checklist** — but that requires someone (opus or human) to already know the suspects, which is most of the gate's value. Composer executes a known checklist reliably; it does not reliably DISCOVER the latent defect cold.
- **Best efficient roles:**
  1. Cheap **first-pass** reviewer feeding opus (catches the surface 100%, ~70% of latent → opus reviews a smaller residue). 
  2. **k≥3 union** self-gate where one opus pass is too costly and ~91% union recall is acceptable (NOT for P0-money/auth — the 1/3 P0 miss is unacceptable there).
  3. Driven by an opus/human-authored MUST-verify checklist → near-opus on the enumerated items.
- **Keep opus as the sole gate on cold high-risk (money/auth/trust-boundary) latent correctness.** Mirrors cursor-orchestrator IRON LAW: cheap engine executes, strong model judges the latent.

## Caveats
- n=3 units, k=3. ws-e (rich, soft-hint) and clawback (sharp-hint) bracket the axes; wave1 confirms on auth. Not a broad multi-wave cert.
- Symmetric-leak design: both sides saw the same bespoke prompt → fair comparison, but absolute recall is inflated by the hints vs a truly generic gate. A composer MISS under hints is the conservative (valid) signal; a composer match is partly hint-carried.
- Novel findings not adjudicated against code/spec → treated as plausible, not scored into recall.
- Self-graded (owner barred spawning opus). Mechanism-match rubric applied uniformly.
