Решили: вырвать то, что существовало только потому, что у боя не было границы в жизненном цикле.
Снесены: очередь команд симуляции целиком (ISimCommand, ICombatCommand, PauseCommand,
ResumeCommand, _commandQueue, ApplyDueCommands), память «последнего боя» у EncounterLoader
(Reload, LoadPreset, три поля, CopyPlayerSide) и ручка BattleTapeBroadcast.Enabled.
Почему: у всех троих в игре не осталось ни одного пользователя — живы были только их собственные тесты. Очередь команд задумывалась как шов lockstep-мультиплеера, от которого отказались 19.06.2026; память последнего боя нужна была рестарту на месте, а рестарт теперь — новый скоуп с тем же пресетом; ручка раздачи была заготовкой «на будущее, ради ставок», которую никто не дёргал.
Грабли:
- Тест мёртвого механизма выглядит как живой инвариант. Все три пункта имели зелёные тесты, и ровно поэтому код читался как рабочий. Признак, по которому их видно: единственный вызывающий — тестовая сборка.
- Пауза симуляции упростилась вместе с очередью. Ветка «счётчик тиков идёт, пока в очереди есть
команды» существовала только чтобы отложенный
ResumeCommandкогда-нибудь наступил. Без очереди пауза — это простоif (_isPaused) return;, снимает её тот, кто поставил, вызовом. - Удалил публичный тип — гони
compile-check.ps1 -All. Без ключа скрипт проверяет только сборки, задетые правками, и потребителей удалённого типа в ЧУЖИХ сборках не видит: снос неймспейсаGuildmaster.Combat.Commandsоставил висячийusingвGuildmaster.DevTools, точечная проверка осталась зелёной, а упал уже полный прогон — на компиляции, то есть без единого теста. ResetBattleне умер, а сменил смысл. Границей боя он быть перестал (граница — рождение и смерть скоупа), но «поставить состав заново на том же бою» никуда не делось: это пере-расстановка, когда игрок двигает строй. Поэтому сброс убран с пути рождения (PlacePartyна свежей пустой симуляции сбрасывать нечего) и оставлен там, где он и означает своё имя.
Осталось до фазы 2, сознательно: ветвление по роли (IBattleAuthority.Role != Host в раздаче
ленты и родня). План отдаёт роль инсталлеру Сессии, а Сессии ещё нет — вырывать флаг раньше, чем
появится тот, кто выбирает инсталлер, значит заменить его на другой такой же.
Владелец правды: Combat/CombatSimulation.cs, Combat/Units/EncounterLoader.cs,
Net/Tape/BattleTapeBroadcast.cs.