- Added 'rating' column to players table
- Renamed old columns to _deprecated_*
- Created recalculate_ratings.rs tool to replay all matches
- Updated all queries and structs to use unified rating
- Match form now shows single rating per player
- API returns single rating field
Final ratings after recalculation:
- Andrew: 1538
- David: 1522
- Jacklyn: 1515
- Eliana: 1497
- Krzysztof: 1476
- Dane: 1449
- Email chart: single unified ELO chart instead of separate singles/doubles
- Email leaderboard: single unified leaderboard
- Removed duplicate top_doubles query (was identical to top_singles anyway)
- Charts: Single unified ELO chart instead of separate singles/doubles
- Match history: Shows individual player rating changes (not just team)
- About page: Full explanation of rating system with examples
- Nav: Added About link, shortened button text for mobile
- Cleaned up unused variables
- Created new ELO module (src/elo/) with:
- Simple rating-only system (no RD or volatility tracking)
- Standard ELO expected score calculation
- Per-point performance scoring
- Effective opponent formula for doubles
- Full test suite (21 tests, all passing)
- Updated main.rs to use ELO calculator:
- Per-point scoring: performance = points_scored / total_points
- Effective opponent in doubles: Opp1 + Opp2 - Teammate
- K-factor = 32 for casual play
- Created analysis tool (src/bin/elo_analysis.rs):
- Reads match history from database
- Recalculates all ratings using pure ELO
- Generates before/after comparison (JSON + Markdown)
- Updated documentation:
- New LaTeX report (rating-system-v3-elo.tex)
- Simplified explanations (no volatility/RD complexity)
- Plain English examples and use cases
- FAQ section
- All tests passing (21/21 ELO tests)
- Code compiles without errors
- Release build successful
Changed from: 'How Bad Am I, Actually? Building a Pickleball Rating System That Doesn't Lie'
New title: 'The Carry Problem: When Your Rating Doesn't Match Your Ego'
With subtitle: 'A Mathematically Principled Approach to Rating Pickleball Players
(And Finally Proving Whether Your Partner Is Holding You Back)'
RATIONALE:
- 'The Carry Problem' directly addresses v2's innovation (effective opponent formula)
- Funny and relatable without being mean-spirited
- Hooks both casual players and technical readers
- Self-deprecating sass matches the rec pickleball vibe
- More memorable than academic title
The rest of the document (intro, TL;DR, content) already had the right tone.
DOCUMENTATION ADDED:
1. docs/rating-system-v2.tex (681 lines, ~9,000 words)
- Complete technical report on system redesign
- Includes: introduction, mathematical foundation, v1 review
- Motivation for all 4 changes with detailed explanations
- Complete v2.0 formulas with clear notation
- Worked example: concrete doubles match (v1 vs v2)
- Discussion of advantages, edge cases, future work
- Professional typesetting for blog/website publication
- 36 subsections with table of contents
2. docs/README.md
- How to compile the LaTeX document
- File overview and contents summary
- Compilation instructions for macOS, Linux, Docker, Overleaf
- Publishing guidance (HTML conversion, blog extraction)
- Citation format for references
3. docs/FORMULAS.md
- Quick reference card for all formulas
- Match outcome calculation (singles & doubles)
- Effective opponent examples
- RD distribution formula with worked examples
- Expected point win probability table
- Parameter meanings and initial values
- Summary of v1 vs v2 changes
- FAQ section
STATUS: Ready for publication ✅
- LaTeX file is syntactically correct
- All formulas verified against code
- Example calculations match implementation
- Suitable for recreational audience + technical rigor
- Can be compiled to PDF or converted to HTML/blog format
- README.md: full project docs with features, API endpoints, Glicko-2 explanation
- main.rs: doc comments for all 18 HTTP handlers
- db/mod.rs: schema and migration documentation
- models/mod.rs: Player struct and Glicko-2 parameter docs
- Fixed route syntax (:id instead of {id}) for Axum 0.7 compatibility