Решили: выбор узла на карте — команда в шину забега (ChooseNode), а не сетевое событие. Она
пишет MapState.EnteringNodeId, петля акта ждёт эту запись. Отдельного канала под действия игрока
нет и не будет.
Почему: дорога к состоянию должна быть одна, и она уже есть — RunCommandBus с логом,
аудитом «кто передвинул» и реплеем. Клик хозяина и клик напарника приходят ею одинаково, поэтому
права, когда дойдут, встанут ОДНИМ фильтром на шине.
Отвергнуто два варианта, оба мои:
- Канал на действие (
MapChoice+ приёмник у хоста). Написан и удалён в тот же вечер: пока всем можно всё, он неотличим от правильного, а в день появления прав дал бы N мест для одной проверки — и забытая проверка выглядит как работающая функция. - Общий канал интентов (
PlayerIntent+ роутер). Прожил десять минут. Я защищала его доводом «интент не ложится в лог, иначе реплей сломается»; довод держался ровно на том, что петля актаawait-ная. Стоило петле стать реакцией на состояние — возражение исчезло вместе с интентами.
Сказано: «Нет, мы как раз на стадии разработки, я хочу чистую архитектуру, чтобы потом все не переписывать все еще раз. Ок? Чисто, понятно и один источник правды. Разве у нас щас это будет сложно сделать?» — и раньше, вскрывая мою границу: «А разве все “действия управления” тчо ты перечислил, это не те самые durable состояния? И они как бы не одно и тоже?» (04.08.2026, сессия fef16360).
Грабли: оценку «переписывать ActRunner, заход на день-два» я дала, не открыв файл. Открыла —
139 строк и два await, а выбор узла в петле занимает одну строку: она просто просит узел. Менять
пришлось не петлю, а то, чего ждёт её await. Цена ошибки — предложенная отсрочка на работу, которая
делается за вечер.
Второе: правку «объявить гостю, ждём ли мы выбора» (поле в ActivityState) я успела написать и
закоммитить до этого разговора. Она не понадобилась вовсе — «ждём выбора» выводится из состояния как
«поле входа пусто и акт не завершён», и объявленное отдельно оно было бы вторым владельцем
подсветки. Удалено вместе с каналом.
Владелец правды: Guild/RunState.cs (MapState.EnteringNodeId),
Guild/Commands/RunCommandApplier.cs (проверка достижимости),
Game/Flow/WorldMapNodeChooser.cs (ожидание записи), тест
ChooseNodeIsStateTests.