Решили: ожидание выбора узла слушает RunCommandBus.Applied, а не RunStateService.Committed.

Почему: Committed означает «состояние ЗАФИКСИРОВАНО» и поднимается только при смене самого объекта забега — старт и загрузка. Это точка сохранения, а не «что-то изменилось»: её докстринг так и говорит, и она нарочно совпадает с точками записи сейва, чтобы гость получал ровно то же, что диск. Применённая команда её не трогает. У шины для «изменение прошло» есть своё событие, и оно единственно верное — мимо шины в состояние не пишут.

Грабли: я подписалась на событие по имени, не спросив, когда оно публикуется. Симптом получился злым: команда доезжала, применитель писал EnteringNodeId, лог принимал — то есть весь путь был «зелёный», — а игра стояла. Узел помечен, карта горит, петля спит. У хоста при этом сейв уносил EnteringNodeId на диск, и следующая загрузка входила в узел сама.

Проверять надо было не «есть ли подходящее событие», а «в каких строках оно поднимается» — это один grep, и он дешевле вечера чужого прогона вдвоём.

Владелец правды: Game/Flow/WorldMapNodeChooser.cs (комментарий у поля _bus), Guild/Commands/RunCommandBus.cs (Applied и почему оно живёт на шине), Guild/RunStateService.cs (Committed и почему он про сохранение).