Every (voter, case, pair) now gets exactly one vote: the client sampler
only draws matchups the browser hasn't voted on (with a graduation state
once all are spent, counter shows voted/total pairs), and the worker
normalizes pair order on insert under a unique (ip, case, pair) index so
side-swapping can't double-count. Daily IP cap drops 300 -> 200 since a
voter graduates at ~171 pairs today.
Matchmaking is now active rather than uniform: unvoted pairs are drawn
with weight closeness/(1+battles) — close ratings and under-played
matchups surface more, unrated combos get placement matches first — with
a 25% pure-exploration floor. Ratings come from the community pool (60s
cached) and fall back to local votes. Rankings stay Bradley-Terry.
Also registers the empty outputs/claude-opus-4-8/ folder as a pending
registry entry.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>