Решили: выбор узла на карте — команда в шину забега (ChooseNode), а не сетевое событие. Она пишет MapState.EnteringNodeId, петля акта ждёт эту запись. Отдельного канала под действия игрока нет и не будет.

Почему: дорога к состоянию должна быть одна, и она уже есть — RunCommandBus с логом, аудитом «кто передвинул» и реплеем. Клик хозяина и клик напарника приходят ею одинаково, поэтому права, когда дойдут, встанут ОДНИМ фильтром на шине.

Отвергнуто два варианта, оба мои:

  1. Канал на действие (MapChoice + приёмник у хоста). Написан и удалён в тот же вечер: пока всем можно всё, он неотличим от правильного, а в день появления прав дал бы N мест для одной проверки — и забытая проверка выглядит как работающая функция.
  2. Общий канал интентов (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.