61aaa0bf35
build / mod (push) Failing after 22s
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>
127 lines
14 KiB
Markdown
127 lines
14 KiB
Markdown
# Продолжение 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 и полёт не
|
||
измерялись.
|