All posts
Wei LindqvistJudge, Calibration Cuprankingnormalizationz-scorebradley-terryborda

The problem with averages

Lenient judges inflate every project they touch; harsh judges sink theirs. A raw average confuses generosity with quality.

We calibrate per judge, per criterion: z = (s − μ_judge) / σ_judge, remapped into global scale as z × σ_global + μ_global. Constant scorers (σ = 0) fall back to raw and are flagged constant:true, excludable via /ranking?exclude_judge=.

Three more views, one verdict

Over the same scores the organizer endpoint computes Bradley-Terry latent strengths from per-judge pairwise comparisons (ties skipped, disconnected-graph warning) and Borda points with fractional ties.

The prize boundary (top-k, default 3) is ROBUST only when raw, calibrated, Bradley-Terry and Borda agree on the set above the line — otherwise FRAGILE with the disagreeing methods named. Both seeded demos flip: Food Rescue Route raw #2 → calibrated #5, Mural Mile raw #2 → calibrated #3.

Why organizers trust it

Math alone does not convince anyone. The progress dashboard, raw-vs-calibrated CSV columns, low_confidence flags on thinly reviewed projects and the duplicates list (second Solar Kiosk counted once) make the calibration inspectable.

Details and formulas: JUDGING.md. Reproduce: python demo-5min/seed_judging_demo.py and seed_grand_jury.py.

Run it yourself

Every post maps to a real route or file in this repo. Start with the gallery, then the docs.

Browse projectsMore posts

Keep reading

View all