Решили: у каждого сетевого канала есть объявленный владелец формата, а у выделенного кодека —
прогон туда-обратно; список каналов для этой проверки выводится из перечисления, поэтому новый
канал без строки в реестре роняет тест (NetChannelFormatRegistryTests).
Почему: канал состава сеанса кодека не имел — писатель жил в HostSessionRoster, читатель в
GuestSessionRoster, за сотню строк друг от друга. Правка cf7663512, добавившая участнику место,
дописала байт в обе половины ХОЗЯЙСКОЙ стороны и не тронула гостевую: хозяин стал писать шесть полей
на участника, гость читать пять; гость представлялся тремя, хозяин читал четыре. Обе стороны
глотали разбор и выходили с комментарием «чужая версия» — при том, что версия и отпечаток контента
сверяются рукопожатием, то есть расхождение было нашим собственным. Отвергли автоматическую
проверку «у канала должен быть класс *Codec»: у части каналов формат честно живёт внутри одного
класса (рукопожатие, управление боем), и требовать от них пустых обёрток дороже, чем перепись. Но
канал, у которого владелец формата не назван вообще, — ровно тот случай, с которого начался разъезд.
Сказано: «Что берем в работу все, и надо создать норм систему, СТРУКТУРУ или что-то еще чтобы в принципе таких различий быть не могло, посадить все на ОДНИ рельсы. Мы ведь так можем?» (08.08.2026, сессия eab27015).
Грабли: поломка была невидима на всех наших зелёных. Компиляция зелёная, рукопожатие проходит
(«гость 1 принят: версия и контент сошлись»), EditMode зелёный — а состав не доезжает никуда:
у гостя список участников пуст всегда, у хозяина ник, цвет и скин гостя не применяются никогда.
Дальше цепочка уводит в сторону от причины: гость не находит себя в составе, SessionPlayerRouter
тихо падает на дев-ручку GameConfig.LocalPlayerTeam, и в PvP гость считает себя стороной хозяина —
на экране это выглядит как «оба управляют одной командой», то есть как дефект прав, а не формата.
Второй канал (Decision) имел ту же раскладку плюс третий разбор в тесте и просто не успел
сломаться. DeploymentIntentCodec был internal — тест до него не дотягивался вовсе.
Владелец правды: SessionRosterCodec.cs, DecisionCodec.cs, тесты
SessionRosterCodecTests, DecisionCodecTests, DeploymentIntentCodecTests,
NetChannelFormatRegistryTests.