From e6a70004406b34ea17884875ce236a5fb4b849e4 Mon Sep 17 00:00:00 2001 From: chexit Date: Wed, 4 Nov 2026 18:07:15 +0300 Subject: [PATCH] docs: record the engine cleanup for failed film takes Engine 60cc7b11d removes a failed or cancelled take's video, raw sound and log, carries the log's last lines in the error, and only creates .mp4 after a successful finish. A real failing encoder on the scratch world left no temporaries and kept the earlier film byte for byte; successful audio and no-audio control films still verified. Co-Authored-By: Kimi Code --- docs/CONTINUATION-2026-11-04.md | 8 +++++--- docs/ENGINE.md | 15 ++++++++++----- docs/HD-RENDERER.md | 12 ++++++++---- docs/IMPLEMENTATION-STATUS.md | 2 +- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/docs/CONTINUATION-2026-11-04.md b/docs/CONTINUATION-2026-11-04.md index 20bd3e8..9c2185d 100644 --- a/docs/CONTINUATION-2026-11-04.md +++ b/docs/CONTINUATION-2026-11-04.md @@ -67,9 +67,11 @@ query/voice/peak-memory бюджеты. Старый допуск broadband RT60 h264 + AAC, отчёт мода совпадает с `ffprobe nb_frames`, отмена/ошибка SDK/ошибка энкодера/повторный запуск проходят. Найден и исправлен дефект: выход в заголовок во время экспорта оставлял захват записывать заголовок (запрос `sec=10` дал 3898 кадров); теперь показ завершается по кадровому хуку. -Подробности и ограничения (очистка временных файлов движком при ошибке энкодера) — -[HD-RENDERER](HD-RENDERER.md) (раздел про кинорежиссёра) и [ENGINE](ENGINE.md) (раздел про -захват). 10-минутный экспорт и Windows/Linux по-прежнему не проверены. +Подробности и проверенные ограничения — [HD-RENDERER](HD-RENDERER.md) (раздел про кинорежиссёра) +и [ENGINE](ENGINE.md) (раздел про захват). Очистка временных файлов при ошибке энкодера +исправлена в движке `73b9d3070`: лог удаляется, его последние строки входят в текст ошибки, а +готовый MP4 прежнего экспорта с тем же именем сохраняется. 10-минутный экспорт и Windows/Linux +по-прежнему не проверены. ## Обновление #123 diff --git a/docs/ENGINE.md b/docs/ENGINE.md index bfe8db4..babbff8 100644 --- a/docs/ENGINE.md +++ b/docs/ENGINE.md @@ -63,7 +63,8 @@ runtime закреплённого движка. Используется вре ## Акустика и владение захватом (API 27) -Текущий pin: `57f8b2853c4443f7e3ff5701600cbb262b53118f` (API 29). Акустические +Текущий pin: `73b9d307048fc44d7f21fa3c829fc5a855d144a6` (API 29; поверх `57f8b2853` — очистка +неудачного захвата). Акустические `render.acoustics-status` и `render.capture-owner-status` возвращают поколение, `available`, `enabled`, `request-accepted`, `prepared` и причину. В игре всё это показывает `/airdef capabilities`. Отсутствие запроса, выключение, ожидание backend и ошибка различаются. @@ -81,14 +82,18 @@ AirDef не принимает чужие Recording/Done за свой эксп сбрасывает готовность. Уже переданный writer файл на Encoding может всё же завершиться: это запрос отмены, не гарантия удаления файла. -Проверено на реальном экспорте 4 ноября (pin `57f8b2853`): +Проверено на реальном экспорте 4 ноября (pin `57f8b2853`; очистка ошибки в `73b9d3070`): - Смена мира доходит до движка только через снимок мода (`set_snapshot`). На экране заголовка тики не вызываются, поэтому мод без хука `frame` не сообщает о закрытии мира, и захват продолжает писать заголовок. AirDef теперь просит `frame` и завершает показ по `game.world-id = none`. -- При ошибке энкодера писатель удаляет только отменённые файлы: `<имя>.audio.raw` и - `<имя>.ffmpeg.log` остаются. Успешная и отменённая записи временных файлов не оставляют. - Это ограничение движка, а не мода; исправление — в `game/film.rs`. +- При ошибке энкодера временные файлы этого захвата (`<имя>.video.mp4`, `<имя>.audio.raw`, + `<имя>.ffmpeg.log`) удаляются, а последние строки лога переносятся в текст ошибки: ссылки на + уже удалённый лог больше нет. Кодировщик всегда пишет `<имя>.video.mp4`, а `<имя>.mp4` + появляется только после успешного mux или переименования, поэтому неудачный, отменённый или + беззвучный захват не перезаписывает и не удаляет готовый фильм прежнего экспорта с тем же + именем. Исправлено в `73b9d307048fc44d7f21fa3c829fc5a855d144a6` (`game/film.rs`), проверено + реальной ошибкой ffmpeg и контрольным MP4. ## Отдельный тяжёлый WASM tier diff --git a/docs/HD-RENDERER.md b/docs/HD-RENDERER.md index d8faed0..7d34f8f 100644 --- a/docs/HD-RENDERER.md +++ b/docs/HD-RENDERER.md @@ -368,7 +368,7 @@ HORIZON_HD_TAA=0 --out run-home-bench/out/taa-off` — A/B; `--baseline run-home - Мод-HUD (`set-hud`) теперь рисуется и при `set-main-view` (титры, леттербокс фильма); ванильный HUD по-прежнему скрыт. - Режиссура: `airdef-mod/src/film.rs` (план по записи, варианты ракурсов, проверка рельефа по высотам `Ground::land_state`, ускорение/замедление времени). -### Проверенный жизненный цикл MP4 (4 ноября, pin `57f8b2853`, API 29) +### Проверенный жизненный цикл MP4 (4 ноября, pin `57f8b2853`, очистка ошибки энкодера — `73b9d3070`, API 29) Реальный короткий экспорт на scratch `HORIZON_HOME`/мире (не на сохранениях игрока), Apple M5, Metal, ffmpeg 9.0.1. `/airdef replay export` с записанного налёта (4 цели, 4 перехвата), 640×360: @@ -383,9 +383,13 @@ ffmpeg 9.0.1. `/airdef replay export` с записанного налёта (4 ffmpeg не остаётся; сразу после отмены новый экспорт проходит. - отказ SDK (`size=10000x10000`): сообщение об ошибке, захват не остаётся, следующий экспорт проходит. - ошибка энкодера (подставной `HORIZON_FFMPEG`, отвечающий на `-encoders`, но падающий при записи): - «Экспорт не удался: … Broken pipe», файла и процесса нет; новый экспорт после неё проходит. - Движок при этом оставляет `<имя>.audio.raw` и `<имя>.ffmpeg.log` — очистка временных файлов при - ошибке писателя находится в `horizon/crates/horizon-client/src/game/film.rs` (вне этого репозитория). + «Экспорт не удался: … Broken pipe …: fake encoder failed: no such codec»; временных файлов и + процесса нет, а последние строки лога теперь в самом тексте ошибки (сам лог удалён). Готовый + `keep.mp4` прежнего экспорта с тем же именем остался байт-в-байт (sha256), как и беззвучный + `keepnone.mp4` после неудачного `noaudio`-экспорта с тем же именем. Движок `73b9d3070` всегда + пишет `<имя>.video.mp4`; `<имя>.mp4` появляется только после успешного mux/переименования. + Контрольный `ctrl` на итоговой сборке `73b9d3070` — h264 + AAC, 33 кадра, временных файлов нет; + `keep` (h264 + AAC, 32 кадра) и `keepnone` (только h264, 32 кадра) проверялись на той же правке. - **выход в заголовок во время экспорта** (до исправления): игра перестаёт тикать на экране заголовка, но продолжает кадры, поэтому захват писал заголовок; запрос `sec=10` дал 3898 кадров (129.9 с), временные `video.mp4`/`audio.raw` и ffmpeg оставались, а после возврата в тот же мир diff --git a/docs/IMPLEMENTATION-STATUS.md b/docs/IMPLEMENTATION-STATUS.md index de06e85..fe50898 100644 --- a/docs/IMPLEMENTATION-STATUS.md +++ b/docs/IMPLEMENTATION-STATUS.md @@ -15,7 +15,7 @@ | #72 | Upstream Horizon 0.2.97 объединён с форком; сохранена история; локальные тесты и Metal-полигон | Windows/Linux, native HDR, сравнительная производительность | | #87 | Каноническое SDK-free ядро `airdef-core`, используется модом и сценариями | Дальнейшее отделение текстового/визуального вывода домена от адаптера | | #88 | Типизированный журнал измеренных переходов; read-only Snapshot для Smoke/Shown; записанные пожары, позы, пуски и зажигание | Перевести оставшиеся model/audio adapters и режиссёра на общий снимок; замер полной 10-минутной записи | -| #89 | Session владеет Live/Replay/Export; явные часы/поколения; единый cleanup; задержанный звук следует часам показа; выход в заголовок завершает показ одним cleanup (хук `frame`, `Session::world_left`) | Реальный короткий MP4 проверен 4 ноября (звук/видео, отмена, ошибка SDK и энкодера, повторный запуск, совпадение кадров и хвоста очереди). Остаётся: очистка `*.audio.raw`/`*.ffmpeg.log` движком при ошибке энкодера; 10-минутный экспорт; приёмка Windows/Linux | +| #89 | Session владеет Live/Replay/Export; явные часы/поколения; единый cleanup; задержанный звук следует часам показа; выход в заголовок завершает показ одним cleanup (хук `frame`, `Session::world_left`); движок освобождает temp/лог ошибки энкодера и не трогает готовый MP4 | Реальный короткий MP4 проверен 4 ноября (звук/видео, отмена, ошибка SDK и энкодера, повторный запуск, совпадение кадров и хвоста очереди, сохранность прежнего MP4). Остаётся: 10-минутный экспорт; приёмка Windows/Linux | | #91 | Общий каталог доступности и потребители меню/инвентаря; явный RM48U-профиль; корректные подписи очередей | Единый источник всех чисел, звуков и Python-регистраций; проверка вариантов комплексов | | #92 | Authored overrides, проверка ссылок/PNG/границ, manifest, безопасная транзакционная генерация; registry/texture/icon modules | Дальнейшее ручное улучшение контента относится к #115 | | #96 | Акустические пути; измеренные синтетические occlusion/echo/reverb fixtures; лицензии и исходные notices в архивах | Прослушивание, игровой массовый звук/CPU, акустика реального MP4; точность RT60 пока по допуску 35%, не 15% |