Решили: при схлопывании узла его поворот уходит ВВЕРХ, в сустав, если под костью есть суставы, и ВНИЗ, в арт, если под ней только рисунок. Мировые позы всех спрайтов снимаются до перестройки и возвращаются после — перестройка обязана быть тождественной по виду, и это проверяется числом, а не глазами.

Почему: 26.61° предплечья — это поза покоя, она обязана поворачивать кисть и меч вместе с рукой; 320.55° меча — калибровка рисунка, и уйди она вверх, анимируемый хват перестал бы быть чистым нулём, а все дуги атак начали бы отсчёт от кривого нуля. Одно правило на оба случая («вливать в родителя») ломает вторую половину молча — поза выглядит правильной, а дуга уезжает. Различие механическое: есть ли под костью суставы.

Восстановление по снимку выбрано вместо ручного пересчёта локальных координат ещё и потому, что оно чинит варианты бесплатно: подгонка арта — это и ЕСТЬ мировая поза спрайта, поэтому 112 override-ов Storybook не переносятся, а выводятся заново на новых узлах.

Грабли:

  • Предмет варианта может быть ВЛОЖЕННЫМ префабом. Копьё — инстанс Weapons/Spear.prefab, а не узел: код, разобравший его как обычную кость с предметом, снёс копьё целиком. Перед любой правкой поддерева — IsAnyPrefabInstanceRoot вверх по цепочке.
  • Removed-override держится за КОНКРЕТНЫЙ объект, а не за то, что видно. Spear удалял кость Sword, и спрайт уходил вместе с ней; после схлопывания спрайт стал прямым ребёнком хвата — и меч со щитом воскресли. Правило-лекарство: спрайт, которого в варианте не было ДО прохода, удаляется после него.
  • Снимок не переживает границу вызова execute_code. Переменные не живут между вызовами, и перестройка, разорванная на два вызова, теряет эталон — пришлось откатывать дважды. Снимок пишется в файл, тогда шаги можно делить.
  • Откат префаба через git при живом редакторе требует явного Refresh — с выключенным Auto Refresh Unity иначе продолжает показывать своё.

Владелец правды: BoneUnit_Standart.prefab (структура рига), RigNaming.cs (конвенция имён), кадры приёмки — рендер позы покоя до и после.