Решили: содержимое шага узла едет типизированной коробкой на каждый вид (RewardStage, InterludeStage, TextEventStage, OutcomeStage), а не общим списком строк с флагами. Состояние хранит коробку упакованной и распаковывает по виду (TryOpenReward и соседи); чужой вид не открывается.

Почему: общий мешок хватало ровно на один экран. Уже прощанию понадобилось положить заголовок в позицию 0, а тело в позицию 1, событию — целое число золота, исходу — второй флаг; смысл позиций при этом знали бы два файла на разных концах провода. Отвергли и второй вариант — свой сетевой канал на каждый экран: тогда «что сейчас на экране» перестаёт быть одним состоянием, и подключившемуся гостю пришлось бы опрашивать шестерых по очереди вместо одного.

Сказано: «Своя коробка на экран» (08.08.2026, сессия eab27015) — выбор Макса из трёх вариантов после разбора «на пальцах».

Грабли: переезд прощания вскрыл то, чего не было видно, пока экран публиковали двумя сообщениями: кадр-прощание и кнопки передышки живут на экране ОДНОВРЕМЕННО — кадр задником, кнопки поверх. Шаг узла отвечает на «что сейчас», а не «что добавить», поэтому двумя шагами второй молча стирает первый. Свели в один: ключи кладёт тот, кто вёл узел, а петля объявляет голые кнопки только если конец узла ещё не объявлен. У боя ключей нет — исход показан своим экраном.

Второе: порядок публикации теперь держит потребитель, а не тот, кто узел вёл. Кадр публикуется первым, иначе ляжет поверх кнопок.

Владелец правды: NodeStageState.cs, NodeStageScreens.cs, тесты NodeEndStageTests, NodeStageTests.