secret storage, evolution throughput, predictions, enrichment, fairness,
lineage, crash ratings, cron model, core capture, replay pruning
Critical fixes:
- R2 write budget: replaced Worker cron index rebuilder (was ~1.6M
writes/mo, over 1M limit) with Rackspace index builder that deploys
to Pages every ~90 min (500 builds/mo). R2 now only for replays,
match metadata, and evolution live status (~44K writes/mo).
- D1 schema consolidated: all 13 tables in one place (§8.3), including
predictions, map_votes, replay_feedback, series, series_games, seasons
- Protocol schema examples updated with notes about future additive
fields (season_id, terrain, debug) per backward compatibility rules
High fixes:
- Shared secret storage: removed self-contradicting draft note, clean
statement of AES-256-GCM approach
- Predictions: changed predicted_winner INTEGER to predicted_bot_id TEXT
(tied to bot identity, not random player slot)
Medium fixes:
- Evolution throughput: configurable ladder/evolution ratio (70/30
default), container exits after 4h for Kubernetes redeploy
- Test harnesses added: game engine, bot protocol, evolution validation
- Enrichment: coding agent on Rackspace generates markdown play-by-play
- Map fairness: sample increased from 20 to 80 matches (~2% false
positive vs ~15%)
- Bot lineage: parent_ids TEXT column added to bots table
- Crash/timeout matches explicitly affect Glicko-2 ratings
- "Undefended core" defined at Phase CAPTURE
- Replay pruning: age-based 90-day, weekly Rackspace job, exemptions
for playlists/rivalries/series/seasons, acb-replay-pruner container
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>