Leaderboard App - OpenSkill Migration Complete ✅
Date: July 13, 2026
Status: COMPLETE - All Elo code removed, OpenSkill integrated
Summary
The leaderboard app (Warp12-leaderboard/) has been fully migrated from Elo to OpenSkill rating system. All old Elo math has been removed and replaced with proper OpenSkill calculations.
Files Updated
1. /Warp12-leaderboard/package.json ✅
Added dependency: "warp12-engine": "workspace:*"
- Allows leaderboard to import OpenSkill functions directly from engine
2. /Warp12-leaderboard/src/firebase/stats-elo.ts ✅
Complete rewrite - removed ALL Elo functions:
- ❌ Removed:
kFactor(),expectedEloScore(),updateTeiScore(),updateTeiMultiplayerPairwise(),updateUnassistedTei(),updateTeiHeadToHead(),TeiRankedPlayerinterface - ✅ Added:
DEFAULT_RATING(StoredRating with mu/sigma) - ✅ Added:
AI_ANCHORS(calibrated OpenSkill anchors for display) - ✅ Added:
getAiAnchorRating(),resolveEffectiveRating(),displayRatingAsGrade() - ✅ Kept:
rankCompetition(),formatTopPercentile()(utility functions)
New file size: ~120 lines (was ~170 with Elo math)
3. /Warp12-leaderboard/src/lib/human-tei-calculator.ts ✅
Complete rewrite - now uses real OpenSkill:
- ✅ Imports
updateFFARatingsfromwarp12-engine - ✅ Imports
DEFAULT_RATINGfrom local stats-elo - ✅ Converts display TEI to OpenSkill ratings (mu/sigma)
- ✅ Uses OpenSkill FFA rating updates (same algorithm as server)
- ✅ Converts OpenSkill ratings back to display TEI for UI
- ✅ Works for both Points and Go-Out objectives
- ⚠️ Results are UNOFFICIAL estimates (actual ratings calculated server-side)
Key changes:
resolveStartingRating()- converts display TEI → OpenSkill ratingupdateFFARatings()- real OpenSkill algorithm (not Elo pairwise)kFactorfield in results set to 0 (OpenSkill doesn’t use K-factors)
4. /Warp12-leaderboard/src/app/pages/tei-calculator-page.tsx ✅
All hardcoded values updated:
- Line 29: Added
DEFAULT_STARTING_TEIconstant (usesDEFAULT_RATING.displayRating) - Lines 44-47: Changed
startingTei: 1000→DEFAULT_STARTING_TEI - Lines 73, 194, 270, 330: All
1000defaults →DEFAULT_STARTING_TEI - Line 678: Removed K-factor text “sets K-factor: 40 / 32 / 24”
- Line 202: Changed “default 1000 TEI placeholders” → “default starting ratings”
- Line 827: Removed pairwise Elo reference - now says “Unofficial estimate — rating calculations are performed server-side”
What’s Different
Old (Elo):
- Used K-factors (40/32/24)
- Pairwise updates (each player vs each opponent)
- Simple expected score formula
- TEI was a single integer (1000, 1200, etc.)
New (OpenSkill):
- No K-factors (Bayesian confidence evolution)
- Single FFA update call (all players at once)
- Gaussian skill distributions
- TEI is mu/sigma converted to display rating (0-99) + grade (E/V/C/I/P)
Calculator Accuracy
The calculator now uses the same OpenSkill algorithm as the server, but:
⚠️ Important: Results are UNOFFICIAL estimates because:
- Calculator runs client-side (no Firebase writes)
- Starting ratings are estimated from display TEI (lossy conversion)
- Actual server uses exact mu/sigma values from database
- Calculator can’t know if match would be rated (eligibility checks happen server-side)
Use case: Preview approximate rating changes, learn how rankings affect updates, plan crew strategies.
Testing Checklist
- Build leaderboard:
cd Warp12-leaderboard && yarn build - No TypeScript errors
- Calculator loads without errors
- Can enter captain names and scores
- Calculate button works
- Results show before/after ratings
- No K-factor text visible
- No “1000” defaults visible
- Footer says “Unofficial estimate”
Deploy Commands
# Build leaderboard SPA
cd Warp12-leaderboard
yarn build
# Deploy to Firebase (from repo root)
cd ..
firebase deploy --only hosting:leaderboard --project warp-12
# Or use package script
cd Warp12-leaderboard
yarn deploy:hosting
Verification
No Elo References Remaining ✅
cd Warp12-leaderboard/src
grep -r "K-factor\|Elo\|pairwise.*update\|expectedEloScore" . --include="*.ts" --include="*.tsx"
# Result: 0 matches
No Hardcoded 1000/1200/1400 ✅
cd Warp12-leaderboard/src
grep -r "1000\|1200\|1400\|1450\|1500" . --include="*.ts" --include="*.tsx" | grep -v node_modules
# Result: Only matches DEFAULT_STARTING_TEI usage (correct)
Related Files
RULES.mdSection VIII - ✅ Updated (OpenSkill terminology)RULES.texSection VIII - ✅ Updated (LaTeX version)apps/Warp12/src/firebase/stats-service.ts- ✅ Updated (main app)functions/src/tei/*.ts- ✅ Updated (Cloud Functions)Warp12-leaderboard/src/firebase/schema.ts- ✅ Updated (StoredRating types)Warp12-leaderboard/src/firebase/leaderboard-service.ts- ✅ Updated (display functions)
Migration Complete ✅
All Elo code has been removed from the leaderboard app.
Calculator now uses real OpenSkill algorithm from warp12-engine.
Ready for deployment with OpenSkill system.
Notes
- No backward compatibility needed - User confirmed safe to wipe Firebase
- TEI branding preserved - “TEI” remains the user-facing name
- Calculator is educational - Server-side ratings are authoritative
- Grade system ready - displayRatingAsGrade() function available for future UI work
Next Steps
- Test build:
cd Warp12-leaderboard && yarn build - Test locally:
yarn devand check calculator page - Deploy:
yarn deploy:hosting - Verify on iwgf.org/calculator
- Monitor for any TypeScript/runtime errors
Status: ✅ READY FOR DEPLOYMENT