Решили: «Жилы» Десятины собраны отдельным эффектом effect.sinews (пассивка кита), а не внутри
эффекта-стойки; принадлежность форме компонент проверяет сам — полем _requiredStance против
RuntimeUnit.AttackStance. Тем же полем гейтится BleedOnHitComponent: кровь пускают только выпады
в упор.
Почему: статовые модификаторы адресуются эффектом-ключом, а AttackStanceComponent уже держит
на своём ключе статы формы (дальность, темп). Поселись «Жилы» там же, снятие бонуса скорости
сносило бы заодно профиль формы — и не в момент правки, а когда кит впервые просядет ниже порога.
Отвергнута и вторая развилка: научить стойку вешать self-эффекты формы. Стойка сознательно
устроена как идемпотентный СНИМОК профиля, у неё нет обратной операции; пара «наложить/снять» на
каждую форму вернула бы ей вопрос «а что если форму сорвали посреди боя», ради одного кита.
Грабли: порог HP гейтит бонус и плату ОДНИМ правилом. Разведи их — и кит продолжал бы платить
4% максимума за удар по опустевшему запасу, то есть добивал бы себя; при общем правиле кламп «не
ниже 1 HP» вообще не нужен, и его отсутствие не недосмотр (тест Cost_StopsAtThreshold_SoItCannotKill
держит это явно). Плата берётся прямым вычетом CurrentHP, как дань «Голода», а не через
DealDamage: иначе её погасила бы броня, разбудили бы шипы, а вампиризм отыграл бы цену навыка
обратно. Состояние «бонус висит» живёт в RuntimeEffect.Counter — поле в компоненте стало бы общим
на всех носителей.
Владелец правды: SinewsComponent, BleedOnHitComponent._requiredStance,
AttackStanceComponent.CloseStanceIndex, тесты SinewsTests.