parallax
Cross-model verification for Claude Code. Two equal-weight frontier
models — the session model and a cross-vendor reviewer (via the OpenAI
codex CLI; the current reviewer lane is declared in the skill's
model-prompting-notes.md) —
verify and refute each other's claims with file:line evidence before a
cheaper implementer touches code, and again before the result merges.
Neither vendor grades its own homework.
Companion to superpowers, not a
replacement: it fills the cross-model review gap superpowers rules out of
scope.
How it works
flowchart LR
A[superpowers<br/>brainstorm] --> B{{"mode plan debate<br/>session ⇄ reviewer"}}
B -->|converged| C["frozen plan<br/>+ debate record"]
B -->|escalated| U[user decides]
C --> D["implementer subagent<br/>(zero judgment calls)"]
D --> E{{"mode diff debate<br/>spec + port fidelity"}}
E -->|PASS| F([merge])
E -->|FIX| D
E -->|ESCALATE| U
- Mode
plan — after brainstorming, before the implementation plan is
written. The two models debate the approach, port-fidelity claims, and the
API/behavior risk register until convergence or the round cap, then the
converged plan is frozen with a full debate record
(participants, rounds, resolved/struck/escalated points, verification
status).
- Mode
diff — after implementation, alongside superpowers code review.
A PostToolUse hook fingerprints the superpowers code-reviewer dispatch and
injects the diff-mode reminder with the same base/head SHAs, so both
reviews always look at the same range. Verdicts are PASS / FIX / ESCALATE
from each side.
The debate rules that keep this honest
(skills/multi-model-verify/references/debate-protocol.md):
- Strike rule — every externally checkable claim carries a citation the
other side can read (
References/<addon>/<file>:<line>, API docs, a dated
probe). Uncited claims are struck, not debated.
- Equal weight — disagreements resolve by evidence, never by which model
said it. Unresolvable points escalate to the user with both positions.
- Round cap — 4 exchanges by default; convergence in one round on a
sound plan is the system working, and manufactured objections are a
protocol violation, not diligence.
- Session continuity — the reviewer keeps debate state across rounds via
codex exec … resume <SESSION_ID>; the full context is sent once.
- Final adjudication — the session always has the last step: it
verifies the reviewer's final round against the repo and emits the
terminal verdict itself. A reviewer PASS/FIX is input, never the
decision; genuine deadlocks escalate to the user. The rule attaches to
the role, not the model — it holds whoever fills the session seat.
What's in the box
| Piece | What it does |
|---|
skills/multi-model-verify/ | The debate skill: both modes, debate protocol, frozen-plan format, model prompting notes, fallbacks/consent gate |
hooks/ | PostToolUse + PostToolUseFailure hook (matcher Task|Agent): fingerprints the superpowers code-reviewer dispatch, injects the mode-diff reminder with matching SHAs; inert everywhere else |
agents/implementer.md | Zero-judgment executor for frozen-plan tasks, pinned to the cheap lane (currently model: sonnet) |
commands/drift-triage.md | /parallax:drift-triage — reads the newest drift report, verifies each finding against the live contract surfaces, repairs on a branch |
commands/doctor.md | /parallax:doctor — operational health check: checkout-vs-installed version, hook registration, superpowers fingerprint, codex transport round-trip, drift task + pending entries. Reports, never fixes |
evals/ | Four gate tiers for the skill itself — see Verify |
tools/check-drift.ps1 | Weekly drift watch over the three upstreams the contract depends on — see Drift protection |
tools/write-attestation.ps1 · tools/verify-attestation.ps1 | SHA-bound review attestations — see Attestation lane |
.githooks/pre-push | Non-blocking attestation check on main pushes (git config core.hooksPath .githooks to enable) |
Fails loud, never silent
The governing rule
(skills/multi-model-verify/references/fallbacks.md): no transition that reduces
vendor diversity, evidence quality, or conversation continuity happens
without explicit user consent.
flowchart TD
X[codex failure] --> R{one same-parameters retry}
R -->|recovered| OK[debate continues]
R -->|still failing| G["CONSENT GATE banner:<br/>what failed · what degraded mode<br/>would and would NOT verify"]
X -. "quota-exhausted:<br/>skip the retry" .-> G
G -->|fix codex| OK
G -->|run degraded| D["single-vendor, visibly flagged;<br/>DEGRADED plan poisons any diff PASS"]
G -->|abort or unattended| B2[BLOCKED / DEGRADED-NOT-AUTHORIZED]