Решили: семь треш-реликвий (по одной на боевой класс) авторятся Override-статами в 70% от классовой нормы, а урон подбирается под уже квантованный тиками темп атаки, а не под записанный в ассете.

Почему: сим работает на 30 Гц, интервал атаки — целое число тиков, поэтому темп 0.55 бой читает как 0.5, а 0.85 как 0.9. Наивный расчёт «урон × темп из ассета» дал Танку 38.5 DPS на бумаге и 35 в бою (−9%), Дальнику — 92.4 против 99 (+7%). Числа правились после сборки юнита через боевой каскад (UnitStatPreview считает тем же путём, что фабрика), а не по калькулятору. Альтернатива — подбирать дробный темп так, чтобы после квантизации вышло ровно нужное, — отвергнута: она прячет зависимость в неочевидном числе, тогда как правка урона оставляет обе величины читаемыми.

Грабли: три штуки, все стоили времени.

  1. AssetDatabase.SaveAssets() из execute_code уносит чужое несохранённое: вместе с лок-таблицами на диск уехала открытая в редакторе сцена MaxSceneForTests.unity. Правильный путь — SaveAssetIfDirty на конкретные ассеты, для лок-таблиц это Collection.StringTables.
  2. run-tests.ps1 -Filter <класс> без -Mode EditMode печатает «Some tests failed», даже когда EditMode-часть зелёная: под фильтр не попал ни один PlayMode-тест, а пустой прогон считается провалом. Узкую проверку гонять с -Mode EditMode.
  3. Стенд баланса internal целиком (BalanceAssets, SimEnvironment), из execute_code он недоступен. Собрать юнита «как в бою» снаружи можно через Guildmaster.Combat.UnitStatPreview — он публичный и по контракту считает тем же путём.

Владелец правды: ассеты ScriptableObjects/Relics/Trash*.asset и Effects/Trash*.asset, числа норм — ClassBalanceConfig.asset, карточки замысла — docs/wiki/gdd/relics/trash-*.md.