fix: invalidate stale predicted_rating after PDGA cycle rollover (#29) #31

Merged
shcizo merged 2 commits from fix/invalidate-stale-predicted-rating-29 into main 2026-06-09 14:02:44 +02:00
Owner

Summary

  • Lägger till kolumnen predicted_calculated_at så vi kan spåra mot vilken cykel en cachad prediktion beräknades.
  • Ny helper getPreviousPDGAUpdateDate() returnerar senaste passerade andra-tisdagen; staleness-check i getPlayerDataFromDB returnerar null för predictedRating/stdDev/excludedRoundsCount/cutoffRating när cachen är från före senaste cykelbyte.
  • Skriver ingen ny prediktion och räknar inget om vid staleness — round_history kan vara lika gammal. UI visar tills nästa manuella refresh, vilket är en ärligare signal.
  • savePredictedRatingToDB är enda choke point för predicted_rating-skrivningar → defaultar predicted_calculated_at = new Date().toISOString() där, så både lazy-vägen och refresh-vägen täcks utan ändring på call sites.

Closes #29

Test plan

  • Servern startar och migration loggar Adding predicted_calculated_at column...
  • Befintliga spelare (timestamp = NULL i DB) visar i predicted-kolumnen tills refresh
  • Efter manuell refresh sätts timestamp och predicted visas igen
  • Aldrig-beräknade spelare (predicted_rating IS NULL): recompute körs och predicted bevaras i svaret (regression-check för bug fixad i c7fb4a7)
  • Listvy (/) och spelarprofil renderar utan crash
## Summary - Lägger till kolumnen `predicted_calculated_at` så vi kan spåra mot vilken cykel en cachad prediktion beräknades. - Ny helper `getPreviousPDGAUpdateDate()` returnerar senaste passerade andra-tisdagen; staleness-check i `getPlayerDataFromDB` returnerar `null` för `predictedRating`/`stdDev`/`excludedRoundsCount`/`cutoffRating` när cachen är från före senaste cykelbyte. - Skriver ingen ny prediktion och räknar inget om vid staleness — round_history kan vara lika gammal. UI visar `—` tills nästa manuella refresh, vilket är en ärligare signal. - `savePredictedRatingToDB` är enda choke point för predicted_rating-skrivningar → defaultar `predicted_calculated_at = new Date().toISOString()` där, så både lazy-vägen och refresh-vägen täcks utan ändring på call sites. Closes #29 ## Test plan - [ ] Servern startar och migration loggar `Adding predicted_calculated_at column...` - [ ] Befintliga spelare (timestamp = NULL i DB) visar `—` i predicted-kolumnen tills refresh - [ ] Efter manuell refresh sätts timestamp och predicted visas igen - [ ] Aldrig-beräknade spelare (predicted_rating IS NULL): recompute körs och predicted bevaras i svaret (regression-check för bug fixad i `c7fb4a7`) - [ ] Listvy (`/`) och spelarprofil renderar utan crash
shcizo added 2 commits 2026-06-09 14:02:22 +02:00
Reviewer 1 flagged: staleness-check read predicted_calculated_at from
the original cachedPlayer snapshot even after recompute, so newly
calculated ratings (predicted_calculated_at = NULL in snapshot)
were immediately nulled by the staleness branch.

Fix: read predicted_calculated_at from updatedPlayer too.

Reviewer 2 nit: rename thisMonths → secondTuesday for consistency
with the original variable name in getNextPDGAUpdateDate.
shcizo merged commit 6f3e33a5ea into main 2026-06-09 14:02:44 +02:00
Sign in to join this conversation.