[enhancement] Контракт сборки мода и форка: версии инструментов, capabilities и проверки реального WASM/рендера #102

Open
opened 2026-10-30 10:31:24 +00:00 by chexit · 9 comments
Owner

🤖 Filed by Codex, AI-агент Владимира (chexit).

Архитектурный проход по 76f680eba64b64eb28435e71ce9f22a84b0e5da1.

Диагноз

Форк уже состоит из pinned Horizon commit + 32 последовательных patch-файлов. fork_stamp проверяет состав патчей — полезная основа. Однако tools/airdef.py::mod устанавливает cargo-horizon-mod только если бинарника нет: установленный ранее packer не сверяется с текущим форком. SDK подключён path-зависимостью, расширения render/input/ui experimental; наличие API и фактическая готовность конкретного эффекта имеют разную семантику (пример #81).

CI уже запускает native unit tests и четыре сценария — добавлять «cargo test вообще» повторно не нужно. Эти тесты не проверяют host ABI/capability replies, WASM fuel/memory, реальную камеру/capture и GPU buffers. Отдельные задачи #44/#72 сохраняются: эта — о воспроизводимом контракте всей поставки, а не ещё один запрос обновить Horizon.

Этапы

  • Описать build identity: upstream commit, patch-set hash, SDK/packer/API version и совместимость hmod↔engine. Проверять установленный tool; при несовпадении использовать repo-local pinned binary/пересобрать осознанно. Не молча паковать чужим старым инструментом.
  • Feature capability handshake: available/enabled/accepted/rendered — разные состояния. Мод выбирает fallback по фактической поддержке и возвращает диагностируемую причину.
  • Маленький CI tier: чистая подготовка форка, ядро, catalog/assets validation, actual wasm build и host integration fixtures. Тяжёлый tier отдельно/по расписанию/изменению движка: ABI smoke, максимальный сценарий с fuel/memory/query/voice budgets, graphics/export checks из #44. Уважать имеющийся слабый runner, не запускать всё дорогое на каждом пуше.
  • Для patch stack — inventory по подсистемам/зависимостям/проверкам; периодический squash чисто исторических поправок после baseline или отдельная поддерживаемая fork branch с воспроизводимым экспортом. Выбрать один canonical workflow, не поддерживать два расходящихся источника. При обновлении убирать уже пришедшие upstream патчи после проверки, не по одному похожему заголовку.

Приёмка

Чистая машина и машина со старым cargo-horizon-mod получают одинаковый совместимый артефакт либо понятную ошибку. Неподдерживаемая возможность не заставляет мод убирать рабочий fallback. Native success не маскирует fuel exhaustion в реальном WASM. В отчёте указываются все версии/хэши и лимиты; профили Mac проверяются отдельно, ускорение не обещается без замера. Короткая карта архитектуры/ADR объясняет, куда добавлять следующую engine-возможность.

Общий порядок и зависимости: архитектурная дорожная карта.

🤖 Filed by Codex, AI-агент Владимира (chexit). Архитектурный проход по `76f680eba64b64eb28435e71ce9f22a84b0e5da1`. ### Диагноз Форк уже состоит из pinned Horizon commit + **32** последовательных patch-файлов. `fork_stamp` проверяет состав патчей — полезная основа. Однако `tools/airdef.py::mod` устанавливает `cargo-horizon-mod` только если бинарника нет: установленный ранее packer не сверяется с текущим форком. SDK подключён path-зависимостью, расширения render/input/ui experimental; наличие API и фактическая готовность конкретного эффекта имеют разную семантику (пример #81). CI уже запускает native unit tests и четыре сценария — добавлять «cargo test вообще» повторно не нужно. Эти тесты не проверяют host ABI/capability replies, WASM fuel/memory, реальную камеру/capture и GPU buffers. Отдельные задачи #44/#72 сохраняются: эта — о воспроизводимом контракте всей поставки, а не ещё один запрос обновить Horizon. ### Этапы - Описать build identity: upstream commit, patch-set hash, SDK/packer/API version и совместимость hmod↔engine. Проверять установленный tool; при несовпадении использовать repo-local pinned binary/пересобрать осознанно. Не молча паковать чужим старым инструментом. - Feature capability handshake: available/enabled/accepted/rendered — разные состояния. Мод выбирает fallback по фактической поддержке и возвращает диагностируемую причину. - Маленький CI tier: чистая подготовка форка, ядро, catalog/assets validation, actual wasm build и host integration fixtures. Тяжёлый tier отдельно/по расписанию/изменению движка: ABI smoke, максимальный сценарий с fuel/memory/query/voice budgets, graphics/export checks из #44. Уважать имеющийся слабый runner, не запускать всё дорогое на каждом пуше. - Для patch stack — inventory по подсистемам/зависимостям/проверкам; периодический squash чисто исторических поправок после baseline или отдельная поддерживаемая fork branch с воспроизводимым экспортом. Выбрать один canonical workflow, не поддерживать два расходящихся источника. При обновлении убирать уже пришедшие upstream патчи после проверки, не по одному похожему заголовку. ### Приёмка Чистая машина и машина со старым `cargo-horizon-mod` получают одинаковый совместимый артефакт либо понятную ошибку. Неподдерживаемая возможность не заставляет мод убирать рабочий fallback. Native success не маскирует fuel exhaustion в реальном WASM. В отчёте указываются все версии/хэши и лимиты; профили Mac проверяются отдельно, ускорение не обещается без замера. Короткая карта архитектуры/ADR объясняет, куда добавлять следующую engine-возможность. Общий порядок и зависимости: [архитектурная дорожная карта](https://gitea.maoniao.team/chexit/airdef/issues/103).
chexit added the area:architecturearea:toolingpriority:P2type:enhancement labels 2026-10-30 10:31:24 +00:00
Author
Owner

🤖 Agent: Codex — по решению пользователя создана отдельная задача #104: перенос форка Horizon в самостоятельную репу и подключение horizon/ через pinned git submodule. Репозиторий создаст Владимир и передаст URL позже. Эта задача конкретизирует способ хранения/подключения движка; остальные требования к совместимости и проверкам сохраняются.

🤖 Agent: Codex — по решению пользователя создана отдельная задача #104: перенос форка Horizon в самостоятельную репу и подключение `horizon/` через pinned git submodule. Репозиторий создаст Владимир и передаст URL позже. Эта задача конкретизирует способ хранения/подключения движка; остальные требования к совместимости и проверкам сохраняются.
Author
Owner

🤖 Agent: Codex — работа Владимира (chexit).

Контракт: pinned repo-local packer по identity движка, прямой вызов бинарника вместо произвольного PATH tool; рядом с .hmod build-identity.json с SHA AirDef/engine/pin, WIT/artifact hash и dirty diff.

Добавлен python tools/airdef.py test-wasm: настоящий .hmod в runtime закреплённого host, временное storage, 11 steps загрузки/команды/deploy/raid/tick/frame/world unload/reload. Прошло на Mac с обычными runtime лимитами (64 MiB linear memory, fuel init 2B/tick 300M/frame 10M/event 1B). Render replies отсутствуют: проверены ABI/fallback, не GPU. Assets validation в лёгком build, тяжёлый Wasmtime tier — ручной wasm-contract workflow.

Полный capability available/enabled/accepted/rendered handshake, максимум нагрузки/fuel telemetry и graphics/export tier остаются.

Issue оставлен открытым согласно просьбе автора.

🤖 Agent: Codex — работа Владимира (chexit). [Контракт](https://gitea.maoniao.team/chexit/airdef/commit/dedb021): pinned repo-local packer по identity движка, прямой вызов бинарника вместо произвольного PATH tool; рядом с .hmod build-identity.json с SHA AirDef/engine/pin, WIT/artifact hash и dirty diff. Добавлен `python tools/airdef.py test-wasm`: настоящий .hmod в runtime закреплённого host, временное storage, 11 steps загрузки/команды/deploy/raid/tick/frame/world unload/reload. Прошло на Mac с обычными runtime лимитами (64 MiB linear memory, fuel init 2B/tick 300M/frame 10M/event 1B). Render replies отсутствуют: проверены ABI/fallback, не GPU. Assets validation в лёгком build, тяжёлый Wasmtime tier — ручной wasm-contract workflow. Полный capability available/enabled/accepted/rendered handshake, максимум нагрузки/fuel telemetry и graphics/export tier остаются. Issue оставлен открытым согласно просьбе автора.
Author
Owner

🤖 Agent: Codex, при участии GPT-6.1 Terra и GPT-6 Luna. Продолжение в kimi-work: код.

Движок опубликован в chexit/horizon-airdef:airdef, pin 86b1014a9218e68041444cbf52db02a85107c815. API26 render.smoke-status различает available/enabled/request-accepted/backend-ready и возвращает generation + причину. При смене мира очищаются старые сегменты и часы; AirDef заменяет fallback только при выполнении всех четырёх условий.

Backend-ready — путь последнего подготовленного основного кадра, не доказательство исполнения GPU или видимости каждого сегмента. Контракт для acoustic/capture этим API не расширялся. Проверены SDK/host/WIT-reference и реальный WASM guest со сменой мира/отключением/повторной отправкой; AirDef WASM — 16 шагов. Новый macOS arm64 клиент собран, Metal/HD кадр получен, airdef.py check подтверждает API26 у мода/форка/игры и схему ресурсов. GPU/export/max-load tier остаётся отдельной приёмкой. Issue не закрываю.

🤖 Agent: Codex, при участии GPT-6.1 Terra и GPT-6 Luna. Продолжение в `kimi-work`: [код](https://gitea.maoniao.team/chexit/airdef/commit/d4adbb1e473c94241c9b38f82bb325ba5450d67e). Движок опубликован в `chexit/horizon-airdef:airdef`, pin `86b1014a9218e68041444cbf52db02a85107c815`. API26 `render.smoke-status` различает available/enabled/request-accepted/backend-ready и возвращает generation + причину. При смене мира очищаются старые сегменты и часы; AirDef заменяет fallback только при выполнении всех четырёх условий. Backend-ready — путь последнего подготовленного основного кадра, не доказательство исполнения GPU или видимости каждого сегмента. Контракт для acoustic/capture этим API не расширялся. Проверены SDK/host/WIT-reference и реальный WASM guest со сменой мира/отключением/повторной отправкой; AirDef WASM — 16 шагов. Новый macOS arm64 клиент собран, Metal/HD кадр получен, `airdef.py check` подтверждает API26 у мода/форка/игры и схему ресурсов. GPU/export/max-load tier остаётся отдельной приёмкой. Issue не закрываю.
Author
Owner

🤖 Agent: Codex, with GPT-6.1 Terra and GPT-6 Luna.

Продолжение опубликовано в kimi-work до 19c53fd, движок horizon-airdef:airdef закреплён c89c78c47047fcfc0dfb0b8968600c650bf12d2b (API27). Добавлены scoped acoustics-status/capture-owner-status с available/enabled/request-accepted/prepared/reason и поколением мира. AirDef сохраняет звуковой fallback до подготовки, не принимает чужие Recording/Done и ограничивает Arming 600 тиками. Capture-stop проверяет владельца; смена мира снимает запрос/посылает отмену. Encoding уже переданного writer может завершиться, это не обещание удаления файла.

Opt-in test-budgets: 64 комплекса + две перекрывающиеся волны по 80, 602 tick / 300 frame, 69 шагов actual WASM. JSON фиксирует clean SHA aab3e78, pin/API/WIT/артефакт, совпадение build identity, Wasmtime и исходные fuel/memory caps. Фактический fuel/peak memory не измеряется. Отдельный ручной workflow; лёгкий tier остаётся отдельным (26 шагов). Есть offline failure tests на build exit, stale identity и fuel trap. Windows stale upstream URL исправлен через обязательный submodule sync (d3378b3); реальная Git-регрессия прошла.

Проверки объединения: core release190+4, mod60+1boundary+4, WASM26 и heavy69. Клиент собран; два offscreen Metal-профиля: HD smoke ready после подготовки кадра, включённая акустика при no-audio остаётся awaiting-backend. Это не GPU completion/готовый MP4/прослушивание. Остаток: свет/камеры/sound-source handshakes, полные query/voice/peak budgets и GPU/export/платформенная приёмка.

Точный контракт и сохранённый JSON.

Issue state intentionally unchanged.

🤖 Agent: Codex, with GPT-6.1 Terra and GPT-6 Luna. Продолжение опубликовано в kimi-work до 19c53fd, движок horizon-airdef:airdef закреплён c89c78c47047fcfc0dfb0b8968600c650bf12d2b (API27). Добавлены scoped acoustics-status/capture-owner-status с available/enabled/request-accepted/prepared/reason и поколением мира. AirDef сохраняет звуковой fallback до подготовки, не принимает чужие Recording/Done и ограничивает Arming 600 тиками. Capture-stop проверяет владельца; смена мира снимает запрос/посылает отмену. Encoding уже переданного writer может завершиться, это не обещание удаления файла. Opt-in test-budgets: 64 комплекса + две перекрывающиеся волны по 80, 602 tick / 300 frame, 69 шагов actual WASM. JSON фиксирует clean SHA aab3e78, pin/API/WIT/артефакт, совпадение build identity, Wasmtime и исходные fuel/memory caps. Фактический fuel/peak memory не измеряется. Отдельный ручной workflow; лёгкий tier остаётся отдельным (26 шагов). Есть offline failure tests на build exit, stale identity и fuel trap. Windows stale upstream URL исправлен через обязательный submodule sync (d3378b3); реальная Git-регрессия прошла. Проверки объединения: core release190+4, mod60+1boundary+4, WASM26 и heavy69. Клиент собран; два offscreen Metal-профиля: HD smoke ready после подготовки кадра, включённая акустика при no-audio остаётся awaiting-backend. Это не GPU completion/готовый MP4/прослушивание. Остаток: свет/камеры/sound-source handshakes, полные query/voice/peak budgets и GPU/export/платформенная приёмка. [Точный контракт и сохранённый JSON](https://gitea.maoniao.team/chexit/airdef/src/branch/kimi-work/docs/ENGINE.md). Issue state intentionally unchanged.
Author
Owner

🤖 Agent: Codex.

Correction to comment 2402: the 69-step script did not prove two overlapping raids. Both commands were issued without ticks between them; order_raid rejects the second while the first is being planned, and the fixture did not assert that feedback. The reported 160 is an attempted/requested count, not a confirmed active count. The actual runtime run still passed, but its scenario-coverage claim was too strong. We are replacing the fixture with acceptance assertions and real overlap as part of investigating the user-reported double-raid crash; the saved report/docs will be corrected. No claim of a reproduced crash or a fixed cause yet.

🤖 Agent: Codex. Correction to comment 2402: the 69-step script did not prove two overlapping raids. Both commands were issued without ticks between them; order_raid rejects the second while the first is being planned, and the fixture did not assert that feedback. The reported 160 is an attempted/requested count, not a confirmed active count. The actual runtime run still passed, but its scenario-coverage claim was too strong. We are replacing the fixture with acceptance assertions and real overlap as part of investigating the user-reported double-raid crash; the saved report/docs will be corrected. No claim of a reproduced crash or a fixed cause yet.
Author
Owner

🤖 Agent: Codex, with GPT-6.1 Terra and GPT-6 Luna.

Исправленное покрытие опубликовано до 10f24b5, движок ed7615d36. Теперь default test-budgets использует optional flat render-world: ground/sections/rays действительно отвечают, неожиданные ошибки команд в Script отклоняются. Оба приказа 40+40 Орешников проверены как принятые; на тике2102 assertion подтверждает184 цели в воздухе при64 ПВО. В середине включаются HD+grid. Root-прогон clean2932364: 271 шаг PASS, immutable fixture SHA bcc0359..., build identity совпал. Это конкретная проверенная точка, не измеренный peak; GPU не работает в sandbox. Старый69-шаговый report сохранён с coverage_correction.

Отчёт считает requested units отдельно, подтверждённые assertions записывает только после success и точного SHA. Используются те же байты fixture, которые хешировались до сборки. Проверки итогового кода: core190+6 сценариев/7ignored; mod60+1boundary+4; lightWASM26; heavyWASM271; 5 report tests. Контракт и оба отчёта.

Issue state intentionally unchanged.

🤖 Agent: Codex, with GPT-6.1 Terra and GPT-6 Luna. Исправленное покрытие опубликовано до 10f24b5, движок ed7615d36. Теперь default test-budgets использует optional flat render-world: ground/sections/rays действительно отвечают, неожиданные ошибки команд в Script отклоняются. Оба приказа 40+40 Орешников проверены как принятые; на тике2102 assertion подтверждает184 цели в воздухе при64 ПВО. В середине включаются HD+grid. Root-прогон clean2932364: 271 шаг PASS, immutable fixture SHA bcc0359..., build identity совпал. Это конкретная проверенная точка, не измеренный peak; GPU не работает в sandbox. Старый69-шаговый report сохранён с coverage_correction. Отчёт считает requested units отдельно, подтверждённые assertions записывает только после success и точного SHA. Используются те же байты fixture, которые хешировались до сборки. Проверки итогового кода: core190+6 сценариев/7ignored; mod60+1boundary+4; lightWASM26; heavyWASM271; 5 report tests. [Контракт и оба отчёта](https://gitea.maoniao.team/chexit/airdef/src/branch/kimi-work/docs/ENGINE.md). Issue state intentionally unchanged.
Author
Owner

🤖 Agent: Codex, with GPT-6.1 Terra and GPT-6 Luna.

Published through d410e2c, engine pin f95f03c08ec2916a0e5bd3b2d4a2a790e7937b47. Added optional host-side per-callback fuel profiling to the test runner (--fuel-profile); disabled by default, successful and failed callbacks report calls/max/budget/failures, with runtime budgets unchanged. Used it to reproduce and fix a large-raid cache invalidation fuel trap: before 300M fuel exhausted, after peak 135,273,690/300M across 3602 ticks. This is diagnostic-guest CPU/WASM evidence, not GPU/FPS evidence or a measured peak from the default budget report.

Final clean d410e2c default actual WASM flat fixture passed 271 steps; light fixture passed 27. Core suite: 192 tests plus 6 scenarios passed, 7 ignored; newly added maximum-menu native scenario passed separately. Adapter: 60 tests + 1 boundary + 4 scenarios passed. Full native client build and actual Wasmtime isolated-stop/profile regression passed on the pinned engine. Evidence and limits. Existing platform/GPU acceptance limits still apply; issue state unchanged.

🤖 Agent: Codex, with GPT-6.1 Terra and GPT-6 Luna. Published through d410e2c, engine pin f95f03c08ec2916a0e5bd3b2d4a2a790e7937b47. Added optional host-side per-callback fuel profiling to the test runner (--fuel-profile); disabled by default, successful and failed callbacks report calls/max/budget/failures, with runtime budgets unchanged. Used it to reproduce and fix a large-raid cache invalidation fuel trap: before 300M fuel exhausted, after peak 135,273,690/300M across 3602 ticks. This is diagnostic-guest CPU/WASM evidence, not GPU/FPS evidence or a measured peak from the default budget report. Final clean d410e2c default actual WASM flat fixture passed 271 steps; light fixture passed 27. Core suite: 192 tests plus 6 scenarios passed, 7 ignored; newly added maximum-menu native scenario passed separately. Adapter: 60 tests + 1 boundary + 4 scenarios passed. Full native client build and actual Wasmtime isolated-stop/profile regression passed on the pinned engine. [Evidence and limits](https://gitea.maoniao.team/chexit/airdef/src/branch/kimi-work/docs/RAID-STABILITY.md). Existing platform/GPU acceptance limits still apply; issue state unchanged.
Author
Owner

🤖 Agent: Codex, with GPT-6.1 Terra.

Published API29 engine 57f8b2853, parent c1a595b; handoff 56339b0. test-budgets now requests real --fuel-profile, persists per-callback calls/max/budget/failures and rejects missing measurements instead of inferring usage from configured caps. API28 point-lights-status reports accepted/cache/main-frame HD processing, API29 sound-sources-status reports real source-manager apply with live/offline output; per-run/world/source epochs and reset/disable/reload cases tested with actual Wasmtime guests. /airdef capabilities exposes both, without claiming visible pixels or audible voices.

Also fixed camera owner collision: texture targets, scheduler, HUD/canvas/corner and main view now use (run_serial, local_id). Two real guests with identical camera IDs, scheduler/target lookup test and client check passed. Camera-ready milestone is deliberately still absent, as are full GPU/MP4/platform and query/voice/peak-memory acceptance. Exact scope. Issue state unchanged.

🤖 Agent: Codex, with GPT-6.1 Terra. Published API29 engine 57f8b2853, parent c1a595b; handoff 56339b0. test-budgets now requests real --fuel-profile, persists per-callback calls/max/budget/failures and rejects missing measurements instead of inferring usage from configured caps. API28 point-lights-status reports accepted/cache/main-frame HD processing, API29 sound-sources-status reports real source-manager apply with live/offline output; per-run/world/source epochs and reset/disable/reload cases tested with actual Wasmtime guests. /airdef capabilities exposes both, without claiming visible pixels or audible voices. Also fixed camera owner collision: texture targets, scheduler, HUD/canvas/corner and main view now use (run_serial, local_id). Two real guests with identical camera IDs, scheduler/target lookup test and client check passed. Camera-ready milestone is deliberately still absent, as are full GPU/MP4/platform and query/voice/peak-memory acceptance. [Exact scope](https://gitea.maoniao.team/chexit/airdef/src/branch/kimi-work/docs/CONTINUATION-2026-11-04.md). Issue state unchanged.
Author
Owner

🤖 Agent: Kimi Code, с участием Kimi for Coding и DeepSeek.

В kimi-work: 9217f9a5c, 61aaa0bf3; engine airdef = 278f356aa (API 30).

Добавлен per-run/per-world camera-status: prepared означает host-side encoding картинки в target либо кадр мира с фактически использованным main-view, не GPU fence. Чужой run с тем же local ID готовность не получает. Empty/clear/reload/world change и потеря picture target обрабатываются; /airdef capabilities показывает каждую камеру и main.

Проверки: 37 unit + 4 API reference + 44 sandbox, 120 gfx, сборка клиента с/без mods, AirDef 66+1+5, настоящий WASM 27 шагов. Metal/offscreen приёмка подтвердила картинку monitor, main-view и повторную готовность после смены мира. Контракт и наблюдения.

Остаются полные query/voice/peak-memory budgets и Windows/другие GPU. Issue не закрываю.

🤖 Agent: Kimi Code, с участием Kimi for Coding и DeepSeek. В `kimi-work`: `9217f9a5c`, `61aaa0bf3`; engine `airdef` = `278f356aa` (API 30). Добавлен per-run/per-world `camera-status`: `prepared` означает host-side encoding картинки в target либо кадр мира с фактически использованным main-view, не GPU fence. Чужой run с тем же local ID готовность не получает. Empty/clear/reload/world change и потеря picture target обрабатываются; `/airdef capabilities` показывает каждую камеру и main. Проверки: 37 unit + 4 API reference + 44 sandbox, 120 gfx, сборка клиента с/без mods, AirDef 66+1+5, настоящий WASM 27 шагов. Metal/offscreen приёмка подтвердила картинку monitor, main-view и повторную готовность после смены мира. [Контракт и наблюдения](https://gitea.maoniao.team/chexit/airdef/src/branch/kimi-work/docs/ENGINE.md). Остаются полные query/voice/peak-memory budgets и Windows/другие GPU. Issue не закрываю.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chexit/airdef#102