Решили: CombatSimulation рождается и умирает вместе с боем. Вне боя тела на арене держит
собственный слой мира, а не замороженная симуляция. Показ получает шов «источник кадра»: в бою его
кормит лента, вне боя — статичная сцена мира.
Выбрано Максом из трёх вариантов развилки, вариант «Боевая, миру свой держатель тел» (02.08.2026, сессия 9c8550b1). Отвергнуты: «мировая симуляция + RNG боя за швом» (дешевле на два дня, но граница боя остаётся объявляемой вручную) и «мировая симуляция + пересев при рождении скоупа» (полдня, но пункт «пересев вырван с корнем» из плана не выполняется честно).
Почему это дороже и всё равно правильно: пока симуляция живёт вечно, у боя нет границы в
lifecycle — её объявляют вызовами (ResetBattle, ReseedForBattle, три SetPaused, Reset() у
ленты), и каждый новый участник обязан на них подписаться. Кто не подписался, ломается молча.
Ровно так сломался повторный бой у гостя. С боевой симуляцией граница становится созданием и
уничтожением скоупа, и подписываться не на что.
Что делает вариант подъёмным (проверено чтением, а не предположено): CombatPresenter.Update
рисует только из кадра ленты — состав видов, снаряды, интерполяция, события. Живая симуляция
нужна ему лишь для dev-оверлеев. Значит поставщика кадра можно подменить, и показ этого не заметит:
в бою это BattleTapePlayback, вне боя — статичный кадр мира. Второе доказательство рядом: балансный
стенд SimEnvironment уже собирает симуляцию без мира, сети и карты — тот самый критерий, по
которому проверяется правильность реза.
Грабли: план фазы 1 я написала с критерием «пересев RNG удалён», не доведя до Макса развилку, от которой этот критерий зависит. Критерий требовал боевой симуляции, конституция persist-мира — мировой; противоречие лежало внутри принятого плана. Нашлось на первом же шаге разведки, до кода. Урок тот же, что днём раньше: критерий приёмки, который тянет за собой архитектурное решение, — это и есть архитектурное решение.
Владелец правды: Planning - Scope Hierarchy §3 и §7 (фаза 1
разбита на три шага под это решение); ход захода — docs/scope-split-progress.md.