Решили: риг разложен в три уровня — кость → Visual Part (Кость) → узлы спрайтов. Масштаб и подмена арта живут на контейнере, поза и калибровка — на кости.

Почему контейнер пустой: первый заход положил рендерер на сам контейнер, и Макс это отверг (30.07). У части бывает больше одного спрайта — броня поверх торса, перо на шлеме; рендерер на контейнере делает первый спрайт привилегированным, а остальные — его детьми. Пустой контейнер держит их равными сиблингами.

Почему: до этого узел нёс и своё изображение, и суставы под собой — спрайт предплечья буквально родительствовал над хватом, а хват над мечом. Отмасштабировать предплечье под перерисованный арт было нельзя, не увезя вместе с ним хват и оружие. Отвергли обратную раскладку — «вынуть кости из-под спрайтов»: она меняет пути анимируемых узлов, а на путях висят клипы, три маски и generic-аватар, и ни один из них при расхождении не жалуется. Контейнер ставится НИЖЕ кости, поэтому не двинулся ни один анимируемый путь: в диффе профиля изменились ровно два поля, ItemPath меча и щита.

Грабли: трое потребителей читали рендерер прямо с кости, и каждый сломался бы по-своему, молча. RigProfile.MeasureHeld брал калибровку предмета как локальный угол узла с рендерером — после переезда прочитал бы ноль вместо −89.39 (теперь считается разницей с хватом, что верно при любом числе промежуточных узлов). RigSweep.MeasureCoverage искал тело по имени узла и нашёл бы ноль рендереров, то есть отчитался бы, что щит не закрывает ничего (теперь сверяется с именем КОСТИ через RigVisualParts.BoneNameOf). Дальний конец кости считался от трансформа кости, а не рендерера — при отмасштабированном контейнере вернул бы длину без скейла. Приёмка была числовая: пересобранный профиль дал те же 15 длин костей и обе калибровки до знака.

Владелец правды: RigVisualParts.cs (раскладка и хелперы FindVisual / BoneNameOf), RigProfile.HeldItem.Resolve (как от хвата дойти до предмета), префаб Assets/_Project/Prefabs/Bones/BoneUnit_Standart.prefab.