This is the step most teams skip, and it is the decision rule that makes the gate more than a vibe check. A 1-point difference on 100 examples is not automatically real. If 92 and 91 out of 100 users get the same answer, the difference could easily be sampling noise.
Use a simple significance test on the paired results. For pass/fail per example, a paired comparison over the same examples is right: count the cases where the candidate wins and where the incumbent wins, and only the cases where they disagree matter. A rough 95% confidence interval on the difference of two proportions (with n around 100) is about plus or minus 10 percentage points at worst, and tighter near the middle of the range. That is why a 1-point gap is not by itself proof, and why the gate asks two questions:
- Is the candidate within tolerance on every subset? (Within 1 pp on critical subsets, within a wider band on non-critical.)
- Is the observed gap distinguishable from noise at 95% confidence, or is the candidate actually better?
The rule that makes sense in practice: do not switch if the candidate is worse than the incumbent by more than the tolerance on any critical subset, even if the overall numbers look close. If the candidate is indistinguishable from the incumbent, treat that as acceptable only when cost savings are meaningful and you plan a canary. If the candidate is better, switch. The point is to refuse the swap when the evidence does not support it, not to demand statistical purity every time.
A small script for the paired test:
# Only disagreements matter for a paired sign test.
def sign_test(candidate_scores, incumbent_scores):
wins = sum(c > i for c, i in zip(candidate_scores, incumbent_scores))
losses = sum(c < i for c, i in zip(candidate_scores, incumbent_scores))
n = wins + losses
# Rough two-sided 95% interval on the win rate.
p = wins / n if n else 0.5
margin = 1.96 * (p * (1 - p) / n) ** 0.5 if n else 0
return p - margin, p + margin # interval around the win share
If the interval straddles 0.5, the cheaper model is not clearly better or worse; combine that with the subset check to decide.