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

14 KiB
Raw Permalink Blame History

Продолжение 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. Кадры и ограничения. tools/model-preview воспроизводит реальный set-models, glow=false; установленный stone-template блок не подходит для оценки света динамической модели. Полосы яркости на наклонных сегментах вынесены в #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.
  • #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 дорожки. Это не замер полного игрового 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: 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 (раздел про кинорежиссёра) и ENGINE (раздел про захват). Очистка временных файлов при ошибке энкодера исправлена в движке 73b9d3070: лог удаляется, его последние строки входят в текст ошибки, а готовый MP4 прежнего экспорта с тем же именем сохраняется. Акустика проверена отдельно в настоящем MP4 (пары on/off одного повтора, статусы ready, диффузный wet-остаток в каменном дворе); чистый хвост/RT60 и прослушивание остаются — ACOUSTICS. 10-минутный экспорт и Windows/Linux по-прежнему не проверены.

Обновление #123

Engine 45b43f00d: dynamic block models используют геометрическую нормаль квада вместо осевого facing; для вырожденных вершин сохранён прежний fallback. Unit-тест покрывает ±45°, другие наклоны, осевые и вырожденные квады. На реальном Lancet-инстансе через set-models, glow=false и HD получены парные кадры до/после в одном мире и ракурсе, а также вид сверху и ночью; полосы осевого освещения устранены. Кадры и ограничения. Массовый FPS и полёт не измерялись.