Judge Protocol (pairwise duels)
Author: Simon-Pierre Boucher — contact@spboucher.ai
Open-ended domains (writing, safety_refusal_quality) are ranked by pairwise duels judged by
LLMs, feeding a Bradley-Terry model.
Rules
- ≥2 judge models from different providers per duel (configured via the
JUDGE_MODELSenv var — validated at runtime; never hardcoded). - No self-judging: a model never judges a duel it participates in.
- Position swap: judges see the two responses in opposite orders; the swap is recorded on every verdict row.
- Style-length guard: the judge prompt explicitly forbids rewarding verbosity or style over substance. Length-bias correlation is computed on published runs.
- Transparency: judge agreement rate and position-bias rate are stored in the run's
fit_diagnosticsand published on the methodology dashboard. - Verdicts are
1,2, orTIE(unparseable verdicts count as ties, conservatively).
The exact comparison prompt lives in apps/worker/src/judges/config.ts (judgePrompt) and is
public. Grading rubrics for scored items are never public — but duel judging is rubric-free by
design, so nothing secret ships to judges.
Aggregation
Ties are encoded as half-wins. Bradley-Terry strengths are fitted with an MM algorithm with light
damping (apps/psychometrics/llmindex_psycho/bt.py), log-strengths standardized to a θ-like scale
(btStrengthToTheta in packages/scoring), then rescaled like any other domain score.