RANK SIGNAL · METHODOLOGY
The Bayesian method behind our rank-signal measurements
Rank Signal estimates how a single text feature changes an AI model's choice between two otherwise-identical passages. Each signal is a Beta-Binomial model with a Jeffreys prior, Beta(0.5, 0.5). The figure reported per signal is the posterior mean; the bar around it is the equal-tailed 95% credible interval, the 2.5th and 97.5th percentiles of the posterior, not a Wilson or Clopper-Pearson confidence interval. A signal's verdict is read from where that credible interval sits relative to 50%, the point at which the model has no preference between the two passages. The table below is an anonymized snapshot of 17 signals measured on Gemini 3.6 Flash across 3,206 paired decisions; the signal names are withheld.
Compute behind this sample: 3,973,582 input tokens and 984,371 output tokens across the runs that produced the data below.
One measurement
A single test shows the model two passages: one carrying the feature, one without it, identical in every other respect. The model picks the one it would use to answer, and a pick for the feature-carrying passage counts as a win. The side that carries the feature is alternated across tests so position cannot bias the result. Repeated over many independent passages, this gives w wins out of n trials.
The model
- Prior: Beta(0.5, 0.5), the Jeffreys prior for a proportion.
- Likelihood: Binomial, w wins in n independent trials.
- Posterior: Beta(w + 0.5, n − w + 0.5).
- Point estimate: the posterior mean, (w + 0.5) / (n + 1).
- Interval: the equal-tailed 95% credible interval, from the 2.5th to the 97.5th percentile of that posterior.
The decision rule
- Lower bound above 50%: confirmed positive, the feature helps.
- Upper bound below 50%: confirmed negative, the feature hurts.
- Interval still crossing 50% after 40 trials: no measurable effect.
No verdict is read before 20 trials. A second stage tests whether adding a positive feature flips a losing passage to a win against a competing passage; it requires at least 10 such tests and a flip rate of 30% or more. Every verdict in the table below is recomputed from the current data by this rule, so each row is consistent with its own interval.
Worked example
The strongest negative in the sample is S17: 6 wins in 185 trials. The posterior is Beta(6.5, 179.5), a mean of 3.5% and a 95% credible interval of [1.4%, 6.6%]. The whole interval lies about 43 points below the 50% line, so the verdict is confirmed negative.
The point estimate also shows the prior at work. A signal with 0 wins in 35 trials reports a posterior mean of (0 + 0.5) / (35 + 1) = 1.4%, not 0%. A raw win-rate would read a flat 0%; the small non-zero figure is the prior.
Sample data
17 signals measured on Gemini 3.6 Flash, pooled across all runs. Signal names are withheld. n is the number of paired decisions; the verdict is recomputed from the current interval by the rule above. The final column shows the second-stage competitor-flip test where it was run.
| Signal | Verdict | n | Wins | Posterior mean | 95% credible interval | Stage-2 flips |
|---|---|---|---|---|---|---|
| S01 | positive | 190 | 190 | 99.7% | [98.7%, 100.0%] | 14 / 14 |
| S02 | positive | 195 | 191 | 97.7% | [95.2%, 99.3%] | 17 / 17 |
| S03 | positive | 196 | 180 | 91.6% | [87.4%, 95.1%] | 17 / 17 |
| S04 | positive | 191 | 174 | 90.9% | [86.4%, 94.5%] | 14 / 14 |
| S05 | positive | 187 | 167 | 89.1% | [84.3%, 93.1%] | 14 / 14 |
| S06 | positive | 198 | 166 | 83.7% | [78.2%, 88.5%] | 16 / 16 |
| S07 | positive | 194 | 147 | 75.6% | [69.4%, 81.4%] | 14 / 14 |
| S08 | positive | 154 | 116 | 75.2% | [68.1%, 81.6%] | 14 / 14 |
| S09 | positive | 198 | 131 | 66.1% | [59.4%, 72.5%] | 14 / 14 |
| S10 | no effect | 191 | 98 | 51.3% | [44.2%, 58.3%] | 14 / 14 * |
| S11 | no effect | 195 | 96 | 49.2% | [42.3%, 56.2%] | — |
| S12 | no effect | 194 | 93 | 47.9% | [41.0%, 55.0%] | — |
| S13 | negative | 176 | 66 | 37.6% | [30.6%, 44.8%] | — |
| S14 | negative | 195 | 67 | 34.4% | [28.0%, 41.2%] | — |
| S15 | negative | 170 | 54 | 31.9% | [25.1%, 39.0%] | — |
| S16 | negative | 197 | 62 | 31.6% | [25.3%, 38.2%] | — |
| S17 | negative | 185 | 6 | 3.5% | [1.4%, 6.6%] | — |
* S10 passed the second-stage flip test (14 / 14) during an earlier run, but its first-stage interval has since drifted to cross 50% as more trials accumulated. Its current verdict is therefore no effect. It is shown as a boundary case rather than removed.
Reproduce it
Given w wins and n trials, the posterior mean and 95% credible interval are:
from scipy.stats import beta a, b = w + 0.5, n - w + 0.5 mean = a / (a + b) lo, hi = beta.ppf(0.025, a, b), beta.ppf(0.975, a, b)
The anonymized dataset behind the table:
[
{"signal":"S01","n":190,"wins":190,"verdict":"positive","mean":0.997,"ci":[0.987,1.000],"stage2":[14,14]},
{"signal":"S02","n":195,"wins":191,"verdict":"positive","mean":0.977,"ci":[0.952,0.993],"stage2":[17,17]},
{"signal":"S03","n":196,"wins":180,"verdict":"positive","mean":0.916,"ci":[0.874,0.951],"stage2":[17,17]},
{"signal":"S04","n":191,"wins":174,"verdict":"positive","mean":0.909,"ci":[0.864,0.945],"stage2":[14,14]},
{"signal":"S05","n":187,"wins":167,"verdict":"positive","mean":0.891,"ci":[0.843,0.931],"stage2":[14,14]},
{"signal":"S06","n":198,"wins":166,"verdict":"positive","mean":0.837,"ci":[0.782,0.885],"stage2":[16,16]},
{"signal":"S07","n":194,"wins":147,"verdict":"positive","mean":0.756,"ci":[0.694,0.814],"stage2":[14,14]},
{"signal":"S08","n":154,"wins":116,"verdict":"positive","mean":0.752,"ci":[0.681,0.816],"stage2":[14,14]},
{"signal":"S09","n":198,"wins":131,"verdict":"positive","mean":0.661,"ci":[0.594,0.725],"stage2":[14,14]},
{"signal":"S10","n":191,"wins":98,"verdict":"no_effect","mean":0.513,"ci":[0.442,0.583],"stage2":[14,14]},
{"signal":"S11","n":195,"wins":96,"verdict":"no_effect","mean":0.492,"ci":[0.423,0.562],"stage2":[0,0]},
{"signal":"S12","n":194,"wins":93,"verdict":"no_effect","mean":0.479,"ci":[0.410,0.550],"stage2":[0,0]},
{"signal":"S13","n":176,"wins":66,"verdict":"negative","mean":0.376,"ci":[0.306,0.448],"stage2":[0,0]},
{"signal":"S14","n":195,"wins":67,"verdict":"negative","mean":0.344,"ci":[0.280,0.412],"stage2":[0,0]},
{"signal":"S15","n":170,"wins":54,"verdict":"negative","mean":0.319,"ci":[0.251,0.390],"stage2":[0,0]},
{"signal":"S16","n":197,"wins":62,"verdict":"negative","mean":0.316,"ci":[0.253,0.382],"stage2":[0,0]},
{"signal":"S17","n":185,"wins":6,"verdict":"negative","mean":0.035,"ci":[0.014,0.066],"stage2":[0,0]}
]