Извлечено из замороженного 10-reference/combat-model.

Решили: каскад статов резолвится одним общим кодом — и игрой, и балансным инструментарием.

Почему: до этого каскад был переписан в трёх местах, и балансный аудитор пропускал два слоя — классовый и слой вида. Последствие было хуже расхождения кода: таблицы, по которым принимались балансные решения, показывали MaxHP и MoveSpeed, которых в игре не бывает. То есть баланс правился по числам, не существующим на арене.

Это тот же дефект двух владельцев, но в самой опасной форме: расходились не текст и код, а инструмент измерения и измеряемое. Ошибка при этом не выглядит ошибкой — она выглядит как цифра в отчёте.

Грабли: любой новый потребитель статов (бенч, витрина, тултип, редактор) обязан идти через тот же резолвер, а не «посчитать быстренько на месте». Свой мини-расчёт — это возврат к трём местам, и в следующий раз о нём узнают снова через неверный балансный отчёт.

Владелец правды: Assets/_Project/Scripts/Combat/Stats/ (резолвер каскада и Stats.Explain); потребители — Balance/ и UI; классовый слой — memory combat-classes-cascade.