chore(audit): remove stage0 audit files
Docs Deploy / Build and Deploy MkDocs (push) Successful in 1m54s
Test / Lint (push) Failing after 1m58s
Test / Test (push) Has been skipped
Test / Render parity (push) Has been skipped

This commit is contained in:
2026-06-25 11:44:49 +04:00
parent e572558d5f
commit 0b8776b850
-643
View File
@@ -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 05: Vulkan revision»;
- <https://app.notion.com/p/387e79f2db3981778f94cdf34db5f93f>.
Проверялась ветка:
- <https://github.com/valentineus/fparkan/tree/devel>.
Ограничения:
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": "<sha>",
"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: <https://app.notion.com/p/387e79f2db3981778f94cdf34db5f93f>
### Workspace и governance
- Root manifest: <https://github.com/valentineus/fparkan/blob/devel/Cargo.toml>
- Toolchain: <https://github.com/valentineus/fparkan/blob/devel/rust-toolchain.toml>
- Cargo config: <https://github.com/valentineus/fparkan/blob/devel/.cargo/config.toml>
- xtask manifest: <https://github.com/valentineus/fparkan/blob/devel/xtask/Cargo.toml>
- xtask implementation: <https://github.com/valentineus/fparkan/blob/devel/xtask/src/main.rs>
- README: <https://github.com/valentineus/fparkan/blob/devel/README.md>
### Platform и render
- Platform core: <https://github.com/valentineus/fparkan/blob/devel/crates/fparkan-platform/src/lib.rs>
- SDL stub adapter: <https://github.com/valentineus/fparkan/blob/devel/adapters/fparkan-platform-sdl/src/lib.rs>
- Render core: <https://github.com/valentineus/fparkan/blob/devel/crates/fparkan-render/src/lib.rs>
- GL stub adapter: <https://github.com/valentineus/fparkan/blob/devel/adapters/fparkan-render-gl/src/lib.rs>
- Game composition: <https://github.com/valentineus/fparkan/blob/devel/apps/fparkan-game/src/main.rs>
- Viewer composition: <https://github.com/valentineus/fparkan/blob/devel/apps/fparkan-viewer/src/main.rs>
- Headless manifest: <https://github.com/valentineus/fparkan/blob/devel/apps/fparkan-headless/Cargo.toml>
### Documentation drift
- Implementation tome: <https://github.com/valentineus/fparkan/blob/devel/docs/tomes/07-implementation.md>
- Parity README: <https://github.com/valentineus/fparkan/blob/devel/parity/README.md>
- Parity cases: <https://github.com/valentineus/fparkan/blob/devel/parity/cases.toml>
---
## 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.