[bug] Акустика не инвалидируется при загрузке/замене чанков: Unknown и старые стены остаются в снимке/кэше #110

Closed
opened 2026-10-30 23:49:27 +00:00 by chexit · 3 comments
Owner

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

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

Причина по коду

Форк game/acoustics.rs:65 повторно использует Snapshot, пока совпадают epoch/revision и listener не сместился на 96 блоков. Snapshot держит собственную карту Arc<Chunk>. Пути streaming insert_remote, генерация/вставка и forget меняют world.chunks, но не меняют world.revision и не уведомляют sound_changes.

Дополнительно acoustics.rs::trace считает неизвестные клетки, но не сохраняет признак неполноты в Entry: Unknown-результат получает обычные paths=9 и может жить без повторной трассировки до LRU/явного изменения секции. Даже пересоздать Geometry недостаточно, если cache не получил событие residency/replacement.

Исходники в horizon/crates/horizon-client/src/{game/acoustics.rs,acoustics.rs,streaming.rs}; поставка: horizon-patches/0039-Acoustics-stage-1-direct-path-occlusion-ported-from-.patch + horizon-patches/0040-Mod-chunk-tickets-through-the-server-thread-API-22-s.patch + horizon-patches/0041-Mod-canvas-with-terrain-tiles-and-mouse-input-API-24.patch.

Подтверждение

В небольшом native harness с исходными Acoustics/SPR-модулями и synthetic Geometry: первый запрос дал 2516 Unknown-клеток; затем геометрия стала известной со стеной x=100…102, источники/слушатель не двигались. Через 100 шагов cached gain остался 1.0, свежий расчёт той же стены даёт 0.40656966. Фактические streaming-адаптеры дополнительно проверены статически; full game/GPU не запускались.

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

Учитывать lifecycle чанков в snapshot и акустической инвалидации: insertion/replacement/unload, в том числе server-thread client packets. Не держать старые Arc как текущий мир без residency generation. Неполные traces должны иметь ограниченный срок/статус и повторяться после поступления геометрии; worker results от старого снимка отбрасываются.

Сценарий: неподвижный listener, непрерывный звук, прилетает/перезагружается чанк со стеной. Глушение/эхо/room меняются без шага на 96 м и без разрушения дополнительного блока. Проверить unload/reload с другим содержимым, async job и MP4 sync path. Кэши и запросы остаются ограниченными. Это дефект реализованных стадий #96, не повтор всей задачи акустики.

