Решили: проверку «разводка тела не сделана» в SkeletalBodyVisual.Awake считаем по ЖИВЫМ ссылкам, а не по длине списка, а сам инвариант («каждая часть жива и несёт спрайт, и их столько же, сколько рендереров в риге») держит тест BoneRigLayoutTests.

Почему: переезд арта в контейнеры Visual Part (Кость) пересоздал узлы спрайтов, и все шестнадцать ссылок вида умерли разом. Через этот список идёт ВСЁ тело — тинт, вспышка удара, инвиз, силуэт, границы, осколки смерти, — поэтому юнит перестал краситься и вспыхивать, а умирал без осколков: PlayShatter насчитывал ноль живых частей и сразу звал завершение. Ни одной строки в консоли: страховка в Awake смотрела на _parts.Count, а список из шестнадцати трупов не пуст.

Грабли: дефект нашёлся не там, где болело. Красным был тест политики тинта — он считал, что дев-дуэлянт делит арт с реликвией. На самом деле он читал у скелетного юнита выключенный легаси-узел Visual Sprites/Body, унаследованный от базового UnitView, — просто потому что скелетный путь возвращал пустоту. Починка ссылок погасила оба красных теста сама.

Порядок отрисовки уцелел только потому, что у прежнего владельца — поля sortingOrder на каждом спрайте — значения никуда не делись: SortByCurrentOrder вернул список в прежний вид (щит 8, голова 7, руки 6–4, сапоги 3, меч и голени 2, бёдра 1, тело 0). Правь список в риг-префабе: UnitView_BoneStandart — вариант поверх него, и починка в варианте стала бы оверрайдом.

Владелец правды: SkeletalBodyVisual.cs (LiveParts, RebuildParts), тест BoneRigLayoutTests.EveryBodyPartReferenceStillPointsAtArtwork, префаб Assets/_Project/Prefabs/Bones/BoneUnit_Standart.prefab.