Closes audit Md11. BattleSession.RunAsync now clears each RealParticipant.Outbound archive immediately before the TerminateAsync cascade, releasing the heavy dict the moment the battle ends instead of waiting for the participant to be GC'd. Bots (NoOp / Scripted) don't expose an OutboundSequencer, so the 'p is RealParticipant rp' conditional cast is the natural filter. Tests: 1 new BattleSessionTerminateCascadeTests — pre-load the archive, drive RunAsync to completion via TestWebSocket.CompleteIncoming, assert the archive is empty. Suite: 939 → 948. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2.6 KiB
2.6 KiB