Решили: редакторный стенд больше не изображает взмах, а разговаривает с игрой через два публичных входа: UnitView.ScrubSwing(clipTime) — «поставь взмах сюда» — и SwingArcLaunch.Begin(...) — «заведи дугу». Дугу заказывает сам вид (SetSwingStartHandler), как и в бою. Сортировка дуги переехала внутрь тела: эффект репарентится в носитель SortingGroup и получает порядок на единицу ниже бьющей части.

Почему: обходов было три, и каждый по отдельности выглядел мелочью — своя раскладка параметров, своё решение «идёт ли взмах», своя сортировка. Вместе они складывались во вторую правду о взмахе. Копия не знала ни удержанного кадра финишера, ни режима потока, ни номера взмаха, по которому дуга заводится один раз за свинг, — то есть показывала эффект, которого в игре нет, и по нему принимались решения о яркости.

Альтернатива — разбить UnitView на агрегаты и вынести взмах в отдельный тип — отвергнута: вход остался бы таким же приватным и после реза, а стенд по-прежнему не мог бы его позвать. Проблема была не в размере класса, а в отсутствии двери.

Порядок дуги берётся у БЬЮЩЕЙ ЧАСТИ, а не числом из данных: у бойца с двумя клинками левый и правый лежат в разных слоях тела, и число в ассете было бы верным ровно для одного из них. Слоем требование не выражается вовсе — тело сортируется группой целиком, и снаружи объект может быть только над всем юнитом или под ним.

Сказано: «Хватит делать костыли. Еще раз. Один источник правды, и нельзя никак его обходить и случайно нарушить. Как это сделаем? Нельзя разве просто брать прямо из текущего кода, сделать единый источник правды, как я и предложил? Зачем ты это нарушила?» и, про порядок: «След дуги должен быть ЗА мечом, тут все ок. Его слой - “я меч, но чуть ниже меча”, относительно других частей тела» (2026-08-06, сессия f0c50476).

Грабли: три штуки, каждая тихая. Пул возвращал объекты только SetActive(false), не трогая родителя, — а дуга теперь переезжает внутрь чужого тела и умерла бы вместе с ним, оставшись «возвращённой» с точки зрения пула. Масштаб дуги задавался локально, и любой масштабированный родитель молча менял размер сектора; теперь он считается мировым, делением на lossyScale родителя — вместе со знаком, то есть зеркало юнита приходит даром. Правка asmdef не подхватывается compile-check вовсе: скрипт берёт команды компиляции из готовых rsp Unity, и новая ссылка на сборку появляется в них только после переимпорта редактором.

Владелец правды: Assets/_Project/Scripts/Presentation/Effects/SwingArcLaunch.cs, UnitView.ScrubSwing, SwingArcGeometry.TryResolveAnchor, тест SwingArcSingleOwnerTests.