90 days == 3 calendar months exactly in March/April, causing
TestThreeMonthAgeCheck to fail. The intent is >= 3 months old.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Implements the full map lifecycle audit as a hourly ticker in the
matchmaker:
1. updateMapFairnessStats: recompute per-slot win counts from completed
matches into the map_fairness table
2. flagUnfairMaps: flag maps where any slot deviates >10pp from expected
(1/N) across 80+ matches → status='probation'
3. retireDislikedMaps: force-retire maps with >20 net negative votes
4. pruneLowEngagementMaps: monthly bottom-10% engagement prune per tier
5. promoteClassicMaps: top-5 all-time engagement, 3+ months → 'classic'
Matchmaker already filters retired maps and gives probation maps 50%
reduced selection probability in selectMapLRU.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>