# Передача разработки AirDef Это журнал фактически сделанных изменений и ограничений проверки, а не список обещанных функций. Рабочая ветка `kimi-work`; issues не закрывать, публиковать комментарии с коммитом и проверками. Движок — отдельный `chexit/horizon-airdef`, ветка `airdef`, подключён точным gitlink `horizon/`. ## Контрольная точка перед #120 / #118 / #121 / #119 Исходное состояние этой серии: `2689d93`; движок закреплён на `86b1014a9218e68041444cbf52db02a85107c815`, уровень API 26. Рабочее дерево было чистым, коммиты опубликованы. Текущий точный pin всегда смотреть в `git ls-files --stage horizon`, а происхождение собранного пакета — в `airdef-mod/target/horizon-mod/build-identity.json`. Четыре задачи заказаны владельцем отдельно; на этой контрольной точке они **в работе**: | Issue | Заказанный остаток | |---|---| | #120 | Конечная работа двигателя перехватчика, coast, энергия манёвра, согласованные эффекты | | #118 | Типизированная доставка RM48U через ТЗМ; не создавать неподтверждённые носители | | #121 | Переключение излучения, сохранение разрешённого внешнего целеуказания, разведка излучателей | | #119 | Ослабление непрямого урона известным укрытием, ограниченная политика Unknown | Исполнители работают в отдельных worktree; интеграция, проверка и публикация идут небольшими коммитами в `kimi-work`. Не принимать наличие кода в соседнем worktree за опубликованную функцию. ## Что уже сделано в предыдущей серии Codex - `airdef-core` компилирует исходники `airdef-mod/src/sim/mod.rs` через `#[path]`. Это единый источник симуляции, но разделение домена и представления ещё не завершено (#87). - Исправлены остаточные терминальные коллизии ответных ударов и скачок после world-query (#106/#117). Восстановление ответов мира не даёт права телепортироваться к плановой точке. - Доработаны запись ответных ударов, launch one-shot и live-след (#109), lifecycle показа и часы отложенного звука (#88/#89). Полная унификация всех потребителей сцены ещё не закончена. - Движок вынесен в отдельную репу; сборщик берётся из закреплённого форка, а не случайного PATH. Есть build identity, настоящий WASM contract и handshake доступности дыма API26 (#102/#104). - Обновлён upstream Horizon 0.2.97, исправления очереди/инвалидации акустики сохранены. Измерительные fixtures, notices и лицензии добавлены; прослушивание и массовый CPU-тест ещё нужны (#96). - Pipeline поддерживает authored overrides, manifest и экспорт итоговых габаритов в `sim/generated_bounds.rs`. Навигация учитывает footprint. Generated output вручную не редактировать. - Улучшены модели наземной техники; степень сходства и материалы ещё промежуточные (#115). Галерея: `MODEL-PILOTS.md`, `VEHICLE-MODELS.md`; это не приёмка всех летательных аппаратов. - `966b52f`: раздельные ПУ С-400/С-500, роли Radar Search/Engagement/Height/Multi. Чужая подсказка разрешает огневому радару уточнение, но не подменяет собственное измерение. - `966b52f`: резерв конкретной ячейки, отдельные крышки ТПК, выброс до включения двигателя. RM48U — условный игровой профиль С-400; AA и ground rounds делят четыре физические ячейки. Боеприпас списывается при выбросе, не при выдаче отложенного приказа; отмена не расходует его. - Конфигурация, маска использованных ячеек и положение крышек включены в save/replay. Smoke начинается в точке зажигания. С-500 ограничен двумя ракетами по числу ТПК; старое сохранение с четырьмя загруженными ракетами при загрузке ограничивается двумя. - `2689d93`: документированы источники архитектуры батареи, команды, скриншоты и границы визуальной проверки. ## Проверки и воспроизведение На `966b52f`: 169 тестов ядра + 4 сценария прошли, 7 ignored; адаптер — 53 теста, 1 boundary и 4 сценария прошли; WASM contract — 21 шаг. Это исходная контрольная точка, не результат будущих четырёх задач. На `2689d93` собран чистый пакет (`airdef_dirty=false`). ```sh cargo test --manifest-path airdef-core/Cargo.toml cargo test --manifest-path airdef-mod/Cargo.toml python3 tools/airdef.py test-wasm python3 tools/gen_models.py --check python3 tools/test_gen_assets.py git diff --check ``` На этой macOS cargo находится в `~/.cargo/bin/cargo`. GUI-проверки запускать с отдельным `HORIZON_HOME` и рабочим каталогом тестового мира; не использовать реальные сохранения владельца. Metal-проверки не подтверждают Windows/Linux, HDR всех платформ или прослушивание звука. Скриншоты крышек подтверждают только их позу: полного видео выброса/зажигания пока нет. ## Важные ограничения для следующего агента ### #119: непрямой взрыв и укрытия `WorldCache::blast_cover` читает текущую occupancy без запросов мира и без загрузки чанков. Три луча к репрезентативным точкам корпуса дают общий множитель для корпуса и узлов; для отмеченного объекта считается своя тройка. Известное укрытие оставляет 15% игрового воздействия по перекрытому лучу, открытый — 100%; края/проёмы дают промежуточное значение. Все лучи этого вызова читаются до отправки разрушения в движок. Исходный воксель пропускается, чтобы контакт на поверхности стены не закрывал взрыв сразу во все стороны. Unknown, stale и слишком старые секции считаются **неразрешёнными**. Ожидание равно нулю: для них сохраняется прежний неослабленный урон как консервативная игровая политика, а не утверждение, что там воздух. После ответа мира этот взрыв не пересчитывается. Нет очереди отложенного урона и повторного применения на world reply. Частичные блоки на этом этапе считаются занятым кубом; тонкая collision shape для blast отдельно не запрашивается. Прямой вооружённый контакт не ослабляется этим множителем. Проверки `sim::damage::cover_tests`: стена/проём для корпуса, узлов и объекта; Unknown и поздний ответ без повторного урона/запросов; прямое попадание; устаревшая геометрия; пропуск исходного блока. Все четыре прошли. Объединённый полный прогон будет указан ниже. - Не закрывать issue даже после исправления; сообщать проверенный объём и остаток в комментарии. - Не переписывать gitlink на плавающую ветку. Изменения движка сначала публикуются отдельно. - Не путать наблюдённый трек с настоящим положением цели и `own_tick` с relay. - Не менять live-мир при seek; replay воспроизводит последствия, не применяет урон повторно. - Не считать Unknown свободным пространством или подтверждённой стеной без явной игровой политики. - Новые числа — игровой масштаб, не реальные характеристики вооружения. - Токен Gitea читать из локального файла во время запроса; не коммитить и не печатать.