Решили: ожидание выбора узла слушает RunCommandBus.Applied, а не RunStateService.Committed.
Почему: Committed означает «состояние ЗАФИКСИРОВАНО» и поднимается только при смене самого
объекта забега — старт и загрузка. Это точка сохранения, а не «что-то изменилось»: её докстринг так и
говорит, и она нарочно совпадает с точками записи сейва, чтобы гость получал ровно то же, что диск.
Применённая команда её не трогает. У шины для «изменение прошло» есть своё событие, и оно
единственно верное — мимо шины в состояние не пишут.
Грабли: я подписалась на событие по имени, не спросив, когда оно публикуется. Симптом получился
злым: команда доезжала, применитель писал EnteringNodeId, лог принимал — то есть весь путь был
«зелёный», — а игра стояла. Узел помечен, карта горит, петля спит. У хоста при этом сейв уносил
EnteringNodeId на диск, и следующая загрузка входила в узел сама.
Проверять надо было не «есть ли подходящее событие», а «в каких строках оно поднимается» — это один grep, и он дешевле вечера чужого прогона вдвоём.
Владелец правды: Game/Flow/WorldMapNodeChooser.cs (комментарий у поля _bus),
Guild/Commands/RunCommandBus.cs (Applied и почему оно живёт на шине),
Guild/RunStateService.cs (Committed и почему он про сохранение).