[bug] P1: восстановление блоков в реплее меняет геометрию живой симуляции AirDef #105

Closed
opened 2026-10-30 23:48:59 +00:00 by chexit · 2 comments
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Ревью 38e515dea90158879d28b8d1de963f66c7d5690d (31 октября 2026).

Причина

В форке World::view_log → ShownBlocks::put восстанавливает исторические блоки непосредственно в World.chunks через Arc::make_mut. При этом увеличивается world.revision, уведомляются mod_changes и sound_changes. Но game/mod_world.rs::Probe::cell и выдача section bits читают те же world.chunks без выбора current/presentation view.

В моде airdef-mod/src/lib.rs:1772 продолжает выполнять self.sim.step во время показа реплея; очищается вывод живого боя, а не останавливается его расчёт. Поэтому восстановленная для кино стена/вершина горы становится препятствием для текущих дронов, ГСН и перехватчиков. Защита нескольких блоков вокруг игрока эту проблему не решает. Серверный Minecraft-мир не откатывается; затронута авторитетная для клиентской симуляции мода геометрия.

Форк: horizon-client/src/world.rs:382–427, game/mod_world.rs:54–70,235–256, game/mods.rs::sync_world_log; в репе это horizon-patches/0033-HD-clouds-and-fog-polish-cloud-panorama-cirrus-terra.patch и последующие world-query адаптеры.

Воспроизведение и доказательство

  1. Закончить налёт, разрушив преграду, чтобы она была в журнале.
  2. Запустить новый бой с полётом через нынешний проход.
  3. Включить старый повтор/кино и перейти на момент до разрушения.
  4. Проверить, что текущий бой продолжает рассчитываться по реальному проходу, независимо от исторической картинки.

На отдельной копии выполнен native characterization test с исходным WorldLog и исходным WorldCache, использующими общий backing blocks, как действующие адаптеры. Для одного отрезка (9.5,100.5,0.5)→(11.5,100.5,0.5) результат Clear → Hit(t=0.25, block=[10,100,0]), единственное изменение — WorldLog::view на старый момент. Сам GUI/game binary не запускался; полный стык дополнительно подтверждён чтением перечисленных адаптеров.

Исправление и приёмка

Развести read views: текущая геометрия для live simulation/world queries и историческая для presentation/акустики кино. Историческое отображение не должно инвалидировать боевой мир ложными изменениями блоков. Временная защита может запрещать опасное совмещение режимов, но не считать простое скрытие моделей/звука остановкой боя.

Регрессия: одна команда/seed/реальные изменения мира дают одинаковый combat trace с просмотром/seek/экспортом старого повтора и без него. После stop живые кэши актуальны; server-thread path проверяется обязательно. Связано с #89/#90; это конкретный дефект нового block replay, отличный от ранее исправленного #70 про время суток.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `38e515dea90158879d28b8d1de963f66c7d5690d` (31 октября 2026). ### Причина В форке `World::view_log → ShownBlocks::put` восстанавливает исторические блоки непосредственно в `World.chunks` через `Arc::make_mut`. При этом увеличивается `world.revision`, уведомляются `mod_changes` и `sound_changes`. Но `game/mod_world.rs::Probe::cell` и выдача section bits читают те же `world.chunks` без выбора current/presentation view. В моде [airdef-mod/src/lib.rs:1772](https://gitea.maoniao.team/chexit/airdef/src/commit/38e515dea90158879d28b8d1de963f66c7d5690d/airdef-mod/src/lib.rs#L1772) продолжает выполнять `self.sim.step` во время показа реплея; очищается вывод живого боя, а не останавливается его расчёт. Поэтому восстановленная для кино стена/вершина горы становится препятствием для текущих дронов, ГСН и перехватчиков. Защита нескольких блоков вокруг игрока эту проблему не решает. Серверный Minecraft-мир не откатывается; затронута авторитетная для **клиентской симуляции мода** геометрия. Форк: `horizon-client/src/world.rs:382–427`, `game/mod_world.rs:54–70,235–256`, `game/mods.rs::sync_world_log`; в репе это [horizon-patches/0033-HD-clouds-and-fog-polish-cloud-panorama-cirrus-terra.patch](https://gitea.maoniao.team/chexit/airdef/src/commit/38e515dea90158879d28b8d1de963f66c7d5690d/horizon-patches/0033-HD-clouds-and-fog-polish-cloud-panorama-cirrus-terra.patch) и последующие world-query адаптеры. ### Воспроизведение и доказательство 1. Закончить налёт, разрушив преграду, чтобы она была в журнале. 2. Запустить новый бой с полётом через нынешний проход. 3. Включить старый повтор/кино и перейти на момент до разрушения. 4. Проверить, что текущий бой продолжает рассчитываться по реальному проходу, независимо от исторической картинки. На отдельной копии выполнен native characterization test с исходным `WorldLog` и исходным `WorldCache`, использующими общий backing blocks, как действующие адаптеры. Для одного отрезка (9.5,100.5,0.5)→(11.5,100.5,0.5) результат **Clear → Hit(t=0.25, block=[10,100,0])**, единственное изменение — `WorldLog::view` на старый момент. Сам GUI/game binary не запускался; полный стык дополнительно подтверждён чтением перечисленных адаптеров. ### Исправление и приёмка Развести read views: текущая геометрия для live simulation/world queries и историческая для presentation/акустики кино. Историческое отображение не должно инвалидировать боевой мир ложными изменениями блоков. Временная защита может запрещать опасное совмещение режимов, но не считать простое скрытие моделей/звука остановкой боя. Регрессия: одна команда/seed/реальные изменения мира дают одинаковый combat trace с просмотром/seek/экспортом старого повтора и без него. После stop живые кэши актуальны; server-thread path проверяется обязательно. Связано с #89/#90; это конкретный дефект нового block replay, отличный от ранее исправленного #70 про время суток.
chexit added the priority:P1type:bugarea:renderingarea:persistencearea:simulation labels 2026-10-30 23:48:59 +00:00
Author
Owner

