From 0b8776b850ad76ca0d08ff52733225044272eb3a Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Thu, 25 Jun 2026 11:44:49 +0400 Subject: chore(audit): remove stage0 audit files --- fparkan_stage_0_audit_2026-06-23.md | 643 ------------------------------------ 1 file changed, 643 deletions(-) delete mode 100644 fparkan_stage_0_audit_2026-06-23.md diff --git a/fparkan_stage_0_audit_2026-06-23.md b/fparkan_stage_0_audit_2026-06-23.md deleted file mode 100644 index 979c2cf..0000000 --- a/fparkan_stage_0_audit_2026-06-23.md +++ /dev/null @@ -1,643 +0,0 @@ -# FParkan — аудит Stage 0 и план полного закрытия - -**Проект:** `valentineus/fparkan` -**Проверенная ветка:** `devel` GitHub-зеркала -**Дата аудита:** 23 июня 2026 года -**Область:** только Stage 0 — Governance, reproducibility и Vulkan foundation -**Метод:** статический архитектурный и кодовый аудит -**Сборка и исполнение:** не выполнялись; `cargo build`, `cargo test`, Vulkan smoke и validation jobs не запускались - ---- - -## 1. Итоговый вердикт - -**Stage 0 не закрыт и находится в статусе `BLOCKED`.** - -Главный критерий Stage 0 — воспроизводимый репозиторий и минимальный настоящий Vulkan vertical slice на Windows, Linux и macOS. В проверенном состоянии: - -- отсутствует `fparkan-platform-winit`; -- отсутствует `fparkan-render-vulkan`; -- отсутствуют Vulkan instance/device/surface/swapchain; -- `fparkan-game` использует `RecordingBackend`, а не GPU backend; -- workspace по-прежнему содержит SDL/OpenGL stub adapters; -- Rust toolchain закреплён только как изменяемый канал `stable`; -- `cargo xtask ci` не реализует полный канонический gate; -- нет подтверждённых артефактов Windows/Linux/macOS smoke jobs. - -### Сводная оценка - -| Группа требований | Статус | Основной блокер | -|---|---|---| -| Reproducibility и toolchain | **FAIL** | Toolchain не закреплён точной версией, MSRV не объявлен | -| Repository policy и CI | **FAIL** | Неполные fmt/test/clippy/doc/security gates | -| Platform abstraction | **FAIL** | Core API содержит OpenGL-specific contract; `winit` adapter отсутствует | -| Vulkan backend | **FAIL** | Нет Vulkan loader/device/surface/swapchain/pipeline | -| macOS portability | **FAIL** | Нет MoltenVK integration и portability handling | -| Offline shaders | **FAIL** | Нет SPIR-V build/validation/hash pipeline | -| Legacy cleanup | **FAIL** | SDL/GL stubs остаются workspace members | -| Headless isolation | **PASS на manifest-level** | Автоматическое доказательство dependency closure ещё требуется | -| Native acceptance | **FAIL / NOT RUNNABLE** | Нет реального backend и platform artifacts | - -Stage 0 можно объявить закрытым только после прохождения реального Vulkan smoke на всех трёх системах и публикации machine-readable артефактов. - ---- - -## 2. Область и ограничения аудита - -Канонические требования взяты из документа: - -- «План реализации stage 0–5: Vulkan revision»; -- . - -Проверялась ветка: - -- . - -Ограничения: - -1. Ветка `devel` является движущейся ссылкой. Следующий formal audit следует выполнять на закреплённом commit SHA или tag. -2. README указывает self-hosted repository как primary. Его закрытые CI runners и artifacts не были доступны. -3. Код не собирался и не запускался по условию аудита. -4. Vulkan runtime, validation layers, MoltenVK и native window creation не проверялись динамически. -5. Статический анализ достаточен для определения текущих архитектурных блокеров: требуемых adapters и зависимостей в workspace нет. - ---- - -## 3. Матрица требований Stage 0 - -| Требование | Статус | Текущее состояние | Необходимо для закрытия | -|---|---|---|---| -| Exact stable Rust toolchain | **FAIL** | `rust-toolchain.toml`: `channel = "stable"` | Закрепить точную версию, например `1.xx.y` | -| Объявленный MSRV | **FAIL** | `workspace.package.rust-version` отсутствует | Добавить `rust-version` и отдельный MSRV job | -| Полный `cargo xtask ci` | **FAIL** | Есть custom rustfmt, policy, workspace test и clippy | Добавить канонические fmt/test/clippy/doc/security gates | -| `--all-targets --all-features` | **FAIL** | Не используются текущим `ci` | Добавить к test/clippy/doc gates | -| Clippy `-D warnings` | **FAIL** | Явно не передаётся | Сделать предупреждения blocking | -| Rustdoc broken-link gate | **FAIL** | Отсутствует | Добавить `RUSTDOCFLAGS=-D warnings -D rustdoc::broken_intra_doc_links` | -| License/advisory/source policy | **PARTIAL / UNVERIFIED** | Есть custom policy и GPL workspace license | Подключить `cargo-deny` или эквивалент и хранить versioned policy | -| Typed TOML parsing | **FAIL** | Licensed manifest разбирается вручную построчно | `serde` + TOML schema + `deny_unknown_fields` | -| `cargo_metadata` policy | **FAIL** | Dependency rules не опираются на typed Cargo graph | Добавить `cargo_metadata` и package-ID based checks | -| CI matrix Windows/Linux/macOS | **UNVERIFIED / BLOCKER** | Доступных platform artifacts нет | Создать native matrix и сохранять reports | -| Backend-neutral platform API | **FAIL** | В core есть `GraphicsProfile`, GL/GLES versions и `WindowPort::present()` | Удалить GL context concepts; present перенести в renderer | -| `fparkan-platform-winit` | **FAIL** | В workspace только SDL-named stub | Реализовать настоящий event loop/window adapter | -| `fparkan-render-vulkan` | **FAIL** | В workspace только GL-named recording stub | Реализовать настоящий Vulkan backend | -| Vulkan loader/instance/device | **FAIL** | Vulkan bindings отсутствуют | Добавить `ash`, instance, device selection, queues | -| Surface/swapchain/present | **FAIL** | Отсутствуют | Реализовать platform surface и swapchain lifecycle | -| Indexed triangle | **FAIL** | Есть только command capture | Нарисовать реальный indexed triangle | -| Resize/out-of-date/suboptimal | **FAIL** | Swapchain отсутствует | Реализовать полную recreation policy | -| Deterministic capability report | **FAIL** | Device discovery отсутствует | Pure scoring policy + JSON capability report | -| macOS portability | **FAIL** | MoltenVK integration отсутствует | Portability enumeration, subset и packaged MoltenVK | -| Offline SPIR-V pipeline | **FAIL** | GL stub проверяет только synthetic markers | Pinned compiler, validator, descriptor manifest и hashes | -| Legacy adapter removal | **FAIL** | SDL/GL crates входят в workspace | Удалить crates и все references после замены | -| Game/viewer composition | **FAIL** | Game использует `RecordingBackend`; viewer — CLI inspector | Подключить winit + Vulkan только в composition roots | -| Headless isolation | **PASS на manifest-level** | Нет window/Vulkan dependency | Добавить automated Cargo metadata assertion | -| 300 frames + resize + validation=0 | **FAIL** | Невозможно выполнить без backend | Native smoke jobs на трёх OS | -| Negative Vulkan tests | **FAIL** | Нет Vulkan error model | Loader/device/queue/format failure fixtures | - ---- - -## 4. Замечания - -### S0-B01 — Workspace содержит удаляемые SDL/OpenGL stub crates - -**Приоритет:** BLOCKER -**Файлы:** `Cargo.toml`, `adapters/fparkan-platform-sdl`, `adapters/fparkan-render-gl` - -Root workspace включает оба прежних adapter crate. При этом: - -- SDL adapter не зависит от SDL и содержит in-memory stubs; -- GL adapter не зависит от OpenGL и только сохраняет canonical command captures; -- их tests доказывают deterministic stub behavior, а не platform/GPU integration. - -Это создаёт ложноположительный сигнал готовности backend-а. - -**Рекомендация:** - -1. До появления замены пометить crates как `legacy-proof` и исключить из default production composition. -2. Добавить policy, запрещающий приложениям зависеть от них. -3. После подключения `platform-winit` и `render-vulkan` удалить crates, lockfile references, docs и tests. - -### S0-B02 — Core platform contract остаётся OpenGL-specific - -**Приоритет:** BLOCKER -**Файл:** `crates/fparkan-platform/src/lib.rs` - -Проблемы: - -- `GraphicsProfile::DesktopCore/Embedded` описывает GL/GLES profile; -- `GraphicsContextRequest` описывает создание GL context; -- `WindowPort::present()` ошибочно закрепляет presentation за window abstraction; -- `PlatformEvent` содержит только `Quit`; -- отсутствуют resize, scale factor, focus, keyboard, mouse, suspend/resume и raw handles; -- `PlatformError::Backend` не содержит source/context. - -Для Vulkan окно не выполняет present. Surface, swapchain, image acquisition и queue presentation принадлежат render adapter. - -**Рекомендация:** platform crate должен предоставлять только: - -- event/lifecycle model; -- physical и logical size; -- scale factor; -- normalized input; -- raw window/display handles; -- structured platform errors. - -### S0-B03 — Реального Vulkan code path нет - -**Приоритет:** BLOCKER - -В inspected manifests отсутствуют `ash`, `ash-window`, `winit` и `raw-window-handle`. Следовательно, текущий код не может создать Vulkan instance/device/surface/swapchain. - -`fparkan-game` выполняет backend-neutral capture через `RecordingBackend`. Это полезный CPU oracle, но не Vulkan renderer. - -**Definition of fixed:** отдельный smoke executable открывает окно, создаёт Vulkan swapchain, рисует indexed triangle, обрабатывает resize и корректно завершается. - -### S0-B04 — `cargo xtask ci` не соответствует exit gate - -**Приоритет:** BLOCKER -**Файл:** `xtask/src/main.rs` - -Текущий gate не подтверждает: - -- все targets и features; -- clippy с `-D warnings`; -- rustdoc warnings и broken links; -- advisory/source policy; -- dependency denylist; -- отсутствие project-owned unsafe вне разрешённого Vulkan boundary; -- корректность typed acceptance manifests; -- platform-native smoke jobs. - -Custom recursive rustfmt также может расходиться с canonical `cargo fmt --all -- --check`. - -### S0-B05 — Toolchain не воспроизводим - -**Приоритет:** BLOCKER -**Файл:** `rust-toolchain.toml` - -Канал `stable` изменяется. Один и тот же commit может использовать разные компиляторы в разные дни. MSRV также не объявлен. - -**Рекомендация:** - -- закрепить точный Rust release; -- указать `rust-version`; -- обновлять toolchain отдельным reviewed PR; -- сохранять toolchain и SDK versions в acceptance report. - -### S0-H01 — Нужен изолированный audited unsafe boundary - -**Приоритет:** HIGH - -`unsafe_code = "forbid"` правильно сохранять для backend-neutral crates. Однако Vulkan FFI требует локальных unsafe calls. - -Нельзя ослаблять policy всему workspace. - -**Целевая схема:** - -- unsafe разрешён только в `fparkan-render-vulkan` low-level modules; -- `unsafe_op_in_unsafe_fn = deny`; -- каждый block имеет `// SAFETY:` comment; -- ownership/lifetime rules документированы; -- raw Vulkan handles не выходят в public neutral API; -- custom policy scanner проверяет allowlist. - -### S0-H02 — Neutral render IDs не должны быть GPU allocation IDs - -**Приоритет:** HIGH, не блокирует первый hardcoded triangle -**Файл:** `crates/fparkan-render/src/lib.rs` - -`GpuMeshId` и `GpuMaterialId` появляются до существования GPU registry. Это смешивает CPU asset identity и backend-local allocation identity. - -**Рекомендация:** использовать neutral `MeshAssetId`/`MaterialAssetId`; Vulkan adapter должен самостоятельно отображать их на buffers, images и descriptors. - -### S0-M01 — Документация рассогласована с Vulkan revision - -**Приоритет:** MEDIUM - -`docs/tomes/07-implementation.md` сохраняет старую последовательность и multi-backend формулировки. Parity documentation ссылается на отсутствующий workspace crate, а active parity cases не определены. - -**Рекомендация:** один versioned source of truth для stages и автоматическая проверка упомянутых crates, commands и backend names. - ---- - -## 5. Сильные стороны, которые следует сохранить - -- Workspace lint policy строгая и подходит для backend-neutral crates. -- `Cargo.lock` присутствует, а команды используют `--locked`. -- Synthetic и licensed corpus paths концептуально разделены. -- `fparkan-headless` не зависит от platform/render adapters на manifest-level. -- `fparkan-render` уже предоставляет deterministic command ordering, validation и canonical capture. -- Composition roots отделены от большинства core crates. - -Эти элементы позволяют построить Vulkan foundation без переписывания CPU/data foundation. - ---- - -## 6. Целевая архитектура Stage 0 - -```text -apps/fparkan-game, apps/fparkan-viewer - │ - ├── fparkan-platform-winit - │ └── winit + raw-window-handle - │ - └── fparkan-render-vulkan - ├── ash-window - ├── ash - ├── surface / swapchain - ├── device / queues - ├── shaders / pipelines - └── synchronization / presentation - -apps/fparkan-headless - └── runtime/core only - no winit, ash, MoltenVK or window dependencies -``` - -Разделение ответственности: - -- `fparkan-platform`: события, input, lifecycle, sizes и handle access; -- `fparkan-platform-winit`: concrete window/event-loop implementation; -- `fparkan-render`: backend-neutral command/snapshot contracts; -- `fparkan-render-vulkan`: Vulkan resources, synchronization и present; -- game/viewer: composition root; -- headless: полностью изолированный путь. - ---- - -## 7. План полного закрытия Stage 0 - -Порядок PR важен. Vulkan adapter не следует строить поверх текущего GL-oriented platform contract. - -### PR S0-01 — Reproducible toolchain и metadata - -**Изменения** - -- закрепить exact Rust toolchain; -- добавить `workspace.package.rust-version`; -- зафиксировать supported triples; -- добавить `cargo xtask doctor`; -- включать commit SHA, Rust version и platform SDK versions в reports. - -**Acceptance** - -- clean checkout формирует одинаковый metadata report; -- MSRV job собирает backend-neutral crates; -- pinned toolchain проходит полный synthetic gate. - -### PR S0-02 — Typed xtask configuration - -**Изменения** - -- `serde` + TOML schemas для corpus/acceptance manifests; -- `deny_unknown_fields`; -- duplicate/missing/unknown-field validation; -- absolute canonical paths для local licensed manifest; -- `cargo_metadata` для dependency и workspace policy; -- удалить ручной line parser. - -**Acceptance** - -- malformed manifest всегда даёт non-zero exit; -- неизвестные поля не игнорируются; -- dependency policy работает по Cargo package IDs, targets и features. - -### PR S0-03 — Полный synthetic CI gate - -Обязательные команды: - -```bash -cargo fmt --all -- --check -cargo test --workspace --all-targets --all-features --locked -cargo clippy --workspace --all-targets --all-features --locked -- -D warnings -RUSTDOCFLAGS="-D warnings -D rustdoc::broken_intra_doc_links" \ - cargo doc --workspace --no-deps --all-features --locked -cargo deny check advisories bans licenses sources -cargo xtask policy -cargo xtask acceptance audit --strict -``` - -Добавить reports для каждого gate и запрет silent skip. - -### PR S0-04 — Redesign `fparkan-platform` - -**Изменения** - -- удалить `GraphicsProfile`, `GraphicsContextRequest` и GL version negotiation; -- убрать `present()` из window port; -- добавить normalized keyboard/mouse events; -- physical/logical size и scale factor; -- focus, minimize, occlusion, suspend/resume; -- deterministic lifecycle state machine; -- structured errors с source chain. - -**Synthetic tests** - -- resize coalescing; -- zero-size/minimized window; -- scale-factor changes; -- focus loss clears held input; -- key repeat и modifiers; -- suspend/resume; -- deterministic event ordering. - -### PR S0-05 — `fparkan-platform-winit` - -**Изменения** - -- winit event loop; -- native window lifecycle; -- raw window/display handles; -- platform-specific event normalization; -- отсутствие GPU ownership. - -**Acceptance** - -- window-only smoke на Windows, Linux и macOS; -- native event trace соответствует synthetic model. - -### PR S0-06 — Vulkan low-level boundary - -**Изменения** - -- `ash` и `ash-window`; -- dynamic Vulkan loader; -- instance и debug messenger; -- physical device capability records; -- pure deterministic device scoring; -- graphics/present queue selection; -- deterministic capability JSON; -- audited unsafe allowlist. - -**Negative tests** - -- loader отсутствует; -- Vulkan 1.1 недоступен; -- graphics queue отсутствует; -- present queue отсутствует; -- `VK_KHR_swapchain` отсутствует; -- required surface format отсутствует. - -### PR S0-07 — Swapchain, triangle и offline shaders - -**Изменения** - -- surface и swapchain; -- format/present-mode/image-count policy; -- render pass и graphics pipeline; -- indexed triangle; -- command pools/buffers; -- binary semaphores и fences; -- frames in flight; -- resize/out-of-date/suboptimal/zero extent handling; -- pinned offline shader compiler; -- SPIR-V validation; -- descriptor/push-constant manifest; -- shader content hashes. - -### PR S0-08 — macOS portability proof - -**Изменения** - -- `VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR`; -- portability extension enumeration; -- `VK_KHR_portability_subset` enablement, если объявлен device; -- MoltenVK packaging strategy; -- deterministic portability report; -- `.app` bundle smoke. - -### PR S0-09 — Composition roots и legacy removal - -**Изменения** - -- game/viewer подключают winit + Vulkan adapters; -- headless остаётся без window/GPU graph; -- удалить SDL/GL stub crates; -- очистить lockfile, policy и docs; -- заменить GPU-named neutral IDs на asset IDs; -- запретить stale backend names automated policy check-ом. - -### PR S0-10 — Native acceptance matrix - -**Jobs** - -- Windows MSVC + system Vulkan loader; -- Linux X11 или Wayland surface; -- macOS Apple Silicon + MoltenVK; -- отдельный software-Vulkan Linux PR job допустим как быстрый gate; -- native GPU jobs остаются release evidence. - -**Обязательный сценарий** - -1. Создать окно. -2. Создать real Vulkan swapchain. -3. Показать indexed triangle. -4. Выполнить не менее 300 frames. -5. Изменить размер окна. -6. Пересоздать swapchain. -7. Корректно завершить event loop. -8. Получить `validation_error_count = 0`. -9. Сохранить capability, shader и validation reports как artifacts. - -**Stage 0 закрывается только после merge S0-01…S0-10 и зелёных native artifacts.** - ---- - -## 8. Требуемая CI/acceptance модель - -### 8.1 Synthetic PR gate - -Должен работать без игровых каталогов и без silent skip: - -1. fmt, clippy, docs, security и policy; -2. все unit/integration tests; -3. platform lifecycle state-machine tests; -4. device scoring tests на synthetic capability records; -5. swapchain policy tests; -6. shader manifest/hash tests; -7. Vulkan negative-path tests без обязательного GPU; -8. headless dependency assertion; -9. report schema validation. - -Tests, требующие native GPU или licensed data, должны иметь отдельные suites и machine-readable ownership/reason, а не оставаться обычными `#[ignore]` без evidence trail. - -### 8.2 Native platform gate - -| Platform | Минимальный gate | Дополнительное evidence | -|---|---|---| -| Windows | system loader, swapchain, triangle, resize, 300 frames, validation=0 | Периодическая NVIDIA/AMD/Intel coverage | -| Linux | X11 или Wayland surface, swapchain, resize, validation=0 | Software Vulkan PR job + Mesa/NVIDIA native release jobs | -| macOS | MoltenVK, portability enumeration/subset, CAMetalLayer surface, resize, validation=0 | Apple Silicon как primary target | - -### 8.3 Формат machine-readable отчёта - -Минимальные поля: - -```json -{ - "schema": 1, - "commit": "", - "target": "x86_64-pc-windows-msvc", - "rustc": "1.xx.y", - "vulkan_api": "1.1", - "device_name": "...", - "driver": "...", - "portability_subset": false, - "frames": 300, - "resize_count": 1, - "swapchain_recreate_count": 1, - "validation_error_count": 0, - "shader_manifest_hash": "...", - "result": "pass" -} -``` - ---- - -## 9. Definition of Done - -Stage 0 считается закрытым, когда выполнены **все** пункты: - -- [ ] Exact Rust toolchain закреплён. -- [ ] MSRV объявлен и проверяется. -- [ ] Full fmt/test/clippy/doc/security/source/license gate проходит. -- [ ] Typed TOML manifests используются. -- [ ] Dependency policy работает через `cargo_metadata`. -- [ ] Windows/Linux/macOS matrix сохраняет artifacts. -- [ ] `fparkan-platform` больше не содержит GL-specific context concepts. -- [ ] `fparkan-platform-winit` реализован. -- [ ] `fparkan-render-vulkan` реализован. -- [ ] Vulkan 1.1 instance/device/queues/surface/swapchain реализованы. -- [ ] Deterministic device scoring и capability report реализованы. -- [ ] Indexed triangle рисуется настоящим Vulkan backend. -- [ ] Resize, zero extent, out-of-date и suboptimal обработаны. -- [ ] MoltenVK portability path реализован. -- [ ] Offline SPIR-V validation и hash manifest реализованы. -- [ ] Unsafe разрешён только в audited Vulkan/FFI modules. -- [ ] Legacy SDL/GL adapters и references удалены. -- [ ] Game/viewer используют новые composition adapters. -- [ ] Headless dependency graph не содержит winit/Vulkan/MoltenVK. -- [ ] 300-frame + resize smoke проходит на трёх OS. -- [ ] Validation error count равен нулю на трёх OS. -- [ ] Acceptance reports включают commit SHA и сохраняются как artifacts. - -Наличие crates или unit tests с соответствующими названиями само по себе не является закрытием Stage 0. - ---- - -## 10. Рекомендуемые automated policy checks - -Добавить в `cargo xtask policy`: - -### Workspace denylist - -- запрещены `fparkan-platform-sdl` и `fparkan-render-gl` после миграции; -- запрещены stale symbols `GraphicsProfile`, `DesktopCore`, `Embedded`, `Gles2` в canonical platform/render API; -- canonical docs не содержат OpenGL как production backend. - -### Dependency rules - -- headless не зависит от `winit`, `raw-window-handle`, `ash`, `ash-window` или Vulkan adapter; -- backend-neutral crates не зависят от concrete platform/render adapters; -- только composition roots связывают platform и renderer; -- raw Vulkan types не экспортируются из adapter public boundary. - -### Unsafe rules - -- project-owned unsafe разрешён только в exact allowlisted files/modules; -- каждый block содержит `SAFETY:`; -- `unsafe_op_in_unsafe_fn` запрещён; -- изменение allowlist требует отдельного reviewed diff. - -### Test и report rules - -- synthetic gate не получает licensed paths; -- ignored tests обязаны иметь registered reason и owner; -- acceptance IDs уникальны; -- reports проходят schema validation; -- report всегда содержит commit SHA и target triple. - -### Documentation rules - -- документированные crates и commands существуют; -- canonical stage version совпадает с acceptance schema; -- старые backend names отсутствуют; -- README не объявляет незакрытый Vulkan path реализованным. - ---- - -## 11. Основные риски - -| Риск | Последствие | Снижение | -|---|---|---| -| Vulkan adapter начнут до redesign platform API | Повторная переделка surface/lifecycle/present | Сначала S0-04, затем S0-05/S0-06 | -| `unsafe_code` ослабят всему workspace | Рост FFI и lifetime рисков | Изолированный audited adapter и allowlist scanner | -| Stubs будут приняты за production backend | Ложное закрытие Stage 0 | Удаление legacy crates и real native smoke | -| Linux software Vulkan будет единственным evidence | Не выявятся vendor-driver проблемы | Native Mesa/NVIDIA jobs перед release | -| macOS будет проверен без portability subset report | Скрытая несовместимость MoltenVK | Обязательное capability evidence | -| Shader compiler останется неприкреплённым | Невоспроизводимый SPIR-V | Pinned compiler + manifest hashes | -| GitHub mirror и primary repository разойдутся | Audit и release относятся к разному коду | Commit SHA, canonical remote и artifact metadata | -| Документация останется отдельным source of truth | Повторное рассогласование | Versioned stage schema и automated doc checks | - ---- - -## 12. Реестр доказательств - -### Canonical requirement - -- Vulkan revision: - -### Workspace и governance - -- Root manifest: -- Toolchain: -- Cargo config: -- xtask manifest: -- xtask implementation: -- README: - -### Platform и render - -- Platform core: -- SDL stub adapter: -- Render core: -- GL stub adapter: -- Game composition: -- Viewer composition: -- Headless manifest: - -### Documentation drift - -- Implementation tome: -- Parity README: -- Parity cases: - ---- - -## 13. Финальное заключение - -У проекта уже имеется пригодный backend-neutral фундамент: deterministic render commands, строгие neutral-crate lints, отдельный headless composition root и разделение synthetic/licensed tests. Однако Stage 0 пока представлен интерфейсными proof/stub crates, а не настоящим Vulkan vertical slice. - -Критический путь: - -```text -reproducible toolchain - → complete CI/policy gate - → backend-neutral platform redesign - → winit adapter - → Vulkan loader/device/surface/swapchain - → indexed triangle + shaders + synchronization - → MoltenVK portability - → composition integration - → legacy removal - → three-platform acceptance artifacts -``` - -До прохождения этого пути рекомендуемый статус: - -```text -Stage 0: IN PROGRESS / BLOCKED -``` - -Главный критерий закрытия: - -> Stage 0 завершён не тогда, когда существуют crates с названиями `winit` и `vulkan`, а когда один закреплённый commit создаёт настоящий Vulkan swapchain, рисует triangle, переживает resize и завершается без validation errors на Windows, Linux и macOS, сохраняя воспроизводимые machine-readable artifacts. -- cgit v1.2.3