Решили: возможности игрока живут одним реестром в трёх категориях — право (что он может инициировать), состояние (что оба обязаны знать) и подача (что оба обязаны увидеть), — а одинаковость подачи делается хешем от стабильного ключа, а не общим seed.

Почему три категории, а не две. Право и состояние различают все, и мы тоже. Третьей у нас не было — и ровно она потерялась: наезд камеры с затемнением при входе в узел не право и не состояние, поэтому не имел дома и не попал ни в один список. Подача не выводится из состояния принципиально: состояние отвечает «мы в узле», подача — «мы въезжаем прямо сейчас», и кто прочитал состояние позже, тот переход уже пропустил. Категория, которой нет в списке, теряется системно, а не случайно.

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

Почему один файл, а не фичер-лист рядом с контрактом синхронизации. Перечень возможностей игрока с двумя владельцами разъедется за две недели, и никто не будет знать, какой врёт. Кооп стал колонкой, а не отдельным документом.

Сказано: «Хотя некоторая “подача” было бы хорошо, если бы была синхронизирована? Или зависела от сида и была хотя бы похожа. Те же разлеты каких-то частиц, рандоманая анимация атаки в важном эффекте или чет такое. Т.е. в подаче надо поделить что стоит оба видеть одинаково, а что - все равно.» и «я бы создал фичер лист нашего проекта (все наши фичи, анимки, возможности). Выписал бы их отдельно, постоянно бы ввел и дополнял.» (04.08.2026, сессия 90652c3d). Деление подачи — его; отвергнутый seed и три полки вместо двух — уточнение по ходу.

Грабли: курсору предсказание с откатом не нужно и не было нужно — своё положение локально и откатывать его нечего, а чужое сглаживает интерполятор, который стоит с 31.07. Полчаса ушло на проверку того, что уже сделано лучше, чем предлагалось.

Владелец правды: docs/player-capability-registry.md, тест PlayerCapabilityRegistryTests (полнота по RunCommandKind и NetChannel), жанр реестра в scripts/journals.ps1.