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

101 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Передача разработки 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 читать из локального файла во время запроса; не коммитить и не печатать.