Решили: вырвать то, что существовало только потому, что у боя не было границы в жизненном цикле. Снесены: очередь команд симуляции целиком (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.