Решили: бой за главным меню поднимается напрямую от мирового скоупа, а не через мероприятие. Набор боёв — данные (MenuBattleConfig: пресет + сид), директор живёт в WorldLifetimeScope, стол за меню уходит по отдельному событию MenuBattleChangedEvent.

Почему: первая версия звала ActivityHost.Open(ProvingGrounds) и получила от SessionHost «сеанс не открыт → дочернему скоупу рождаться не от кого»: в главном меню сеанса ещё нет, он открывается вместе с игрой. Фон меню не является занятием игрока и владения состоянием не требует, поэтому живёт этажом ниже нашей же лестницы (Мир → Сессия → Занятие → Бой): мир → бой, без сессии посередине. Записи боя при этом не нужно — ядро детерминировано, пресет плюс сид дают тот же бой покадрово.

Сказано: «Какой лучше всего обычный бой с экшн камерой и мб с небольшим затемнением? Будто у нас он дешевый, просто просчитанные заранее созданные бои… Сделать таких боев 20, рандомные брать друг за другом. Все прям на грани» (04.08.2026, сессия ca460396).

Грабли:

  • Директор обязан жить там, где виден префаб боевого скоупа. В корне его нет: префаб регистрируется в мире, а корень — предок мира и его регистраций не видит.
  • Вершинные цвета в линейном пространстве конвертируются вручную. Painter2D делает это сам, ручной меш — нет, и всякая пластина выходила примерно вдвое светлее заданной. Поймано на скриншоте, а не на глаз: цифры замера переставали сходиться с картинкой.
  • Правки USS мимо редактора не видны в play mode без refresh_unity — при выключенном Auto Refresh снимок показывает старую тему, и это читается как «правка не сработала».
  • Незакрытое: боевой скоуп поднимается и стол уходит, но юнитов на арене ноль — отряд игрока берётся из RunState, которого у меню нет. Составу фонового боя нужен свой источник.

Владелец правды: Assets/_Project/Scripts/Game/Flow/MenuBattleDirector.cs, Data/Definitions/MenuBattleConfig.cs, Presentation/Map/MenuBackdropView.cs, конфиг — ScriptableObjects/Configs/MenuBattleConfig.asset.