Решили: на UnitData не осталось ни одного Color — только роли (UnitTone — чем светит, BodyShade — ступень приглушения тела). Значения живут в токенах дизайн-системы (--gm-flare-* / --gm-dim-* → роли --gm-color-unit-* → снимок GuildmasterPalette), резолв роли в цвет — UnitColorRoles (Data), HDR-яркость накручивает CombatColorPalette множителями-полями. Градиент разброса перестал быть данными: он выводится из роли и кэшируется ПО РОЛИ.

Почему: требование Макса «все цвета в токенах, а не наобум в SO» — формально незакрытый долг правила от 2026-07-27, цвета юнитов были последним местом с сырыми Color. Четыре развилки решены так: (1) роли названы по СМЫСЛУ оттенка, а не по юниту — роль на каждого героя превратила бы палитру во второй реестр контента при 25+ реликвиях; (2) множители яркости живут в CombatColorPalette, а не в палитре и не в Data — в снимок палитры HDR не едет по правилу от 27.07, и это авторинг фидбэка; (3) градиент разброса не поле, потому что три поля на юнита дублировали формулу множителей, вбитую руками в 17 ассетов; (4) показ цвет НЕ резолвит — UnitView.SetVfxSpread подаёт презентер, иначе вид стал бы вторым входом за цветом.

Грабли: четыре, и все про Unity, а не про цвет. PrefabUtility.SaveAsPrefabAsset записал в вариант новый runtimeAnimatorController, но молча потерял SpriteRenderer.sprite — тот остался прежним, и подмена арта выглядела наполовину сделанной. Сработала правка через SerializedObject компонента + SaveAssetIfDirty + ImportAsset. Спрайты пака лежат НЕ рядом с его UnitVisual: путь надо брать из idle-клипа (AnimationUtility.GetObjectReferenceCurveBindings), угадывание по имени папки дало «нет такого файла». Масштаб фигуры живёт на узле Body (у нас 3.6–4.5), и считать его надо от НЕПРОЗРАЧНОЙ высоты кадра, а не от sprite.bounds: гриб при унаследованных 4.15 выходил ростом 2.6 юнита против 1.7 у человека. UnitVisual._skillClips — отдельный список, независимый от AnimatorOverrideController: заполнив только контроллер, я получила красный AbilityVisualSlots_PointToNonEmptySlot — при переезде на новый пак заполнять надо оба места.

Владелец правды: Assets/_Project/UI/Theme/tokens.primitives.uss и tokens.semantic.uss (значения), Assets/_Project/Scripts/Data/Definitions/UnitColorRoles.cs (роль → имя токена), Assets/_Project/Scripts/Presentation/Design/CombatColorPalette.cs (множители и градиенты), тест Assets/_Project/Tests/EditMode/Content/UnitTintPolicyTests.cs.