Решили: счёт контроля (MetricCollector.ControlScore) считается по полю ControlWeight на самом
эффекте, а не по маске тегов. Сырые секунды (ControlSecondsDealt) остались рядом и по-прежнему
идут по тегам.
Почему: тег отвечает на вопрос «это контроль», вес — на вопрос «сколько он стоит», и это разные вопросы. По тегам замедление не контроль вовсе (оно живёт модификатором скорости, тега не несёт), и кит, тормозящий врага весь бой, в счёт не попадал бы совсем. Обратно: по тегам сон и оглушение неразличимы, хотя цена у них может быть разной по замыслу.
Отвергнут вывод веса из содержимого эффекта — считать по флагам ControlComponent и по доле снятого
стата. Звучит красиво («число нельзя разойтись с механикой»), но у замедления нет выводимого курса:
цифра всё равно назначается, только неявно и без места, где её видно. Решение Макса: «Надо на
каждый эффект свой же заводить, разве нет?» — и он прав.
Грабли: поле, добавленное в .cs, не существует для редактора, пока тот не перекомпилировал
сборку. SerializedObject.FindProperty("_controlWeight") вернул null для всех четырнадцати
ассетов, и выглядело это как «поле не завелось», а не как «редактор о нём ещё не знает». Признак:
compile-check зелёный, а typeof(T).GetProperty(...) в execute_code даёт null.
Владелец правды: EffectData.ControlWeight (шкала в <remarks>), MetricCollector.ControlScore,
тест ControlWeightTests, решение — gdd/00-meta/journal-adr §2026-08-22 (2).