Files
airdef/docs/CONTINUATION-2026-11-04.md
chexit 61aaa0bf35
build / mod (push) Failing after 22s
Record the Metal/offscreen camera picture acceptance
The final engine 6a53a626c with the API30 AirDef build was run in the
real game (macOS, Apple M5, Metal, --offscreen, a clean HORIZON_HOME and
copied test worlds), not only in the sandbox: the monitor and the film's
main view report ready with the picture actually drawn (screenshots show
the panel and picture area, not a registered target), an empty set-views
drops the request, a world change bumps the generation and clears it, and
AirDef's next submission prepares the camera again in the new world.

Fixes nothing: no defect showed. It also records what the run does not
prove (a human visual check, Windows/other GPUs, two runs with the same
local id on the GPU, a mod reload on the GPU), the per-tick
set-views/set-main-view ordering that can honestly read awaiting-frame
between tick and note (not flicker), and that a title trip back into the
same world keeps the request because the generation is per world.

Co-Authored-By: Kimi Code <noreply@moonshot.cn>
2026-11-04 21:10:34 +03:00

127 lines
14 KiB
Markdown
Raw Permalink 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.
# Продолжение 4 ноября: #115, #87, #91, #102, #96
Рабочая ветка `kimi-work`. Все issues оставлены открытыми. Работа выполнена Codex с GPT-6.1 Terra.
Движок опубликован в `horizon-airdef:airdef`, текущий pin
`57f8b2853c4443f7e3ff5701600cbb262b53118f`, API **29**.
## Изменения
- **#115:** authored-модели «Ланцета» и Х-101: сегментные стреловидные крылья,
детали носа/корпуса. Элементы 17→49 и 22→30 соответственно; игровые параметры не менялись.
`5366988`, `cfae0c1`, `914f723`. [Кадры и ограничения](AIRCRAFT-MODELS.md).
`tools/model-preview` воспроизводит реальный `set-models`, `glow=false`; установленный
stone-template блок не подходит для оценки света динамической модели. Полосы яркости
на наклонных сегментах вынесены в [#123](https://gitea.maoniao.team/chexit/airdef/issues/123).
- **#87:** `375fdf2`, `cb73cb7`, `0c870c1`: типизированный `BatteryStatus`, отчёт кэша мира
и причины повреждений отделены от русского форматирования. Команда/карта/монитор используют
адаптеры `battery_view`, `world_view`, `why_view`. Порядок и тексты сохранены.
Это постепенное разделение: `CheckReason::Text`, сообщения `Out` и часть представления в ядре остаются.
- **#91:** `eea1b36`, `1553976`, `daa9ed7`: `catalog/content.json` — идентичности техники,
предметы и метаданные иконок; `catalog/sounds.json` — звуковые события, дальности и far-варианты.
`gen_catalog.py` создаёт Rust-константы, Python-регистрации читают тот же источник;
CI проверяет актуальность. Сохранены порядок позиционных сейвов, все 35 звуковых событий,
OGG и порядок общего RNG синтезатора. Числовые `DroneSpec`/`SamSpec` остаются типизированным
источником в Rust; полного переноса всех характеристик в JSON не было.
Продолжение переноса чисел — ниже.
- **#102:** `63aefc7`: `test-budgets` включает настоящий `--fuel-profile` и сохраняет
`measured_fuel.callbacks`, включая ошибки. Отсутствие запрошенных счётчиков запрещает success.
В движке `6230ec703`/`d8fa77b00` добавлены API28 point-lights-status и API29 sound-sources-status.
Свет: заявка → cache → обработка main-view HD списка; звук: заявка → фактический apply
source manager при live/offline output. Отдельные run/world/source epochs, clear/reload и
отсутствие output проверены настоящими Wasmtime-гостями. Это не обещание пикселя/слышимости.
`/airdef capabilities` показывает оба состояния (`c1a595b`).
`57f8b2853` также устраняет коллизию камер: texture targets, scheduler, HUD/canvas/corner и
main-view адресуются `(run_serial, local_id)`. Проверены два настоящих гостя с одинаковым ID,
поиск target и scheduler, компиляция клиента.
`efe017ffb`/`278f356aa` добавляют API30 `camera-status`: `prepared` — закодированный в target
кадр камеры или кадр мира с её main-view, причём milestone получает только тот запуск, чей выбор
экран реально использовал (чужой тот же local ID и чужая картинка его не готовят). `enabled` —
последний отмеченный кадр был кадром мира, не заголовком. Пустая `set-views` и смена мира
очищают заявку/выбор/готовность, reload начинает заново; главный вид теряет picture target до
нового кадра. Проверено настоящими Wasmtime-гостями. Итоговый engine `278f356aa` с AirDef API30
проверен и в запущенной игре на Metal/offscreen (Apple M5, чистый `HORIZON_HOME`, копии тестовых
миров): monitor даёт `ready` с нарисованной картинкой (по снимкам), film-main-view — `ready` с
main-view (на экране карточка подготовки фильма), пустая заявка
и смена мира — `not-requested` с новым поколением, после deploy+monitor камера снова готова;
команды и ограничения — в [ENGINE.md](ENGINE.md#gpu-приёмка-картинки-камер-metaloffscreen).
- **#96:** engine `e44ad82a9`: opt-in `audio::tests::export_moving_mass_raid` проводит
100 движущихся двигателей и 16 импульсных источников через настоящие `Audio::tick_acoustics`
и `film_mix`: эхо/реверб, камера, инвалидация и смена epoch, новый capture без старого хвоста.
Два 6-секундных прогона дают одинаковые float-сэмплы; ненулевая дорожка, finite/peak и reset
проверяются assertions. Сэмплы и геометрия синтетические, устройство звука не открывается.
Release на Apple M5: step+mix на 50 мс аудио — p50 **3.55 мс**, p95 **4.30 мс**, max **5.57 мс**.
[Отчёт и SHA дорожки](measurements/mass-acoustics-2026-11-04.json).
Это не замер полного игрового CPU/GPU, не Windows FPS и не готовый MP4.
## Продолжение #91: один источник чисел
`catalog/specs.json` теперь единственная копия числовых строк симуляции: 13 дронов
(`DroneKind::spec`), 9 ракет (включая `seeker`, звук пуска и голос мотора), 15 комплексов
(`SamKind::spec`, включая части моделей и именованные наборы), общие константы гравитации,
высоты раскрытия «Орешника», приводов и логистики. `tools/gen_catalog.py` генерирует
`airdef-mod/src/sim/specs_generated.rs` и `unit_specs_generated.rs`; `include!` встраивает их в
`mod.rs` и `units.rs`, поэтому мод и `airdef-core` компилируют одни и те же строки. Прежние
`match`-литералы удалены; `DroneKind::spec`, `MissileKind::spec`, `SamKind::spec` и их производные
(RCS, seeker, звуки, голос) читают сгенерированные константы.
`load_specs` проверяет схему, звуковые ссылки, совпадение набора kinds с `content.json`, ссылки на
именованные части и то, что каждая строка кем-то используется; `gen_catalog.py --check` уже в
CI-шаге «Проверка generated assets», поэтому расхождение JSON и Rust валит сборку.
Сверка перед переносом: JSON сравнивался с литералами `632061d` по всем полям. Голос P1-SUN —
тонкое место: фактически играет ранний возврат `flame == 0` в старом `voices.rs`
(`(DRONE_LANCET, 0.8, 1.6)`), а `P1sun => 1.7` в `match` недостижим. Первая версия сверки ошибочно
приняла недостижимую ветку за факт и поставила в JSON 1.7 — это меняло звук перехватчика; fixup
вернул 1.6 и добавил регрессию `missile_engine_voices_keep_their_played_values` (P1-SUN и M48N6).
После генерации строки сверены с прежними литералами поле-в-поле (включая части моделей и
именованные refs) — расхождений нет. Порядок raid/save, ключи `sam`/дронов, RNG и тексты не менялись.
Проверки этого этапа: `cargo test --release` ядра — **194 passed, 7 ignored** + **8 сценариев**;
адаптер — **64 unit**, **1 boundary**, **5 сценариев**; `gen_catalog.py --check`, `gen_models.py --check`,
тесты генераторов/звука/границ моделей; настоящий WASM `test-wasm` — **27 шагов**, 1 скрипт.
GUI/MP4 и варианты комплексов (разные ракеты/профили по батареям) в этот этап не входили.
## Проверки и продолжение
Объединённый core release: **193 unit**, 7 ignored, **8 сценариев**; адаптер: **64 unit**,
**1 boundary**, **5 сценариев**. Генераторы catalog/models, asset pipeline, sound references,
границы моделей и 6 тестов provenance/failure отчёта проверяются отдельно. Лёгкий WASM — 27 шагов.
Тяжёлый default fixture — 271 шаг с двумя принятыми налётами; его текущий отчёт пишет
`python tools/airdef.py test-budgets` в `.horizon-cache/wasm-budget-report.json`.
Чистый финальный прогон `56339b0` с API29 сохранён в
[api29-wasm-budget.json](measurements/api29-wasm-budget.json): tick max 106132646/300000000,
command max 1013387/1000000000, ошибок 0, build identity совпал.
Не завершены: субъективное прослушивание, настоящий MP4 с акустикой, полный 10-минутный
replay/export, расширенная модельная/ночная/FPS приёмка, визуальная/Windows-GPU приёмка
camera-ready картинки и полные query/voice/peak-memory бюджеты.
Старый допуск broadband RT60 35% не ужесточался до 15%.
Попытка живого MP4 в этом проходе не дала проверенного файла и за приёмку не считается;
изолированные процессы закрыты. Продолжать с текущего pin, не с временных пакетов агентов.
Обновление Windows прежнее: `git switch kimi-work`, `git pull --ff-only`,
`python tools/airdef.py all`, `python tools/airdef.py play`.
## Обновление #89 (4 ноября, после этого прохода)
Живой короткий MP4 получен и проверен на pin `57f8b2853` (API 29) на scratch `HORIZON_HOME`/мире:
h264 + AAC, отчёт мода совпадает с `ffprobe nb_frames`, отмена/ошибка SDK/ошибка энкодера/повторный
запуск проходят. Найден и исправлен дефект: выход в заголовок во время экспорта оставлял захват
записывать заголовок (запрос `sec=10` дал 3898 кадров); теперь показ завершается по кадровому хуку.
Подробности и проверенные ограничения — [HD-RENDERER](HD-RENDERER.md) (раздел про кинорежиссёра)
и [ENGINE](ENGINE.md) (раздел про захват). Очистка временных файлов при ошибке энкодера
исправлена в движке `73b9d3070`: лог удаляется, его последние строки входят в текст ошибки, а
готовый MP4 прежнего экспорта с тем же именем сохраняется. Акустика проверена отдельно в настоящем
MP4 (пары on/off одного повтора, статусы ready, диффузный wet-остаток в каменном дворе); чистый
хвост/RT60 и прослушивание остаются — [ACOUSTICS](ACOUSTICS.md). 10-минутный экспорт и Windows/Linux
по-прежнему не проверены.
## Обновление #123
Engine `45b43f00d`: dynamic block models используют геометрическую нормаль квада вместо осевого
`facing`; для вырожденных вершин сохранён прежний fallback. Unit-тест покрывает `±45°`, другие
наклоны, осевые и вырожденные квады. На реальном Lancet-инстансе через `set-models`, `glow=false`
и HD получены парные кадры до/после в одном мире и ракурсе, а также вид сверху и ночью; полосы
осевого освещения устранены. [Кадры и ограничения](AIRCRAFT-MODELS.md). Массовый FPS и полёт не
измерялись.