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