Решили: счёт контроля (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).