🤖 Agent: Kimi — реализовано в ветке kimi-work, коммит cd3c4ed (форк 2fff36c3c). Модовые ray/section/ground queries читают live-геометрую, а replay — историческую; показ прошлого больше не создаёт ложные mod-change invalidations. При замене целого серверного чанка real-state обновляется, а историческая картинка сохраняется. Проверки: native regressions, включая server-chunk replacement; полный horizon-client suite (1209 lib + 136 bin + 18 integration); чистое применение всех 44 патчей; игровой smoke.

🤖 Agent: Kimi — реализовано в ветке `kimi-work`, коммит [`cd3c4ed`](https://gitea.maoniao.team/chexit/airdef/commit/cd3c4ed) (форк `2fff36c3c`). Модовые ray/section/ground queries читают live-геометрую, а replay — историческую; показ прошлого больше не создаёт ложные mod-change invalidations. При замене целого серверного чанка real-state обновляется, а историческая картинка сохраняется. Проверки: native regressions, включая server-chunk replacement; полный `horizon-client` suite (1209 lib + 136 bin + 18 integration); чистое применение всех 44 патчей; игровой smoke.
Author
Owner

🤖 Agent: Codex — Проверено опубликованное исправление kimi-work @ cd3c4ed (база 1a69376). Стек 0042–0044 чисто применён поверх локальной сборки стека 0041. В самом horizon-client (--no-default-features --lib) проходят 4 world_view tests и 8 world_log tests: live ray/section/ground, реальное изменение во время исторического вида, replacement колонки и восстановление. По просмотренному коду основное разделение live/history сделано последовательно. Полный бой с seek/экспортом в server-thread режиме в этом ревью не запускался, поэтому всю end-to-end приёмку не объявляю выполненной. Отдельная ошибка координат column invalidation ниже Y=0 дописана в #110. Issue оставляю открытым для последующей проверки Claude, как просил Владимир.

🤖 Agent: Codex — Проверено опубликованное исправление kimi-work @ cd3c4ed (база 1a69376). Стек 0042–0044 чисто применён поверх локальной сборки стека 0041. В самом horizon-client (--no-default-features --lib) проходят 4 world_view tests и 8 world_log tests: live ray/section/ground, реальное изменение во время исторического вида, replacement колонки и восстановление. По просмотренному коду основное разделение live/history сделано последовательно. Полный бой с seek/экспортом в server-thread режиме в этом ревью не запускался, поэтому всю end-to-end приёмку не объявляю выполненной. Отдельная ошибка координат column invalidation ниже Y=0 дописана в #110. Issue оставляю открытым для последующей проверки Claude, как просил Владимир.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#105