Dependency: READY — start now. No blockers. Genuinely low priority until #160 raises match volume, since the storage growth this bounds is proportional to scrim traffic.
Every match writes a compressed FileRecord (replays, submissions) with no cleanup path. LocalStorageService has deleteRecord/deletePhysicalFile helpers but nothing calls them on a schedule or age threshold — confirmed via search, the only two @Scheduled jobs in the codebase (StaleGameMatchRescheduler, ScheduledMatchMaker) are unrelated to file lifecycle.
Add a retention policy (age-based or count-based) and a scheduled job to enforce it, to bound storage growth as match volume increases (relevant once server-side scrimmage, #160, increases match volume significantly).
Every match writes a compressed
FileRecord(replays, submissions) with no cleanup path.LocalStorageServicehasdeleteRecord/deletePhysicalFilehelpers but nothing calls them on a schedule or age threshold — confirmed via search, the only two@Scheduledjobs in the codebase (StaleGameMatchRescheduler,ScheduledMatchMaker) are unrelated to file lifecycle.Add a retention policy (age-based or count-based) and a scheduled job to enforce it, to bound storage growth as match volume increases (relevant once server-side scrimmage, #160, increases match volume significantly).