"""Run the unchanged season matches; keep game outcomes and timing evidence.""" import json from pathlib import Path import sys ROUTE = Path(__file__).resolve().parent ROOT = ROUTE.parents[1] sys.path.insert(0, str(ROOT / 'referee')) import play def main(): rows = [] for opponent in sorted(p.name for p in (ROOT / 'field').iterdir() if p.is_dir()): for opening_index, opening in enumerate(play.openings(), 1): for seat in (0, 1): brains = [play.brain(str(ROUTE)), play.brain(str(ROOT / 'field' / opponent))] if seat: brains.reverse() result = play.match(brains, opening) our_times = [m[2] for i, m in enumerate(result['moves']) if i >= len(opening) and i % 2 == seat] points = 0.5 if result['winner'] is None else float(result['winner'] == seat) rows.append({'opponent': opponent, 'opening': opening_index, 'seat': 'black' if seat == 0 else 'white', 'points': points, 'reason': result['reason'], 'moves': len(result['moves']), 'max_reply_ms': max(our_times, default=0)}) out = ROUTE / 'out' out.mkdir(exist_ok=True) (out / 'games.json').write_text(json.dumps(rows, indent=2) + '\n') groups = {opp: [r for r in rows if r['opponent'] == opp] for opp in sorted({r['opponent'] for r in rows})} lines = ['# Season check evidence', '', 'Generated by `python3 routes/codex-line-threats/audit.py`.', 'Uses the unchanged project referee, all six openings, and both colours.', '', '| Opponent | Wins | Draws | Losses | Points share |', '|---|---:|---:|---:|---:|'] for opp, games in groups.items(): counts = [sum(r['points'] == value for r in games) for value in (1, 0.5, 0)] lines.append(f'| {opp} | {counts[0]} | {counts[1]} | {counts[2]} | {sum(r["points"] for r in games)/len(games):.6f} |') lines += ['', f'Overall points share: {sum(r["points"] for r in rows)/len(rows):.6f}.', f'Maximum measured reply latency: {max(r["max_reply_ms"] for r in rows)} ms.', 'Reply latency is measured by the project referee on this local machine; it is not a cross-machine runtime guarantee.', f'End reasons: {json.dumps({reason: sum(r["reason"] == reason for r in rows) for reason in sorted({r["reason"] for r in rows})})}.', '', 'Per-game evidence, including losses, is in `games.json`.'] report = '\n'.join(lines) + '\n' (out / 'season.md').write_text(report) print(report) if __name__ == '__main__': main()