Решили: сеанс пишет в канал диагностики «сеанс» весь свой путь — подъём, приглашение, соединение, обе половины рукопожатия, отказ, разрыв, каждую смену состояния. Полка каналов на F2 подписана, а состояние диагностики выведено в строку статуса.

Почему: канал DiagChannel.Session был объявлен и предлагался в консоли, но в него не писал никто. Включив его на разборе прогона, игрок видит пустой лог и делает единственный доступный вывод — что диагностика не работает. Хозяйскую половину рукопожатия (GuestApproved/GuestRejected) вдобавок не слушал ни один потребитель, поэтому «гость принят» не оставляло следа нигде. Полка каналов существовала с 06.08.2026, но стояла в подвале шестью безымянными кнопками рядом с «сохранить/папка/очистить» — и читалась как фильтры показа, а не как «включить логи».

Сказано: «Я вообще хотел вместо ввода команды заиметь куда-то кнопки в духе “Включи логи мп”. Точнее переключатель и его сохранение состояния между запусками игр. // Просто включить когда надо. Выключить когда не надо. Удобно и без зазубривания команд.» (Макс, 07.08.2026, сессия 9c0cf5ea). Сохранение между запусками уже работало (DiagChannelStore) — не хватало ровно читаемости входа.

Грабли: событие «игрок пришёл» наружу сознательно НЕ заводится. Приход показывает панель участников, читающая состав сеанса сама; диалог, как на уходе, прерывал бы игру ради новости, не требующей решения, а событие без слушателя — мёртвый код. Рядом закрыт третий дефект того же прогона: «В главное меню» у гостя молча не работало — токен мероприятия взводят петля акта и площадка, а гость не проходит ни ту, ни другую. У него выход из чужой игры это выход из сеанса; признак гостя берётся у роли сеанса, названной при входе.

Владелец правды: Net/Session/CoopSession.cs, UI/DevConsole/DevLogScreen.cs, Game/Services/GameFlow.cs (RequestReturnToMainMenu).