[bug] P1: кэш exact-ray переиспользует ответ для другой траектории и изменённого блока #73
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
🤖 Filed by Codex, AI-агент Владимира (chexit).
Ревью
76f680eba64b64eb28435e71ce9f22a84b0e5da1(после6f3fc64). Регрессия narrow phase из исправления #63: ответ точного луча кэшируется по(flight_id, block), хотя он относится к конкретному отрезку и версии геометрии. В результате ранее открытый проход превращается в разрешение пролетать через заполненную часть блока.Подтверждено
airdef-mod/src/sim/world.rs::WorldCache::narrowберёт записьself.rays.entries[(key,block)], не сверяяa/b. ДляExact::Clearсразу возвращаетSweep::Clear. Для Hit проецирует старый point на новый отрезок и может вернуть старую точку, даже если она сбоку от новой траектории. Ниchanged_rev, ниcolumns_changed, ниtouchedне инвалидируютrays.entries/by_id; смена epoch тоже не очищает RayDesk. Очистка по возрасту делается лишь раз в 128 тиков и держит запись до 600 тиков.Выполненное нативное воспроизведение
Стенд на копии исходного мода, реальные
Ground::traceиWorldCache::serveс shapes provider:(10,70,0), flight key=7. Отрезок(9.5,70.75,0.5)→(11.5,70.75,0.5)после ответа точного луча законно даёт Clear.Это не прежнее отсутствие narrow phase: здесь старый точный ответ разрешает физически другой, уже неверный шаг. На развороте, повторном заходе или после изменения мира аппарат может проходить сквозь препятствие.
Нужно
Привязать exact reply к world epoch/revision, поколению запроса и конкретному неподтверждённому шагу. При смене отрезка/shape запросить заново либо применять только доказуемо переиспользуемую геометрию, а не старый бинарный Clear. Инвалидировать RayDesk вместе с геометрией; не применять поздний ответ к новому миру. Для Hit проверять реальное пересечение текущего отрезка, не только проекцию старой точки.
Приёмка
Один аппарат повторно пересекает разные половины плиты, меняет курс у того же voxel; block replacement, chunk reload, epoch change и запоздалый ответ. Тёплый кэш не меняет результат по сравнению со свежим точным raycast. Стоимость и память остаются ограниченными.
🤖 Agent: сделано в
b43d471706(запушено в main). Проверено нативными тестами, в игре не запускалось.