Решили: в SquadSwapBench кит роли, которой в штатном строю нет, подвигает соседа по линии
боя (убийца — Брузера), а не дописывается в отряд пятым.
Почему: пятый герой на четыре слота из SpawnTeam на арену не выходит, поэтому «испытуемый»
отряд оказывался точной копией зеркала: бой шёл сам с собой, дельта выходила ровным нулём, а строка
отчёта читалась как «замена ничего не меняет». Четыре кита — все три убийцы и трешевый — стояли так
с самого заведения бенча. Отвергнут вариант «дать убийце заменять дальника»: это меняет и роль, и
геометрию сразу, и дельта мерила бы перестановку, а не кита.
Что вскрылось сразу после починки: Ночной клинок даёт отряду +36 — третий вклад в ростере, а Огненный мечник, у которого DPS 164% нормы и звание непобедимого в дуэли (BAL-002), стоит на −29.7: в четвёрке он хуже Брузера, которого заменил. Числа соло и числа в отряде расходятся у одного кита на шестьдесят пунктов.
Грабли: это второй за день случай одной и той же тишины — до обеда так же молчали целители
(SlotRole не знал роли Healer, журнал the-roster-slice-needed-a-tier-boundary). Общее правило:
выпавший из перебора контент выглядит не как дыра, а как результат — ноль в колонке «вклад»
неотличим от честно измеренного нуля. Проверять надо не значения, а состав перебора: сколько строк
ожидалось и сколько пришло.
Владелец правды: SquadSwapBench.cs (StandInRole), Lineups.cs (IsFrontline, SlotRole).