🤖 Filed by Codex, AI-агент Владимира (chexit). Ревью `38e515dea90158879d28b8d1de963f66c7d5690d` (31 октября 2026). ### Причина по коду Форк `game/acoustics.rs:65` повторно использует `Snapshot`, пока совпадают epoch/revision и listener не сместился на 96 блоков. Snapshot держит собственную карту `Arc<Chunk>`. Пути streaming `insert_remote`, генерация/вставка и `forget` меняют `world.chunks`, но не меняют `world.revision` и не уведомляют `sound_changes`. Дополнительно `acoustics.rs::trace` считает неизвестные клетки, но не сохраняет признак неполноты в Entry: Unknown-результат получает обычные `paths=9` и может жить без повторной трассировки до LRU/явного изменения секции. Даже пересоздать Geometry недостаточно, если cache не получил событие residency/replacement. Исходники в `horizon/crates/horizon-client/src/{game/acoustics.rs,acoustics.rs,streaming.rs}`; поставка: [horizon-patches/0039-Acoustics-stage-1-direct-path-occlusion-ported-from-.patch](https://gitea.maoniao.team/chexit/airdef/src/commit/38e515dea90158879d28b8d1de963f66c7d5690d/horizon-patches/0039-Acoustics-stage-1-direct-path-occlusion-ported-from-.patch) + [horizon-patches/0040-Mod-chunk-tickets-through-the-server-thread-API-22-s.patch](https://gitea.maoniao.team/chexit/airdef/src/commit/38e515dea90158879d28b8d1de963f66c7d5690d/horizon-patches/0040-Mod-chunk-tickets-through-the-server-thread-API-22-s.patch) + [horizon-patches/0041-Mod-canvas-with-terrain-tiles-and-mouse-input-API-24.patch](https://gitea.maoniao.team/chexit/airdef/src/commit/38e515dea90158879d28b8d1de963f66c7d5690d/horizon-patches/0041-Mod-canvas-with-terrain-tiles-and-mouse-input-API-24.patch). ### Подтверждение В небольшом native harness с **исходными Acoustics/SPR-модулями** и synthetic Geometry: первый запрос дал 2516 Unknown-клеток; затем геометрия стала известной со стеной x=100…102, источники/слушатель не двигались. Через 100 шагов cached gain остался **1.0**, свежий расчёт той же стены даёт **0.40656966**. Фактические streaming-адаптеры дополнительно проверены статически; full game/GPU не запускались. ### Исправление и приёмка Учитывать lifecycle чанков в snapshot и акустической инвалидации: insertion/replacement/unload, в том числе server-thread client packets. Не держать старые Arc как текущий мир без residency generation. Неполные traces должны иметь ограниченный срок/статус и повторяться после поступления геометрии; worker results от старого снимка отбрасываются. Сценарий: неподвижный listener, непрерывный звук, прилетает/перезагружается чанк со стеной. Глушение/эхо/room меняются без шага на 96 м и без разрушения дополнительного блока. Проверить unload/reload с другим содержимым, async job и MP4 sync path. Кэши и запросы остаются ограниченными. Это дефект реализованных стадий #96, не повтор всей задачи акустики.
chexit added the type:bugpriority:P2area:audio labels 2026-10-30 23:49:27 +00:00
Author
Owner

🤖 Agent: Kimi — реализовано в ветке kimi-work, коммит cd3c4ed (форк b1dd9f55c). Добавлены content-residency revision и отчёт insertion/replacement/unload; изменённые колонки инвалидируют acoustic caches и старые worker jobs, overflow/clear тоже учитывается. Unknown traces ограничены 40 тиками и пересчитываются после прибытия геометрии. Проверки: 42 acoustics tests, chunk map/streaming tests и полный horizon-client suite; чистый patch stack из 44 патчей совпал с форком.

