Решили: тир реликвии (DropRarity) стал осью замера в RunBench, а не фильтром: отряд
набирается в границах одного тира, и обычные с трешевыми китами стоят разными строками отчёта.
Почему: варианты состава брались по общему списку подряд, поэтому первые два набирались обычными китами, а третий-четвёртый доскребали трешевыми — теми, что слабее по замыслу. Среднее по режиму мешало два вопроса, и разброс внутри строя объяснялся не ростером, а тем, в какой момент кончился список. Отвергнут простой фильтр «гонять только обычных»: треш — половина ростера, и вопрос «сколько стоит бедный ростер» законный. Ответ на него оказался крупнее ожидаемого — тир двигает смертность вдвое (1.05 против 2.22 на бой), то есть сильнее, чем строй.
Грабли: класс Healer завели 28.07, а сопоставления со слотом строя ему не дали — SlotRole
знал только Summoner → Support. Ни один строй слота Healer не объявляет, поэтому Светлый пастырь
и Травница не выходили на арену ни в одном замере за три недели, и заметить это было нечем:
тыловой слот исправно закрывался китом роли Support, а отсутствие хила читалось как свойство
ростера. Урок общий: молчаливо выпавший из перебора контент выглядит не как дыра, а как результат.
Второе: знаменатель доли целых маршрутов был формулой Routes * Variants. С разным числом вариантов
у тиров она завысила бы знаменатель треша втрое — теперь пройденные маршруты считаются счётчиком.
Владелец правды: RunBench.cs (Tiers, BuildSquads), Lineups.cs (SlotRole),
docs/balance-issues.md §BAL-029.