Решили: в 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).