The math behind the validation

On this page

In plain language. The benchmark’s credibility rests on a handful of numbers: how well the AI judge agrees with a human expert, how reliably a scanner catches directional errors, and (soon) how much a model is reasoning versus reciting. This page defines each of those statistics exactly as the code computes them, says what counts as a good value, and reports where the project stands today. Nothing here is decorative — every formula maps to a function you can read in the repository.

How to read this page

Each statistic below is tagged with the validation step it serves and whether it is computed (a number exists today) or planned (the instrument is built, the run is pending). Symbols are defined immediately under each formula.


1. Spearman’s rank correlation — ρ

The code computes ρ as the Pearson correlation of the average ranks, which handles ties correctly:

ρ=i=1n(RiRˉ)(SiSˉ)i=1n(RiRˉ)2  i=1n(SiSˉ)2\rho = \frac{\sum_{i=1}^{n} (R_i - \bar{R})(S_i - \bar{S})} {\sqrt{\sum_{i=1}^{n} (R_i - \bar{R})^2}\;\sqrt{\sum_{i=1}^{n} (S_i - \bar{S})^2}}

Reading guide: ρ0.7\rho \ge 0.7 rank order agrees · 0.4ρ<0.70.4 \le \rho < 0.7 partial · ρ<0.4\rho < 0.4 disagreement on ordering.

Current values (n = 12): against the v0.2 judge prompt, core total ρ=0.770\rho = 0.770 (passes); sign/directionality ρ=0.838\rho = 0.838 (best-ranked dimension). Against the hardened v0.3.1 judge prompt (2026-07-09), core total ρ=0.421\rho = 0.421 — the drop is driven entirely by the only two scores that moved, one of them the identity check firing on an answer the SME had accepted as a deliberate illustration (see §3 and the judge hardening writeup). At n = 12, both values are small-sample estimates.


2. Cohen’s quadratic-weighted kappa — κ

Define the disagreement weights, the observed agreement matrix, and the chance-expected matrix:

wij=(ij)2(K1)2Eij=OiOjnw_{ij} = \frac{(i - j)^2}{(K - 1)^2} \qquad E_{ij} = \frac{O_{i\bullet}\, O_{\bullet j}}{n} κ=1i,jwijOiji,jwijEij\kappa = 1 - \frac{\sum_{i,j} w_{ij}\, O_{ij}}{\sum_{i,j} w_{ij}\, E_{ij}}

Reading guide: κ0.6\kappa \ge 0.6 substantial · 0.4κ<0.60.4 \le \kappa < 0.6 moderate · κ<0.4\kappa < 0.4 weak.

Current values (n = 12): against the v0.2 judge prompt, core total κ=0.390\kappa = 0.390 (weak); sign/directionality κ=0.733\kappa = 0.733 (substantial); causal reasoning κ=0.000\kappa = 0.000. Against the v0.3.1 prompt, core total κ=0.177\kappa = 0.177 — same two moved scores as the ρ drop above; the causal-reasoning κ=0\kappa = 0 persists unchanged.


3. Planted-error detection rate

For a single case, let sdctrls^{\text{ctrl}}_{d} be the judge’s score on the clean reference and sddefs^{\text{def}}_{d} its score on the defective answer, both on the targeted dimension dd. Detection is the indicator:

detected=1 ⁣[sddef<sdctrl]\text{detected} = \mathbf{1}\!\left[\, s^{\text{def}}_{d} < s^{\text{ctrl}}_{d} \,\right]

The detection rate for a defect type tt (e.g. self_contradiction) over its set of cases CtC_t is:

rate(t)=1CtcCt1 ⁣[sd(c)def<sd(c)ctrl]\text{rate}(t) = \frac{1}{|C_t|} \sum_{c \in C_t} \mathbf{1}\!\left[\, s^{\text{def}}_{d(c)} < s^{\text{ctrl}}_{d(c)} \,\right]

Current values (n = 28, v0.3.1 prompt, run 2026-07-09): all 18 non-cousin cases (sign flips, self-contradictions including subtle distributed ones, fabricated confidence, dropped edge cases) are caught at 1.001.00 by both judges under the v0.2 prompt and stay near-perfect after hardening (two stable single-case Opus regressions, both caught by the second judge — panel detection 28/28). The historically weak cell was cousin-product mis-attribution (correct mechanics under a one-feature-off product name, e.g. autocall mechanics called a barrier reverse convertible): Opus 5/105/10, GPT-5.4 8/108/10 under the v0.2 prompt. The v0.3.1 judge prompt adds a mandatory product-identity check (both products named, an auditable product_identity_match flag, a deterministic factual-accuracy cap), raising cousin detection to Opus 9/109/10, GPT-5.4 10/1010/10. Original 21-case writeup: planted-error judge validation; hardening and 28-case re-run: judge hardening v0.3.


4. Precision, recall, and F₁ — FM3 scanner

P=TPTP+FPR=TPTP+FNF1=2PRP+R=2TP2TP+FP+FNP = \frac{TP}{TP + FP} \qquad R = \frac{TP}{TP + FN} \qquad F_1 = \frac{2PR}{P + R} = \frac{2\,TP}{2\,TP + FP + FN}

Current values (n = 12): TP=3, FP=4, FN=1, TN=4P=0.429, R=0.750, F1=0.545TP = 3,\ FP = 4,\ FN = 1,\ TN = 4 \Rightarrow P = 0.429,\ R = 0.750,\ F_1 = 0.545.


5. Memorization index — contamination audit

For an (original, twin) pair and a given model:

MI=score(original)score(twin)\text{MI} = \text{score}(\text{original}) - \text{score}(\text{twin})

Aggregated per model and per domain, the distribution of MI flags any domain where the canonical answers may be contaminated by training data.

Current values (n = 12 twins, claude-sonnet-4-6, run 2026-06-13): mean MI =+0.50= +0.50/8 with 6/12 twins at exactly 00 — no contamination signature. The residual positive signal concentrates in FM3 directional flips (skew +5+5, issuer vega-sign +4+4, correlation +3+3), and one negative MI (4-4) shows MI conflates contamination with intrinsic difficulty asymmetry — so the twin set doubles as an FM3-robustness probe, while the fictional-entity canary stays the cleaner pure-contamination test. Full writeup: docs/analysis/2026-06-13-contamination-audit.md.


6. Retry backoff — judge robustness

The delay before retry attempt kk (zero-indexed) is:

Δk=2k seconds1s, 2s, 4s, \Delta_k = 2^{k}\ \text{seconds} \quad\Rightarrow\quad 1\text{s},\ 2\text{s},\ 4\text{s},\ \ldots

After max_retries\text{max\_retries} exhausted attempts the score is flagged errored = true and dropped from every aggregate — so it can never masquerade as a real zero in ρ\rho or κ\kappa.