2.0.5
What's Changed
A maintenance release — performance, correctness, and convention fixes under the hood. No user-facing feature changes.
Fixed
- Leaderboard totals can no longer be corrupted by a race. When two score updates for the same user ran at the same time, both could insert a duplicate all-time score row (the all-time scope isn't covered by the unique index, since SQL treats
NULL != NULL). Score writes are now serialized per user and scope, so the duplicate can't happen.
Performance
- Live scoring marks a game's picks correct/incorrect in two batched database updates instead of one update per pick — a popular game with hundreds of picks no longer fires hundreds of separate writes.
- Admin test-data seeding loads existing picks in a single query instead of one existence check per user-per-game (which previously ran tens of thousands of queries and could time out on a real data set).
- ESPN score sync now goes through the shared Guzzle HTTP client (honouring the host's proxy/SSL config) instead of a raw curl handle.
Internal
- Migrations now use Flarum's
createTableIfNotExists()/addColumns()helpers consistently. - Removed redundant manual
wasRecentlyCreatedbookkeeping in the schedule sync, relying on Eloquent's own value.