Concilium — cross-model adversarial review
A second, different model reviews your (or the user's) claims adversarially. Different model
lineage means different blind spots — that's the value. The reviewer PROPOSES; the calling
session RATIFIES. Never let either side's confidence substitute for evidence.
Designed to be orchestrated from Claude Code — Opus 5 and Fable 5 are both first-class
ratification seats (measured at chair parity on a blind outcome-prediction benchmark; any
Claude model can drive the loop, but the ratifier should be one of the two). The GPT side
(sol/terra/5.5 via codex) does the independent probing and mechanical execution — and that
cross-family seat is load-bearing: it measurably catches what same-family chairs jointly miss.
Prerequisites (check once per environment)
codex login status → must say "Logged in using ChatGPT" (subscription OAuth). An API key is
NOT needed. It is not forbidden either — the wrappers inherit whatever session the CLI already
has, so codex login --with-api-key works identically and simply bills per token. What does NOT
work is the reverse: a subscription can NOT be used as an API key, so don't attempt proxy/router
bridges.
Discover available models: codex debug models or ~/.codex/models_cache.json. If a model
errors "requires a newer version of Codex", run codex update and retry.
First time in a new environment, run the calibration bootstrap (references/setup.md) before
trusting verdicts: a known-truth reasoning test, then one simple real task, then (optionally)
a head-to-head to pick tier models.
Kimi seat — EXPERIMENTAL and opt-in; never part of a default round. Add it only when the
user explicitly asks for a third family. Two transports, each with its own wrapper here:
- Kimi Desktop (Windows).
scripts/concilium-review-kimi.ps1 drives the app's bundled
daimon runner under its own Electron. Requires the desktop app installed and signed in.
- Kimi Code CLI (Linux/macOS/Windows).
scripts/concilium-review-kimi.sh drives the
cross-platform, MIT-licensed CLI — headless kimi -p plus device-code OAuth, so it suits a
container or a throwaway VM (worked example: references/isolated-guest-vmware.md). ⚠ Print
mode auto-approves every tool call by construction, so isolation there is a precondition, not
a precaution. ⚠ Always pass --model: the CLI's built-in default is an older generation than
the flagship and nothing in the output names it.
Calibrated but flakier than codex, and weaker on isolation. Installation paths and model
selection are in references/setup.md; operating caveats are in references/kimi-seat.md and
pitfalls #18–21.
Grok seat (xAI, fourth family) — EXPERIMENTAL and opt-in; never part of a default round.
scripts/concilium-review-cursor.{sh,ps1} drive the Cursor Agent CLI on Cursor-subscription
auth (no xAI API key, no per-token bill), default model cursor-grok-4.6-xhigh. Effort is baked
into the model id, not a flag, and the wrappers refuse -fast ids unless you override.
Isolation is better than kimi's (--mode ask provably blocks writes) but still not containment
(the workspace is not a boundary; --sandbox is macOS/Linux only). It scored BELOW codex on the
calibration packet — seat it for fourth-lineage coverage, not accuracy. Full detail, numbers and
two Windows-only traps that silently break it: references/grok-seat.md, pitfalls #22–26.
Seats beyond codex, kimi and grok — four more families, no new transport
Three vendors expose an Anthropic-compatible endpoint, so one wrapper drives all of them through
the Claude Code CLI; the fourth (Google) has its own CLI. Two run on a subscription, two on a
pay-as-you-go key — see the plan column before assuming a seat is free:
scripts/concilium-review-compat.sh <glm|deepseek|qwen> {claim|diff|raw} [...]
scripts/concilium-review-agy.sh {claim|diff|raw} [...] # Google, via Antigravity
| seat |
vendor |
model |
credential |
plan |
glm |
Z.ai |
glm-5.3 |
ZAI_TOKEN |
GLM Coding Plan Lite, quota-metered not per-token |
deepseek |
DeepSeek |
deepseek-v4-pro |
DEEPSEEK_TOKEN |
pay-as-you-go key |
qwen |
Alibaba |
qwen3.8-max |
QWEN_TOKEN |
pay-as-you-go DashScope key |
agy |
Google |
gemini-3.1-pro-high |
Antigravity OAuth |
Google AI Pro subscription |
Each compat seat gets its own CLAUDE_CONFIG_DIR (~/.claude-<vendor>) so it cannot share
session state with a real Anthropic seat or another vendor. ⚠ A Claude-Code transport does not
mean a Claude model or Anthropic data handling — everything the seat reads goes to that vendor.
Which seat to pick for review — measured, and it inverts raw accuracy. Eight seats on an
18-claim adjudication packet (48 runs, 108 scored decisions per seat) landed within 6 points of each
other on accuracy — seven of the eight do; only qwen falls outside — so ranking by accuracy is
noise. Calibration separates them. Against a 55.6% base rate:
| seat |
refute rate |
recognises TRUE claims |
| kimi |
53.7% |
68.8% |
| glm |
59.3% |
62.5% |
| fable |
56.5% |
64.6% |
| grok |
66.7% |
56.2% |
| opus / deepseek |
68.5% |
50.0% / 47.9% |
| gemini |
76.9% |
41.7% |
| qwen |
67.6% |
37.5% |
Since the measured baseline failure of review is over-refutation, prefer the seats nearest the
base rate. fable is nearest of all (56.5%), but it shares the orchestrator's lineage, and
same-family agreement is weak evidence — so among the cross-family seats prefer kimi, then glm.
The Google seat refutes three-quarters of everything and recognises 42% of true claims — seat it for
lineage diversity, not as a trusted reviewer.
Setup, cost, runtime and the full calibration for all four: references/compat-seats.md — it is the
single home for these seats. references/setup.md carries the Z.ai and Google walk-throughs
alongside the other seats'; deepseek and qwen need no walk-through beyond the table above, since
the same wrapper drives them.
Tier matrix (defaults are current-day models — override per installation)
| Tier |
Default |
Effort |
Use for |
| Research |
flagship (e.g. gpt-5.6-sol) |
max |
open review rounds, adversarial verification |
| Mechanical |
prev flagship (e.g. gpt-5.5) |
medium |
verify a known claim with one probe |
| Runner |
cheap tier (e.g. gpt-5.6-terra) |
low |
execute-and-report: run a script, babysit an import |
Research-tier wrappers default to max on every seat. Effort vocabularies differ and are worth
knowing exactly: codex accepts none · minimal · low · medium · high · xhigh · max (measured —
the API rejects anything else and names the enum), the kimi seat accepts low · high · max.
Effort is not a substitute for a second family — measured, with the control. Six runs of one
seat (gpt-5.6-sol) over the same 14-item prediction packet, at low/medium/high/xhigh/max plus a
same-effort replicate: two runs at the SAME effort covered 10/14, while cross-effort pairs
averaged 8.9 and never beat that; the full six-run ensemble also reached only 10/14, equal to the
two-run noise floor and equal to one codex+kimi pair. Accuracy was not monotonic in effort
(high 9, max 9, xhigh 7, medium 7, low 7) while wall time grew 8× (21s → 166s). Four items were
missed by every run at every effort — and the cross-family seat got two of them. Varying effort
resamples the same blind spots; a different lineage is what moves them. If you want coverage,
add a family, not compute. -Mechanical is the deliberate opt-down and stays at medium.
Runner tasks are NOT reviews — skip the wrapper and call codex directly:
codex exec -m <cheap-model> -c model_reasoning_effort=low [-s read-only unless it writes] "<task>" < /dev/null
Always close stdin on direct non-interactive calls (bash < /dev/null; PowerShell $null | codex …) —
an open non-TTY stdin blocks codex forever on "Reading additional input from stdin...", and the orphaned
process survives the parent shell's timeout (pitfall #10; the wrappers are immune — they pipe via stdin).
Modes
This skill has two halves. Review mode (the rest of this file) asks is this claim true? —
one seat probes, proposes, and the orchestrator ratifies. Forge mode asks what has nobody
pointed at yet? — seats generate original ideas against an open question, read each other's work
from a shared register and BUILD on it, and nothing is judged or voted on. Use forge when the
bottleneck is that the good idea has not been had yet; use review when a claim already exists and
might be wrong.
- Forge:
scripts/concilium-forge.{sh,ps1}, method in references/forge-mode.md, brief template in
references/forge-brief-template.md.
- Brainstorming (
/concilium-brainstorm): forge's open-book inversion — a live read-only copy
of the system under discussion per seat (data and/or source tree, if applicable), boldness-tier
quotas, evidence replayed, findings synthesised, ideas flowing to HUMAN-reviewed dossiers that
the orchestrator never curates. Method, evidence-tiered: references/brainstorming-mode.md. Use
brainstorming over forge when the system can be safely replicated read-only into an isolated
environment and the ask is range plus grounding rather than closed-book originality.
- The wider catalogue of multi-model modes — fragment verification, selective escalation, role
rotation, blind replication, instrument audit, and the ones measured DEAD (effort sweeps,
generation sweeps, instructed blindness, judge-over-transcripts, same-lineage majority votes) —
is in
references/modes.md.
Offering a mode (what to do when the skill is invoked without one named)
The user will usually just describe a problem. Default to review. But first check the task
against the table below, and if a non-review mode clearly fits, offer it in one or two lines
before running anything — name the mode, say in a clause what it would return, and let the user
choose. Do not offer more than two, do not explain the catalogue, and do not offer at all when the
task is an ordinary "is this true?" — an unwanted menu is worse than no menu.
| If the user is about to / is asking… |
offer |
because |
| spend a batch of runs on a measurement, benchmark, eval or A/B |
instrument audit |
one call before the batch; it catches a fixture that cannot answer its own question |
| hand over a long write-up or a multi-claim result |
fragment verify |
a single verdict discards the parts that were right and hides the one load-bearing part that is wrong |
| act on a spec, schema or protocol others will implement |
blind replication |
two independent implementations; the divergences are the spec's ambiguities |
| settle something that looks underdetermined rather than wrong |
cross-examination |
returns the question list that has to be answered before a verdict means anything |
| stuck on framing, or the same approach keeps failing |
frame translation |
restates the problem in other fields' terms and imports their method |
| generate options, plans or research directions |
forge |
review's duty to refute kills a half-formed idea; forge is the opposite discipline |
| generate ideas with the real system open in front of the seats, when conventional methods are exhausted |
brainstorming |
open-book: findings come out checkable and replayable; ideas go to human-reviewed dossiers, never an orchestrator shortlist |
Everything else — including all of references/modes.md's remaining entries — is run only when the
user asks for it by name. Nothing here fires automatically.
Two requests about modes rather than for one, both common:
- "Which mode fits this?" — recommend, do not run. Name one mode (two at most), say what it
would return that a review would not, and stop. The point of the question is the choice, so
handing back a finished round instead of a recommendation answers a question they did not ask.
- "Run every mode that applies." — first rule modes OUT and say which and why: blind
replication needs a specification, instrument audit needs a measurement design, fragment verify
needs a multi-claim artifact. A mode with nothing to bite on returns a competent-looking void and
costs a full round. Then run the survivors and report the union of their findings, never a
merged verdict — they answer different questions, so two modes "disagreeing" is two findings,
not a split to resolve. Warn about the cost before starting: N rounds at 5–15 minutes each.
Running a review
Use the bundled wrappers. They load the shared review contract from
references/contract.md (single source of truth — falsification probe, alternative explanation,
caveat, verdict-proposal, schema/encoding rules; edit the contract there, never in the
scripts) and add provenance stamping. Both wrappers are functionally identical; pick by platform:
Linux / macOS (bash):
- Claim:
scripts/concilium-review.sh claim "<claim>"
- Diff:
scripts/concilium-review.sh diff [base-branch]
- Config via env:
MODEL, EFFORT, MECHANICAL=1 (mechanical tier), REPO_DIR, PROJECT_RULES (rules file path).
- First use after clone:
chmod +x scripts/concilium-review.sh.
Windows (PowerShell 5.1+):
- Claim:
powershell -ExecutionPolicy Bypass -File scripts/concilium-review.ps1 -Claim "<claim>" [-Mechanical] [-RepoDir <path>] [-ProjectRules <file>]
- Diff:
... -Diff [-Base <branch>] — reviews the working-tree diff of -RepoDir.
Grok fourth-family seat — EXPERIMENTAL, opt-in. concilium-review-cursor.sh (env-configured:
MODEL, MECHANICAL=1, ALLOW_FAST=1, REPO_DIR, PROJECT_RULES, PRIOR_ROUNDS, AUTO_RULES=1,
WATCH_PATHS, NO_HOME_ISOLATION=1) and concilium-review-cursor.ps1 (same surface as flags).
Both send the prompt on stdin (argv is mangled by the Windows shim), run --mode ask --force
(read commands, no writes), parse the CLI's .result, and count distinct contract blocks
instead of trusting the exit code. Auto-rules bridging is OFF: this CLI loads project
CLAUDE.md/AGENTS.md natively. See references/grok-seat.md before using it for anything blind.
Kimi third-family seat — EXPERIMENTAL, opt-in. Not part of a default round; add it only when
the user asks for a third family. Two wrappers, same contract and same five blocks:
concilium-review-kimi.sh (cross-platform CLI, env-configured — MODEL is mandatory there) and
concilium-review-kimi.ps1 (Windows desktop runner).
The desktop wrapper takes the same -Claim/-Diff/-RepoDir/-ProjectRules/-PriorRounds surface, plus
-Model (default k3-agent), -Effort (low|high|max) and -RawPrompt (no contract, for
calibration probes). Two seat-specific differences, both measured: CLAUDE.md auto-bridging is
OFF by default here — the injection reliably kills the run with a bare Connection error., so
it is opt-in via -AutoRules; use -ProjectRules <file> to give the reviewer context instead.
And never trust its exit code — it exits 0 on that failure, so check for the five blocks.
Multi-line prompts must go through this wrapper; a direct kimi-daimon --prompt from bash gets
its argv mangled (pitfalls #18–19).
This seat has no sandbox — give it a disposable copy. -SandboxFrom <dir> copies the tree
to a throwaway directory (excluding .git, virtualenvs and secret-shaped files), runs the agent
there, prints exactly what it created/modified/deleted, and deletes the copy unless
-KeepSandbox. Use it by default. Be clear about what it buys: workDir is not a boundary —
a canary outside it was read by absolute path and returned verbatim (pitfalls #20) — so this is
blast-radius control and an audit trail, not containment. If material on the machine must not
reach the provider, isolate at the OS level (separate account with ACLs, or a VM).
For a blind round, the risk from that same porousness is contamination rather than damage:
an agent that wanders into the real tree can find the answer, and the round silently stops being
blind. Add -WatchPaths <a,b,c> — it snapshots NTFS last-access times for whatever must stay
unread (the real repo, the results log, the answer key) and reports anything read during the
run. Validated against a known escape in both directions; read pitfalls #21 before trusting it,
including why an enumeration-based version of the same check reported "clean" on a run that had
demonstrably escaped.
Reasoning boost — now OFF by default on EVERY seat (changed 2026-08-22, measured).
references/reasoning-boost.md is a short "hunt the non-obvious, take the strong position" block the
wrappers can append to the contract. Enable per round with REASONING_BOOST=1 / -ReasoningBoost.
⚠ Do not turn it on for review work. It was ON for the grok and kimi seats on the strength of a
prediction-mode result (false alarms 33%→7% and 93%→67%). Re-measured in adjudication mode on
a packet with proven measurement capacity — 6 seats, 5 vendors, 36 runs — it is a pure criterion
shift toward refutation with no accuracy benefit:
|
base |
boost |
| refute rate |
61.0% |
73.4% (+12.4 pp, 95% CI [+5.5, +19.3]) |
| upheld-recall (true claims recognised) |
61.1% |
43.5% |
| accuracy |
70.8% |
67.7% |
Within those six seats the refute rate rose in all six and upheld-recall fell in five. Replicated
on two further vendors afterwards, the direction holds for the population but not for every seat:
the sign test is 7 of 8 (p = 0.035), and Qwen is a measured counterexample at −8.5 pp. Do not
write "every seat". The production default still flips OFF — the two seats that shipped it ON both
degrade — and since chairs already over-refute (rejecting true claims at a high rate is the measured
baseline failure), the boost makes the dominant error worse while buying nothing. One seat went to a
96% refute rate and recognised 4% of true claims. Detail: references/benchmarks.md.
Operational rules (each one is a measured failure — the why is in references/pitfalls.md):
- Run in background with a full ~10 min timeout from the FIRST call. Real reviews take
5–15+ min at high effort; a foreground timeout kills them mid-probe.
- Prefer a fresh session over resuming a timed-out one. Long resumed chains hit context
compaction — the reviewer's early careful reading gets lossy-summarized before the final,
consequential step.
- Never bare-resume.
codex exec resume silently resets model AND sandbox to the user's
config.toml defaults. If you must resume (or want to switch models mid-session), re-pin
everything:
codex exec resume -m <model> -c sandbox_mode="read-only" -c model_reasoning_effort=<tier> <session-id> -
Flags go BEFORE the positional session id. The key is sandbox_mode — -c sandbox=... is
silently ignored, and there is no -s flag on resume. Cross-model resume retains context.
- The reviewer is a full agent, not a chatbot — read-only sandbox blocks file writes, not
read commands or DB SELECTs. Everything it reviews goes to the second model's provider.
- Watch progress live, don't wait blind — and monitor the right stream. The contract (rule 9)
makes the reviewer emit
STATUS: one-liners as it works, and codex writes progressively — but
the streams split (verified live): with 1> out 2> err, the final five blocks land on
stdout while the streaming transcript (banner, STATUS lines, tool calls) goes to stderr.
Point a tail/monitor at stderr for progress + failure signatures; read stdout for the verdict.
Caveat: PowerShell 1>/2> redirects write UTF-16 — decode accordingly (or redirect through a
UTF-8-forcing step) before grepping.
- A blind round needs structural isolation, not an instruction. When the round must be
unprimed (a blind eval, a framing-critical blind-first pass per request-template), run the
reviewer in a clean directory with auto-rules bridging OFF (
-NoAutoRules / NO_AUTO_RULES=1):
a model carrying project context and told to "answer from the packet alone" measurably still
uses that context (pitfalls #16–17).
Ratification protocol (the calling session's job)
The reviewer returns five blocks: PROBE / ALT / CAVEAT / VERDICT-PROPOSAL / PHASE-LOG.
Before relaying or acting:
- Read the actual probe (the query/commands), not just the prose summary.
- Extremal results are a tripwire: 0% or 100% on a first attempt usually means a wrong
join key, wrong scope, or wrong table — not a discovery. Verify the probe's load-bearing
step yourself before accepting it.
- Scope-check disagreements: two probes can both be factually right at different scopes
(one table vs DB-wide, one source vs all sources). Name the scope before comparing numbers.
- Distinguish refuted / stale / incomplete. "The numbers differ today" does not mean the
claim was wrong when written — check history/timestamps before saying "refuted".
- Read ALT before you read the verdict, and check its discriminator. The block carries the
strongest reading the reviewer rejected plus the observation that killed it. Two failure modes
to catch: a strawman rival (weak, easily dismissed — the reviewer optimised for a clean
verdict, so treat the round as having attempted no alternative at all), and a missing
discriminator (the separation is argued rather than observed — then the reviewer preferred
rather than verified, and the tag caps at
[C] however confident the sentence sounds).
⚠ In practice the discriminator is almost never missing — it is manufactured. Measured over
315 refutations, the honest "nothing separated them" escape was taken once, and some of the
invented separations were fabricated experimental results, cited to refute claims that were
TRUE. So the check that pays is not "is there a discriminator?" but "can I follow its quote
back to the input the reviewer was given?" If the observation is not in that material, the
refutation is worth nothing however specific it sounds.
⚠ Weight this most when the proposal is [X]. Chairs measurably over-refute — they reject
true claims at a substantial rate, and some true claims get refuted by every chair
independently — so on a refutation the rejected alternative is disproportionately likely to be
the correct one. It is the cheapest available substitute for adding another model family.
- Assign the final verdict tag yourself:
[V-code] (verified vs source, cite file:line) /
[V-db] (read-only query, cite it) / [V-probe] (re-runnable script) / [C] (unverified) /
[X] (refuted — name what supersedes it). The proposal is input, not the answer.
- Weigh agreement by lineage. Same-family confirmation (a Claude chair agreeing with a
Claude orchestrator) is weak evidence — same-lineage chairs measurably share wrong answers,
down to independently producing the identical wrong inference. A cross-family confirmation
or refutation outweighs any count of same-lineage votes; never settle a dispute by majority
across chairs that share a lineage. Two further families are available as experimental opt-in
seats — Moonshot (kimi) and xAI (grok) — and an extra seat buys nothing unless it is
independent, so weigh by family, not by headcount; note that a unanimous panel may simply mean
the item was easy (references/benchmarks.md). Weigh a dissent by lineage, never by stated confidence —
measured, seats differ enormously in how much doubt they express (codex 99.7 mean vs grok 70.9
on items they got right), so a confident vote and a hedged one are not comparable quantities.
The concilium loop (iterative rounds)
A single review pass is often enough. But when the reviewer's probe has a gap, or you (the
orchestrator) disagree with the proposal on defensible grounds, one exchange isn't a concilium
— a council deliberates. The loop runs review rounds until the verdict converges or the dispute
is proven genuine. This loop is orchestrated by you, the calling Claude session — it is a
protocol, not a script (the ratification step is your judgment; nothing can automate it).
Each round:
- Run a review (the wrapper) → get the five blocks → ratify per the protocol above.
- Decide the round's outcome and act:
| Outcome |
Condition |
Action |
| Converged |
You verified the probe's load-bearing step and it holds |
STOP — emit the final tag. |
| Dispute |
The probe has a gap, wrong scope, or you have a specific, evidence-backed objection |
Write this round's PROBE and ALT + your objection to a rounds file; run the next round with -PriorRounds/PRIOR_ROUNDS pointing at it. Carrying ALT forward stops the next round re-rejecting the same near-miss without knowing it was already the runner-up. |
| Dry |
A round adds no new checkable evidence — the reviewer re-asserts, or says (in CAVEAT) it has no new path |
STOP — escalate to the owner as [C]/[POLICY] with the open question and the surviving ALT. A dry round means the rivals were never separated, so the strongest one is the substance of what you are handing over. This is the anti-oscillation guard. |
| Cap |
Round limit reached (default 3) without converging |
STOP — present the state and escalate; a real dispute is a finding, not a failure. |
Design rules (they follow directly from the pitfalls):
- Fresh session per round — never a resume chain. The loop is exactly the "long chain"
that pitfall #3 warns about; carry context forward via the
-PriorRounds file, not
codex exec resume. Each round starts clean and sees only a compact summary of what was
already tried.
- Every round must add a NEW evidence path. The contract (rule 8) enforces this on the
reviewer side; you enforce it on yours — an objection is only worth a round if it's backed by
evidence or points at a concrete, checkable gap. "I'm not convinced" is not a round.
- Ratifier stays fixed (you / Fable); the reviewer can drop tiers as the dispute narrows.
Round 1 on the research tier; once it's down to a mechanical check, run later rounds
-Mechanical. Each round is a real 5–15 min codex call — the cap and the dry-stop are cost
controls, not just correctness ones.
- Keep the rounds file in durable project storage (not a session temp dir), so the whole
deliberation is auditable and the final PHASE-LOG can cite it.
Trigger it when the user asks to "loop", "iterate", "keep going until it's resolved", "have them
hash it out", or when a first pass comes back disputed and the stakes justify another round.
Project adaptation
The reviewer sees AGENTS.md, not CLAUDE.md — mind the gap
codex auto-loads AGENTS.md (from the working directory upward), the same way Claude Code
auto-loads CLAUDE.md. They are different files: a project with only a CLAUDE.md gives the
reviewer none of the ground rules Claude has — it reviews half-blind. Three ways to close it,
in order of durability:
- Best (project-level): make
AGENTS.md exist. Mirror your CLAUDE.md into an AGENTS.md
(or make AGENTS.md a short pointer to it), and keep them synced. This helps all codex
usage, not just this skill, and is codex's own supported convention.
- Automatic (built into the codex wrappers): CLAUDE.md bridging. When no
AGENTS.md is
present, the wrapper auto-injects the project's CLAUDE.md (root or .claude/CLAUDE.md) into
the contract and prints a notice, so the reviewer isn't missing rules. Disable with
-NoAutoRules / NO_AUTO_RULES=1 (e.g. a huge, mostly-workflow CLAUDE.md you don't want in
every review). The kimi wrapper inverts this — bridging is off unless you pass
-AutoRules, because the injection breaks that seat (pitfalls #18); use option 3 there.
- Curated (explicit):
-ProjectRules <file>. Point at a short, hand-picked extract of the
safety-critical rules — this overrides auto-bridging. Best for large instruction files where
only a slice is relevant to review (invariants, "never touch X", schema quirks).
If you keep both files but let them drift, the reviewer sees the AGENTS.md version — sync them.
Other adaptation
- If the project keeps a claims ledger, the PHASE-LOG block is a ready-to-paste line
(
Phase N — <reviewer>(<model>) — <date> — <found> [proposed]); append it only via the
project's own hygiene rules (typically: owner or main session, append-only). No ledger → drop
the block.
- Storage: keep probe outputs and frozen samples in a durable project location, never in
session-scoped temp dirs (they die with the session).
References
references/request-template.md — how to construct the REQUEST you hand in (your side, not the
reviewer's): confidence-tag facts (never "do not re-derive" over a conclusion), always mount the
repo/DB, license rejecting the frame, and run a blind-first pass for framing-critical rounds. Read
before writing any non-trivial request.
references/contract.md — the review contract the wrappers send (edit it there; both scripts
load it at runtime).
references/pitfalls.md — known issues and the rules that counter them (read when a rule
seems overcautious, or when debugging reviewer misbehavior).
references/setup.md — first-time installation, authentication and calibration bootstrap.
references/benchmarks.md — head-to-head model selection, panel benchmarking methods and the
measured results behind the defaults.
references/maintenance.md — public documentation, example and release-note sanitization.
references/kimi-seat.md / references/grok-seat.md — the two experimental extra-family seats:
transports, measured limits, and what each one's testing produced for the skill as a whole.
1---2name: concilium3description: Adversarial cross-model review for hard, load-bearing tasks — combining frontier models: the Claude session (Opus 5 or Fable 5 as the intended orchestrator) hands a claim, diff, or result to an OpenAI model (gpt-5.6-sol / gpt-5.6-terra / gpt-5.5, via the codex CLI on ChatGPT-subscription auth, no API key), which probes it with falsification attempts and PROPOSES a verdict; the orchestrator checks the probe and RATIFIES. Two EXPERIMENTAL, opt-in extra-family seats can be added when asked for — Kimi (Moonshot, via the Kimi Code CLI or the local Kimi Desktop runner) and Grok (xAI, via the Cursor Agent CLI on Cursor-subscription auth); neither is part of a default round. Use whenever the user wants a second opinion from a different model, a cross-model or concilium review, adversarial verification of a research claim, benchmark number, or diff, says "have GPT/codex check this", explicitly asks to add the kimi or grok seat, wants codex set up as a reviewer, needs to switch codex models mid-session (park-and-resume4---56# Concilium — cross-model adversarial review78A second, *different* model reviews your (or the user's) claims adversarially. Different model9lineage means different blind spots — that's the value. The reviewer PROPOSES; the calling10session RATIFIES. Never let either side's confidence substitute for evidence.1112Designed to be orchestrated from Claude Code — **Opus 5 and Fable 5 are both first-class13ratification seats** (measured at chair parity on a blind outcome-prediction benchmark; any14Claude model can drive the loop, but the ratifier should be one of the two). The GPT side15(sol/terra/5.5 via codex) does the independent probing and mechanical execution — and that16cross-family seat is load-bearing: it measurably catches what same-family chairs jointly miss.1718## Prerequisites (check once per environment)19201. `codex login status` → must say "Logged in using ChatGPT" (subscription OAuth). An API key is21 NOT needed. It is not forbidden either — the wrappers inherit whatever session the CLI already22 has, so `codex login --with-api-key` works identically and simply bills per token. What does NOT23 work is the reverse: a subscription can NOT be used as an API key, so don't attempt proxy/router24 bridges.252. Discover available models: `codex debug models` or `~/.codex/models_cache.json`. If a model26 errors "requires a newer version of Codex", run `codex update` and retry.273. First time in a new environment, run the calibration bootstrap (references/setup.md) before28 trusting verdicts: a known-truth reasoning test, then one simple real task, then (optionally)29 a head-to-head to pick tier models.304. Kimi seat — **EXPERIMENTAL and opt-in; never part of a default round.** Add it only when the31 user explicitly asks for a third family. Two transports, each with its own wrapper here:32 - **Kimi Desktop (Windows).** `scripts/concilium-review-kimi.ps1` drives the app's bundled33 daimon runner under its own Electron. Requires the desktop app installed and signed in.34 - **Kimi Code CLI (Linux/macOS/Windows).** `scripts/concilium-review-kimi.sh` drives the35 cross-platform, MIT-licensed CLI — headless `kimi -p` plus device-code OAuth, so it suits a36 container or a throwaway VM (worked example: references/isolated-guest-vmware.md). ⚠ Print37 mode auto-approves every tool call by construction, so isolation there is a precondition, not38 a precaution. ⚠ Always pass `--model`: the CLI's built-in default is an older generation than39 the flagship and nothing in the output names it.4041 Calibrated but flakier than codex, and weaker on isolation. Installation paths and model42 selection are in references/setup.md; operating caveats are in references/kimi-seat.md and43 pitfalls #18–21.445. Grok seat (xAI, fourth family) — **EXPERIMENTAL and opt-in; never part of a default round.**45 `scripts/concilium-review-cursor.{sh,ps1}` drive the **Cursor Agent CLI** on Cursor-subscription46 auth (no xAI API key, no per-token bill), default model `cursor-grok-4.6-xhigh`. Effort is baked47 into the model id, not a flag, and the wrappers refuse `-fast` ids unless you override.48 Isolation is better than kimi's (`--mode ask` provably blocks writes) but still not containment49 (the workspace is not a boundary; `--sandbox` is macOS/Linux only). It scored BELOW codex on the50 calibration packet — seat it for fourth-lineage coverage, not accuracy. Full detail, numbers and51 two Windows-only traps that silently break it: references/grok-seat.md, pitfalls #22–26.5253## Seats beyond codex, kimi and grok — four more families, no new transport5455Three vendors expose an **Anthropic-compatible endpoint**, so one wrapper drives all of them through56the Claude Code CLI; the fourth (Google) has its own CLI. Two run on a subscription, two on a57pay-as-you-go key — see the `plan` column before assuming a seat is free:5859```60scripts/concilium-review-compat.sh <glm|deepseek|qwen> {claim|diff|raw} [...]61scripts/concilium-review-agy.sh {claim|diff|raw} [...] # Google, via Antigravity62```6364| seat | vendor | model | credential | plan |65|---|---|---|---|---|66| `glm` | Z.ai | `glm-5.3` | `ZAI_TOKEN` | GLM Coding Plan Lite, quota-metered not per-token |67| `deepseek` | DeepSeek | `deepseek-v4-pro` | `DEEPSEEK_TOKEN` | pay-as-you-go key |68| `qwen` | Alibaba | `qwen3.8-max` | `QWEN_TOKEN` | pay-as-you-go DashScope key |69| `agy` | Google | `gemini-3.1-pro-high` | Antigravity OAuth | Google AI Pro subscription |7071Each compat seat gets its **own `CLAUDE_CONFIG_DIR`** (`~/.claude-<vendor>`) so it cannot share72session state with a real Anthropic seat or another vendor. ⚠ **A Claude-Code transport does not73mean a Claude model or Anthropic data handling** — everything the seat reads goes to that vendor.7475**Which seat to pick for review — measured, and it inverts raw accuracy.** Eight seats on an7618-claim adjudication packet (48 runs, 108 scored decisions per seat) landed within 6 points of each77other on accuracy — seven of the eight do; only `qwen` falls outside — so ranking by accuracy is78noise. **Calibration separates them.** Against a 55.6% base rate:7980| seat | refute rate | recognises TRUE claims |81|---|---:|---:|82| kimi | **53.7%** | **68.8%** |83| glm | 59.3% | 62.5% |84| fable | 56.5% | 64.6% |85| grok | 66.7% | 56.2% |86| opus / deepseek | 68.5% | 50.0% / 47.9% |87| gemini | **76.9%** | **41.7%** |88| qwen | 67.6% | 37.5% |8990Since the measured baseline failure of review is **over-refutation**, prefer the seats nearest the91base rate. `fable` is nearest of all (56.5%), but it shares the orchestrator's lineage, and92same-family agreement is weak evidence — so among the cross-family seats prefer **kimi, then glm**.93The Google seat refutes three-quarters of everything and recognises 42% of true claims — seat it for94lineage diversity, not as a trusted reviewer.9596Setup, cost, runtime and the full calibration for all four: `references/compat-seats.md` — it is the97single home for these seats. `references/setup.md` carries the Z.ai and Google walk-throughs98alongside the other seats'; `deepseek` and `qwen` need no walk-through beyond the table above, since99the same wrapper drives them.100101## Tier matrix (defaults are current-day models — override per installation)102103| Tier | Default | Effort | Use for |104|---|---|---|---|105| Research | flagship (e.g. `gpt-5.6-sol`) | **max** | open review rounds, adversarial verification |106| Mechanical | prev flagship (e.g. `gpt-5.5`) | medium | verify a known claim with one probe |107| Runner | cheap tier (e.g. `gpt-5.6-terra`) | low | execute-and-report: run a script, babysit an import |108109Research-tier wrappers default to **max** on every seat. Effort vocabularies differ and are worth110knowing exactly: codex accepts `none · minimal · low · medium · high · xhigh · max` (measured —111the API rejects anything else and names the enum), the kimi seat accepts `low · high · max`.112113**Effort is not a substitute for a second family — measured, with the control.** Six runs of one114seat (gpt-5.6-sol) over the same 14-item prediction packet, at low/medium/high/xhigh/max plus a115same-effort replicate: two runs at the SAME effort covered 10/14, while cross-effort pairs116averaged 8.9 and never beat that; the full six-run ensemble also reached only 10/14, equal to the117two-run noise floor and equal to one codex+kimi pair. Accuracy was not monotonic in effort118(high 9, max 9, xhigh 7, medium 7, low 7) while wall time grew 8× (21s → 166s). Four items were119missed by every run at every effort — and the cross-family seat got two of them. **Varying effort120resamples the same blind spots; a different lineage is what moves them.** If you want coverage,121add a family, not compute. `-Mechanical` is the deliberate opt-down and stays at `medium`.122123Runner tasks are NOT reviews — skip the wrapper and call codex directly:124`codex exec -m <cheap-model> -c model_reasoning_effort=low [-s read-only unless it writes] "<task>" < /dev/null`125**Always close stdin on direct non-interactive calls** (bash `< /dev/null`; PowerShell `$null | codex …`) —126an open non-TTY stdin blocks codex forever on "Reading additional input from stdin...", and the orphaned127process survives the parent shell's timeout (pitfall #10; the wrappers are immune — they pipe via stdin).128129## Modes130131This skill has two halves. **Review mode** (the rest of this file) asks *is this claim true?* —132one seat probes, proposes, and the orchestrator ratifies. **Forge mode** asks *what has nobody133pointed at yet?* — seats generate original ideas against an open question, read each other's work134from a shared register and BUILD on it, and **nothing is judged or voted on**. Use forge when the135bottleneck is that the good idea has not been had yet; use review when a claim already exists and136might be wrong.137138- Forge: `scripts/concilium-forge.{sh,ps1}`, method in `references/forge-mode.md`, brief template in139 `references/forge-brief-template.md`.140- **Brainstorming** (`/concilium-brainstorm`): forge's open-book inversion — a live read-only copy141 of the system under discussion per seat (data and/or source tree, if applicable), boldness-tier142 quotas, evidence replayed, findings synthesised, ideas flowing to HUMAN-reviewed dossiers that143 the orchestrator never curates. Method, evidence-tiered: `references/brainstorming-mode.md`. Use144 brainstorming over forge when the system can be safely replicated read-only into an isolated145 environment and the ask is range plus grounding rather than closed-book originality.146- The wider catalogue of multi-model modes — fragment verification, selective escalation, role147 rotation, blind replication, instrument audit, and the ones measured DEAD (effort sweeps,148 generation sweeps, instructed blindness, judge-over-transcripts, same-lineage majority votes) —149 is in `references/modes.md`.150151### Offering a mode (what to do when the skill is invoked without one named)152153The user will usually just describe a problem. **Default to review.** But first check the task154against the table below, and if a non-review mode clearly fits, **offer it in one or two lines155before running anything** — name the mode, say in a clause what it would return, and let the user156choose. Do not offer more than two, do not explain the catalogue, and do not offer at all when the157task is an ordinary "is this true?" — an unwanted menu is worse than no menu.158159| If the user is about to / is asking… | offer | because |160|---|---|---|161| spend a batch of runs on a measurement, benchmark, eval or A/B | **instrument audit** | one call before the batch; it catches a fixture that cannot answer its own question |162| hand over a long write-up or a multi-claim result | **fragment verify** | a single verdict discards the parts that were right and hides the one load-bearing part that is wrong |163| act on a spec, schema or protocol others will implement | **blind replication** | two independent implementations; the divergences are the spec's ambiguities |164| settle something that looks underdetermined rather than wrong | **cross-examination** | returns the question list that has to be answered before a verdict means anything |165| stuck on framing, or the same approach keeps failing | **frame translation** | restates the problem in other fields' terms and imports their method |166| generate options, plans or research directions | **forge** | review's duty to refute kills a half-formed idea; forge is the opposite discipline |167| generate ideas with the real system open in front of the seats, when conventional methods are exhausted | **brainstorming** | open-book: findings come out checkable and replayable; ideas go to human-reviewed dossiers, never an orchestrator shortlist |168169Everything else — including all of `references/modes.md`'s remaining entries — is run only when the170user asks for it by name. Nothing here fires automatically.171172Two requests about modes rather than for one, both common:173174- **"Which mode fits this?"** — recommend, do **not** run. Name one mode (two at most), say what it175 would return that a review would not, and stop. The point of the question is the choice, so176 handing back a finished round instead of a recommendation answers a question they did not ask.177- **"Run every mode that applies."** — first rule modes OUT and say which and why: blind178 replication needs a specification, instrument audit needs a measurement design, fragment verify179 needs a multi-claim artifact. A mode with nothing to bite on returns a competent-looking void and180 costs a full round. Then run the survivors and report **the union of their findings, never a181 merged verdict** — they answer different questions, so two modes "disagreeing" is two findings,182 not a split to resolve. Warn about the cost before starting: N rounds at 5–15 minutes each.183184## Running a review185186Use the bundled wrappers. They load the shared review contract from187`references/contract.md` (single source of truth — falsification probe, alternative explanation,188caveat, verdict-proposal, schema/encoding rules; **edit the contract there**, never in the189scripts) and add provenance stamping. Both wrappers are functionally identical; pick by platform:190191**Linux / macOS (bash):**192- Claim: `scripts/concilium-review.sh claim "<claim>"`193- Diff: `scripts/concilium-review.sh diff [base-branch]`194- Config via env: `MODEL`, `EFFORT`, `MECHANICAL=1` (mechanical tier), `REPO_DIR`, `PROJECT_RULES` (rules file path).195- First use after clone: `chmod +x scripts/concilium-review.sh`.196197**Windows (PowerShell 5.1+):**198- Claim: `powershell -ExecutionPolicy Bypass -File scripts/concilium-review.ps1 -Claim "<claim>" [-Mechanical] [-RepoDir <path>] [-ProjectRules <file>]`199- Diff: `... -Diff [-Base <branch>]` — reviews the working-tree diff of `-RepoDir`.200201**Grok fourth-family seat — EXPERIMENTAL, opt-in.** `concilium-review-cursor.sh` (env-configured:202`MODEL`, `MECHANICAL=1`, `ALLOW_FAST=1`, `REPO_DIR`, `PROJECT_RULES`, `PRIOR_ROUNDS`, `AUTO_RULES=1`,203`WATCH_PATHS`, `NO_HOME_ISOLATION=1`) and `concilium-review-cursor.ps1` (same surface as flags).204Both send the prompt on **stdin** (argv is mangled by the Windows shim), run `--mode ask --force`205(read commands, no writes), parse the CLI's `.result`, and count **distinct** contract blocks206instead of trusting the exit code. Auto-rules bridging is OFF: this CLI loads project207CLAUDE.md/AGENTS.md natively. See references/grok-seat.md before using it for anything blind.208209**Kimi third-family seat — EXPERIMENTAL, opt-in.** Not part of a default round; add it only when210the user asks for a third family. Two wrappers, same contract and same five blocks:211`concilium-review-kimi.sh` (cross-platform CLI, env-configured — `MODEL` is mandatory there) and212`concilium-review-kimi.ps1` (Windows desktop runner).213214The desktop wrapper takes the same `-Claim`/`-Diff`/`-RepoDir`/`-ProjectRules`/`-PriorRounds` surface, plus215`-Model` (default `k3-agent`), `-Effort` (`low|high|max`) and `-RawPrompt` (no contract, for216calibration probes). Two seat-specific differences, both measured: **CLAUDE.md auto-bridging is217OFF by default here** — the injection reliably kills the run with a bare `Connection error.`, so218it is opt-in via `-AutoRules`; use `-ProjectRules <file>` to give the reviewer context instead.219And **never trust its exit code** — it exits 0 on that failure, so check for the five blocks.220Multi-line prompts must go through this wrapper; a direct `kimi-daimon --prompt` from bash gets221its argv mangled (pitfalls #18–19).222223**This seat has no sandbox — give it a disposable copy.** `-SandboxFrom <dir>` copies the tree224to a throwaway directory (excluding `.git`, virtualenvs and secret-shaped files), runs the agent225there, prints exactly what it created/modified/deleted, and deletes the copy unless226`-KeepSandbox`. Use it by default. Be clear about what it buys: workDir is **not** a boundary —227a canary outside it was read by absolute path and returned verbatim (pitfalls #20) — so this is228blast-radius control and an audit trail, not containment. If material on the machine must not229reach the provider, isolate at the OS level (separate account with ACLs, or a VM).230231For a **blind round**, the risk from that same porousness is contamination rather than damage:232an agent that wanders into the real tree can find the answer, and the round silently stops being233blind. Add `-WatchPaths <a,b,c>` — it snapshots NTFS last-access times for whatever must stay234unread (the real repo, the results log, the answer key) and reports anything read during the235run. Validated against a known escape in both directions; read pitfalls #21 before trusting it,236including why an enumeration-based version of the same check reported "clean" on a run that had237demonstrably escaped.238239**Reasoning boost — now OFF by default on EVERY seat (changed 2026-08-22, measured).**240`references/reasoning-boost.md` is a short "hunt the non-obvious, take the strong position" block the241wrappers can append to the contract. Enable per round with `REASONING_BOOST=1` / `-ReasoningBoost`.242243⚠ **Do not turn it on for review work.** It was ON for the grok and kimi seats on the strength of a244*prediction*-mode result (false alarms 33%→7% and 93%→67%). Re-measured in **adjudication** mode on245a packet with proven measurement capacity — 6 seats, 5 vendors, 36 runs — it is a pure criterion246shift toward refutation with no accuracy benefit:247248| | base | boost |249|---|---:|---:|250| refute rate | 61.0% | **73.4%** (+12.4 pp, 95% CI [+5.5, +19.3]) |251| upheld-recall (true claims recognised) | 61.1% | **43.5%** |252| accuracy | 70.8% | 67.7% |253254Within those six seats the refute rate rose in all six and upheld-recall fell in five. **Replicated255on two further vendors afterwards, the direction holds for the population but not for every seat:256the sign test is 7 of 8 (p = 0.035), and Qwen is a measured counterexample at −8.5 pp.** Do not257write "every seat". The production default still flips OFF — the two seats that shipped it ON both258degrade — and since chairs already over-refute (rejecting true claims at a high rate is the measured259baseline failure), the boost makes the dominant error worse while buying nothing. One seat went to a26096% refute rate and recognised 4% of true claims. Detail: `references/benchmarks.md`.261262Operational rules (each one is a measured failure — the why is in references/pitfalls.md):263264- **Run in background with a full ~10 min timeout from the FIRST call.** Real reviews take265 5–15+ min at high effort; a foreground timeout kills them mid-probe.266- **Prefer a fresh session over resuming a timed-out one.** Long resumed chains hit context267 compaction — the reviewer's early careful reading gets lossy-summarized before the final,268 consequential step.269- **Never bare-resume.** `codex exec resume` silently resets model AND sandbox to the user's270 config.toml defaults. If you must resume (or want to switch models mid-session), re-pin271 everything:272 `codex exec resume -m <model> -c sandbox_mode="read-only" -c model_reasoning_effort=<tier> <session-id> -`273 Flags go BEFORE the positional session id. The key is `sandbox_mode` — `-c sandbox=...` is274 silently ignored, and there is no `-s` flag on resume. Cross-model resume retains context.275- **The reviewer is a full agent, not a chatbot** — read-only sandbox blocks file writes, not276 read commands or DB SELECTs. Everything it reviews goes to the second model's provider.277- **Watch progress live, don't wait blind — and monitor the right stream.** The contract (rule 9)278 makes the reviewer emit `STATUS:` one-liners as it works, and codex writes progressively — but279 the streams split (verified live): with `1> out 2> err`, the **final five blocks land on280 stdout** while the **streaming transcript (banner, STATUS lines, tool calls) goes to stderr**.281 Point a tail/monitor at stderr for progress + failure signatures; read stdout for the verdict.282 Caveat: PowerShell `1>`/`2>` redirects write UTF-16 — decode accordingly (or redirect through a283 UTF-8-forcing step) before grepping.284- **A blind round needs structural isolation, not an instruction.** When the round must be285 unprimed (a blind eval, a framing-critical blind-first pass per request-template), run the286 reviewer in a clean directory with auto-rules bridging OFF (`-NoAutoRules` / `NO_AUTO_RULES=1`):287 a model carrying project context and told to "answer from the packet alone" measurably still288 uses that context (pitfalls #16–17).289290## Ratification protocol (the calling session's job)291292The reviewer returns five blocks: `PROBE / ALT / CAVEAT / VERDICT-PROPOSAL / PHASE-LOG`.293Before relaying or acting:2942951. **Read the actual probe** (the query/commands), not just the prose summary.2962. **Extremal results are a tripwire**: 0% or 100% on a first attempt usually means a wrong297 join key, wrong scope, or wrong table — not a discovery. Verify the probe's load-bearing298 step yourself before accepting it.2993. **Scope-check disagreements**: two probes can both be factually right at different scopes300 (one table vs DB-wide, one source vs all sources). Name the scope before comparing numbers.3014. **Distinguish refuted / stale / incomplete.** "The numbers differ today" does not mean the302 claim was wrong when written — check history/timestamps before saying "refuted".3035. **Read ALT before you read the verdict, and check its discriminator.** The block carries the304 strongest reading the reviewer rejected plus the observation that killed it. Two failure modes305 to catch: a **strawman** rival (weak, easily dismissed — the reviewer optimised for a clean306 verdict, so treat the round as having attempted no alternative at all), and a **missing307 discriminator** (the separation is argued rather than observed — then the reviewer preferred308 rather than verified, and the tag caps at `[C]` however confident the sentence sounds).309 ⚠ **In practice the discriminator is almost never missing — it is manufactured.** Measured over310 315 refutations, the honest "nothing separated them" escape was taken **once**, and some of the311 invented separations were fabricated experimental results, cited to refute claims that were312 TRUE. So the check that pays is not "is there a discriminator?" but **"can I follow its quote313 back to the input the reviewer was given?"** If the observation is not in that material, the314 refutation is worth nothing however specific it sounds.315 ⚠ **Weight this most when the proposal is `[X]`.** Chairs measurably over-refute — they reject316 true claims at a substantial rate, and some true claims get refuted by every chair317 independently — so on a refutation the rejected alternative is disproportionately likely to be318 the correct one. It is the cheapest available substitute for adding another model family.3196. Assign the final verdict tag yourself: `[V-code]` (verified vs source, cite file:line) /320 `[V-db]` (read-only query, cite it) / `[V-probe]` (re-runnable script) / `[C]` (unverified) /321 `[X]` (refuted — name what supersedes it). The proposal is input, not the answer.3227. **Weigh agreement by lineage.** Same-family confirmation (a Claude chair agreeing with a323 Claude orchestrator) is weak evidence — same-lineage chairs measurably share wrong answers,324 down to independently producing the identical wrong inference. A cross-family confirmation325 or refutation outweighs any count of same-lineage votes; never settle a dispute by majority326 across chairs that share a lineage. Two further families are available as experimental opt-in327 seats — Moonshot (kimi) and xAI (grok) — and an extra seat buys nothing unless it is328 *independent*, so weigh by family, not by headcount; note that a unanimous panel may simply mean329 the item was easy (references/benchmarks.md). **Weigh a dissent by lineage, never by stated confidence** —330 measured, seats differ enormously in how much doubt they express (codex 99.7 mean vs grok 70.9331 on items they got right), so a confident vote and a hedged one are not comparable quantities.332333## The concilium loop (iterative rounds)334335A single review pass is often enough. But when the reviewer's probe has a gap, or you (the336orchestrator) disagree with the proposal on defensible grounds, one exchange isn't a *concilium*337— a council deliberates. The loop runs review rounds until the verdict converges or the dispute338is proven genuine. **This loop is orchestrated by you, the calling Claude session — it is a339protocol, not a script** (the ratification step is your judgment; nothing can automate it).340341Each round:3421. Run a review (the wrapper) → get the five blocks → **ratify** per the protocol above.3432. Decide the round's outcome and act:344345| Outcome | Condition | Action |346|---|---|---|347| **Converged** | You verified the probe's load-bearing step and it holds | STOP — emit the final tag. |348| **Dispute** | The probe has a gap, wrong scope, or you have a specific, *evidence-backed* objection | Write this round's PROBE **and ALT** + your objection to a rounds file; run the next round with `-PriorRounds`/`PRIOR_ROUNDS` pointing at it. Carrying ALT forward stops the next round re-rejecting the same near-miss without knowing it was already the runner-up. |349| **Dry** | A round adds no new checkable evidence — the reviewer re-asserts, or says (in CAVEAT) it has no new path | STOP — escalate to the owner as `[C]`/`[POLICY]` with the open question **and the surviving ALT**. A dry round means the rivals were never separated, so the strongest one is the substance of what you are handing over. This is the anti-oscillation guard. |350| **Cap** | Round limit reached (default **3**) without converging | STOP — present the state and escalate; a real dispute is a finding, not a failure. |351352Design rules (they follow directly from the pitfalls):353354- **Fresh session per round — never a resume chain.** The loop is exactly the "long chain"355 that pitfall #3 warns about; carry context forward via the `-PriorRounds` file, not356 `codex exec resume`. Each round starts clean and sees only a compact summary of what was357 already tried.358- **Every round must add a NEW evidence path.** The contract (rule 8) enforces this on the359 reviewer side; you enforce it on yours — an objection is only worth a round if it's backed by360 evidence or points at a concrete, checkable gap. "I'm not convinced" is not a round.361- **Ratifier stays fixed (you / Fable); the reviewer can drop tiers as the dispute narrows.**362 Round 1 on the research tier; once it's down to a mechanical check, run later rounds363 `-Mechanical`. Each round is a real 5–15 min codex call — the cap and the dry-stop are cost364 controls, not just correctness ones.365- **Keep the rounds file in durable project storage** (not a session temp dir), so the whole366 deliberation is auditable and the final PHASE-LOG can cite it.367368Trigger it when the user asks to "loop", "iterate", "keep going until it's resolved", "have them369hash it out", or when a first pass comes back disputed and the stakes justify another round.370371## Project adaptation372373### The reviewer sees AGENTS.md, not CLAUDE.md — mind the gap374375codex auto-loads **`AGENTS.md`** (from the working directory upward), the same way Claude Code376auto-loads **`CLAUDE.md`**. They are different files: a project with only a `CLAUDE.md` gives the377reviewer *none* of the ground rules Claude has — it reviews half-blind. Three ways to close it,378in order of durability:3793801. **Best (project-level): make `AGENTS.md` exist.** Mirror your `CLAUDE.md` into an `AGENTS.md`381 (or make `AGENTS.md` a short pointer to it), and keep them synced. This helps *all* codex382 usage, not just this skill, and is codex's own supported convention.3832. **Automatic (built into the codex wrappers): CLAUDE.md bridging.** When no `AGENTS.md` is384 present, the wrapper auto-injects the project's `CLAUDE.md` (root or `.claude/CLAUDE.md`) into385 the contract and prints a notice, so the reviewer isn't missing rules. Disable with386 `-NoAutoRules` / `NO_AUTO_RULES=1` (e.g. a huge, mostly-workflow CLAUDE.md you don't want in387 every review). **The kimi wrapper inverts this** — bridging is off unless you pass388 `-AutoRules`, because the injection breaks that seat (pitfalls #18); use option 3 there.3893. **Curated (explicit): `-ProjectRules <file>`.** Point at a short, hand-picked extract of the390 safety-critical rules — this *overrides* auto-bridging. Best for large instruction files where391 only a slice is relevant to review (invariants, "never touch X", schema quirks).392393If you keep both files but let them drift, the reviewer sees the `AGENTS.md` version — sync them.394395### Other adaptation396- If the project keeps a claims ledger, the PHASE-LOG block is a ready-to-paste line397 (`Phase N — <reviewer>(<model>) — <date> — <found> [proposed]`); append it only via the398 project's own hygiene rules (typically: owner or main session, append-only). No ledger → drop399 the block.400- Storage: keep probe outputs and frozen samples in a durable project location, never in401 session-scoped temp dirs (they die with the session).402403## References404405- `references/request-template.md` — how to construct the REQUEST you hand in (your side, not the406 reviewer's): confidence-tag facts (never "do not re-derive" over a conclusion), always mount the407 repo/DB, license rejecting the frame, and run a blind-first pass for framing-critical rounds. Read408 before writing any non-trivial request.409- `references/contract.md` — the review contract the wrappers send (edit it there; both scripts410 load it at runtime).411- `references/pitfalls.md` — known issues and the rules that counter them (read when a rule412 seems overcautious, or when debugging reviewer misbehavior).413- `references/setup.md` — first-time installation, authentication and calibration bootstrap.414- `references/benchmarks.md` — head-to-head model selection, panel benchmarking methods and the415 measured results behind the defaults.416- `references/maintenance.md` — public documentation, example and release-note sanitization.417- `references/kimi-seat.md` / `references/grok-seat.md` — the two experimental extra-family seats:418 transports, measured limits, and what each one's testing produced for the skill as a whole.