Решили: подключение к чужой игре показывается полноэкранной заслонкой (BusyRequest.TakesOver), держится ДО первого доехавшего снимка забега, а не до рукопожатия, и по дороге меняет строку этапа отдельным сообщением BusyStageChanged.

Почему: ожидание снималось по CoopSessionState.Connected, но Connected — это принятое рукопожатие, а не вход в игру: сеанс гостя открывается позже, и только потом он просит у хозяина состояние забега (GuestRunState, GuestActivityFollower, GuestSessionStage шлют запросы из своих Start). Между этими моментами игрок сидел на пустом экране без единого признака, что что-то происходит. Теперь экран живёт до RunPartyReadyEvent — сигнала «первый снимок пришёл».

Этап меняется отдельным сообщением, а не повторным BusyRequest: повторный заказ пересобрал бы экран, и кольцо дёрнулось бы с начала — продвижение читалось бы как мигание.

Сказано: «Полноэкранное подключение к лобби» и «Этапы строкой (рекоменд.)» (21.08.2026, сессия 26182ec4); решение о полноэкранном виде принято днём раньше — см. journal-adr.md §2026-08-21.

Грабли:

  • Между Connecting и Connected сигнал есть, но наружу не выходит. SteamNetTransport поднимает PeerConnected, CoopSession на него шлёт SayHello — и всё: состояние сессии не меняется, публикаций нет, след только в Diag.Log. Поэтому этапов у экрана два, а не три: показывать «соединились» до рукопожатия нечем, и выдумывать третий этап по таймеру нельзя — это анимация прогресса, которая врёт заметнее всего там, где связь встала.
  • Потолка по времени у ожидания нет намеренно. Вход посреди боя законно длится до 30 с (MidBattleJoinHold), и таймаут-страховка резала бы честное ожидание. Выход у игрока есть — кнопка отмены, которая делает настоящее дело (Leave), а не просто снимает картинку.
  • Строка ожидания на пустом кадре не должна лежать строкой. В окне кольцо стоит слева от текста; на всём кадре та же композиция центрируется целиком, а глаз ищет ось по тексту — кнопка под ней выглядит съехавшей. Лечится колонкой (.gm-busy--takeover .gm-wait).

Владелец правды: Assets/_Project/Scripts/Game/Session/CoopSessionPresenter.cs, Assets/_Project/Scripts/Core/Flow/NoticeMessages.cs, Assets/_Project/UI/Theme/components/notice.uss.