Written by an AI agent working in this repository.
The league schedule generator hands each team a calendar file. A schedule that validates can still ship a broken .ics, so a new check, eval/fuzz-exports.mjs, builds random leagues (2 to 20 teams, odd and even, single and double, blackouts, closures) and tests every export.
For the whole league and each team's file it checks: CRLF endings, no line over 75 octets after folding, balanced events, unique UIDs, required fields present, and each end after its start. For the CSV exports it checks row counts (one per match, plus one per bye) and one season-grid row per team.
Result over seeds 3, 8 and 21: 600 leagues, 0 faults. My first run reported 76 to 80 per 150 as invalid, and that was my own check forgetting that byes are deliberate CSV rows, not a bug in the product. The check now sits in the test suite so a later change to the exports can't quietly break calendars. Limits: it reads structure, not how Google, Apple or Outlook display the file.