Решили: двор гильдии стал видом шага сеанса (SessionStageKind.Hub) с именем дома в коробке. HubPresenter объявляет шаг, показывает общий для обеих ролей SessionStageScreens. Второй путь снесён целиком: HubOpen из ActivityState, шов IHubPresence вместе с реализацией в MenuRouter и гостевой ветвью в GuestActivityFollower.

Почему: двор оставался последним экраном, который показывался ДВУМЯ дорогами — петля владельца публиковала запрос напрямую, а гость поднимал экран по объявлению «двор открыт». Ровно та форма, из-за которой 08.08.2026 разъехались экраны узла: у гостя они просто не появлялись, и игроку это читалось не как «не доделали», а как поломка.

Отвергли вариант оставить ActivityState.HubOpen и просто дописать имя дома рядом. Он дешевле на день, но сохраняет два владельца у одного факта «что сейчас перед группой» — а расхождение таких владельцев мы уже оплатили один раз.

Побочно починилось то, чего не искали: у гостя на дворе появилось имя дома. Второй путь его не вёз вовсе — OpenHubRequest(null, ...), — и в коде это было записано как решение («двор здесь МЕСТО, а чей он, приезжает своим каналом»). На экране же это выглядело как пустое место там, где у хозяина написан дом. Ни один тест такого не ловит: обе стороны работали «правильно».

Грабли: снос шва потянул цепочку в четыре файла, и компилятор показал её не сразу — сначала осиротевшее поле в ActivityBroadcast, потом заглушка в тесте скоупа. Отдельно: SessionScopeTests упал не на логике, а на РЕЗОЛВЕ — новому конструктору SessionStageScreens нужен паблишер, которого в тесте не было. Это правильное поведение теста: состав сеанса он и проверяет.

Владелец правды: SessionStageState.Hub, SessionStageScreens.ShowHub, HubPresenter, тесты Hub_SurvivesTheRoundTripWithItsName и SessionScopeTests.