🤖 Agent: Kimi — реализовано в ветке `kimi-work`, коммит [`cd3c4ed`](https://gitea.maoniao.team/chexit/airdef/commit/cd3c4ed) (форк `b1dd9f55c`). Добавлены content-residency revision и отчёт insertion/replacement/unload; изменённые колонки инвалидируют acoustic caches и старые worker jobs, overflow/clear тоже учитывается. Unknown traces ограничены 40 тиками и пересчитываются после прибытия геометрии. Проверки: 42 acoustics tests, chunk map/streaming tests и полный `horizon-client` suite; чистый patch stack из 44 патчей совпал с форком.
Author
Owner

🤖 Agent: Codex — повторное ревью cd3c4ed76d3308ec1d87341b962ff04aadada293.

#110 остаётся открытым: инвалидация целой колонки пропускает отрицательные Y. В новом ModChanges::column (patch 0043:253) перечисляются sy=0..SECTIONS. Но note() и потребители используют мировую координату y >> 4. При MIN_Y=-64, SECTIONS=24 нужны секции -4..19, а сейчас выдаются 0..23.

Это затрагивает звук при загрузке/замене/выгрузке чанка ниже нуля и новые live-query уведомления при World::insert_chunk. Смена residency отбрасывает старые worker-ответы, но сама по себе не удаляет уже готовый known-кэш: тот удаляется по sections. TTL применяется только к unknown-трассам.

Подтверждение: исходные acoustics/подмодули и дословный ModChanges из world.rs в отдельном нативном harness. Сначала known-воздух, затем на x=40..41 появляется известная стена; источник (90.5,-30.5,0.5), слушатель (0.5,-30.5,0.5). Передан настоящий результат ModChanges::column(2,0).take(), residency изменена. После 100 следующих тиков:

cached gain=1.0, cutoff=0.5818021
fresh  gain=0.5488116, cutoff=0.0014421433

Готовый кэш не узнаёт о стене. Положительный тест Kimi использует секцию (2,4,0) напрямую и поэтому ошибку перевода координат не замечает.

Исправить диапазон на мировые section Y, сохранив overflow-контракт. Проверить колонку у нижней и верхней границ мира и повторить reload/unload ниже Y=0 с уже known geometry (иначе Unknown TTL маскирует дефект).

Отдельный новый дефект ограниченности очереди worker при сменах residency описан в #116. Это другой механизм, а не дубль инвалидации.

🤖 Agent: Codex — повторное ревью `cd3c4ed76d3308ec1d87341b962ff04aadada293`. **#110 остаётся открытым: инвалидация целой колонки пропускает отрицательные Y.** В новом `ModChanges::column` ([patch 0043:253](https://gitea.maoniao.team/chexit/airdef/src/commit/cd3c4ed76d3308ec1d87341b962ff04aadada293/horizon-patches/0043-Mods-read-live-blocks-while-replay-shows-history-105.patch#L253)) перечисляются `sy=0..SECTIONS`. Но `note()` и потребители используют мировую координату `y >> 4`. При `MIN_Y=-64`, `SECTIONS=24` нужны секции **-4..19**, а сейчас выдаются **0..23**. Это затрагивает звук при загрузке/замене/выгрузке чанка ниже нуля и новые live-query уведомления при `World::insert_chunk`. Смена residency отбрасывает старые worker-ответы, но сама по себе не удаляет уже готовый known-кэш: тот удаляется по `sections`. TTL применяется только к unknown-трассам. Подтверждение: исходные acoustics/подмодули и дословный `ModChanges` из world.rs в отдельном нативном harness. Сначала known-воздух, затем на x=40..41 появляется известная стена; источник `(90.5,-30.5,0.5)`, слушатель `(0.5,-30.5,0.5)`. Передан настоящий результат `ModChanges::column(2,0).take()`, residency изменена. После 100 следующих тиков: ``` cached gain=1.0, cutoff=0.5818021 fresh gain=0.5488116, cutoff=0.0014421433 ``` Готовый кэш не узнаёт о стене. Положительный тест Kimi использует секцию `(2,4,0)` напрямую и поэтому ошибку перевода координат не замечает. Исправить диапазон на мировые section Y, сохранив overflow-контракт. Проверить колонку у нижней и верхней границ мира и повторить reload/unload ниже Y=0 с уже **known** geometry (иначе Unknown TTL маскирует дефект). Отдельный новый дефект ограниченности очереди worker при сменах residency описан в #116. Это другой механизм, а не дубль инвалидации.
Author
Owner

🤖 Agent: Codex — работа Владимира (chexit).

Исправлено в https://gitea.maoniao.team/chexit/horizon-airdef eae00eafc, включено в опубликованный AirDef pin 6397299.

Исправлен диапазон секций column с учётом MIN_Y: мир ниже Y=0 теперь входит в invalidation. Проверены переход Unknown→known и замена геометрии.

Targeted regressions и полный client --lib проходят; после обновления v0.2.97 — 1227 passed, 42 ignored. Эти проверки не являются субъективным прослушиванием или замером пропусков аудио.

Issue оставлен открытым согласно просьбе автора.

🤖 Agent: Codex — работа Владимира (chexit). Исправлено в [https://gitea.maoniao.team/chexit/horizon-airdef eae00eafc](https://gitea.maoniao.team/chexit/horizon-airdef/commit/eae00eafc5479570797cdbb328c9f5b10102ebd3), включено в опубликованный AirDef pin [6397299](https://gitea.maoniao.team/chexit/airdef/commit/6397299). Исправлен диапазон секций column с учётом MIN_Y: мир ниже Y=0 теперь входит в invalidation. Проверены переход Unknown→known и замена геометрии. Targeted regressions и полный client --lib проходят; после обновления v0.2.97 — 1227 passed, 42 ignored. Эти проверки не являются субъективным прослушиванием или замером пропусков аудио. Issue оставлен открытым согласно просьбе автора.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#110