Решили: четырнадцать ассетов ран заведены с Value = дельта (−0.3), хотя каталог и карточки пишут ту же величину множителем (×0.7); расхождение нотаций закрыто рамкой в каталоге, а не переименованием поля.

Почему: движок считает (base + ΣFlat) × (1 + ΣPercentAdd) × Π(1 + Value) (Stats.cs) — и это общая форма для всех источников, от классовых скейлов до предметов. Менять смысл поля ради одного контент-типа значит чинить четырнадцать ассетов ценой всего остального контента. Отвергнуто и «просто помнить»: дизайн-документ говорит на языке множителей, потому что игроку и Максу так читаемее, и следующий автор придёт к ассету именно оттуда.

Грабли: промах здесь необнаружим ни одним гейтом. Записанное вместо −0.3 число 0.7 даёт ×1.7 — рана становится наградой: компилятор молчит (поле float), валидация контента молчит (диапазон допустим), тесты молчат (они на синтетических ассетах), бенч молчит (отряд просто выигрывает чуть чаще). Единственная защита — знать нотацию до того, как заполнил поле.

Попутно: ContentDefinition.OnValidate при CreateAsset из кода не приходит — _id проставляется вручную через ContentDomains.MakeId (уже записано в 2026-08-21-an-asset-made-from-code-has-no-id), а ContentDatabaseSync.Sync() звать нельзя: он дёргает AssetDatabase.SaveAssets() и сохранит чужую незакоммиченную работу в общем дереве. Запись в _entries идёт через SerializedObject плюс SaveAssetIfDirty.

Владелец правды: Stats.cs (формула), ConsequenceData.cs (<remarks> про PercentMult), каталог gdd/30-run-meta/injury-catalogue.md §Как это ложится на движок.