Решили: оффлайновая композиция поз (RigLayerBlend) выросла со «база плюс одна надстройка» до СТЕКА слоёв с двумя режимами — Override и Additive, — и её же теперь зовут и контактный лист, и гизмо зоны удара. Форма «трассируемый клип лежит слоем на движущемся теле» вынесена в общий RigLayerBlend.Composition + SampleTraced.

Почему: с 30.07 удар не стейт базы, а надстройка: тело бежит на базе, свинг едет Override-слоем по верху тела, просадка таза приезжает Additive. Картинка, умеющая базу и один оверлей, была бы короче игры ровно на слой — и коротка именно на тазе, ради которого аддитивный слой и заводился. Хуже того, RigSweep строит дугу от плеча, а плечо теперь едет от локомоции: гизмо по одному клипу показывало бы траекторию, которой в игре нет, и врало бы тем сильнее, чем размашистее бег.

Аддитивная дельта считается от ПЕРВОГО КАДРА самого клипа, а не от позы покоя рига — так её считает Animator, и у клипа удара с разбега нулевой кадр это поза бега, от которой дельта и должна идти. Сверка эмуляции с рантаймом на живом риге: таз 0.038 → 0.001, плечо 95.23 → 336.00, нога 3.90 не шелохнулась — цифра в цифру с тем, что дал Animator.

Отвергли отдельную копию композиции внутри RigSweep: два владельца разошлись бы, и одна картинка показывала бы позу игры, а другая нет — без всякого признака, которая из них.

Грабли: Sample начинается с сэмпла базы, поэтому «доложить слои поверх уже готовой композиции» им сделать нельзя — он бы стёр её целиком и молча съел слой. Понадобился отдельный Fold без базы.

Второе: чинить приёмку пришлось до самой проводки показа, и проверить рендером её не удалось — параллельная сессия держит дерево некомпилируемым (EmpowerNextAttackComponent ссылается на RuntimeUnit.EmpowerSplitShare/EmpowerSplitType, которых ещё нет). Сверка additive сделана ДО этого, на скомпилированной сборке; сами картинки не отрисованы.

Владелец правды: RigLayerBlend (Blend, Layer, Composition, Fold), RigSweep.Options.Composition, AnimationLabRenderer.Options (Layers + Composition).