Решили: состав арены у гостя едет ОДНИМ путём во всех случаях — паспортами и лентой, пока ареной владеет симуляция. Лента для этого досылает «кадр покоя»: тот же кадр заново, 10 Гц, пока сим на паузе.
Почему: до этого у одного факта «кто стоит на арене» было два владельца и одна дыра между ними.
В забеге тела гостю ставил снимок RunState (GuestPartyFollower), в бою — лента. Ристалище и PvP
не покрывались ни одним: забега там нет вовсе, а лента молчала. Отвергнут отдельный канал «состояние
расстановки»: он стал бы ТРЕТЬИМ способом сказать то же самое, и разошёлся бы с лентой ровно так же,
как снимок разошёлся с ней сейчас. Снимок забега при этом остаётся владельцем durable-состояния
(гильдия, золото, прогресс) — тел на поле он больше не касается.
Сказано: «Думаю, лучше чтобы все работало одинаково, из одного источника правды. Чтобы и забег и ристалище оба работали однотипно для клиента.» (04.08.2026, сессия fef16360). Решение о единстве пришло от Макса; выбор канала — инженерный.
Грабли: симптом «гость не видит юнитов» выглядел как поломка ленты, а держался на двух разных
причинах в одной строке. Кадры лента адресует ТИКАМИ, а на паузе тик не растёт: продюсер честно
переписывает кадр под тем же номером, нарезчику слать нечего. И поверх этого — свежая арена стоит на
тике ноль, поэтому readyThrough = CurrentTick - 1 давало −1 и раздача выходила по «нечего слать»
ДО всякой логики: ни одного кадра не уезжало никогда. Первая причина ищется в протоколе, вторая — в
одной строке проверки, и починка только второй дала бы «юниты появились, но не двигаются».
Владелец правды: Net/Tape/BattleTapeBroadcast.cs (когда слать), Net/Tape/TapeChunkPump.cs
(Resend — почему граница не двигается), заметки прогона — docs/qa-coop-progress.md.