Решили: двор гильдии стал видом шага сеанса (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.