Files
airdef/docs/CODEX-HANDOFF.md
T
chexit c96676f3e5
build / mod (push) Failing after 18s
feat: attenuate indirect blast damage behind known cover
Use a bounded read-only pre-destruction occupancy sample; preserve conservative damage for unresolved geometry and do not defer or repeat damage on replies.

Co-authored-by: Codex <codex@openai.com>
2026-11-02 23:55:38 +03:00

10 KiB
Raw Blame History

Передача разработки 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).

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 читать из локального файла во время запроса; не коммитить и не печатать.