Calibrating arena
Calibrating arena
Method
This is not a star-rating site. Averages are anchored to whoever votes first, they cannot be compared across items with different vote counts, and they are trivially stuffed. Everything here is pairwise comparison with a statistical model on top, and the model is written down below because being legible about the method is the only credibility a ranking site has.
The server picks the pair, not your browser. It writes a ballot row, signs a token over the ballot id, the axis, your session and a five-minute expiry, and only accepts a vote carrying that signature. Each ballot is single-use: replaying one returns a conflict, never a second vote. Votes are append-only — there is no code path that edits or deletes one, and the database raises an exception if anything tries. Corrections happen by recording an invalidation and refitting.
The number that moves the moment you click. Expected score for A against B, then the update:
E_a = 1 / (1 + 10^((R_b − R_a) / 400))
R_a' = R_a + K · (S_a − E_a)
S_a is 1 for a win, 0.5 for a tie, 0 for a loss. K is 40 below thirty votes, 24 below a hundred, 16 after that, so a rating settles as its record firms up.
Elo is order dependent: the same votes arriving in a different sequence give different ratings. That is fine for a number that animates and unacceptable for a ranking, so Elo never decides the leaderboard.
The model says each robot has a strength π, and
P(i beats j) = π_i / (π_i + π_j)
We fit π by maximum likelihood using the MM algorithm, iterating until no log-strength moves by more than 1e-6, capped at five hundred passes:
π_i ← W_i / Σ_(j≠i) [ n_ij / (π_i + π_j) ]
W_i is i's win count with ties worth half to each side, and n_ij is the number of games between i and j. Every robot also gets one virtual win and one virtual loss against a phantom opponent of exactly average strength. Without that, a robot who is three-and-zero has a maximum likelihood estimate at infinity. Finally we normalise so the log-strengths sum to zero and map onto a familiar scale:
score = 1500 + 400 · log₁₀(π)
Because it is a fit rather than a running tally, the result does not depend on the order the votes arrived in. Shuffle the entire log and you get the same board.
For each axis we resample the vote log with replacement a hundred times, refit every resample, and take the 2.5th and 97.5th percentiles of each robot's score. That is the bar you see on the leaderboard. The resampling is seeded from the vote log itself, never from the clock, so the same votes always produce the same interval.
The board sorts by the left edge of the bar, not by the rating. A robot with two votes and a perfect record has a rating near the top and almost no evidence behind it; sorting by the lower bound puts it where its evidence puts it. This one decision is the difference between a ranking and a novelty.
Below twelve votes a bar is drawn dashed. At that point the prior is doing most of the work and the interval describes our estimate more than it describes the robot.
Three quarters of the time we pick a robot whose interval is still wide and find it an opponent within a hundred and fifty points, because a matchup whose outcome is already obvious teaches us nothing. One vote in twenty goes to the least-voted robots. The remaining fifth is uniformly random, and that arm is not optional: a sampler that only exploits splits the comparison graph into clusters that never meet, and Bradley-Terry silently stops being comparable between them while the board carries on looking confident. We measure connectivity on every refit.
| axis | votes | components | largest |
|---|---|---|---|
| cool | 9 | 61 | 4/70 |
| gait | 0 | 70 | 0/70 |
| job | 0 | 70 | 0/70 |
| laundry | 0 | 70 | 0/70 |
| ship | 0 | 70 | 0/70 |
| survive | 0 | 70 | 0/70 |
| trust_knife | 0 | 70 | 0/70 |
Every specification on this site carries a source URL, a source name and the date it was retrieved. A figure without a citation fails validation and fails the build, so a robot with an empty spec table is a robot whose numbers we could not trace — not one nobody got around to. Fictional entries cite canon, labelled as canon, which is a real citation to a real published source and is not a measurement. No language model writes a number here: if one writes the descriptive line, the output is rejected when it contains any numeral absent from the sourced facts.
Every roster entry has a sourced image selected for a clear, identifiable view of the robot. Each source, owner credit and rights statement is recorded before the image is admitted to the roster. The site serves checked-in AVIF and WebP derivatives at two sizes, so voting does not hotlink a third-party server or transform images at request time. If you own an image and want it removed, the takedown link below is the direct route.
There are no accounts and no behavioural analytics. The site sets one anonymous, http-only session cookie so a ballot belongs to the browser that received it. Rate limits use a salted daily hash of the network address; the address itself is never stored.