← All projects
In build

Crux

Two agents argue a decision in isolation. A third names the one fact that would end the disagreement — or admits it can't yet.

BuiltAug 2026
RoleSole developer
Live runs0, by design
StatusRepo public

What it does

Two agents — an optimist and a pessimist — build the strongest case they can for and against a decision, from the same evidence, without ever seeing each other's output. A mediator, on a different model family than the debaters, reads both and does one job: find the crux — the single unknown that, if resolved, would end the disagreement — and decide whether a verdict is even warranted yet.

Its opposite number is AgentDesk — same engineering discipline, aimed at the opposite kind of problem.

Why this isn't AgentDesk

AgentDesk is a linear pipeline for tasks where a ground truth exists — a claim in an outreach email either traces to a source URL or it doesn't, and the whole system is built around mechanically checking that trace. Crux is for the other kind of question: build our own system or buy one, take the offer or walk, sign the contract or don't. There's nothing to verify — only competing reasoning, and usually one fact nobody has looked up yet that both arguments quietly depend on.

Same spine, opposite shape. AgentDesk gates — pass or block, with a retry budget that runs out and escalates to a human. Crux never gates; it produces a decision aid, and it gets exactly one pass, no retries, because sending a weak position back for a stronger case would mean the system is coaching the debate rather than judging it. Where AgentDesk's hard check asks whether an email still reads as sendable with the company name redacted, Crux's asks whether one side argued more than 25% longer than the other — length reading as conviction is the bias a synthesizer falls into first.

How it's wired

  1. Parallel isolationThe optimist and pessimist get the byte-identical evidence pack and never see each other's output. A position that references an opponent it was never shown is rejected outright — the phantom-opponent check.
  2. Symmetry enforcementBoth sides get the identical word budget, recomputed in code and never trusted from the model's own count, plus a 1.25× length-ratio check that fires even when both individually fit the budget.
  3. Order randomizationWhich position is presented to the mediator first is randomized and the seed is logged, so any reading-order bias is auditable after the fact.
  4. ContractsEvery handoff — evidence pack, position, crux report — is a typed JSON schema. The mediator has no search tools and works only from the two positions and the pack.
  5. GateThe mediator must name a concrete primary_crux before any verdict, checked in code. A vague crux attached to a confident verdict is the averaging behavior this system exists to block.
  6. RecordEvery run's seed, presented-first order, and outcome is written to a run log.

Measured results

evals/run_eval.py scores 15 cases, each a named mutation of one baseline debate: 8 of 12 bad debates blocked before spending a single mediator call, at zero false positives. The four that escape the deterministic layer need real judgment, not arithmetic:

run_eval.py --live would add real mediator calls and measure whether the model catches those four. It hasn't been run — this project makes no API calls yet.

Known limits

What I'd do next