Решили: мероприятие получает вид — ActivityKind (None / Campaign / ProvingGrounds) плюс ActivitySetup с двумя ограничениями площадки. Вид называется при входе (ActivityHost.Open(setup)) и читается через IActivityView. Интерфейс спрашивает «где мы» у мероприятия и по этому ответу показывает панель забега, панель площадки и кнопку «Начать».

Сказано: «А зачем вообще testZoneActive? Или что это? Это не костыль? … По логике тест бои наши - это просто прегены для ристалища.» (02.08.2026, сессия f24f0cc4).

Почему: место игрока выводилось из двух косвенных признаков — run == null && _testZoneActive, — и владелец второго (DeploymentController) живёт внутри боевого скоупа. Пока бой был вечным, владелец всегда отвечал. Когда бой стал рождаться по требованию (фаза 1), интент «включи площадку» стало некому обработать: на входе боя ещё нет, а когда он появился, событие уже улетело — шина истории не хранит. Итог: UI считал, что мы нигде, и прятал панель вместе с кнопкой «Начать», хотя бой шёл и фаза Deployment до интерфейса доходила.

Три решения Макса, закрывшие развилки: PvP — это Ристалище с двумя флагами (скрыть чужой строй, двигать только своих), а не отдельный вид; дев-арены как вида больше нет — тест-бои это прегены состава для Ристалища; сессия будет рождаться в меню («Создать» / «Присоединиться»), а не на буте (последнее — следующий шаг).

Что из этого следует в коде:

  • Площадка открывается вместе с ареной: ActivityHost.Open(ProvingGrounds) сразу зовёт BattleHost.OpenEmpty(). Забег арену не поднимает — там её заказывает узел.
  • BattleHost.OpenEmpty() — своя дверь, а не Open(null): пустой пресет в Open это ошибка вызова («бой заказали, а чем — не сказали»), а на площадке пустота и есть смысл.
  • GameFlow.ShowProvingGroundsAsync открывает мероприятие и закрывает его в finally, а интент серой зоны публикует уже внутри — теперь ему есть кому ответить.
  • _testZoneActive в UiRootBootstrap удалён. Событие тест-зоны осталось, но только про экран боя: «серая зона включена» — это не «мы на Ристалище».

Владелец правды: Data/Definitions/Activity.cs, Game/Activity/ActivityHost.cs, Game/Flow/BattleHost.OpenEmpty, тесты ActivitySetupTests.