Решили: перед системой оружия идёт фаза 0 — удалить легаси визуального слоя, выправить имена, которые врут, и свести клипы в одно место. Список целиком — Planning - Weapon System §6.1.

Почему: заказ Макса дословно — «давай именно поменяем нейминг, ибо он щас у нас не особо корректный (будь то файлы, документация или нечто такое)» и «все помимо BoneUnit_Storybook - это ЛЕГАСИ. Остальное можно удалять, даю свое согласие» (06.08.2026, сессия a4e2eebd). Отвергнуто: переименовать по ходу фазы 1 — тогда правки контента и правки имён легли бы в один дифф, и разбирать причину поломки пришлось бы в обоих сразу.

Грабли:

  • Имена контроллеров врут ровно наоборот, и это опаснее всего в списке. BoneUnit_Standart.controller («лабораторный» по имени) играет в бою у всех 47 юнитовUnitView_BoneStorybook не переопределяет m_Controller вовсе и берёт наследуемый. А BoneUnit_Combat.controller («боевой») стоит override’ом только на дев-дуэлянте. То есть чистка «по имени» сносит живой бой и оставляет стенд. Проверено сверкой guid в YAML, не по докладу.
  • BoneUnit_Standart.prefab удалить нельзя ни при каком раскладе: живой BoneUnit_Storybook — его Prefab Variant (guid базы совпадает в m_SourcePrefab), и от базы он наследует контроллер, аватар и половину спрайтов. «Удаляем всё кроме Storybook» звучит как чистка, а означает удаление ростера.
  • BuildUnitViewPrefabs.cs — заряженное ружьё в меню. Генерирует покадровые префабы, которых в дереве уже нет, И перезаписывает _viewPrefab в живых Relic/Enemy-ассетах. Один случайный клик по пункту меню снимает вид 47 юнитам. Это не «мёртвый код, который мешает читать», а активная опасность.
  • Половина работы оказалась сделана до захода. Покадровые префабы и UnitView_Human128 («Man128») удалены коммитами 969f3c2d0 и 1c4adca48 от 05.08. Разведка по имени файла дала бы пусто и прочиталась бы как «искать негде»; правду сказала история git.
  • Дев-дуэлянтов было два, и второй — копия. BoneDevDuelist против BoneStorybookDevDuelist: различий ровно три строки — имя, id, префаб вида; статы и класс идентичны байт в байт. Пара имела смысл, пока видов было два и их сравнивали рядом.
  • Клипы живут по трём адресам, а предписанный документом пуст. ScriptableObjects/Visuals/ (58 клипов, 11 override-контроллеров — 71 файл из 82 в ней вообще не ScriptableObject), Prefabs/Bones/ (11), Art/Animations/ (пусто, только .gitkeep), при том что 30-how-to/adding-assets §2 велит класть клипы именно в третью.
  • Раскладку папок не проверяет ни один тест, а владельцев правды про неё три — док adding-assets, код ContentPaths и Assets/_Project/UI/AGENTS.md, — и они расходятся между собой. Пока конвенция не записана решением и не закрыта тестом, любой наведённый порядок разъедется снова: ProjectConventionTests держит корень меню и невидимые символы, но про папки молчит.
  • Побочно найдено и не чинится этой фазой: BoneUnitControllerBuilder объявляет маску Mask_Arms, которой в дереве нет (есть Mask_Action, Mask_Hips, Mask_ShieldArm) — при следующей перестройке контроллеров смотреть в оба. Плюс два ассета с неразрешимым скриптом в git: QC_KeyConfig.asset (удалённый QFSW) и Assets/DefaultNetworkPrefabs.asset (удалённый NGO).

Владелец правды: план tech/40-planning/weapon-system §6.1; после выполнения — само дерево и тест на раскладку, которого пока нет.