Решили: после перестройки рига клипы ПЕРЕГЕНЕРИРУЮТСЯ из рецептов, а маски ПЕРЕСОБИРАЮТСЯ из иерархии — переносить пути (RigMigrate) в обоих случаях неверно. Аватар пересобирается всегда. Логический id сустава в профиле — это имя кости, а не отдельная метка рядом с ним.

Почему: перестройка сдвинула позу покоя локтя в саму кость, поэтому хранимые в клипе абсолютные углы стали неверны на эту величину — перенос путей сохранил бы связь и оставил кривые. Рецепты же авторят в дельтах от покоя: перегенерация даёт ту же позу при других числах. Маски перечисляют всё дерево целиком, а дерева больше нет — repoint переносит записи, но не убирает исчезнувшие и не добавляет новые узлы. Отдельная логическая метка (elbow.R) при имени кости LowerArm_R — второй владелец: переименуй узел, и они разойдутся без единой ошибки компиляции.

Грабли:

  • Авторские поля профиля переживают пересборку только по ID. Сменился id — знак сгиба и лимит молча вернулись к нулю, а нулевой знак разгибает колено в обратную сторону. Лечится картой прежних id, живущей ровно до первой пересборки.
  • Профиль варианта авторских полей не имел вовсе — они были только у базы, и после пересборки вариант остался с нулями. Перенесены явно.
  • Клип без рецепта нужно вести отдельно: у копья свой CombatIdle, и он чинится псевдонимами путей, а не перегенерацией.
  • Human128 остался со старой структурой и после перестройки потерял все анимации (489 путей в никуда): он самостоятельный риг, но кормится ОБЩИМИ клипами. Легаси, оставлен осознанно.

Владелец правды: BoneUnitClipRecipes.cs (содержание клипов), RigProfile.cs (замеры и id), BoneRigLayoutTests (раскладка и живость путей).