Решили: четырнадцать ассетов ран заведены с 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 §Как это ложится на движок.