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
<name>.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 <noreply@moonshot.ai>
This commit is contained in:
2026-11-04 18:07:15 +03:00
parent cec7257ea1
commit e6a7000440
4 changed files with 24 additions and 13 deletions
+5 -3
View File
@@ -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
+10 -5
View File
@@ -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
+8 -4
View File
@@ -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 оставались, а после возврата в тот же мир
+1 -1
View File
@@ -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% |