diff --git a/PLAN.md b/PLAN.md
index 12f3c75..ad7a338 100644
--- a/PLAN.md
+++ b/PLAN.md
@@ -1,8 +1,8 @@
# План разработки Faset Engine
-Версия 1.1 · 18 сентября 2026 года.
+Версия 1.2 · 18 сентября 2026 года.
-**Статус:** идёт реализация MVP. Готовность этапов определяется всеми их критериями, включая проверку обеих ОС; отдельные работающие подсистемы ещё не закрывают этап целиком. Текущие результаты и ограничения записаны в [журнале реализации](docs/IMPLEMENTATION.md). Этот документ определяет порядок работ; контракты подсистем находятся в [ARCHITECTURE.md](docs/ARCHITECTURE.md).
+**Статус:** C++ MVP реализован и принят; первый tag — **v0.1.0-mvp**. Исходники движка проверены на `4cb82556de31268d2bde73948dd1ff1b6c02f162`; финальная публикация добавляет документацию и свидетельства, сохраняя код движка. [Досье M0–M9](docs/validation/mvp-acceptance.md) связывает каждый этап с проверками и точными revisions. Linux проверен на RTX 2080 Ti, Windows — в native CI через SwiftShader; это не сертификация всех GPU/драйверов. Системный IME и физические переходы между мониторами не проверены, native Wayland restore имеет явный skip; XWayland и Windows lifecycle прошли. Текст/DPI проверены на уровне widgets и SDL. Эти границы покрытия сохраняются открыто и не выдаются за пройденные сценарии. Контракты находятся в [ARCHITECTURE.md](docs/ARCHITECTURE.md), история — в [журнале реализации](docs/IMPLEMENTATION.md).
## 1. Результат MVP
@@ -42,12 +42,12 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Результат:** минимальный C++-проект собирается в согласованной среде Linux и Windows.
-- [ ] Создать targets Core, Runtime, Editor, Player, SchemaExporter, инструментов и примеров; запретить зависимости Runtime/Player на Editor/MCP.
-- [ ] Настроить CMake presets, Ninja, Clang/clang-cl, development/release и базовые проверки CI обеих ОС.
-- [ ] Зафиксировать стандарт C++, версии компиляторов, Windows SDK/runtime, библиотек и Slang; определить проверяемую матрицу ОС, архитектур и GPU.
-- [ ] Закрепить EnTT, SDL3, Slang, Box2D, Box3D и отладочный ImGui с воспроизводимым получением, notices и возможностью локальной сборки. Research commits не считать автоматически dependency versions.
-- [ ] Определить ошибки, журналирование, проверки инвариантов, владение ресурсами и формат диагностик.
-- [ ] Выбрать необходимые библиотеки шрифтов/текста, изображений и glTF, зафиксировать их лицензии и владельцев интеграции.
+- [x] Создать targets Core, Runtime, Editor, Player, SchemaExporter, инструментов и примеров; запретить зависимости Runtime/Player на Editor/MCP.
+- [x] Настроить CMake presets, Ninja, Clang/clang-cl, development/release и базовые проверки CI обеих ОС.
+- [x] Зафиксировать стандарт C++, версии компиляторов, Windows SDK/runtime, библиотек и Slang; определить проверяемую матрицу ОС, архитектур и GPU.
+- [x] Закрепить EnTT, SDL3, Slang, Box2D, Box3D и отладочный ImGui с воспроизводимым получением, notices и возможностью локальной сборки. Research commits не считать автоматически dependency versions.
+- [x] Определить ошибки, журналирование, проверки инвариантов, владение ресурсами и формат диагностик.
+- [x] Выбрать необходимые библиотеки шрифтов/текста, изображений и glTF, зафиксировать их лицензии и владельцев интеграции.
**Готово:** чистая сборка проходит на обеих ОС, пример запускается, версии видны в отчёте. Офлайн-сборка проверяется с заранее подготовленными инструментами и зависимостями; обязательных облачных сервисов нет.
@@ -55,12 +55,12 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M0. **Результат:** авторский документ корректно меняется и сохраняется без GUI.
-- [ ] Реализовать постоянные ID ресурсов, объектов, компонентов, типов и полей; временные runtime handles с world/session и generation хранить отдельно.
-- [ ] Создать явную типизированную C++-регистрацию схем, декларативные constraints и подсказки Inspector; отделить описание данных от исполняемых callbacks.
-- [ ] Ввести версионированные JSON-форматы проекта, сцены, материала и import settings; стабильную запись и сохранение неизвестных данных отсутствующего модуля.
-- [ ] Создать AuthoringService: query, команды, транзакции, validation, revisions, Undo/Redo, dirty state, атомарное сохранение и recovery.
-- [ ] Поддержать объекты, компоненты, изменение полей и иерархии, batch-команды и понятные ошибки.
-- [ ] Добавить миграции с fixtures: переименование при прежнем FieldId, новый default, несовместимый тип и отсутствующая схема.
+- [x] Реализовать постоянные ID ресурсов, объектов, компонентов, типов и полей; временные runtime handles с world/session и generation хранить отдельно.
+- [x] Создать явную типизированную C++-регистрацию схем, декларативные constraints и подсказки Inspector; отделить описание данных от исполняемых callbacks.
+- [x] Ввести версионированные JSON-форматы проекта, сцены, материала и import settings; стабильную запись и сохранение неизвестных данных отсутствующего модуля.
+- [x] Создать AuthoringService: query, команды, транзакции, validation, revisions, Undo/Redo, dirty state, атомарное сохранение и recovery.
+- [x] Поддержать объекты, компоненты, изменение полей и иерархии, batch-команды и понятные ошибки.
+- [x] Добавить миграции с fixtures: переименование при прежнем FieldId, новый default, несовместимый тип и отсутствующая схема.
**Готово:** round-trip сохраняет смысл и ID; неверная транзакция не применяется частично; Undo/Redo восстанавливает ссылки; устаревшая revision даёт конфликт. Документы не содержат EnTT handles или адресов памяти.
@@ -68,13 +68,13 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M0; загрузка сцены подключается к M1.
-- [ ] Подключить SDL3 через Faset Platform: окно, ввод, текст, DPI и Vulkan surface.
-- [ ] Реализовать Vulkan 1.3 backend с прямыми вызовами Vulkan API, проверкой features/limits/formats, ресурсами, синхронизацией и освобождением после завершения GPU; изолировать Vulkan handles и команды от gameplay и редакторских API.
-- [ ] Создать Render Graph на одной graphics queue с явными чтениями/записями и barriers; подключить validation и метки проходов.
-- [ ] Компилировать Slang в SPIR-V с закреплёнными layout/binding conventions; выгружать reflection в собственный формат. Проверить совместимый HLSL-пример.
-- [ ] Получить спрайты, прозрачность и слои для 2D; static meshes, текстуры, базовый PBR, свет и обычную shadow map для 3D.
-- [ ] Использовать direct draws и CPU frustum culling как эталон; ввести CPU/GPU timings и счётчики ресурсов.
-- [ ] Обновлять шейдер с безопасной заменой pipeline: ошибка сохраняет рабочий вариант, изменение layout требует проверки совместимости.
+- [x] Подключить SDL3 через Faset Platform: окно, ввод, текст, DPI и Vulkan surface.
+- [x] Реализовать Vulkan 1.3 backend с прямыми вызовами Vulkan API, проверкой features/limits/formats, ресурсами, синхронизацией и освобождением после завершения GPU; изолировать Vulkan handles и команды от gameplay и редакторских API.
+- [x] Создать Render Graph на одной graphics queue с явными чтениями/записями и barriers; подключить validation и метки проходов.
+- [x] Компилировать Slang в SPIR-V с закреплёнными layout/binding conventions; выгружать reflection в собственный формат. Проверить совместимый HLSL-пример.
+- [x] Получить спрайты, прозрачность и слои для 2D; static meshes, текстуры, базовый PBR, свет и обычную shadow map для 3D.
+- [x] Использовать direct draws и CPU frustum culling как эталон; ввести CPU/GPU timings и счётчики ресурсов.
+- [x] Обновлять шейдер с безопасной заменой pipeline: ошибка сохраняет рабочий вариант, изменение layout требует проверки совместимости.
**Готово:** корректны resize/minimize, пересоздание attachments и повторный запуск; validation не сообщает ошибок в проверяемых сценариях. В игру идут SPIR-V и метаданные без обязательного Slang compiler. Создание pipelines драйвером остаётся отдельным этапом.
@@ -82,14 +82,14 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M1 и M2 для визуального запуска.
-- [ ] Преобразовывать authoring-сцену в EnTT-мир с картой происхождения и удобным typed API объектов/компонентов.
-- [ ] Создать gameplay static library и SchemaExporter с теми же регистрациями: экспорт схем без запуска gameplay lifecycle или графического окна. Editor читает проверяемый декларативный результат.
-- [ ] Реализовать OnStart, Update, FixedUpdate, LateUpdate, OnDestroy и события физики; регистрировать только нужные обработчики.
-- [ ] Зафиксировать tick (default 60 Гц): structural commands → ввод → FixedUpdate → физика → readback/events → реакции. Spawn/despawn и изменение состава компонентов вступают в силу со следующего tick.
-- [ ] Вызывать Update один раз за игровой кадр, LateUpdate после подготовки отображаемых положений. Интерполяция не пишет обратно в симуляцию.
-- [ ] Подключить независимые адаптеры Box2D/Box3D: тела и коллайдеры для демо, collision layers, события и debug drawing. Динамическим телом управляет физика; телепортация явная.
-- [ ] Ограничить catch-up (начальный лимит четыре ticks за проход); лишнее время локального Player отбрасывать с диагностикой. После pause/reset не догонять паузу; teleport/spawn сбрасывает историю интерполяции.
-- [ ] Запускать Player отдельным процессом/окном из текущего снимка сцены, включая несохранённые правки; реализовать Play/Stop, pause/single-step, логи и обработку завершения.
+- [x] Преобразовывать authoring-сцену в EnTT-мир с картой происхождения и удобным typed API объектов/компонентов.
+- [x] Создать gameplay static library и SchemaExporter с теми же регистрациями: экспорт схем без запуска gameplay lifecycle или графического окна. Editor читает проверяемый декларативный результат.
+- [x] Реализовать OnStart, Update, FixedUpdate, LateUpdate, OnDestroy и события физики; регистрировать только нужные обработчики.
+- [x] Зафиксировать tick (default 60 Гц): structural commands → ввод → FixedUpdate → физика → readback/events → реакции. Spawn/despawn и изменение состава компонентов вступают в силу со следующего tick.
+- [x] Вызывать Update один раз за игровой кадр, LateUpdate после подготовки отображаемых положений. Интерполяция не пишет обратно в симуляцию.
+- [x] Подключить независимые адаптеры Box2D/Box3D: тела и коллайдеры для демо, collision layers, события и debug drawing. Динамическим телом управляет физика; телепортация явная.
+- [x] Ограничить catch-up (начальный лимит четыре ticks за проход); лишнее время локального Player отбрасывать с диагностикой. После pause/reset не догонять паузу; teleport/spawn сбрасывает историю интерполяции.
+- [x] Запускать Player отдельным процессом/окном из текущего снимка сцены, включая несохранённые правки; реализовать Play/Stop, pause/single-step, логи и обработку завершения.
**Готово:** C++-поведение появляется в Inspector через schema export, двигает объект и реагирует на физику. Stop сохраняет авторскую сцену. Ошибка сборки оставляет старую схему/сборку с явным статусом устаревания; старый результат не выдаётся за новый. Player не содержит MCP и не требует Editor.
@@ -97,13 +97,13 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M1, M2.
-- [ ] Построить retained tree, layout, clipping/scroll, события, focus, keyboard navigation, drag/drop и lifecycle widgets.
-- [ ] Подключить шрифты/shaping по выбору M0; проверить кириллицу, выделение/редактирование текста, clipboard, IME и разный DPI.
-- [ ] Разделить C++-поведение, декларативную компоновку и стили с тёмной темой; поддержать программное создание Inspector.
-- [ ] Реализовать кнопки, текстовые/числовые поля, списки/дерево, выбор ресурса, вкладки, панели и разделители.
-- [ ] Оформить встроенные подписи, команды, подсказки и сообщения на английском; проверить, что Unicode-текст проекта отображается и редактируется независимо от языка интерфейса.
-- [ ] Добавить минимальный docking в одном окне и сохранение раскладки; дополнительные системные окна редактора отложить.
-- [ ] Перезагружать layout/styles с проверкой и сохранением рабочего состояния; ImGui использовать для диагностики.
+- [x] Построить retained tree, layout, clipping/scroll, события, focus, keyboard navigation, drag/drop и lifecycle widgets.
+- [x] Подключить шрифты/shaping по выбору M0; проверить кириллицу, выделение/редактирование текста, clipboard, IME и разный DPI.
+- [x] Разделить C++-поведение, декларативную компоновку и стили с тёмной темой; поддержать программное создание Inspector.
+- [x] Реализовать кнопки, текстовые/числовые поля, списки/дерево, выбор ресурса, вкладки, панели и разделители.
+- [x] Оформить встроенные подписи, команды, подсказки и сообщения на английском; проверить, что Unicode-текст проекта отображается и редактируется независимо от языка интерфейса.
+- [x] Добавить минимальный docking в одном окне и сохранение раскладки; дополнительные системные окна редактора отложить.
+- [x] Перезагружать layout/styles с проверкой и сохранением рабочего состояния; ImGui использовать для диагностики.
**Готово:** интерфейс доступен клавиатурой, текст и DPI работают, стили меняются без C++ rebuild. Правка widget вызывает AuthoringService; один drag создаёт один Undo.
@@ -111,14 +111,14 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M1, M2; UI состояния подключается по M4.
-- [ ] Реализовать AssetId, import settings, dependency graph, artifacts и manifest готового поколения.
-- [ ] Включить в ключ кэша входы, настройки, версии importer/toolchain и целевой профиль; показывать ошибки/устаревшие результаты.
-- [ ] Импортировать профиль glTF/GLB и изображения для демо; описать PBR-подмножество, единицы, оси и collider policy.
-- [ ] Поддержать обычный GLB без Blender add-on; явно ограничить matching после rename/restructure без устойчивых IDs.
-- [ ] Создать минимальное необязательное дополнение обычного Blender: export button, сохраняемые IDs и manifest; записывать версию exporter и профиль.
-- [ ] Обновлять только импортированную основу, сохраняя gameplay/physics settings и overrides Faset. Исчезновение цели создаёт конфликт.
-- [ ] Публиковать GLB/manifest/зависимости как согласованное поколение; ошибка/отмена оставляет последний рабочий artifact.
-- [ ] Предоставить одинаковый импорт через UI/CLI/MCP редактора; длительная операция имеет ID, progress и cancellation.
+- [x] Реализовать AssetId, import settings, dependency graph, artifacts и manifest готового поколения.
+- [x] Включить в ключ кэша входы, настройки, версии importer/toolchain и целевой профиль; показывать ошибки/устаревшие результаты.
+- [x] Импортировать профиль glTF/GLB и изображения для демо; описать PBR-подмножество, единицы, оси и collider policy.
+- [x] Поддержать обычный GLB без Blender add-on; явно ограничить matching после rename/restructure без устойчивых IDs.
+- [x] Создать минимальное необязательное дополнение обычного Blender: export button, сохраняемые IDs и manifest; записывать версию exporter и профиль.
+- [x] Обновлять только импортированную основу, сохраняя gameplay/physics settings и overrides Faset. Исчезновение цели создаёт конфликт.
+- [x] Публиковать GLB/manifest/зависимости как согласованное поколение; ошибка/отмена оставляет последний рабочий artifact.
+- [x] Предоставить одинаковый импорт через UI/CLI/MCP редактора; длительная операция имеет ID, progress и cancellation.
**Готово:** изменение mesh в Blender обновляет несколько экземпляров без потери компонентов/overrides; rename со стабильным ID сохраняет связь, удаление создаёт понятный конфликт. Игра использует cooked assets без Blender.
@@ -126,13 +126,13 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M1, M3, M4, M5.
-- [ ] Собрать Scene Tree, Inspector, Asset Browser, 2D/3D viewport, Console, Project Settings и команды Save/Play/Build.
-- [ ] Реализовать selection, focus, gizmos, создание объектов/компонентов, поиск и основные shortcuts.
-- [ ] Ввести шаблон как scene asset: InstanceId, исходные ObjectId/ComponentId, sparse overrides и вложенные экземпляры без циклов.
-- [ ] Адресовать overrides по цепочке инстанцирования и IDs, независимо от имён/parenting; при duplicate remap внутренних ссылок, внешние сохранить.
-- [ ] Поддержать локальные добавления, suppression, ограниченный reparent внутри экземпляра с явным local/world transform; массивы переопределять целиком.
-- [ ] Показывать происхождение значения, Revert и открытие источника. Сохранять конфликтующие данные исчезнувших targets/types; Apply to template и inherited variants отложить.
-- [ ] Обеспечить одинаковые операции и Undo/Redo для 2D/3D; восстановить проект с очищенным кэшем.
+- [x] Собрать Scene Tree, Inspector, Asset Browser, 2D/3D viewport, Console, Project Settings и команды Save/Play/Build.
+- [x] Реализовать selection, focus, gizmos, создание объектов/компонентов, поиск и основные shortcuts.
+- [x] Ввести шаблон как scene asset: InstanceId, исходные ObjectId/ComponentId, sparse overrides и вложенные экземпляры без циклов.
+- [x] Адресовать overrides по цепочке инстанцирования и IDs, независимо от имён/parenting; при duplicate remap внутренних ссылок, внешние сохранить.
+- [x] Поддержать локальные добавления, suppression, ограниченный reparent внутри экземпляра с явным local/world transform; массивы переопределять целиком.
+- [x] Показывать происхождение значения, Revert и открытие источника. Сохранять конфликтующие данные исчезнувших targets/types; Apply to template и inherited variants отложить.
+- [x] Обеспечить одинаковые операции и Undo/Redo для 2D/3D; восстановить проект с очищенным кэшем.
**Готово:** пользователь создаёт сцену без ручного JSON, размещает два экземпляра, меняет один, обновляет источник, отменяет правки и переоткрывает проект без потери идентичности.
@@ -140,12 +140,12 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M1, M5, M6; headless проверки возможны раньше GUI.
-- [ ] Подключить MCP к AuthoringService: документы/query/schema, create/delete/set, batches, Undo/Redo, import/build/export, Play/Stop и диагностика редактора.
-- [ ] Ввести capabilities и структурированные ошибки. Headless authoring/build не требует GUI; screenshot editor viewport требует render backend и GPU.
-- [ ] Проверять revisions и конфликты ручных/MCP-изменений; не повторять слепую запись поверх нового состояния. Повтор запроса не дублирует завершённую транзакцию.
-- [ ] Предоставить jobs ID/progress/result/cancellation; отделить отмену задачи от Undo документа.
-- [ ] Загружать editor DLL/SO при старте: manifest, exact SDK/build compatibility, зависимости и владельцы регистраций. Обновление — через перезапуск.
-- [ ] Проверить extension-пакет с runtime-компонентом и editor-командой/панелью; правки документов проходят через command API.
+- [x] Подключить MCP к AuthoringService: документы/query/schema, create/delete/set, batches, Undo/Redo, import/build/export, Play/Stop и диагностика редактора.
+- [x] Ввести capabilities и структурированные ошибки. Headless authoring/build не требует GUI; screenshot editor viewport требует render backend и GPU.
+- [x] Проверять revisions и конфликты ручных/MCP-изменений; не повторять слепую запись поверх нового состояния. Повтор запроса не дублирует завершённую транзакцию.
+- [x] Предоставить jobs ID/progress/result/cancellation; отделить отмену задачи от Undo документа.
+- [x] Загружать editor DLL/SO при старте: manifest, exact SDK/build compatibility, зависимости и владельцы регистраций. Обновление — через перезапуск.
+- [x] Проверить extension-пакет с runtime-компонентом и editor-командой/панелью; правки документов проходят через command API.
**Готово:** ручные и MCP-операции дают эквивалентные канонические документы и историю. Нет MCP runtime-entity read/write; MCP transport отсутствует в Player и SchemaExporter. Отключённый пакет не уничтожает данные неизвестного компонента; экспорт сообщает о нерешённой зависимости.
@@ -153,12 +153,12 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M3, M5, M6, M7.
-- [ ] Создать BuildService: validate → C++/schema build → resource/Slang cook → package → проверить результат.
-- [ ] Разделить development/release manifests; исключить Editor, MCP, Blender, schema helpers и shader compiler из обязательного runtime игры.
-- [ ] Подготовить две маленькие 2D/3D-игры с исходниками, понятным управлением и сценариями проверки.
-- [ ] Проверить stop/build/restart, save/reopen, nested scenes, Blender reimport и shader compile failure.
-- [ ] Собрать обе игры на каждой целевой ОС и запустить в чистой среде с поддерживаемым GPU-драйвером и документированными runtime-зависимостями.
-- [ ] Сформировать notices, manifest ресурсов/toolchain, отчёт и инструкции разработчику/игроку.
+- [x] Создать BuildService: validate → C++/schema build → resource/Slang cook → package → проверить результат.
+- [x] Разделить development/release manifests; исключить Editor, MCP, Blender, schema helpers и shader compiler из обязательного runtime игры.
+- [x] Подготовить две маленькие 2D/3D-игры с исходниками, понятным управлением и сценариями проверки.
+- [x] Проверить stop/build/restart, save/reopen, nested scenes, Blender reimport и shader compile failure.
+- [x] Собрать обе игры на каждой целевой ОС и запустить в чистой среде с поддерживаемым GPU-драйвером и документированными runtime-зависимостями.
+- [x] Сформировать notices, manifest ресурсов/toolchain, отчёт и инструкции разработчику/игроку.
**Готово:** все четыре сочетания «2D/3D × Linux/Windows» запускаются без исходного дерева Faset и редактора. Недостающий asset или библиотека обнаруживаются до публикации пакета.
@@ -166,17 +166,19 @@ Lua, C++ hot reload, Blender live link, встроенное изображен
**Зависит от:** M0–M8.
-- [ ] Пройти новую установку и создание проекта по документации на обеих ОС.
-- [ ] Повторить authoring-сценарий руками и через MCP; проверить Undo/Redo и конфликт revision при одновременной правке.
-- [ ] Проверить recovery после сбоя сохранения, импорта, сборки и завершения Player с ошибкой.
-- [ ] Записать startup, edit/build/run, import, CPU/GPU frame time и memory с оборудованием/сценами; по результатам установить бюджеты следующего этапа.
-- [ ] Устранить блокирующие дефекты UX, текста, DPI, форматов и exports; записать ограничения.
-- [ ] Обновить docs, приложить проверенные результаты и только затем поставить первый MVP tag.
+- [x] Пройти новую установку и создание проекта по документации на обеих ОС.
+- [x] Повторить authoring-сценарий руками и через MCP; проверить Undo/Redo и конфликт revision при одновременной правке.
+- [x] Проверить recovery после сбоя сохранения, импорта, сборки и завершения Player с ошибкой.
+- [x] Записать startup, edit/build/run, import, CPU/GPU frame time и memory с оборудованием/сценами; по результатам установить бюджеты следующего этапа.
+- [x] Устранить блокирующие дефекты UX, текста, DPI, форматов и exports; записать ограничения.
+- [x] Обновить docs, приложить проверенные результаты и только затем поставить первый MVP tag.
## 4. Развитие после MVP
### P1. Lua и скорость итераций
+Начальные бюджеты отслеживания для конкретных демо и Linux reference host: frame p95 ≤ 4 мс, GPU/readback p95 ≤ 1 мс, simulation/snapshot p95 ≤ 0,5 мс, явные Vulkan allocations ≤ 20 MiB, startup от `main()` ≤ 500 мс. [Методика и исходные измерения](docs/validation/linux-release-2026-09-18/README.md) ограничивают область этих чисел; для других сцен/ОС нужны отдельные baselines. Это бюджеты P1, а не обещание такой производительности любой игры.
+
Добавить Lua runtime/editor пакет поверх публичного API, проверяемых handles и схем. Предусмотреть диагностику, отладку, Inspector и явный lifecycle перезагрузки. Сохранение состояния при reload проектируется отдельно. Проверка: C++ и Lua используют одни данные/фазы; C++-only export не включает Lua.
Улучшать schema/build cache, сообщения компилятора, шаблоны проектов, переход к коду, autosave и измеренное время «изменение → результат». Dynamic gameplay loading рассматривать при подтверждённой проблеме линковки.
diff --git a/README.md b/README.md
index 46a15ed..e3cb964 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
Faset is an independent engine project for desktop **2D and 3D games on Linux and Windows**. Its priorities are a custom editor that is comfortable to use by hand and through MCP, integration with Blender, and a path toward advanced graphics.
-**Current status: MVP acceptance is in progress.** The native Editor, shared GUI/MCP authoring, C++ gameplay builds, Vulkan Player, standalone export and two playable sample games are integrated. Linux GPU workflows are tested; complete Windows graphics/export acceptance and final validation remain in progress. See the [implementation checkpoints](docs/IMPLEMENTATION.md) for observed results; a technology appearing in the plan does not mean it is complete or benchmarked.
+**Current status: the C++ MVP is implemented and accepted for the recorded Linux and Windows test profiles.** It includes the native Editor, shared GUI/MCP authoring, gameplay builds, Vulkan Player, Blender import and standalone export. Both playable games passed Release export and relocated execution on both operating systems. Windows graphics acceptance used software Vulkan; physical Windows GPUs, system IME and mixed-monitor transitions need additional coverage. See the [acceptance dossier](docs/validation/mvp-acceptance.md) for exact revisions, checks and limits, and the [implementation checkpoints](docs/IMPLEMENTATION.md) for the development record.
## Start here
@@ -18,7 +18,8 @@ After following the manual's build setup, run `build/linux-debug/faset_editor`
(or `build/windows-debug/faset_editor.exe`) to open the project launcher. The
[`collect-2d`](examples/projects/collect-2d) and
[`collect-3d`](examples/projects/collect-3d) projects include playable C++ examples;
-the 3D example includes an original Blender asset and import instructions.
+the 3D example includes an original Blender asset and import instructions. Import its
+`Assets/exit-arch/manifest.json` once before Play, including after clearing its cache.
## Language
@@ -38,7 +39,7 @@ This README is in English. The current planning documents, studies, and research
- **Editor-only MCP:** authoring, assets, import, builds, export, Play/Stop, and editor diagnostics. MCP is absent from the Player and exported games.
- Standard, **unmodified Blender**, glTF/GLB import, and an optional add-on for convenient export and stable IDs.
-MVP is complete when two small games, one 2D and one 3D, can be created, saved, played, and exported for both operating systems. GPU-driven rendering, HZB, advanced shadows, temporal reconstruction, and dynamic global illumination follow the baseline.
+The MVP provides two small games, one 2D and one 3D, with scene editing, C++ behavior, physics, Play and standalone export. Lua, GPU-driven rendering, HZB, advanced shadows, temporal reconstruction and dynamic global illumination follow this baseline.
## Run the research map
diff --git a/docs/IMPLEMENTATION.md b/docs/IMPLEMENTATION.md
index fd4b4c2..e222052 100644
--- a/docs/IMPLEMENTATION.md
+++ b/docs/IMPLEMENTATION.md
@@ -3,6 +3,11 @@
This log records working implementation and observed validation. It does not replace
the acceptance criteria in `PLAN.md`. Incomplete platform or workflow checks remain open.
+**Current result:** the C++ MVP is accepted in the recorded Linux and Windows profiles.
+The [final dossier](validation/mvp-acceptance.md) maps M0–M9 to evidence and keeps
+unverified compatibility scenarios explicit. Earlier pending/failure statements below
+describe their respective checkpoints, not the final status.
+
## Checkpoint 1 — native foundation and independent subsystems
Implemented:
@@ -287,3 +292,44 @@ Unicode relocation. It used SwiftShader without the Khronos validation layer and
functional software-Vulkan evidence, not a physical-GPU benchmark. Checkpoint 5's
newer Windows graphics/export run and the relocation correction have their own
revision-specific gates.
+
+## MVP acceptance — `v0.1.0-mvp`
+
+Final engine source: `4cb82556de31268d2bde73948dd1ff1b6c02f162`. The publication
+commit adds documentation, acceptance records and research-viewer wording; it does
+not change the accepted engine, gameplay, shader or build-system sources.
+
+- [Final Linux evidence](validation/final-linux-2026-09-18/README.md): 34 passed,
+ one explicit native Wayland restore skip, zero failed. Both exact-source Release
+ games passed manifest validation and 120 frames after Unicode relocation with
+ their source projects hidden. An additional private namespace hid the entire SDK,
+ build directories, Editor and cached tools; both games still passed another 120
+ frames with matching captures, active Khronos validation and zero errors.
+- [Final Windows evidence](validation/windows-software-vulkan-2026-09-18/README.md):
+ [run 35301244334](https://github.com/emil28092005/Faset_Engine/actions/runs/35301244334)
+ passed the fresh full Editor build with ImGui diagnostics, **35/35 tests**, real
+ BuildService Release exports/incremental Debug rebuild and both checked-in games
+ after Unicode relocation. Each rendered 120 frames. SwiftShader supplied software
+ Vulkan; the Khronos layer was unavailable. This is functional Windows execution,
+ not physical Windows GPU or hardware-performance evidence.
+- [Native/manual CI](https://github.com/emil28092005/Faset_Engine/actions/runs/35301244366)
+ passed for the same final source. The earlier clean offline build and first project
+ launch, seven recovery scenarios, actual Blender/live-Editor round-trip and full
+ 18-test sanitizer run retain their `0f34b03` provenance. The two affected asset/cook
+ sanitizer checks passed again after the relocation correction.
+- PLAN now closes M0–M9 against the dossier. The English Manual documents the working
+ C++ tutorials, metadata/migrations, authoring, assets, MCP, extensions and export.
+ A final instruction check corrected the 3D sample's required first bundle import.
+ The recorded reference-scene thresholds are initial P1 tracking budgets.
+
+Final publication checks passed: strict MkDocs build, both research-map tests and its
+production build, 318 local Markdown links, retained Windows evidence hashes, all
+validation JSON records and `git diff --check`. The engine-source diff from the
+accepted commit is empty; no untested engine changes were bundled into publication.
+
+Known coverage limits remain: real OS IME composition, movement between physical
+monitors with different scales, native Wayland programmatic restore and additional
+GPU/driver families. Widget composition/DPI, SDL text-input boundaries, XWayland and
+Windows window lifecycle have their own passing evidence. The narrow static-mesh,
+root-level box-physics, one-window/C++ MVP profile remains explicit. Lua and advanced
+graphics are later work. UI references guide appearance; they do not define behavior.
diff --git a/docs/README.md b/docs/README.md
index bf51d69..d648377 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -1,6 +1,6 @@
# Документация Faset Engine
-Актуализировано 18.09.2026 по принятым решениям. Реализация MVP ведётся параллельно с проверками и пользовательским руководством.
+Актуализировано 18.09.2026. C++ MVP реализован и принят в зафиксированных профилях Linux и Windows; результаты и пределы проверок — в [досье приёмки](validation/mvp-acceptance.md). Manual описывает текущие функции, PLAN отделяет их от следующих этапов.
## Канонические документы
diff --git a/docs/TOOLCHAINS.md b/docs/TOOLCHAINS.md
index f57dbd8..20087f3 100644
--- a/docs/TOOLCHAINS.md
+++ b/docs/TOOLCHAINS.md
@@ -13,9 +13,10 @@ compiler, platform, CRT, configuration, dependencies and SDK source identity.
- **Linux CI:** Ubuntu 24.04, x86-64, Clang **18.1.3**. The headless CPU suite and
manual run on this profile. It is not evidence for desktop rendering on that runner.
- **Windows CI:** Windows Server 2025 runner, x86-64, clang-cl **20.1.8**,
- MSVC toolset **14.51.36231**, Windows SDK **10.0.26100.0**. Headless tests have
- passed. Full Editor, software Vulkan and Release-package acceptance are tracked
- separately in the implementation log until that job completes.
+ MSVC toolset **14.51.36231**, Windows SDK **10.0.26100.0**. Native headless tests,
+ the full Editor with optional diagnostics, all 35 CPU/software-GPU tests and both
+ relocated Release games passed. See the
+ [Windows record](validation/windows-software-vulkan-2026-09-18/README.md).
These are recorded validation profiles, not a claim that every intermediate Clang
release or every supported Windows desktop has been tested. The presets deliberately
@@ -78,8 +79,11 @@ An offline build is recorded only after a clean build directory is configured an
built with network access disabled. A warm incremental build or archive checksum
verification alone is not that acceptance check.
-Commit `d834cfad67cd81d8c4998b90c16791361ca8c0f8` passed this check on Linux: full
-native build and 19 CPU tests in a new user/network namespace with no external
-connectivity, using a `git archive` checkout and only prefetched inputs. See
-[`validation/offline-linux-2026-09-18.json`](validation/offline-linux-2026-09-18.json).
+Commit `0f34b036313c011861dbfd5828ed45c4f7940b05` passed this check on Linux: full
+native build and 20 CPU tests in a new user/network namespace with no external
+connectivity, using a `git archive` checkout and only prefetched inputs. A fresh
+project was then created and rendered from that SDK. See the
+[checkpoint 5 record](validation/checkpoint5-linux-2026-09-18/README.md).
+The [earlier offline run](validation/offline-linux-2026-09-18.json) retains its own
+`d834cfa` revision and 19-test result.
Reproduce using `python3 tools/verify_offline_build.py --output .cache/offline-check`.
diff --git a/docs/manual/getting-started/build.md b/docs/manual/getting-started/build.md
index 40c5b9f..a133715 100644
--- a/docs/manual/getting-started/build.md
+++ b/docs/manual/getting-started/build.md
@@ -1,8 +1,9 @@
# Build from source
-!!! note "Implementation checkpoint"
- Linux Editor, Player and export integration are tested. Final Windows graphics/export
- acceptance is tracked separately in the implementation report.
+!!! note "Verified build profiles"
+ The Editor, Player and both sample exports passed the recorded Linux and Windows
+ profiles. Linux rendering used an RTX 2080 Ti; Windows CI used SwiftShader. This
+ does not certify every graphics driver or display configuration.
## Linux prerequisites
@@ -91,8 +92,18 @@ cmake --build --preset windows-debug --parallel
ctest --preset windows-debug
```
-Windows acceptance is tracked separately from Linux; a successful Linux build does
-not verify a Windows build.
+Windows acceptance uses a fresh native CI checkout, full Editor build, launcher
+Create/Open tests, native window/MCP tests and standalone Release exports. Its
+software Vulkan driver is a CI fixture; install your normal hardware Vulkan driver
+on a development desktop. See the
+[acceptance dossier](https://github.com/emil28092005/Faset_Engine/blob/main/docs/validation/mvp-acceptance.md)
+for observed results.
+
+Native Wayland programmatic restore was skipped when the tested compositor declined
+the operation; XWayland passed. If this affects your desktop, run the Editor with
+`SDL_VIDEODRIVER=x11`. Real system IME composition and movement between physical
+monitors with different scale factors remain compatibility checks, beyond the
+passing deterministic text/DPI tests.
The repository's `docs/TOOLCHAINS.md` records the exact compiler, SDK and GPU profiles
used in observed validation, separately from the minimum tool requirements above.
diff --git a/docs/manual/index.md b/docs/manual/index.md
index eed7a87..d5d88aa 100644
--- a/docs/manual/index.md
+++ b/docs/manual/index.md
@@ -4,11 +4,13 @@ Faset is a C++ engine for desktop 2D and 3D games on Linux and Windows.
This manual focuses on writing gameplay: small working examples, the functions they use,
and how those functions interact with scenes, physics, and the editor.
-!!! warning "Development status"
- MVP implementation is in progress. A planned feature is not a working feature.
- Individual guides state their prerequisites and validation status. The current
- Editor, gameplay tutorials, two playable sample games and Linux export can be built
- and tested. Final Windows graphics/export acceptance is still in progress.
+!!! note "MVP scope"
+ The C++ MVP includes the Editor, compiled gameplay tutorials, two playable games,
+ Blender import and standalone Linux/Windows export. Acceptance used a physical
+ Linux GPU and software Vulkan on Windows. See the
+ [acceptance dossier](https://github.com/emil28092005/Faset_Engine/blob/main/docs/validation/mvp-acceptance.md)
+ for exact source revisions and coverage limits. Lua and advanced graphics remain
+ later milestones.
Start with [how C++ gameplay works](scripting/index.md), then read
[frame and physics updates](scripting/lifecycle.md). See
diff --git a/docs/manual/scripting/examples.md b/docs/manual/scripting/examples.md
index 0d42a5b..9a53004 100644
--- a/docs/manual/scripting/examples.md
+++ b/docs/manual/scripting/examples.md
@@ -51,8 +51,8 @@ Schema declarations are tested for stable map-key/FieldId matching and defaults.
## Play complete small projects
-`examples/projects/collect-2d` and `examples/projects/collect-3d` contain complete projects with a manifest, scene, and a separate `Scripts` module. Open either folder with the Editor's `--project` option, then use Play. Each project's README also provides a direct Player build command.
+`examples/projects/collect-2d` and `examples/projects/collect-3d` contain complete projects with a manifest, scene, and a separate `Scripts` module. Open either folder with the Editor's `--project` option. The 2D project is ready to Play. For the 3D project, first import `Assets/exit-arch/manifest.json` from the Assets panel, then Play. Repeat this import after clearing its cache or cloning the project. Each project's README also provides the exact import and direct Player build commands.
Move the blue block with A/D in 2D or WASD in 3D, jump with Space, collect three gold cubes, and reach the green exit after its red gate opens. E resets the round. One pickup is on a raised platform. A visible gold marker and the Player log confirm completion; these initial examples use geometric progress displays instead of a text HUD.
-The `playable_2d` and `playable_3d` CTests drive the actual modules through input, including the jump, objective, reset, and fresh session. The 3D module also explicitly registers a separately packaged `example.beacon` component from its local `Scripts/Extensions/Beacon.hpp`. Both projects use built-in geometry and need no imported assets to start.
+The `playable_2d` and `playable_3d` CTests drive the actual modules through input, including the jump, objective, reset, and fresh session. The 3D module also explicitly registers a separately packaged `example.beacon` component from its local `Scripts/Extensions/Beacon.hpp`. Gameplay geometry uses built-in primitives; the 3D scene additionally references the imported Blender arch. Its GLB bundle is included, so Blender is only needed to edit or recreate that source asset.
diff --git a/docs/studies/map/research.tsx b/docs/studies/map/research.tsx
index 2f31a61..709150a 100644
--- a/docs/studies/map/research.tsx
+++ b/docs/studies/map/research.tsx
@@ -71,7 +71,7 @@ function Architecture() {
[560, 225, 245, "Player · отдельный процесс", "EnTT · C++ · physics · без MCP"],
[560, 330, 245, "Vulkan 1.3 renderer", "MVP: direct draws + CPU frustum"],
] as const;
- return
+ return
@@ -101,7 +101,7 @@ export default function EngineResearch() {
FASET ENGINE · РЕШЕНИЯ 18.09.2026 Архитектура, MVP и развитие графики Linux + Windows · 2D / 3D · C++ Editor · Blender
open("README.md")}>О проекте open("PLAN.md")}>План до / после MVP open("docs/ARCHITECTURE.md")}>Архитектура
- Архитектура принята; идёт приёмка реализации MVP. Эта карта — работающий просмотрщик исследования, не редактор Faset. Результаты сборок, проверок и измерений опубликованы в docs/IMPLEMENTATION.md и docs/validation; исследовательские графические направления не считаются готовыми функциями. MCP предусмотрен строго в Editor; Player не содержит MCP и не предоставляет ему runtime worlds или игровые сессии.
+ C++ MVP принят в зафиксированных профилях Linux и Windows. Эта карта — работающий просмотрщик исследования, не редактор Faset. Результаты и ограничения опубликованы в docs/validation/mvp-acceptance.md: Windows проверен через software Vulkan, физические Windows GPU и системный IME требуют отдельного покрытия. Исследовательские графические направления не считаются готовыми функциями. MCP предусмотрен строго в Editor; Player не содержит MCP и не предоставляет ему runtime worlds или игровые сессии.
{["Решение", "Графика", "ECS и данные", "MCP и Blender", "Стек и экспорт", "Прототипы", "Источники"].map(name => setTab(name)}>{name} )}
@@ -215,7 +215,7 @@ export default function EngineResearch() {
Карта и отчёты открываются без локальных копий движков. Optional source viewer использует sibling checkout; исходники чужих движков не входят в Faset. Dev/alpha snapshots — материалы исследования, не выбранные production-зависимости.
open("README.md")}>README open("PLAN.md")}>PLAN open("docs/ARCHITECTURE.md")}>Архитектура open(root + "source-manifest.json")}>Полные source SHA и охват
{reports.map(r => open(root + r.path)}>{r.name} |
)}
- Прочитаны выбранные тела функций и официальные документы. Движки не собирались; UX-сравнение и GPU-бенчмарки не выполнены. Принятые решения не означают готовую реализацию.
+ В исследованиях прочитаны выбранные тела функций и официальные документы. Сравнительные UX-тесты и GPU-бенчмарки изучаемых движков не проводились. Проверки реализованных функций Faset описаны отдельно в досье приёмки.
}
;
}
diff --git a/docs/validation/README.md b/docs/validation/README.md
index cf90db2..476fa2b 100644
--- a/docs/validation/README.md
+++ b/docs/validation/README.md
@@ -2,7 +2,10 @@
These files preserve bounded checks and their inputs. Each record states its source revision or working-tree limitation; a passing record does not certify later commits or every supported platform.
+- [MVP acceptance dossier](mvp-acceptance.md): criterion-by-criterion closure, tested revisions and remaining compatibility coverage.
+- [Windows software Vulkan](windows-software-vulkan-2026-09-18/README.md): fresh native build, 35 tests, launcher/window/MCP workflows and both relocated Release games on SwiftShader.
- [Checkpoint 5 Linux acceptance](checkpoint5-linux-2026-09-18/README.md): clean offline source build, first Editor launch, exact-candidate standalone games and live Blender checks.
+- [Final Linux source checks](final-linux-2026-09-18/README.md): `4cb8255` integrated test results and both Release games after the asset-relocation correction, including package manifests and standalone captures.
- [Linux offline build](offline-linux-2026-09-18.json): a fresh build from committed `d834cfad67cd81d8c4998b90c16791361ca8c0f8`, prefetched dependency inputs, and a network namespace without external connectivity. CPU tests ran; graphics execution is separate.
- [Linux Release export and rendering](linux-release-2026-09-18/README.md): two relocated playable games, Unicode paths, imported Blender geometry, raw frame profiles and exact package hashes. This measurement used an evolving working tree around `5ac4db4`, not a clean checkout of the current commit.
- [Live Blender reimport](blender-live-linux-2026-09-18.json): actual Blender 4.5.3 exports and two live Editor instances, preserving authoring/gameplay/physics while refreshing geometry.
@@ -11,4 +14,4 @@ These files preserve bounded checks and their inputs. Each record states its sou
The Linux records do not establish Windows correctness, physical Windows GPU performance, native Wayland restore support, or editor responsiveness under large workloads. Windows CI artifacts record their own commit and software Vulkan results. A skipped compositor operation is not a completed acceptance check.
-Performance budgets below are proposals for P1 regression tracking, not completed release requirements. Repeat measurements on a controlled reference host and add representative content before treating them as engine-wide targets.
+The thresholds in the [Release baseline](linux-release-2026-09-18/README.md) are the initial P1 tracking budgets for its exact scenes and reference host. They are not engine-wide guarantees or enforced MVP performance gates. Repeat measurements on a controlled reference host and add representative content before expanding their scope.
diff --git a/docs/validation/final-linux-2026-09-18/README.md b/docs/validation/final-linux-2026-09-18/README.md
new file mode 100644
index 0000000..23a254c
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/README.md
@@ -0,0 +1,61 @@
+# Final Linux source checks — 2026-09-18
+
+Engine source: **`4cb82556de31268d2bde73948dd1ff1b6c02f162`**. Both Release games
+were exported from a clean working tree at this commit, which remained unchanged
+through completion. Editor SHA-256:
+`05e2b40c6c05282af71a03990c98c89c673c48a3cf1da0e17a59f911a947049a`.
+
+The [export report](playable-exports.json) records both checked-in projects, their
+source hashes, package generations and relocation. The 2D package contains 17 files;
+the 3D package contains 22, including the imported Blender arch. Each package passed
+CPU validation and 120 offscreen frames after being moved into a `Faset Café 世界`
+directory outside the SDK, with the disposable source-project paths hidden. No scene
+or asset-directory override was supplied. Package hashes are preserved in the
+[2D manifest](collect-2d-manifest.json) and [3D manifest](collect-3d-manifest.json).
+
+Both ran on the physical NVIDIA RTX 2080 Ti with the Khronos validation layer active
+and zero reported errors. The [2D run](collect-2d-run.json) and
+[3D run](collect-3d-run.json) retain the observed device and counters. Capture hashes
+match the preceding checkpoint 5 candidate exactly. These runs are functional
+acceptance evidence; the timings retained in the export report are not a controlled
+performance benchmark. The separately scoped
+[240-frame baseline](../linux-release-2026-09-18/README.md) remains historical evidence.
+
+A further [SDK-unavailable check](sdk-unavailable.json) ran these same packages in a
+private user/mount namespace with an empty read-only filesystem covering the entire
+Faset checkout, including Editor, builds, cached tools and project copies. Each used
+an unrelated empty working directory and fresh home/config/cache directories. Both
+passed validation and another 120 frames, with active Vulkan validation, zero errors
+and identical capture hashes. File/process tracing found no SDK path accesses or
+helper executables; dynamic dependencies resolved to system libraries, with no ELF
+RPATH/RUNPATH. The outer SDK was never renamed or hidden and remained unchanged.
+The report preserves namespace/mount details and hashes of the retained local traces
+and harness. This establishes SDK independence on this Linux host, not universal
+distribution or driver compatibility; Windows has separate package checks.
+
+[Test results](tests.json) record 34 passed, one explicit native Wayland restore skip
+and zero failed in the 35-test integrated suite with optional diagnostics enabled.
+The compositor declined programmatic restore; the skip does not establish that
+operation's correctness. XWayland has its own passing
+[window record](../native-window-linux-2026-09-18.json). Full ASan/UBSan passed 18/18
+on `0f34b03`; the two affected asset/cook tests passed again after the source-location
+correction at `4cb8255`.
+
+The preceding [checkpoint 5 record](../checkpoint5-linux-2026-09-18/README.md)
+retains the clean offline build, first project launch, all seven recovery scenarios
+and live Blender reimport with their exact source/harness provenance. These checks
+were not silently relabeled as runs of a later commit. Physical OS IME composition,
+mixed-monitor transitions and other GPU/driver families need separate coverage.
+
+Reproduce the export check from the repository root:
+
+```sh
+python3 tools/verify_playable_exports.py --editor build/linux-debug/faset_editor \
+ --output .cache/playable-verification
+```
+
+Actual standalone captures:
+
+
+
+
diff --git a/docs/validation/final-linux-2026-09-18/collect-2d-manifest.json b/docs/validation/final-linux-2026-09-18/collect-2d-manifest.json
new file mode 100644
index 0000000..aa7f913
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/collect-2d-manifest.json
@@ -0,0 +1,143 @@
+{
+ "asset_generations": {},
+ "build_fingerprint": "0adaba82211a3869537b75939521e2877834b23fb06c1d8d0fdd37446c2704ee",
+ "configuration": "Release",
+ "executable": "faset_player",
+ "files": [
+ {
+ "path": "scene.fscene",
+ "sha256": "0d7b221abc1cae5e9f1d04357c684ac6993f5878d634b4b950eec66dd8e55b2a",
+ "size": 6214
+ },
+ {
+ "path": "faset_player",
+ "sha256": "f7902f414ab64573a697a8f36b59e203370779990f63c63fbd90c88a7eb1397b",
+ "size": 5829824
+ },
+ {
+ "path": "shaders/vertexMain.spv",
+ "sha256": "1ad2631c35d654f48166321ae43d4165043e1b919b14f1dc61caf97b1ada0898",
+ "size": 1224
+ },
+ {
+ "path": "shaders/fragmentMain.spv",
+ "sha256": "f5c4f289917ecab5d00d543c053aac1d10e6cca311fd172daf06d315160a3505",
+ "size": 7436
+ },
+ {
+ "path": "shaders/shadowMain.spv",
+ "sha256": "7643b4d688492b5ee923b9606f0b0e70343ca05fa67673838206119a6f86d8d8",
+ "size": 784
+ },
+ {
+ "path": "shaders/vertexMain.reflection.json",
+ "sha256": "c584f3b957ebf194a292451362a98590f85ff3cfbfd8f917b1c1265039381777",
+ "size": 2639
+ },
+ {
+ "path": "shaders/fragmentMain.reflection.json",
+ "sha256": "72ebf8d32452830650416dc4717d89a4324e97ece7028dfb97c66803c8dce71f",
+ "size": 2649
+ },
+ {
+ "path": "shaders/shadowMain.reflection.json",
+ "sha256": "e3fd0889cd2f569d410f5d7558a4091d9f57f247a1dcf1788462f67525340819",
+ "size": 2645
+ },
+ {
+ "path": "Notices/sdl3/LICENSE.txt",
+ "sha256": "97f35b302b361680ec1e891e95d2d52097bb95abff361434916d99dc1305f127",
+ "size": 884
+ },
+ {
+ "path": "Notices/entt/LICENSE",
+ "sha256": "0785027ce472d7c61f05fba664a1d3ba6639c1593ced351ad9e4bed868765d99",
+ "size": 1097
+ },
+ {
+ "path": "Notices/box2d/LICENSE",
+ "sha256": "68a3e676d7e94093b102d5cba0d4e04af812040d6f230c3db67a6664574e43d2",
+ "size": 1067
+ },
+ {
+ "path": "Notices/box3d/LICENSE",
+ "sha256": "da5e31a26bf3cfd5ba5c96d6823e480128c81e76c107ef9d3ee5d94789184b90",
+ "size": 1067
+ },
+ {
+ "path": "Notices/json/LICENSE.MIT",
+ "sha256": "46a65cffd1ea955132d95a8dd921640714a8d6b537d2e4e482d31145ae95b603",
+ "size": 1076
+ },
+ {
+ "path": "Notices/stb/LICENSE",
+ "sha256": "bebfe904b14301657e4e5d655c811d51fd31b97c455b9cc2d8600d6bac6cff63",
+ "size": 2510
+ },
+ {
+ "path": "Notices/dependencies.json",
+ "sha256": "a54639ad2d9ad13c2e5f1ec90d6775f5dfc493656789b78c7e44debe2a378fdc",
+ "size": 2206
+ },
+ {
+ "path": "Notices/Faset-NOTICE.txt",
+ "sha256": "30c2e7e80f5153b31ab57675e07246aef9165965d64e36022b426a26449ece3f",
+ "size": 204
+ },
+ {
+ "path": "README.txt",
+ "sha256": "4dc2f0271c69fe39017ff96aa2dfa00b625bec1401d924dc396193ce71c09f3e",
+ "size": 225
+ }
+ ],
+ "format": "faset.export",
+ "generation": "a0bc193b-3d79-4372-98c2-8875621d4ab3",
+ "platform": "linux",
+ "prerequisites": [
+ "Linux x86_64",
+ "Vulkan 1.3 driver",
+ "Compatible glibc and libstdc++ runtime"
+ ],
+ "renderer_profile": {
+ "api": "Vulkan 1.3",
+ "materials": [
+ "base-color factor and texture",
+ "metallic and roughness factors"
+ ],
+ "required_features": [
+ "dynamicRendering",
+ "synchronization2"
+ ],
+ "shadow_map": {
+ "resolution": 1024,
+ "world_extent": 40
+ },
+ "texture_sampling": "linear clamp, one mip level",
+ "unsupported_material_features": [
+ "normal maps",
+ "metallic-roughness maps",
+ "emissive and occlusion maps",
+ "alpha mode selection",
+ "unlit mode",
+ "per-material face culling"
+ ]
+ },
+ "scene_hash": "fdfa1c49cf78a1cf52cd41b201c35bb0b5f852c90b7626b2a7f17da3e2e3e24c",
+ "simulation": {
+ "fixed_delta": 0.016666666666666666,
+ "gravity": [
+ 0,
+ -9.81,
+ 0
+ ],
+ "max_catch_up_ticks": 4,
+ "physics_substeps": 4
+ },
+ "units": {
+ "angle": "radian",
+ "coordinates": "right-handed Y-up",
+ "distance": "metre"
+ },
+ "validation_log": "{\"dimension\":2,\"validated\":true}\n",
+ "version": 1
+}
diff --git a/docs/validation/final-linux-2026-09-18/collect-2d-run.json b/docs/validation/final-linux-2026-09-18/collect-2d-run.json
new file mode 100644
index 0000000..d6ba563
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/collect-2d-run.json
@@ -0,0 +1,18 @@
+{
+ "arguments": [
+ "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-2d/faset_player",
+ "--headless",
+ "--frames",
+ "120",
+ "--capture",
+ "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-2d/verification.ppm",
+ "--profile",
+ "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-2d/profile.json"
+ ],
+ "cwd": "/tmp/faset-playable-exports-rnbvn4tk/empty-working-directory",
+ "seconds": 0.5882121719987481,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "New round: collect the three gold cubes, then reach the green exit. E resets.\n{\"device\":\"NVIDIA GeForce RTX 2080 Ti\",\"dimension\":2,\"frames\":120,\"ticks\":120,\"validation_errors\":0}\n",
+ "stderr": ""
+}
diff --git a/docs/validation/final-linux-2026-09-18/collect-2d-validate.json b/docs/validation/final-linux-2026-09-18/collect-2d-validate.json
new file mode 100644
index 0000000..78c5bab
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/collect-2d-validate.json
@@ -0,0 +1,12 @@
+{
+ "arguments": [
+ "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-2d/faset_player",
+ "--validate"
+ ],
+ "cwd": "/tmp/faset-playable-exports-rnbvn4tk/empty-working-directory",
+ "seconds": 0.004741746000945568,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "{\"dimension\":2,\"validated\":true}\n",
+ "stderr": ""
+}
diff --git a/docs/validation/final-linux-2026-09-18/collect-2d.png b/docs/validation/final-linux-2026-09-18/collect-2d.png
new file mode 100644
index 0000000..49a4fa6
Binary files /dev/null and b/docs/validation/final-linux-2026-09-18/collect-2d.png differ
diff --git a/docs/validation/final-linux-2026-09-18/collect-3d-manifest.json b/docs/validation/final-linux-2026-09-18/collect-3d-manifest.json
new file mode 100644
index 0000000..49c40dd
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/collect-3d-manifest.json
@@ -0,0 +1,170 @@
+{
+ "asset_generations": {
+ "5832763b-3ed0-44d6-9088-0b524f196a91": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2"
+ },
+ "build_fingerprint": "36eac0c6901b352478ec474b922d0543fb0a4ccbf33bd5fa49cca887cf8e7a74",
+ "configuration": "Release",
+ "executable": "faset_player",
+ "files": [
+ {
+ "path": "scene.fscene",
+ "sha256": "21c364140669ec82c6886102667b255df5ccdf0ec77e0ca64060f84dd7b86632",
+ "size": 8639
+ },
+ {
+ "path": "faset_player",
+ "sha256": "5537942ff7cd999de044168420b730c772a6f21c3cf81ece389e9495c9eae974",
+ "size": 5834840
+ },
+ {
+ "path": "shaders/vertexMain.spv",
+ "sha256": "1ad2631c35d654f48166321ae43d4165043e1b919b14f1dc61caf97b1ada0898",
+ "size": 1224
+ },
+ {
+ "path": "shaders/fragmentMain.spv",
+ "sha256": "f5c4f289917ecab5d00d543c053aac1d10e6cca311fd172daf06d315160a3505",
+ "size": 7436
+ },
+ {
+ "path": "shaders/shadowMain.spv",
+ "sha256": "7643b4d688492b5ee923b9606f0b0e70343ca05fa67673838206119a6f86d8d8",
+ "size": 784
+ },
+ {
+ "path": "shaders/vertexMain.reflection.json",
+ "sha256": "c584f3b957ebf194a292451362a98590f85ff3cfbfd8f917b1c1265039381777",
+ "size": 2639
+ },
+ {
+ "path": "shaders/fragmentMain.reflection.json",
+ "sha256": "72ebf8d32452830650416dc4717d89a4324e97ece7028dfb97c66803c8dce71f",
+ "size": 2649
+ },
+ {
+ "path": "shaders/shadowMain.reflection.json",
+ "sha256": "e3fd0889cd2f569d410f5d7558a4091d9f57f247a1dcf1788462f67525340819",
+ "size": 2645
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2/meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2/meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2/meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh",
+ "sha256": "3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071",
+ "size": 928
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2/manifest.json",
+ "sha256": "ee3f68794c6dc44ab492b1ba4640aa74e4de79a5ec10aed8dcdd45a03afc508e",
+ "size": 4532
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/current.json",
+ "sha256": "b0732959808ce61ef5a3223fba2d9ad8c17a3ea7873d4a81c00aadee6c51032e",
+ "size": 134
+ },
+ {
+ "path": "Notices/sdl3/LICENSE.txt",
+ "sha256": "97f35b302b361680ec1e891e95d2d52097bb95abff361434916d99dc1305f127",
+ "size": 884
+ },
+ {
+ "path": "Notices/entt/LICENSE",
+ "sha256": "0785027ce472d7c61f05fba664a1d3ba6639c1593ced351ad9e4bed868765d99",
+ "size": 1097
+ },
+ {
+ "path": "Notices/box2d/LICENSE",
+ "sha256": "68a3e676d7e94093b102d5cba0d4e04af812040d6f230c3db67a6664574e43d2",
+ "size": 1067
+ },
+ {
+ "path": "Notices/box3d/LICENSE",
+ "sha256": "da5e31a26bf3cfd5ba5c96d6823e480128c81e76c107ef9d3ee5d94789184b90",
+ "size": 1067
+ },
+ {
+ "path": "Notices/json/LICENSE.MIT",
+ "sha256": "46a65cffd1ea955132d95a8dd921640714a8d6b537d2e4e482d31145ae95b603",
+ "size": 1076
+ },
+ {
+ "path": "Notices/stb/LICENSE",
+ "sha256": "bebfe904b14301657e4e5d655c811d51fd31b97c455b9cc2d8600d6bac6cff63",
+ "size": 2510
+ },
+ {
+ "path": "Notices/dependencies.json",
+ "sha256": "a54639ad2d9ad13c2e5f1ec90d6775f5dfc493656789b78c7e44debe2a378fdc",
+ "size": 2206
+ },
+ {
+ "path": "Notices/Faset-NOTICE.txt",
+ "sha256": "30c2e7e80f5153b31ab57675e07246aef9165965d64e36022b426a26449ece3f",
+ "size": 204
+ },
+ {
+ "path": "README.txt",
+ "sha256": "4dc2f0271c69fe39017ff96aa2dfa00b625bec1401d924dc396193ce71c09f3e",
+ "size": 225
+ }
+ ],
+ "format": "faset.export",
+ "generation": "66aa0bad-fb8a-424a-a82a-a41e58b4a13d",
+ "platform": "linux",
+ "prerequisites": [
+ "Linux x86_64",
+ "Vulkan 1.3 driver",
+ "Compatible glibc and libstdc++ runtime"
+ ],
+ "renderer_profile": {
+ "api": "Vulkan 1.3",
+ "materials": [
+ "base-color factor and texture",
+ "metallic and roughness factors"
+ ],
+ "required_features": [
+ "dynamicRendering",
+ "synchronization2"
+ ],
+ "shadow_map": {
+ "resolution": 1024,
+ "world_extent": 40
+ },
+ "texture_sampling": "linear clamp, one mip level",
+ "unsupported_material_features": [
+ "normal maps",
+ "metallic-roughness maps",
+ "emissive and occlusion maps",
+ "alpha mode selection",
+ "unlit mode",
+ "per-material face culling"
+ ]
+ },
+ "scene_hash": "ee12794145c14ba5b599c5d9ae21648cccdfa91c47ee7742549f60d5fe7bc3e0",
+ "simulation": {
+ "fixed_delta": 0.016666666666666666,
+ "gravity": [
+ 0,
+ -9.81,
+ 0
+ ],
+ "max_catch_up_ticks": 4,
+ "physics_substeps": 4
+ },
+ "units": {
+ "angle": "radian",
+ "coordinates": "right-handed Y-up",
+ "distance": "metre"
+ },
+ "validation_log": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n{\"dimension\":3,\"validated\":true}\n",
+ "version": 1
+}
diff --git a/docs/validation/final-linux-2026-09-18/collect-3d-run.json b/docs/validation/final-linux-2026-09-18/collect-3d-run.json
new file mode 100644
index 0000000..1addc7d
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/collect-3d-run.json
@@ -0,0 +1,18 @@
+{
+ "arguments": [
+ "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-3d/faset_player",
+ "--headless",
+ "--frames",
+ "120",
+ "--capture",
+ "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-3d/verification.ppm",
+ "--profile",
+ "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-3d/profile.json"
+ ],
+ "cwd": "/tmp/faset-playable-exports-rnbvn4tk/empty-working-directory",
+ "seconds": 0.5726850880018901,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "New round: collect the three gold cubes, then reach the green exit. E resets.\n{\"device\":\"NVIDIA GeForce RTX 2080 Ti\",\"dimension\":3,\"frames\":120,\"ticks\":120,\"validation_errors\":0}\n",
+ "stderr": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n"
+}
diff --git a/docs/validation/final-linux-2026-09-18/collect-3d-validate.json b/docs/validation/final-linux-2026-09-18/collect-3d-validate.json
new file mode 100644
index 0000000..bae6bd7
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/collect-3d-validate.json
@@ -0,0 +1,12 @@
+{
+ "arguments": [
+ "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-3d/faset_player",
+ "--validate"
+ ],
+ "cwd": "/tmp/faset-playable-exports-rnbvn4tk/empty-working-directory",
+ "seconds": 0.005225719000009121,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "{\"dimension\":3,\"validated\":true}\n",
+ "stderr": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n"
+}
diff --git a/docs/validation/final-linux-2026-09-18/collect-3d.png b/docs/validation/final-linux-2026-09-18/collect-3d.png
new file mode 100644
index 0000000..ca55e0b
Binary files /dev/null and b/docs/validation/final-linux-2026-09-18/collect-3d.png differ
diff --git a/docs/validation/final-linux-2026-09-18/playable-exports.json b/docs/validation/final-linux-2026-09-18/playable-exports.json
new file mode 100644
index 0000000..fba1445
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/playable-exports.json
@@ -0,0 +1,455 @@
+{
+ "format": "faset.playable-export-verification",
+ "version": 1,
+ "started_utc": "2026-09-18T02:56:47.916086+00:00",
+ "platform": "linux",
+ "engine": "/home/emil/Desktop/Faset_Engine",
+ "editor": "/home/emil/Desktop/Faset_Engine/build/linux-debug/faset_editor",
+ "standalone_root": "/tmp/faset-playable-exports-rnbvn4tk",
+ "frames_per_game": 120,
+ "status": "passed",
+ "projects": [
+ {
+ "name": "collect-2d",
+ "dimension": 2,
+ "source_inputs": [
+ {
+ "path": ".gitignore",
+ "sha256": "53aa4d7124d4c8d93b8d7c4cb470b6c82b844e019a660d6243ffeadc50602de1"
+ },
+ {
+ "path": "README.md",
+ "sha256": "d6c35206b10ee28efd5cc02da77a3ce9b6e1f8ce085793150bbf2f23bd925d65"
+ },
+ {
+ "path": "Scenes/main.scene.json",
+ "sha256": "be48a6d21385e717b6c8ebf9a3b4322eebbeff6bb067428e089ab5214be79854"
+ },
+ {
+ "path": "Scripts/Gameplay.cpp",
+ "sha256": "6b581b24da613e1915819de0a0f0ea820dd3333efa62c4b479a9ea7ffdbc6bcc"
+ },
+ {
+ "path": "Scripts/Gameplay.hpp",
+ "sha256": "4121587182ed4f74901b1c0757c53daadbf309af1d6bb5dd87fef142130ccbbe"
+ },
+ {
+ "path": "project.faset.json",
+ "sha256": "36e2acd32210f5489372a2331346a3294ead2395f0713e3e5fd2da4e83263689"
+ }
+ ],
+ "generation": "a0bc193b-3d79-4372-98c2-8875621d4ab3",
+ "configuration": "Release",
+ "standalone_directory": "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-2d",
+ "executable": "faset_player",
+ "package_file_count": 17,
+ "asset_generations": {},
+ "device": "NVIDIA GeForce RTX 2080 Ti",
+ "validation_enabled": true,
+ "validation_errors": 0,
+ "completed_frames": 120,
+ "summary_ms": {
+ "gpu": {
+ "max": 0.580928,
+ "min": 0.558752,
+ "p50": 0.561056,
+ "p95": 0.577536,
+ "samples": 120
+ },
+ "render_call": {
+ "max": 4.353283,
+ "min": 1.355868,
+ "p50": 1.575242,
+ "p95": 1.779117,
+ "samples": 120
+ },
+ "renderer_cpu": {
+ "max": 4.349596,
+ "min": 1.354355,
+ "p50": 1.572978,
+ "p95": 1.777063,
+ "samples": 120
+ },
+ "renderer_readback_cpu": {
+ "max": 2.542697,
+ "min": 0.357785,
+ "p50": 0.393262,
+ "p95": 0.477721,
+ "samples": 120
+ },
+ "simulation": {
+ "max": 0.256133,
+ "min": 0.12707,
+ "p50": 0.136477,
+ "p95": 0.187975,
+ "samples": 120
+ },
+ "snapshot": {
+ "max": 0.263748,
+ "min": 0.120477,
+ "p50": 0.12702,
+ "p95": 0.16401,
+ "samples": 120
+ },
+ "wall": {
+ "max": 4.772504,
+ "min": 1.625006,
+ "p50": 1.861853,
+ "p95": 2.054506,
+ "samples": 120
+ }
+ },
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 7,
+ "sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a"
+ },
+ "source_project_paths_unavailable": true,
+ "status": "passed"
+ },
+ {
+ "name": "collect-3d",
+ "dimension": 3,
+ "source_inputs": [
+ {
+ "path": ".gitignore",
+ "sha256": "53aa4d7124d4c8d93b8d7c4cb470b6c82b844e019a660d6243ffeadc50602de1"
+ },
+ {
+ "path": "Assets/exit-arch/create.py",
+ "sha256": "9c7291124fb1498a3f992ef74afc39cd98f9cc3e2ff4687c633bece85d580905"
+ },
+ {
+ "path": "Assets/exit-arch/manifest.json",
+ "sha256": "7a13347adc89761fb02ebeab3c58ba87f319cd62f53ec87a3bb61bcd066ffa55"
+ },
+ {
+ "path": "Assets/exit-arch/manifest.json.faset-import.json",
+ "sha256": "ef4eef28a18a0cc40a40df75db34c97faa5d783b891265f862633f3aec514afc"
+ },
+ {
+ "path": "Assets/exit-arch/payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb",
+ "sha256": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3"
+ },
+ {
+ "path": "Assets/exit-arch/source.blend",
+ "sha256": "ff2676bec97ab778e531e87a185ad716049ea3b05b4a4f0027a6345737735035"
+ },
+ {
+ "path": "README.md",
+ "sha256": "2df5ca4df47ab5d3d05d41508201296d4ad5ec876245f19f061767ade6a30e8f"
+ },
+ {
+ "path": "Scenes/main.scene.json",
+ "sha256": "61b65baf79e52f07ac386a7f98acf985a1b09e88770cdde37ef461dc94b9dcd7"
+ },
+ {
+ "path": "Scripts/Extensions/Beacon.hpp",
+ "sha256": "c60d56161eead16f541835053ad32ac3333383d83015709c060b7d45e0af5a97"
+ },
+ {
+ "path": "Scripts/Gameplay.cpp",
+ "sha256": "5d419786a6861d7f14ed4eca54634694d8cd43be5dbbd60a2c6790db665c3a6a"
+ },
+ {
+ "path": "Scripts/Gameplay.hpp",
+ "sha256": "4121587182ed4f74901b1c0757c53daadbf309af1d6bb5dd87fef142130ccbbe"
+ },
+ {
+ "path": "project.faset.json",
+ "sha256": "43d273b1054ec9069369073f54cc1fc7efb3d6b699dcd342c552a2dc2ef852ef"
+ }
+ ],
+ "import": {
+ "asset_id": "5832763b-3ed0-44d6-9088-0b524f196a91",
+ "cache_hit": false,
+ "diagnostics": [],
+ "generation": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2",
+ "manifest": {
+ "asset_id": "5832763b-3ed0-44d6-9088-0b524f196a91",
+ "files": [
+ {
+ "path": "meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh",
+ "sha256": "3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071",
+ "size": 928
+ }
+ ],
+ "generation": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2",
+ "importer": "faset-gltf-1/cgltf-1.15",
+ "input_key": {
+ "bundle_sha256": "7a13347adc89761fb02ebeab3c58ba87f319cd62f53ec87a3bb61bcd066ffa55",
+ "dependencies": {},
+ "importer": "faset-gltf-1/cgltf-1.15",
+ "settings": {},
+ "source": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3",
+ "target_profile": "desktop-static-pbr-v1",
+ "toolchain": {
+ "cgltf": "360db1a95480fe102ae9c69b27c5d101167ff5ba",
+ "stb": "2c980bb59875b0d32144a71867fbdebb2f77cd20"
+ }
+ },
+ "kind": "scene",
+ "materials": [
+ {
+ "alpha_cutoff": 0.5,
+ "alpha_mode": "OPAQUE",
+ "base_color": [
+ 0.2199999988079071,
+ 0.28999999165534973,
+ 0.3400000035762787,
+ 1.0
+ ],
+ "base_color_texture": -1,
+ "double_sided": true,
+ "emissive": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "emissive_texture": -1,
+ "format": "faset.material",
+ "id": "material-bb63b094febbf90bb7049c9bcf7587bc",
+ "metallic": 0.07999999821186066,
+ "metallic_roughness_texture": -1,
+ "name": "Weathered stone",
+ "normal_texture": -1,
+ "occlusion_texture": -1,
+ "roughness": 0.800000011920929,
+ "unlit": false,
+ "version": 1
+ }
+ ],
+ "meshes": [
+ {
+ "id": "mesh-fc069a07a87e0f831fd92efdbc4efa1f",
+ "name": "Cube.001",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh"
+ }
+ ]
+ },
+ {
+ "id": "mesh-0961e2a3f92977836a3aa80cab09277e",
+ "name": "Cube.002",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh"
+ }
+ ]
+ },
+ {
+ "id": "mesh-93b5b3e52cb6bb120fefb80e2d8e222b",
+ "name": "Cube.003",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh"
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "id": "node-cec6e8cea80cf5a98ba3263a0156bee4",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 1.4500000476837158,
+ 1.2999999523162842,
+ 1.0
+ ],
+ "mesh": 0,
+ "name": "Left post",
+ "parent_id": "",
+ "stable_source_id": true
+ },
+ {
+ "id": "node-5f8a90a6c4d27020d20bd4fa81d1d958",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 1.4500000476837158,
+ -1.2999999523162842,
+ 1.0
+ ],
+ "mesh": 1,
+ "name": "Right post",
+ "parent_id": "",
+ "stable_source_id": true
+ },
+ {
+ "id": "node-482463e486a8d1fd741340c653cd128f",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 3.0,
+ 0.0,
+ 1.0
+ ],
+ "mesh": 2,
+ "name": "Lintel",
+ "parent_id": "",
+ "stable_source_id": true
+ }
+ ],
+ "outputs": [
+ "node-cec6e8cea80cf5a98ba3263a0156bee4",
+ "node-5f8a90a6c4d27020d20bd4fa81d1d958",
+ "node-482463e486a8d1fd741340c653cd128f",
+ "mesh-fc069a07a87e0f831fd92efdbc4efa1f",
+ "mesh-0961e2a3f92977836a3aa80cab09277e",
+ "mesh-93b5b3e52cb6bb120fefb80e2d8e222b",
+ "material-bb63b094febbf90bb7049c9bcf7587bc"
+ ],
+ "payload_source": "/home/emil/Desktop/Faset_Engine/.cache/playable-release-final/Faset Café 世界/collect-3d/Assets/exit-arch/payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb",
+ "schema_version": 1,
+ "settings": {},
+ "source": "/home/emil/Desktop/Faset_Engine/.cache/playable-release-final/Faset Café 世界/collect-3d/Assets/exit-arch/manifest.json",
+ "source_sha256": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3",
+ "textures": []
+ },
+ "previous_generation": "",
+ "removed_output_ids": []
+ },
+ "generation": "66aa0bad-fb8a-424a-a82a-a41e58b4a13d",
+ "configuration": "Release",
+ "standalone_directory": "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-3d",
+ "executable": "faset_player",
+ "package_file_count": 22,
+ "asset_generations": {
+ "5832763b-3ed0-44d6-9088-0b524f196a91": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2"
+ },
+ "device": "NVIDIA GeForce RTX 2080 Ti",
+ "validation_enabled": true,
+ "validation_errors": 0,
+ "completed_frames": 120,
+ "summary_ms": {
+ "gpu": {
+ "max": 0.609888,
+ "min": 0.5784,
+ "p50": 0.580288,
+ "p95": 0.600416,
+ "samples": 120
+ },
+ "render_call": {
+ "max": 4.356229,
+ "min": 1.486144,
+ "p50": 1.670422,
+ "p95": 1.897079,
+ "samples": 120
+ },
+ "renderer_cpu": {
+ "max": 4.352772,
+ "min": 1.484541,
+ "p50": 1.668107,
+ "p95": 1.894835,
+ "samples": 120
+ },
+ "renderer_readback_cpu": {
+ "max": 2.37976,
+ "min": 0.36052,
+ "p50": 0.407479,
+ "p95": 0.460479,
+ "samples": 120
+ },
+ "simulation": {
+ "max": 0.282002,
+ "min": 0.164811,
+ "p50": 0.176523,
+ "p95": 0.235354,
+ "samples": 120
+ },
+ "snapshot": {
+ "max": 0.7686,
+ "min": 0.154722,
+ "p50": 0.166093,
+ "p95": 0.187914,
+ "samples": 120
+ },
+ "wall": {
+ "max": 5.493053,
+ "min": 1.819833,
+ "p50": 2.0303,
+ "p95": 2.317552,
+ "samples": 120
+ }
+ },
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 42,
+ "sha256": "914060401de93d08b33bf09a1e210859e491a0060c331e5e2044f517356f4980"
+ },
+ "source_project_paths_unavailable": true,
+ "status": "passed"
+ }
+ ],
+ "finished_utc": "2026-09-18T03:00:21.028754+00:00",
+ "engine_commit": "4cb82556de31268d2bde73948dd1ff1b6c02f162",
+ "editor_sha256": "05e2b40c6c05282af71a03990c98c89c673c48a3cf1da0e17a59f911a947049a",
+ "engine_commit_at_completion": "4cb82556de31268d2bde73948dd1ff1b6c02f162",
+ "working_tree_changes_at_start": [],
+ "timings_are_benchmark_evidence": false,
+ "timing_note": "Final release source functional export/relocation/validation/profile completeness acceptance. Timings are retained as functional evidence, not a controlled performance benchmark.",
+ "capture_comparison_to_candidate": {
+ "collect-2d": {
+ "prior_engine_commit": "0f34b036313c011861dbfd5828ed45c4f7940b05",
+ "exact_capture_sha256_match": true
+ },
+ "collect-3d": {
+ "prior_engine_commit": "0f34b036313c011861dbfd5828ed45c4f7940b05",
+ "exact_capture_sha256_match": true
+ }
+ },
+ "png_previews": [
+ "evidence/collect-2d.png",
+ "evidence/collect-3d.png"
+ ]
+}
diff --git a/docs/validation/final-linux-2026-09-18/sdk-unavailable.json b/docs/validation/final-linux-2026-09-18/sdk-unavailable.json
new file mode 100644
index 0000000..4b546ef
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/sdk-unavailable.json
@@ -0,0 +1,115 @@
+{
+ "format": "faset.sdk-unavailable-verification",
+ "version": 1,
+ "status": "passed",
+ "started_utc": "2026-09-18T03:10:58.685939+00:00",
+ "engine_commit": "4cb82556de31268d2bde73948dd1ff1b6c02f162",
+ "editor_sha256": "05e2b40c6c05282af71a03990c98c89c673c48a3cf1da0e17a59f911a947049a",
+ "sdk_paths_unavailable": {
+ "/home/emil/Desktop/Faset_Engine/CMakeLists.txt": true,
+ "/home/emil/Desktop/Faset_Engine/build/linux-debug/faset_editor": true,
+ "/home/emil/Desktop/Faset_Engine/build/linux-debug/shaders": true,
+ "/home/emil/Desktop/Faset_Engine/.cache/deps-src": true,
+ "/home/emil/Desktop/Faset_Engine/.cache/playable-release-final": true
+ },
+ "sdk_empty": true,
+ "mount_namespace": "mnt:[4026533743]",
+ "outer_mount_namespace": "mnt:[4026531832]",
+ "sdk_mount": [
+ "1374 111 0:82 / /home/emil/Desktop/Faset_Engine ro,nosuid,nodev,relatime - tmpfs faset-sdk-hidden ro,size=1024k,uid=1000,gid=1000,inode64"
+ ],
+ "environment": {
+ "PATH": "/usr/bin:/bin",
+ "LANG": "C.UTF-8",
+ "HOME": "/tmp/faset-sdk-unavailable-fp5gnvp2/home",
+ "XDG_CACHE_HOME": "/tmp/faset-sdk-unavailable-fp5gnvp2/cache",
+ "XDG_CONFIG_HOME": "/tmp/faset-sdk-unavailable-fp5gnvp2/config",
+ "XDG_DATA_HOME": "/tmp/faset-sdk-unavailable-fp5gnvp2/data"
+ },
+ "timings_are_benchmark_evidence": false,
+ "projects": [
+ {
+ "name": "collect-2d",
+ "package": "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-2d",
+ "player_sha256": "f7902f414ab64573a697a8f36b59e203370779990f63c63fbd90c88a7eb1397b",
+ "verified_package_files": 17,
+ "default_scene_and_assets": true,
+ "validation_passed": true,
+ "device": "NVIDIA GeForce RTX 2080 Ti",
+ "validation_enabled": true,
+ "validation_errors": 0,
+ "frames": 120,
+ "capture_sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a",
+ "capture_matches_final_release": true,
+ "status": "passed",
+ "trace_sdk_path_mentions": 0,
+ "traced_execve": [
+ "2514912 execve(\"/tmp/faset-playable-exports-rnbvn4tk/Faset Caf\\303\\251 \\344\\270\\226\\347\\225\\214/collect-2d/faset_player\", [\"/tmp/faset-playable-exports-rnbv\"..., \"--headless\", \"--frames\", \"120\", \"--capture\", \"/tmp/faset-sdk-unavailable-fp5gn\"..., \"--profile\", \"/tmp/faset-sdk-unavailable-fp5gn\"...], 0x7ffc06cf8bb0 /* 6 vars */) = 0"
+ ],
+ "dependency_paths_outside_sdk": true,
+ "elf_has_rpath_or_runpath": false,
+ "dependencies": [
+ "\tlinux-vdso.so.1 (0x00007c4f9ae17000)",
+ "\tlibvulkan.so.1 => /usr/lib/x86_64-linux-gnu/libvulkan.so.1 (0x00007c4f9a7c5000)",
+ "\tlibm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x00007c4f9a69f000)",
+ "\tlibstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007c4f9a200000)",
+ "\tlibgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007c4f9a671000)",
+ "\tlibc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x00007c4f99e00000)",
+ "\t/lib64/ld-linux-x86-64.so.2 (0x00007c4f9ae19000)"
+ ]
+ },
+ {
+ "name": "collect-3d",
+ "package": "/tmp/faset-playable-exports-rnbvn4tk/Faset Café 世界/collect-3d",
+ "player_sha256": "5537942ff7cd999de044168420b730c772a6f21c3cf81ece389e9495c9eae974",
+ "verified_package_files": 22,
+ "default_scene_and_assets": true,
+ "validation_passed": true,
+ "device": "NVIDIA GeForce RTX 2080 Ti",
+ "validation_enabled": true,
+ "validation_errors": 0,
+ "frames": 120,
+ "capture_sha256": "914060401de93d08b33bf09a1e210859e491a0060c331e5e2044f517356f4980",
+ "capture_matches_final_release": true,
+ "status": "passed",
+ "trace_sdk_path_mentions": 0,
+ "traced_execve": [
+ "2514989 execve(\"/tmp/faset-playable-exports-rnbvn4tk/Faset Caf\\303\\251 \\344\\270\\226\\347\\225\\214/collect-3d/faset_player\", [\"/tmp/faset-playable-exports-rnbv\"..., \"--headless\", \"--frames\", \"120\", \"--capture\", \"/tmp/faset-sdk-unavailable-fp5gn\"..., \"--profile\", \"/tmp/faset-sdk-unavailable-fp5gn\"...], 0x7ffe821118e0 /* 6 vars */) = 0"
+ ],
+ "dependency_paths_outside_sdk": true,
+ "elf_has_rpath_or_runpath": false,
+ "dependencies": [
+ "\tlinux-vdso.so.1 (0x000071bca491d000)",
+ "\tlibvulkan.so.1 => /usr/lib/x86_64-linux-gnu/libvulkan.so.1 (0x000071bca42ca000)",
+ "\tlibm.so.6 => /usr/lib/x86_64-linux-gnu/libm.so.6 (0x000071bca41a4000)",
+ "\tlibstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x000071bca3e00000)",
+ "\tlibgcc_s.so.1 => /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 (0x000071bca4176000)",
+ "\tlibc.so.6 => /usr/lib/x86_64-linux-gnu/libc.so.6 (0x000071bca3a00000)",
+ "\t/lib64/ld-linux-x86-64.so.2 (0x000071bca491f000)"
+ ]
+ }
+ ],
+ "finished_utc": "2026-09-18T03:11:01.278406+00:00",
+ "outer_sdk_unchanged_after_namespace": true,
+ "outer_editor_sha256_after": "05e2b40c6c05282af71a03990c98c89c673c48a3cf1da0e17a59f911a947049a",
+ "retained_evidence_hashes": {
+ "collect-2d-dependencies.json": "c3882b5fec209be8e140b3a47bc4cd6e4c644baca4ce37308fb9420076fdd094",
+ "collect-2d-elf.json": "aa615e898a2ec9f7d68491d13f6bb5742a566ded87ce0d6c9c0ebe8fbe342de3",
+ "collect-2d-file-trace.log": "3fe847b2f8f8de66aeb04db69d02ba1b5bb311ffd64a057d405b527daa2e221d",
+ "collect-2d-profile.json": "5ab9c3e01d55e5f5a51d4e7d7d53bc1e39d3cac1d98544de246c8e1e05ef8a80",
+ "collect-2d-run.json": "b382c0582482d98c4c184949cb40d1c60939e18f772717b9c3d22f4ec94adba6",
+ "collect-2d-validate.json": "4fdf30c0fda6a275984a746b787f61c1ea50952558706da2232e97ca684a7bd1",
+ "collect-2d.ppm": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a",
+ "collect-3d-dependencies.json": "0839c22cd4269a9461106b6f64c9d7255378639f571bec892ed189f0803cdfe6",
+ "collect-3d-elf.json": "c0f212cfec469cf493d517108f7859638b5aa4529216f42097170bfa0dbd49ba",
+ "collect-3d-file-trace.log": "3df4929e94c9b21e69f8a4dc3aed5d7182c60606af52840c9f945531cb54d6d0",
+ "collect-3d-profile.json": "e461b8c882f7ba487a0dc0704d20c96eafcbfe51785f50796bd70d611896ba27",
+ "collect-3d-run.json": "2a4703d596c1a3aa5450b205ee382cfed9578884bf63a965fde04e6e672c5ca8",
+ "collect-3d-validate.json": "15f128930142c0fc233eeb2b8e3b2a4d5d80e9e578f54f78538e6ce74c93d4cd",
+ "collect-3d.ppm": "914060401de93d08b33bf09a1e210859e491a0060c331e5e2044f517356f4980",
+ "inner.py": "a24ef1b36550a8f1944bda95b13c90eca5d2ddd81f49bfddbceba291c75d3857",
+ "outer-mount-namespace.txt": "b38992f03c046722594e95d6dcdbb4fb1b75a0f4f0156c26cb2059b1bafecdd4",
+ "prior.json": "d0d1ea7b6c4ffc8e6d1ac7dfe0e8dcfa1875780abd8eeb8377621db810c84883",
+ "run.sh": "dad0a2d008508eb2b2f2e0b4d7b86a6f38e3de1bdd6f0272d4d99bfcde201489"
+ }
+}
diff --git a/docs/validation/final-linux-2026-09-18/tests.json b/docs/validation/final-linux-2026-09-18/tests.json
new file mode 100644
index 0000000..6921c46
--- /dev/null
+++ b/docs/validation/final-linux-2026-09-18/tests.json
@@ -0,0 +1,318 @@
+{
+ "recorded_date": "2026-09-18",
+ "profiles": "Ubuntu 26.04 x86-64; Clang 21.1.8; NVIDIA RTX 2080 Ti 595.84; see docs/TOOLCHAINS.md",
+ "checks": [
+ {
+ "source_commit": "4cb82556de31268d2bde73948dd1ff1b6c02f162",
+ "description": "Full Debug with optional ImGui diagnostics",
+ "raw_log_sha256": "4f44fa2bc6b9cc560f89d0000b63cf87e200da237b432de87c5b64f299dc58a9",
+ "tests": [
+ {
+ "name": "authoring",
+ "status": "passed",
+ "seconds": 0.05
+ },
+ {
+ "name": "runtime_contracts",
+ "status": "passed",
+ "seconds": 0.12
+ },
+ {
+ "name": "assets_pipeline",
+ "status": "passed",
+ "seconds": 0.12
+ },
+ {
+ "name": "assets_blender_bundle",
+ "status": "passed",
+ "seconds": 0.07
+ },
+ {
+ "name": "render_graph",
+ "status": "passed",
+ "seconds": 0.01
+ },
+ {
+ "name": "render_offscreen",
+ "status": "passed",
+ "seconds": 0.35
+ },
+ {
+ "name": "render_sprite_alpha",
+ "status": "passed",
+ "seconds": 0.31
+ },
+ {
+ "name": "render_shader_reload",
+ "status": "passed",
+ "seconds": 2.47
+ },
+ {
+ "name": "render_window_lifecycle",
+ "status": "skipped",
+ "seconds": 4.02
+ },
+ {
+ "name": "player_scene_contracts",
+ "status": "passed",
+ "seconds": 0.01
+ },
+ {
+ "name": "player_shutdown_diagnostics",
+ "status": "passed",
+ "seconds": 0.37
+ },
+ {
+ "name": "editor_mcp",
+ "status": "passed",
+ "seconds": 0.02
+ },
+ {
+ "name": "process_and_cook",
+ "status": "passed",
+ "seconds": 0.29
+ },
+ {
+ "name": "build_schema_publication",
+ "status": "passed",
+ "seconds": 5.25
+ },
+ {
+ "name": "editor_plugins",
+ "status": "passed",
+ "seconds": 0.02
+ },
+ {
+ "name": "editor_session_settings",
+ "status": "passed",
+ "seconds": 0.01
+ },
+ {
+ "name": "ui_widgets",
+ "status": "passed",
+ "seconds": 0.12
+ },
+ {
+ "name": "ui_render",
+ "status": "passed",
+ "seconds": 0.43
+ },
+ {
+ "name": "editor_ui_import_conflicts",
+ "status": "passed",
+ "seconds": 0.71
+ },
+ {
+ "name": "editor_ui_project_settings",
+ "status": "passed",
+ "seconds": 0.83
+ },
+ {
+ "name": "editor_ui_reload",
+ "status": "passed",
+ "seconds": 3.9
+ },
+ {
+ "name": "editor_ui_launcher",
+ "status": "passed",
+ "seconds": 0.6
+ },
+ {
+ "name": "editor_ui_templates",
+ "status": "passed",
+ "seconds": 2.01
+ },
+ {
+ "name": "editor_ui_gizmos",
+ "status": "passed",
+ "seconds": 0.78
+ },
+ {
+ "name": "editor_ui_authoring",
+ "status": "passed",
+ "seconds": 1.2
+ },
+ {
+ "name": "editor_mcp_stdio",
+ "status": "passed",
+ "seconds": 0.28
+ },
+ {
+ "name": "editor_gui_mcp",
+ "status": "passed",
+ "seconds": 4.39
+ },
+ {
+ "name": "core",
+ "status": "passed",
+ "seconds": 0.1
+ },
+ {
+ "name": "tutorial_moving",
+ "status": "passed",
+ "seconds": 0.02
+ },
+ {
+ "name": "tutorial_following",
+ "status": "passed",
+ "seconds": 0.01
+ },
+ {
+ "name": "tutorial_spawning",
+ "status": "passed",
+ "seconds": 0.02
+ },
+ {
+ "name": "tutorial_physics",
+ "status": "passed",
+ "seconds": 0.06
+ },
+ {
+ "name": "playable_2d",
+ "status": "passed",
+ "seconds": 0.4
+ },
+ {
+ "name": "playable_3d",
+ "status": "passed",
+ "seconds": 0.88
+ },
+ {
+ "name": "editor_debug_overlay",
+ "status": "passed",
+ "seconds": 0.35
+ }
+ ],
+ "counts": {
+ "passed": 34,
+ "skipped": 1,
+ "failed": 0
+ }
+ },
+ {
+ "source_commit": "4cb82556de31268d2bde73948dd1ff1b6c02f162",
+ "description": "Targeted ASan/UBSan after source-location correction",
+ "raw_log_sha256": "955813d41b1d28cf53df0af7bfe42d3b05009a1e00cfa266d75b8955f08003e1",
+ "tests": [
+ {
+ "name": "assets_pipeline",
+ "status": "passed",
+ "seconds": 0.59
+ },
+ {
+ "name": "process_and_cook",
+ "status": "passed",
+ "seconds": 0.54
+ }
+ ],
+ "counts": {
+ "passed": 2,
+ "skipped": 0,
+ "failed": 0
+ }
+ },
+ {
+ "source_commit": "0f34b036313c011861dbfd5828ed45c4f7940b05",
+ "description": "Complete ASan/UBSan suite before the bounded source-location correction",
+ "raw_log_sha256": "fc34eb7195105c1cc7755eafa20580cdc23022c4edff86fe2f0571cb6cac8ba8",
+ "tests": [
+ {
+ "name": "authoring",
+ "status": "passed",
+ "seconds": 0.18
+ },
+ {
+ "name": "runtime_contracts",
+ "status": "passed",
+ "seconds": 0.76
+ },
+ {
+ "name": "assets_pipeline",
+ "status": "passed",
+ "seconds": 0.44
+ },
+ {
+ "name": "assets_blender_bundle",
+ "status": "passed",
+ "seconds": 0.07
+ },
+ {
+ "name": "editor_mcp",
+ "status": "passed",
+ "seconds": 0.08
+ },
+ {
+ "name": "process_and_cook",
+ "status": "passed",
+ "seconds": 0.53
+ },
+ {
+ "name": "build_schema_publication",
+ "status": "passed",
+ "seconds": 30.02
+ },
+ {
+ "name": "editor_plugins",
+ "status": "passed",
+ "seconds": 0.12
+ },
+ {
+ "name": "editor_session_settings",
+ "status": "passed",
+ "seconds": 0.09
+ },
+ {
+ "name": "ui_widgets",
+ "status": "passed",
+ "seconds": 0.35
+ },
+ {
+ "name": "editor_mcp_stdio",
+ "status": "passed",
+ "seconds": 0.58
+ },
+ {
+ "name": "core",
+ "status": "passed",
+ "seconds": 0.26
+ },
+ {
+ "name": "tutorial_moving",
+ "status": "passed",
+ "seconds": 0.14
+ },
+ {
+ "name": "tutorial_following",
+ "status": "passed",
+ "seconds": 0.06
+ },
+ {
+ "name": "tutorial_spawning",
+ "status": "passed",
+ "seconds": 0.14
+ },
+ {
+ "name": "tutorial_physics",
+ "status": "passed",
+ "seconds": 0.39
+ },
+ {
+ "name": "playable_2d",
+ "status": "passed",
+ "seconds": 2.16
+ },
+ {
+ "name": "playable_3d",
+ "status": "passed",
+ "seconds": 4.64
+ }
+ ],
+ "counts": {
+ "passed": 18,
+ "skipped": 0,
+ "failed": 0
+ }
+ }
+ ],
+ "skip_note": "The Wayland compositor declined programmatic restore. The XWayland lifecycle record is separate; this skipped invocation is not a passed native Wayland check."
+}
diff --git a/docs/validation/linux-release-2026-09-18/README.md b/docs/validation/linux-release-2026-09-18/README.md
index fec6304..d5b45d7 100644
--- a/docs/validation/linux-release-2026-09-18/README.md
+++ b/docs/validation/linux-release-2026-09-18/README.md
@@ -15,14 +15,14 @@ Live Vulkan allocations stayed at 15,750,288 bytes (2D) and 15,787,008 bytes (3D
`render_call` includes GPU waits and synchronous readback; it is not CPU utilization. GPU timestamps cover submitted rendering. Frame timings exclude profile bookkeeping and final file writes. Synthetic 1/60-second simulation ticks run as fast as the offscreen loop allows. The resulting numbers are not display FPS or a real-time gameplay pacing test. Small sample scenes, one GPU, 240 frames and a static camera cannot establish scalability, a memory-leak guarantee, or broad performance claims. The imported 3D material also emits the recorded warning about unsupported material features in its manifest.
-Proposed P1 budgets for these exact scenes on this reference-class Linux host, at the same resolution and validation/readback settings:
+Initial P1 tracking budgets for these exact scenes on this reference-class Linux host, at the same resolution and validation/readback settings:
- Measured frame p95 ≤ 4 ms; GPU p95 ≤ 1 ms; readback p95 ≤ 1 ms.
- Simulation and snapshot p95 ≤ 0.5 ms each.
- Explicit live Vulkan memory ≤ 20 MiB, with no growth after warmup over a future 3,000-frame resource-lifecycle run.
- Startup from `main()` ≤ 500 ms for these tiny packages.
-These initial thresholds leave headroom above the observed values. They are **proposed**, not enforced acceptance criteria. P1 should retain cold-start results separately, run repeated sessions, measure editor input latency and larger content, and collect independent Windows hardware baselines before adopting release gates.
+These initial thresholds leave headroom above the observed values. They are tracking budgets for P1, not enforced MVP acceptance criteria or engine-wide guarantees. P1 should retain cold-start results separately, run repeated sessions, measure editor input latency and larger content, and collect independent Windows hardware baselines before adopting release gates.
Reproduce export validation from the repository with `python tools/verify_playable_exports.py --editor build/linux-debug/faset_editor --output `. Run each retained standalone Player with `--headless --frames 240 --profile ` to repeat the longer measurement. A new run builds current sources and produces new immutable generations; use the stored hashes to distinguish it from this record.
diff --git a/docs/validation/mvp-acceptance.md b/docs/validation/mvp-acceptance.md
new file mode 100644
index 0000000..57c9a0c
--- /dev/null
+++ b/docs/validation/mvp-acceptance.md
@@ -0,0 +1,92 @@
+# MVP acceptance dossier
+
+Accepted engine source: **`4cb82556de31268d2bde73948dd1ff1b6c02f162`**. Recorded 18 September 2026. Release tag: **`v0.1.0-mvp`**, including the final documentation/evidence commit.
+
+**Status: the C++ MVP is accepted for the recorded Linux and Windows profiles.** This dossier maps [PLAN M0–M9](../../PLAN.md) to implemented behavior and bounded evidence. The final publication changes documentation and the research viewer, not the tested engine/gameplay code. Test names below are CTest names, not claims of additional runs. Acceptance does not certify untested devices or turn the compatibility coverage limits below into passing checks.
+
+## Evidence and revision boundaries
+
+- **Final candidate Linux:** the integrated suite has **34 passed, 1 skipped, 0 failed** out of 35 tests, with optional ImGui diagnostics enabled. The skip is native Wayland programmatic restore. Both exact-candidate Release games also passed standalone relocation/validation and 120 frames each. See the [final Linux record](final-linux-2026-09-18/README.md) and [test outcomes](final-linux-2026-09-18/tests.json). The earlier XWayland lifecycle scenario is separate.
+- **Final candidate native/manual CI:** [run 35301244366](https://github.com/emil28092005/Faset_Engine/actions/runs/35301244366) passed. This is separate from the full Windows graphics/export workflow.
+- **Sanitizers:** the [recorded configurations](final-linux-2026-09-18/tests.json) show complete `0f34b03` ASan/UBSan **18/18** and final-candidate asset/cook **2/2** after the source-relocation correction. This is not a claim that the complete sanitizer suite was repeated on `4cb8255`.
+- **Exact earlier Linux candidate:** [checkpoint 5 evidence](checkpoint5-linux-2026-09-18/README.md) records clean offline build, first project launch, standalone games, recovery and real Blender reimport at `0f34b036313c011861dbfd5828ed45c4f7940b05`. The Blender report separately identifies the updated verification harness. These reports retain their original provenance.
+- **Final source Windows:** [run 35301244334](https://github.com/emil28092005/Faset_Engine/actions/runs/35301244334) passed the fresh Editor/Player build, all **35 tests with no skips**, real BuildService Release exports/incremental rebuilding, and both checked-in games after standalone Unicode relocation. The [Windows evidence](windows-software-vulkan-2026-09-18/README.md) separates this exact `4cb8255` result from the preceding successful `0f34b03` run. SwiftShader is software Vulkan; the Khronos validation layer was unavailable.
+
+## Criterion map
+
+### M0 — reproducible foundation
+
+CMake separates Core, Runtime, Editor, Player and SchemaExporter; gameplay is static, and Player does not link Editor/MCP/import services. Presets, compiler/SDK/runtime requirements, dependency hashes, Slang and third-party notices are recorded in [toolchains](../TOOLCHAINS.md), [dependency pins](../../dependencies.lock.json) and [target definitions](../../cmake/Player.cmake). Core tests cover IDs, hashing, atomic IO, Unicode paths and subprocess behavior.
+
+Evidence: `core`, `process_and_cook`, native CI, and the [clean offline build](checkpoint5-linux-2026-09-18/offline.json): committed `0f34b03`, empty build directory, external network disabled, prepared tools/dependencies, 20 CPU tests. A prepared offline build does not establish a fresh installation of every system prerequisite. Windows records the clean checkout, pinned tools, configure/build commands and native test execution separately.
+
+### M1 — documents, metadata and commands
+
+Persistent source IDs are separate from runtime handles. Typed metadata describes stable fields, constraints and versions; unknown data survives round-trip. Authoring transactions validate candidates before publication and share revision conflicts, retry keys, Undo/Redo, save and recovery. Explicit declarative migrations preserve IDs and unknown fields; missing/manual/incompatible rules fail without partial edits.
+
+Evidence: `authoring`, `build_schema_publication`, `editor_session_settings`, `editor_mcp`, and migration actions in `editor_ui_authoring`; [authoring fixtures](../../tests/authoring_tests.cpp) and [metadata publication fixtures](../../tests/build_schema_tests.cpp). Opening older data does not migrate it automatically. Changing field units requires reviewing separately stored instance overrides, as described in the [schema API guide](../manual/scripting/api.md).
+
+### M2 — platform and baseline graphics
+
+SDL window/input/text/DPI feeds a direct Vulkan 1.3 backend with capability checks, explicit synchronization and resource lifetime handling. The serial Render Graph declares reads/writes, barriers and optional GPU labels. Pinned Slang produces SPIR-V and normalized reflection; incompatible or failed shader reload preserves the working pipeline. Baseline rendering includes sprite transparency/layers, static textured meshes, basic PBR, directional shadows, CPU culling and timing/resource counters.
+
+Evidence: `render_graph`, `render_offscreen`, `render_sprite_alpha`, `render_shader_reload`, `render_window_lifecycle`, and `editor_debug_overlay`; [shader reload regression](../../tests/render_reload_tests.cpp) and [native window evidence](native-window-linux-2026-09-18.json). Shipping packages contain SPIR-V rather than requiring Slang. Native Wayland restore and physical-device limits are stated below.
+
+### M3 — runtime, C++, physics and Player
+
+EnTT-backed runtime APIs preserve source identity and validate handles. Deferred structural changes, input/fixed/physics/event phases, bounded catch-up, interpolation and lifecycle callbacks have contract tests. Box2D/Box3D support the demo bodies, layers/events, grounding and debug shapes. A separate statically linked Player receives an immutable resolved authoring snapshot, including unsaved edits; Play/Stop/pause/step do not write simulation state into the document. Failed C++ or metadata publication keeps the previous build and reports stale status.
+
+Evidence: `runtime_contracts`, `player_scene_contracts`, `player_shutdown_diagnostics`, four `tutorial_*` tests, `playable_2d`, `playable_3d`, `build_schema_publication`, and the [seven recovery scenarios](checkpoint5-linux-2026-09-18/recovery.json). The supported physics profile remains root-level box bodies, not arbitrary mesh-collider cooking.
+
+### M4 — retained editor UI
+
+The main UI uses retained IDs, layout/styles, clipping/scroll, keyboard focus, editing/selection, drag/drop, one-window docking and dynamic metadata fields. One gesture creates one authoring Undo. FreeType/HarfBuzz and UTF-8 text support Cyrillic; focus reveals long/nested lists at 1×/2×. Layout/style reload validates candidates and preserves working state. Optional F12 ImGui diagnostics displays real renderer counters without replacing the main UI.
+
+Evidence: `ui_widgets`, `ui_render`, `editor_ui_reload`, `editor_ui_gizmos`, `editor_ui_authoring`, `editor_debug_overlay`; [widget regression](../../tests/ui_tests.cpp) covers composition events, clipboard callbacks, DPI rasterization/hit testing and scroll/focus behavior. These deterministic events do **not** establish physical OS IME or mixed-monitor behavior.
+
+### M5 — resources and Blender
+
+The importer owns cooked geometry/material/texture data, persists source identity/settings, hashes inputs/dependencies/toolchain/profile and publishes complete generations atomically. Ordinary GLB and PNG/JPEG work without Blender. Freshness is visible through UI/MCP; stale sources cannot silently pass cook/export. Removal review pins both candidate and active generations; failed/cancelled imports retain the last good result. The final relocation correction updates logical source and payload together while keeping immutable generations and old pointers readable.
+
+Evidence: `assets_pipeline`, `assets_blender_bundle`, `editor_ui_import_conflicts`; [asset fixtures](../../tests/assets_pipeline.cpp) cover cache rebuild, stable/unstable rename, removal, failure/cancel, freshness, moved PNG/bundle/external glTF and legacy pointers. The [real Blender report](checkpoint5-linux-2026-09-18/blender.json) shows unmodified Blender 4.5.3 updating two live Editor instances while preserving placement, tint, physics, opaque gameplay and revision. It used `0f34b03` binaries; relocation coverage is from the subsequent final-candidate tests. The [documented import profile](../manual/editor/assets.md) limits material/geometry transfer.
+
+### M6 — scene editing and reusable scenes
+
+Scene Tree, Inspector, Assets, viewport selection/gizmos, Console, project/simulation settings and Save/Play/Build are real authoring controls. Templates use stable nested instance/object/component addresses, sparse overrides, local additions/suppression and restricted local/world reparenting. Origin, Revert, source navigation and conflicts are visible. Schema changes invalidate resolved previews even without a document revision change.
+
+Evidence: `editor_ui_launcher`, `editor_ui_project_settings`, `editor_ui_templates`, `editor_ui_gizmos`, `editor_ui_authoring`. The [template workflow](../../tests/editor_ui_templates.cpp) saves through UI, opens a new Session and compares nested IDs, origins and values. Cache clearing/reimport is covered separately by `assets_pipeline`. [First launch](checkpoint5-linux-2026-09-18/first-run.json) follows the Manual on the clean `0f34b03` Linux build. The [Windows record](windows-software-vulkan-2026-09-18/README.md) ties its fresh source build to actual launcher Create/Open and native Editor/MCP tests; it does not claim a retail installer or a human usability study.
+
+### M7 — editor MCP and extensions
+
+GUI and MCP share commands, canonical documents, revisions and history. Headless authoring/build, structured errors and cancellable jobs are separate from GPU screenshots. MCP is confined to editor services; Player and SchemaExporter contain no runtime-world MCP API. Startup DLL/SO extensions use exact SDK/build compatibility, dependencies and registration ownership.
+
+Evidence: `editor_mcp`, `editor_mcp_stdio`, `editor_gui_mcp`, `editor_plugins`; [GUI/stdio regression](../../tests/editor_gui_mcp_test.py) covers actual captures and conflicting edits/Undo; [plugin fixtures](../../tests/plugin_tests.cpp) cover the runtime-component/editor-panel package, compatibility rejection and unknown-data preservation. This is the supported protocol/workflow scope, not certification of every MCP client.
+
+### M8 — standalone games and export
+
+BuildService validates metadata, builds C++, cooks resources/shaders, assembles a manifest/notices and validates the standalone Player before publishing. Editor/MCP/Blender/schema helpers/compiler are not required by the exported game. Both checked-in C++ games exercise controls, physics, pickups, a gate/exit and reset; the 3D game uses the Blender arch.
+
+Evidence: `process_and_cook`, `build_schema_publication`, `playable_2d`, `playable_3d`, shader/template/Blender regressions, and [exact `4cb8255` Linux exports](final-linux-2026-09-18/playable-exports.json). Both packages ran 120 frames after Unicode-path relocation with source projects hidden and zero errors under active Khronos validation. [2D](final-linux-2026-09-18/collect-2d-manifest.json) and [3D](final-linux-2026-09-18/collect-3d-manifest.json) manifests retain package hashes. An additional [Linux namespace check](final-linux-2026-09-18/sdk-unavailable.json) hid the entire SDK/build/tool tree and repeated validation/120 frames with identical captures. [Final Windows exports](windows-software-vulkan-2026-09-18/README.md) passed the same project relocation checks on SwiftShader. **All four dimension/platform combinations passed.** The entire-SDK hiding check was Linux-only; it is not silently attributed to Windows.
+
+### M9 — final acceptance
+
+Existing evidence covers shared GUI/MCP authoring, revision conflicts, Undo/Redo, interrupted Editor recovery and failed save/import/build/Player startup. The [Release baseline](linux-release-2026-09-18/README.md) records scene/hardware/settings, startup and CPU/GPU/readback/memory data; the [implementation log](../IMPLEMENTATION.md) records build/import iteration measurements. Its scoped thresholds serve as initial P1 tracking budgets for the recorded scenes/reference host, not engine-wide guarantees or enforced MVP performance gates. Those measurements retain their original revision and workload limits and are not a benchmark of the final candidate or every platform.
+
+The native build/export gates, first-project workflows and recovery checks are complete for the profiles below. PLAN and the Manual record current capabilities, with compatibility coverage limits retained explicitly. The first release is a source MVP for these small projects, not a claim of production readiness for arbitrary games.
+
+## Final disposition
+
+- **LINUX-EXPORT-4CB — passed:** [final report](final-linux-2026-09-18/README.md), source clean at `4cb8255` through completion; both Release packages validated and rendered 120 frames after Unicode relocation with source paths unavailable. RTX 2080 Ti, Khronos validation active, zero errors. Package hashes and per-game counters are linked from that record; the earlier `0f34b03` reports retain their provenance.
+- **WINDOWS-TEST-4CB — passed:** [run 35301244334](https://github.com/emil28092005/Faset_Engine/actions/runs/35301244334), fresh build with optional diagnostics, 35/35 tests, no failures/skips. Exact outcomes and native UI/window observations are retained in the [Windows dossier](windows-software-vulkan-2026-09-18/README.md).
+- **WINDOWS-EXPORT-4CB — passed:** both Release games, package hash checks, Unicode relocation, disposable source projects unavailable, 120 rendered frames each. Required system/runtime libraries and the software Vulkan driver remain part of the target environment. No physical Windows GPU or active Khronos layer is claimed.
+- **FIRST-PROJECT — passed within the developer setup profile:** clean Linux SDK plus the Manual's create-project command; fresh Windows checkout/toolchain configure/build followed by actual Create/Open, native window and GUI/MCP execution. System prerequisites were prepared on Linux or provided/prepared by the Windows runner. No graphical retail installer was planned or tested.
+- **RELEASE — `v0.1.0-mvp`:** M0–M9 are closed for the documented profiles. Remaining native IME, mixed-monitor, native Wayland restore and additional hardware-driver coverage stay visible below; Lua and subsequent feature work remain in P1–P6. The UI references guide appearance only; architecture, PLAN and working authoring contracts define behavior.
+
+## Coverage limits that must remain visible
+
+- **Physical OS IME:** synthetic preedit/commit and SDL input-area checks passed; an actual system IME/candidate window/composition workflow was not exercised. Clipboard checks do not substitute for it.
+- **Physical mixed-monitor DPI:** tests cover 1×/2× layout, glyph density, input coordinates, focus and live-scale state preservation; moving a native window between actual monitors with different scales was not tested.
+- **Native Wayland restore:** the compositor declined the programmatic restore scenario, which is explicitly skipped. XWayland passing is useful alternative-backend evidence, not native Wayland completion.
+- **Platform and performance scope:** Linux hardware results do not certify physical Windows GPUs. Software-driver functional coverage does not establish hardware performance. Small fixed scenes and static frame profiles do not establish large-project responsiveness.
+
+These are verification limits, not proof that the feature is broken; they also cannot be silently counted as verified. The supported MVP profile remains static glTF/UV0/basic PBR, root-level box physics, one editor window and C++ gameplay. Lua, advanced rendering/animation, live link, variants and C++ hot replacement remain outside this acceptance scope as specified by PLAN.
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/README.md b/docs/validation/windows-software-vulkan-2026-09-18/README.md
new file mode 100644
index 0000000..0659825
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/README.md
@@ -0,0 +1,18 @@
+# Windows software Vulkan acceptance
+
+[The final source record](final-source/evidence.json) documents a successful fresh-checkout build of `4cb82556de31268d2bde73948dd1ff1b6c02f162` in [GitHub Actions run 35301244334](https://github.com/emil28092005/Faset_Engine/actions/runs/35301244334). The hosted Windows Server 2025 image supplied Visual Studio tools and Clang 20.1.8 (`clang-cl`). The job prepared the pinned Vulkan loader/SwiftShader toolchain, fetched the verified Slang compiler, configured the Editor with `FASET_DEBUG_IMGUI=ON`, then built the Editor, Player and tests. All **35 CTests passed**, with no failures or skips.
+
+The [test summary](final-source/tests.json) preserves the concrete acceptance cases and selected output:
+
+- `editor_ui_launcher`: Create/Open, Unicode project paths, validation, recent projects, directory browsing and keyboard navigation through the instrumented retained UI. This is developer setup and first-project evidence, not a retail-installer test.
+- `render_window_lifecycle`: native SDL window resize, Unicode clipboard roundtrip, text-input rectangle conversion, 12 fresh frames while minimized, and restore. Real OS IME composition was not exercised.
+- `editor_gui_mcp`: a visible native Editor plus MCP stdio shared authoring, conflict/Undo handling and 12 fresh PNG captures without loss of responsiveness.
+- `editor_debug_overlay`: the optional ImGui font/triangle rendering, F12 toggling and pointer-event isolation, including gestures crossing the overlay boundary.
+
+Both the BuildService export/incremental-build integration and [the checked-in playable project verifier](final-source/playable-report.json) passed. Each game was built in **Release** from its own C++ scripts, packaged, checked against its manifest, moved outside the engine tree into a `Faset Café 世界` path, and run from an unrelated working directory with its disposable source project unavailable. Each standalone Player passed CPU scene validation and rendered 120 frames at 1280×720. The 3D case includes a real imported Blender arch bundle. Exact source input hashes, generations, packaged file hashes, process results and captures are retained.
+
+The [toolchain](final-source/toolchain.json) and [probe](final-source/probe.json) identify **SwiftShader Vulkan 1.3, a CPU device**. The Khronos validation layer was absent (`validation_enabled=false`); zero reported validation errors must not be read as validation-layer coverage. These records establish functional behavior on a hosted Windows VM, not physical desktop GPU performance, a manually operated desktop, or a large-workload benchmark. Timing fields retained in the original verifier report are diagnostic data only.
+
+Original detailed job logs and raw frame profiles are available in the linked CI artifact while its retention period lasts. This folder keeps the compact acceptance evidence and hashes of the original CTest/CI logs.
+
+The earlier [checkpoint 5 record](checkpoint5/evidence.json) preserves the independently successful run of `0f34b036313c011861dbfd5828ed45c4f7940b05`. The final source run additionally covers the relocated importer metadata fix through `assets_pipeline`, followed by the complete export matrix again. [2D capture](final-source/collect-2d.png) · [3D capture](final-source/collect-3d.png).
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-manifest.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-manifest.json
new file mode 100644
index 0000000..a081b4d
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-manifest.json
@@ -0,0 +1,148 @@
+{
+ "asset_generations": {},
+ "build_fingerprint": "1ce6b1c87ae16d24ae0df4da94b379805d976d550c31f3540cad9f64829542b7",
+ "configuration": "Release",
+ "executable": "faset_player.exe",
+ "files": [
+ {
+ "path": "faset_player.exe",
+ "sha256": "a9616a9547c599ecc27b88a3d5807c5c0a7daa1cd7ec7663743d286411520809",
+ "size": 4278272
+ },
+ {
+ "path": "Notices/box2d/LICENSE",
+ "sha256": "68a3e676d7e94093b102d5cba0d4e04af812040d6f230c3db67a6664574e43d2",
+ "size": 1067
+ },
+ {
+ "path": "Notices/box3d/LICENSE",
+ "sha256": "da5e31a26bf3cfd5ba5c96d6823e480128c81e76c107ef9d3ee5d94789184b90",
+ "size": 1067
+ },
+ {
+ "path": "Notices/dependencies.json",
+ "sha256": "a54639ad2d9ad13c2e5f1ec90d6775f5dfc493656789b78c7e44debe2a378fdc",
+ "size": 2206
+ },
+ {
+ "path": "Notices/entt/LICENSE",
+ "sha256": "0785027ce472d7c61f05fba664a1d3ba6639c1593ced351ad9e4bed868765d99",
+ "size": 1097
+ },
+ {
+ "path": "Notices/Faset-NOTICE.txt",
+ "sha256": "30c2e7e80f5153b31ab57675e07246aef9165965d64e36022b426a26449ece3f",
+ "size": 204
+ },
+ {
+ "path": "Notices/json/LICENSE.MIT",
+ "sha256": "46a65cffd1ea955132d95a8dd921640714a8d6b537d2e4e482d31145ae95b603",
+ "size": 1076
+ },
+ {
+ "path": "Notices/sdl3/LICENSE.txt",
+ "sha256": "97f35b302b361680ec1e891e95d2d52097bb95abff361434916d99dc1305f127",
+ "size": 884
+ },
+ {
+ "path": "Notices/stb/LICENSE",
+ "sha256": "bebfe904b14301657e4e5d655c811d51fd31b97c455b9cc2d8600d6bac6cff63",
+ "size": 2510
+ },
+ {
+ "path": "README.txt",
+ "sha256": "c62b83aa59e8eec3b3508f9e9ad5e78eb4554a2369242c830debe8d5ffbab924",
+ "size": 229
+ },
+ {
+ "path": "scene.fscene",
+ "sha256": "0d7b221abc1cae5e9f1d04357c684ac6993f5878d634b4b950eec66dd8e55b2a",
+ "size": 6214
+ },
+ {
+ "path": "shaders/fragmentMain.reflection.json",
+ "sha256": "ba43159da6ef0e8c305ba9a88414551ec273c487cdc7d324403998ba2d296f10",
+ "size": 2777
+ },
+ {
+ "path": "shaders/fragmentMain.spv",
+ "sha256": "f5c4f289917ecab5d00d543c053aac1d10e6cca311fd172daf06d315160a3505",
+ "size": 7436
+ },
+ {
+ "path": "shaders/shadowMain.reflection.json",
+ "sha256": "3f785e549f40abad75115d5dfc16b409f81bbb0eced6281c6eda33c2eb439249",
+ "size": 2772
+ },
+ {
+ "path": "shaders/shadowMain.spv",
+ "sha256": "7643b4d688492b5ee923b9606f0b0e70343ca05fa67673838206119a6f86d8d8",
+ "size": 784
+ },
+ {
+ "path": "shaders/vertexMain.reflection.json",
+ "sha256": "4459cc3113377b7fbc41b880529cf5ad474ad07d299e033eb9169ac7849894cf",
+ "size": 2768
+ },
+ {
+ "path": "shaders/vertexMain.spv",
+ "sha256": "1ad2631c35d654f48166321ae43d4165043e1b919b14f1dc61caf97b1ada0898",
+ "size": 1224
+ },
+ {
+ "path": "Windows-Runtime.txt",
+ "sha256": "1c53b7b6890d4a10408acfa7a27760ca1b176bb43dba9c25f3e5d2ac2d7d15db",
+ "size": 227
+ }
+ ],
+ "format": "faset.export",
+ "generation": "16e0f91d-c1ab-4c66-b4d7-3dc88459caa9",
+ "platform": "windows",
+ "prerequisites": [
+ "Windows x64",
+ "Vulkan 1.3 driver",
+ "Microsoft Visual C++ x64 Redistributable (Visual Studio 2022 or newer)"
+ ],
+ "renderer_profile": {
+ "api": "Vulkan 1.3",
+ "materials": [
+ "base-color factor and texture",
+ "metallic and roughness factors"
+ ],
+ "required_features": [
+ "dynamicRendering",
+ "synchronization2"
+ ],
+ "shadow_map": {
+ "resolution": 1024,
+ "world_extent": 40
+ },
+ "texture_sampling": "linear clamp, one mip level",
+ "unsupported_material_features": [
+ "normal maps",
+ "metallic-roughness maps",
+ "emissive and occlusion maps",
+ "alpha mode selection",
+ "unlit mode",
+ "per-material face culling"
+ ]
+ },
+ "scene_hash": "fdfa1c49cf78a1cf52cd41b201c35bb0b5f852c90b7626b2a7f17da3e2e3e24c",
+ "simulation": {
+ "fixed_delta": 0.016666666666666666,
+ "gravity": [
+ 0,
+ -9.81,
+ 0
+ ],
+ "max_catch_up_ticks": 4,
+ "physics_substeps": 4
+ },
+ "units": {
+ "angle": "radian",
+ "coordinates": "right-handed Y-up",
+ "distance": "metre"
+ },
+ "validation_log": "{\"dimension\":2,\"validated\":true}\r\n",
+ "version": 1
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-run.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-run.json
new file mode 100644
index 0000000..eccb5a5
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-run.json
@@ -0,0 +1,18 @@
+{
+ "arguments": [
+ "C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-2d\\faset_player.exe",
+ "--headless",
+ "--frames",
+ "120",
+ "--capture",
+ "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-2d\\verification.ppm",
+ "--profile",
+ "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-2d\\profile.json"
+ ],
+ "cwd": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\empty-working-directory",
+ "seconds": 0.5779999999999745,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "New round: collect the three gold cubes, then reach the green exit. E resets.\n{\"device\":\"SwiftShader Device (LLVM 10.0.0)\",\"dimension\":2,\"frames\":120,\"ticks\":120,\"validation_errors\":0}\n",
+ "stderr": "[Faset] Vulkan validation layer/debug-utils unavailable; validation disabled.\n"
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-validate.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-validate.json
new file mode 100644
index 0000000..97f2e97
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d-validate.json
@@ -0,0 +1,12 @@
+{
+ "arguments": [
+ "C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-2d\\faset_player.exe",
+ "--validate"
+ ],
+ "cwd": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\empty-working-directory",
+ "seconds": 0.03199999999992542,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "{\"dimension\":2,\"validated\":true}\n",
+ "stderr": ""
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d.png b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d.png
new file mode 100644
index 0000000..49a4fa6
Binary files /dev/null and b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-2d.png differ
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-manifest.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-manifest.json
new file mode 100644
index 0000000..e1a5036
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-manifest.json
@@ -0,0 +1,175 @@
+{
+ "asset_generations": {
+ "5832763b-3ed0-44d6-9088-0b524f196a91": "e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f"
+ },
+ "build_fingerprint": "2df2988bbee68e7cb0819b84708006393d85217630475289df5ef603fac4e0c3",
+ "configuration": "Release",
+ "executable": "faset_player.exe",
+ "files": [
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/current.json",
+ "sha256": "32a37e4497f1129c0c78f3ccab4c53e802afe60cabc7a445a31114bf071ff90a",
+ "size": 134
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f/manifest.json",
+ "sha256": "c13287d0ebbef75aa610af4a5d3e687e232b2450f3daaff6926fe6128250ead6",
+ "size": 4532
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f/meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f/meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh",
+ "sha256": "3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071",
+ "size": 928
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f/meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "faset_player.exe",
+ "sha256": "4eb9cf7a6d0c2d5e274fb2fe5d6ce6048abda7775dd41927edd77250ecc3eb3a",
+ "size": 4292096
+ },
+ {
+ "path": "Notices/box2d/LICENSE",
+ "sha256": "68a3e676d7e94093b102d5cba0d4e04af812040d6f230c3db67a6664574e43d2",
+ "size": 1067
+ },
+ {
+ "path": "Notices/box3d/LICENSE",
+ "sha256": "da5e31a26bf3cfd5ba5c96d6823e480128c81e76c107ef9d3ee5d94789184b90",
+ "size": 1067
+ },
+ {
+ "path": "Notices/dependencies.json",
+ "sha256": "a54639ad2d9ad13c2e5f1ec90d6775f5dfc493656789b78c7e44debe2a378fdc",
+ "size": 2206
+ },
+ {
+ "path": "Notices/entt/LICENSE",
+ "sha256": "0785027ce472d7c61f05fba664a1d3ba6639c1593ced351ad9e4bed868765d99",
+ "size": 1097
+ },
+ {
+ "path": "Notices/Faset-NOTICE.txt",
+ "sha256": "30c2e7e80f5153b31ab57675e07246aef9165965d64e36022b426a26449ece3f",
+ "size": 204
+ },
+ {
+ "path": "Notices/json/LICENSE.MIT",
+ "sha256": "46a65cffd1ea955132d95a8dd921640714a8d6b537d2e4e482d31145ae95b603",
+ "size": 1076
+ },
+ {
+ "path": "Notices/sdl3/LICENSE.txt",
+ "sha256": "97f35b302b361680ec1e891e95d2d52097bb95abff361434916d99dc1305f127",
+ "size": 884
+ },
+ {
+ "path": "Notices/stb/LICENSE",
+ "sha256": "bebfe904b14301657e4e5d655c811d51fd31b97c455b9cc2d8600d6bac6cff63",
+ "size": 2510
+ },
+ {
+ "path": "README.txt",
+ "sha256": "c62b83aa59e8eec3b3508f9e9ad5e78eb4554a2369242c830debe8d5ffbab924",
+ "size": 229
+ },
+ {
+ "path": "scene.fscene",
+ "sha256": "21c364140669ec82c6886102667b255df5ccdf0ec77e0ca64060f84dd7b86632",
+ "size": 8639
+ },
+ {
+ "path": "shaders/fragmentMain.reflection.json",
+ "sha256": "ba43159da6ef0e8c305ba9a88414551ec273c487cdc7d324403998ba2d296f10",
+ "size": 2777
+ },
+ {
+ "path": "shaders/fragmentMain.spv",
+ "sha256": "f5c4f289917ecab5d00d543c053aac1d10e6cca311fd172daf06d315160a3505",
+ "size": 7436
+ },
+ {
+ "path": "shaders/shadowMain.reflection.json",
+ "sha256": "3f785e549f40abad75115d5dfc16b409f81bbb0eced6281c6eda33c2eb439249",
+ "size": 2772
+ },
+ {
+ "path": "shaders/shadowMain.spv",
+ "sha256": "7643b4d688492b5ee923b9606f0b0e70343ca05fa67673838206119a6f86d8d8",
+ "size": 784
+ },
+ {
+ "path": "shaders/vertexMain.reflection.json",
+ "sha256": "4459cc3113377b7fbc41b880529cf5ad474ad07d299e033eb9169ac7849894cf",
+ "size": 2768
+ },
+ {
+ "path": "shaders/vertexMain.spv",
+ "sha256": "1ad2631c35d654f48166321ae43d4165043e1b919b14f1dc61caf97b1ada0898",
+ "size": 1224
+ },
+ {
+ "path": "Windows-Runtime.txt",
+ "sha256": "1c53b7b6890d4a10408acfa7a27760ca1b176bb43dba9c25f3e5d2ac2d7d15db",
+ "size": 227
+ }
+ ],
+ "format": "faset.export",
+ "generation": "e8819c35-cd05-45d9-b7f4-3de060f62836",
+ "platform": "windows",
+ "prerequisites": [
+ "Windows x64",
+ "Vulkan 1.3 driver",
+ "Microsoft Visual C++ x64 Redistributable (Visual Studio 2022 or newer)"
+ ],
+ "renderer_profile": {
+ "api": "Vulkan 1.3",
+ "materials": [
+ "base-color factor and texture",
+ "metallic and roughness factors"
+ ],
+ "required_features": [
+ "dynamicRendering",
+ "synchronization2"
+ ],
+ "shadow_map": {
+ "resolution": 1024,
+ "world_extent": 40
+ },
+ "texture_sampling": "linear clamp, one mip level",
+ "unsupported_material_features": [
+ "normal maps",
+ "metallic-roughness maps",
+ "emissive and occlusion maps",
+ "alpha mode selection",
+ "unlit mode",
+ "per-material face culling"
+ ]
+ },
+ "scene_hash": "ee12794145c14ba5b599c5d9ae21648cccdfa91c47ee7742549f60d5fe7bc3e0",
+ "simulation": {
+ "fixed_delta": 0.016666666666666666,
+ "gravity": [
+ 0,
+ -9.81,
+ 0
+ ],
+ "max_catch_up_ticks": 4,
+ "physics_substeps": 4
+ },
+ "units": {
+ "angle": "radian",
+ "coordinates": "right-handed Y-up",
+ "distance": "metre"
+ },
+ "validation_log": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\r\n{\"dimension\":3,\"validated\":true}\r\n",
+ "version": 1
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-run.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-run.json
new file mode 100644
index 0000000..5190d59
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-run.json
@@ -0,0 +1,18 @@
+{
+ "arguments": [
+ "C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-3d\\faset_player.exe",
+ "--headless",
+ "--frames",
+ "120",
+ "--capture",
+ "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-3d\\verification.ppm",
+ "--profile",
+ "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-3d\\profile.json"
+ ],
+ "cwd": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\empty-working-directory",
+ "seconds": 2.2810000000001764,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "New round: collect the three gold cubes, then reach the green exit. E resets.\n{\"device\":\"SwiftShader Device (LLVM 10.0.0)\",\"dimension\":3,\"frames\":120,\"ticks\":120,\"validation_errors\":0}\n",
+ "stderr": "[Faset] Vulkan validation layer/debug-utils unavailable; validation disabled.\nwarning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n"
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-validate.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-validate.json
new file mode 100644
index 0000000..0673c3f
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d-validate.json
@@ -0,0 +1,12 @@
+{
+ "arguments": [
+ "C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-3d\\faset_player.exe",
+ "--validate"
+ ],
+ "cwd": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\empty-working-directory",
+ "seconds": 0.03099999999994907,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "{\"dimension\":3,\"validated\":true}\n",
+ "stderr": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n"
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d.png b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d.png
new file mode 100644
index 0000000..404942a
Binary files /dev/null and b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/collect-3d.png differ
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/evidence.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/evidence.json
new file mode 100644
index 0000000..0bdc81d
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/evidence.json
@@ -0,0 +1,235 @@
+{
+ "format": "faset.validation-evidence",
+ "version": 1,
+ "status": "passed",
+ "scope": "Hosted Windows developer build, first-project UI contracts, software Vulkan and relocated Release games",
+ "source_checkout": {
+ "commit": "0f34b036313c011861dbfd5828ed45c4f7940b05",
+ "fresh_checkout": true,
+ "clean_commit_match": true,
+ "checkout_step": "actions/checkout on a fresh GitHub-hosted runner; engine and game targets configured and built in this job"
+ },
+ "ci": {
+ "run_url": "https://github.com/emil28092005/Faset_Engine/actions/runs/35300447535",
+ "job_url": "https://github.com/emil28092005/Faset_Engine/actions/runs/35300447535/job/105463031708",
+ "started_utc": "2026-09-18T02:49:42Z",
+ "finished_utc": "2026-09-18T03:04:40Z",
+ "conclusion": "success",
+ "steps": [
+ {
+ "name": "Set up job",
+ "conclusion": "success"
+ },
+ {
+ "name": "Run actions/checkout@11d5960a326750d5838078e36cf38b85af677262",
+ "conclusion": "success"
+ },
+ {
+ "name": "Run actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065",
+ "conclusion": "success"
+ },
+ {
+ "name": "Visual Studio x64 environment",
+ "conclusion": "success"
+ },
+ {
+ "name": "Enable the documented Windows long-path developer profile",
+ "conclusion": "success"
+ },
+ {
+ "name": "Identify pinned Vulkan source cache",
+ "conclusion": "success"
+ },
+ {
+ "name": "Restore pinned Vulkan test tools",
+ "conclusion": "success"
+ },
+ {
+ "name": "Build official Vulkan loader and SwiftShader from pinned sources",
+ "conclusion": "success"
+ },
+ {
+ "name": "Save successfully built Vulkan test tools",
+ "conclusion": "skipped"
+ },
+ {
+ "name": "Probe Vulkan loader and SwiftShader before compiling the engine",
+ "conclusion": "success"
+ },
+ {
+ "name": "Fetch checksum-verified Slang compiler",
+ "conclusion": "success"
+ },
+ {
+ "name": "Configure full editor and Player",
+ "conclusion": "success"
+ },
+ {
+ "name": "Build full editor and tests",
+ "conclusion": "success"
+ },
+ {
+ "name": "CPU contracts and software GPU pixel tests",
+ "conclusion": "success"
+ },
+ {
+ "name": "Real Release exports, 2D and 3D execution, incremental Debug rebuild",
+ "conclusion": "success"
+ },
+ {
+ "name": "Export and relocate both checked-in playable games",
+ "conclusion": "success"
+ },
+ {
+ "name": "Preserve graphics and export evidence",
+ "conclusion": "success"
+ },
+ {
+ "name": "Post Run actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065",
+ "conclusion": "success"
+ },
+ {
+ "name": "Post Run actions/checkout@11d5960a326750d5838078e36cf38b85af677262",
+ "conclusion": "success"
+ },
+ {
+ "name": "Complete job",
+ "conclusion": "success"
+ }
+ ]
+ },
+ "environment": {
+ "runner_label": "windows-2025",
+ "observed_setup": [
+ "Microsoft Windows Server 2025",
+ "Image: windows-2025-vs2026",
+ "Version: 20260907.229.1",
+ "-- The CXX compiler identification is Clang 20.1.8 with MSVC-like command-line"
+ ],
+ "compiler": "Clang 20.1.8 clang-cl, x64 MSVC ABI",
+ "editor_configuration": "Debug, FASET_DEBUG_IMGUI=ON",
+ "export_configuration": "Release, independent Ninja build with custom project C++ sources",
+ "windows_long_paths_enabled": true,
+ "device": "SwiftShader Device (LLVM 10.0.0)",
+ "validation_layer_available": false
+ },
+ "tests": {
+ "total": 35,
+ "passed": 35,
+ "failed": 0,
+ "skipped": 0,
+ "details": "tests.json"
+ },
+ "first_project_evidence": {
+ "test": "editor_ui_launcher",
+ "observed": "Create/Open through the instrumented launcher, Unicode paths, recents, directory browsing, validation and keyboard navigation; actual retained UI and software-rendered frame"
+ },
+ "games": [
+ {
+ "name": "collect-2d",
+ "generation": "16e0f91d-c1ab-4c66-b4d7-3dc88459caa9",
+ "configuration": "Release",
+ "frames": 120,
+ "validation_enabled": false,
+ "validation_errors": 0,
+ "source_paths_hidden": true,
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 7,
+ "sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a"
+ },
+ "export_compiler_evidence": [
+ "-- The C compiler identification is Clang 20.1.8 with MSVC-like command-line",
+ "-- The CXX compiler identification is Clang 20.1.8 with MSVC-like command-line"
+ ]
+ },
+ {
+ "name": "collect-3d",
+ "generation": "e8819c35-cd05-45d9-b7f4-3de060f62836",
+ "configuration": "Release",
+ "frames": 120,
+ "validation_enabled": false,
+ "validation_errors": 0,
+ "source_paths_hidden": true,
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 43,
+ "sha256": "0edc88eef9f641a780ef44664f58c811a22bd201c8d29e1fcb7531b88f251900"
+ },
+ "export_compiler_evidence": [
+ "-- The C compiler identification is Clang 20.1.8 with MSVC-like command-line",
+ "-- The CXX compiler identification is Clang 20.1.8 with MSVC-like command-line"
+ ]
+ }
+ ],
+ "limitations": [
+ "Software Vulkan on a GitHub-hosted Windows Server VM, not a physical desktop GPU qualification or performance benchmark.",
+ "Khronos validation layer is absent. Zero reported validation errors does not establish validation-layer coverage.",
+ "Fresh developer-toolchain setup and first-project tests are covered; no retail installer or manual OS IME composition acceptance is claimed."
+ ],
+ "original_ci_log_sha256": "5ef915923837881ffba85d03f73fb879acef2849d425fa6c90d6401781cc5937",
+ "retained_files": [
+ {
+ "path": "collect-2d-manifest.json",
+ "sha256": "f65466a16a53bad75cf758952cdb6169c1717e1995257333ca0e882aabda63b3",
+ "size": 4315
+ },
+ {
+ "path": "collect-2d-run.json",
+ "sha256": "9dda395b5012051bfa225be27577bde0eff9d56ccc5f7e64ae8ed7dbd9748d02",
+ "size": 1011
+ },
+ {
+ "path": "collect-2d-validate.json",
+ "sha256": "1789f7b2d8de3bd55be3974d6b1e8fbc76424b5c73633e0a2052fb07482ce474",
+ "size": 445
+ },
+ {
+ "path": "collect-2d.png",
+ "sha256": "c380583f2fd8bc09c5b0e1c6e755c35c3d64b5385ed66177b04d1bbdb532b236",
+ "size": 4525
+ },
+ {
+ "path": "collect-3d-manifest.json",
+ "sha256": "35350b5d34dd2d1caed5cbbc1216274479fcc2ed5139e2de53369df0f2a9b929",
+ "size": 5923
+ },
+ {
+ "path": "collect-3d-run.json",
+ "sha256": "0fd945b0ea7d8373832db5ef017b1d57155ba8a26fd245e43d45732a0aacb5f9",
+ "size": 1128
+ },
+ {
+ "path": "collect-3d-validate.json",
+ "sha256": "3c6f05871ac8d462505c0f4021cb18d9740060955bad22aead701a4dec8bebb0",
+ "size": 562
+ },
+ {
+ "path": "collect-3d.png",
+ "sha256": "48ef9a82378f74e8ad5a0c438bb730773d684cce809afcef461756a38476375e",
+ "size": 20366
+ },
+ {
+ "path": "playable-report.json",
+ "sha256": "d754700b5bfb23e3e5f6f78cc77336daea0503d71fe82bec7c80454f194ac293",
+ "size": 14529
+ },
+ {
+ "path": "probe.json",
+ "sha256": "0c85c12510dbb0d895faefb7d14f26935a5add675cf0477b29f543d72eed40d6",
+ "size": 1019
+ },
+ {
+ "path": "tests.json",
+ "sha256": "ac25ad1d3d9368e28cc9b1bd01275ee7ec154d8a654fbed95ceb6f2d91592c2e",
+ "size": 4730
+ },
+ {
+ "path": "toolchain.json",
+ "sha256": "969162d1f994724ff6f98d20353e62e3881477ebce98759ca325c8febb175176",
+ "size": 937
+ }
+ ]
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/playable-report.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/playable-report.json
new file mode 100644
index 0000000..070dba3
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/playable-report.json
@@ -0,0 +1,435 @@
+{
+ "format": "faset.playable-export-verification",
+ "version": 1,
+ "started_utc": "2026-09-18T03:00:26.437450+00:00",
+ "platform": "win32",
+ "engine": "D:\\a\\Faset_Engine\\Faset_Engine",
+ "editor": "D:\\a\\Faset_Engine\\Faset_Engine\\build\\windows-debug\\faset_editor.exe",
+ "standalone_root": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x",
+ "frames_per_game": 120,
+ "status": "passed",
+ "projects": [
+ {
+ "name": "collect-2d",
+ "dimension": 2,
+ "source_inputs": [
+ {
+ "path": ".gitignore",
+ "sha256": "3bb936ff6f84f3db041c75d6e207138a9107997cc9ad372621f657456c9c0665"
+ },
+ {
+ "path": "project.faset.json",
+ "sha256": "27bd0e432381f8f884e78f6d68e9d0dc13d49222e70f3a5e34fef1d57d379b0b"
+ },
+ {
+ "path": "README.md",
+ "sha256": "7543b24c9ac87d6a7390d61d5289518e5f5725f3c0052675659f6da716883bdd"
+ },
+ {
+ "path": "Scenes/main.scene.json",
+ "sha256": "9e2ad049f60a9ff7f98e31061a8f107648fbf672e5b9292f53e6672e5bae66f1"
+ },
+ {
+ "path": "Scripts/Gameplay.cpp",
+ "sha256": "99fb965e6589b138049a2e6cf95c5c61baea70761ffab33082a8058c91a687ff"
+ },
+ {
+ "path": "Scripts/Gameplay.hpp",
+ "sha256": "9d1fa36da50886fa7d84f8a8b3d1ae42856ae74aae1e52be5015b60977634dc0"
+ }
+ ],
+ "generation": "16e0f91d-c1ab-4c66-b4d7-3dc88459caa9",
+ "configuration": "Release",
+ "standalone_directory": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-2d",
+ "executable": "faset_player.exe",
+ "package_file_count": 18,
+ "asset_generations": {},
+ "device": "SwiftShader Device (LLVM 10.0.0)",
+ "validation_enabled": false,
+ "validation_errors": 0,
+ "completed_frames": 120,
+ "summary_ms": {
+ "gpu": {
+ "max": 128.739,
+ "min": 1.839,
+ "p50": 1.9465,
+ "p95": 2.362,
+ "samples": 120
+ },
+ "render_call": {
+ "max": 129.6447,
+ "min": 2.0406,
+ "p50": 2.1546,
+ "p95": 2.5774,
+ "samples": 120
+ },
+ "renderer_cpu": {
+ "max": 129.6266,
+ "min": 2.0373,
+ "p50": 2.1516,
+ "p95": 2.5745,
+ "samples": 120
+ },
+ "renderer_readback_cpu": {
+ "max": 0.7806,
+ "min": 0.1451,
+ "p50": 0.1478,
+ "p95": 0.1646,
+ "samples": 120
+ },
+ "simulation": {
+ "max": 0.3316,
+ "min": 0.2683,
+ "p50": 0.283,
+ "p95": 0.3148,
+ "samples": 120
+ },
+ "snapshot": {
+ "max": 0.2707,
+ "min": 0.1572,
+ "p50": 0.2213,
+ "p95": 0.2435,
+ "samples": 120
+ },
+ "wall": {
+ "max": 130.7666,
+ "min": 2.5456,
+ "p50": 2.6691,
+ "p95": 3.0846,
+ "samples": 120
+ }
+ },
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 7,
+ "sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a"
+ },
+ "source_project_paths_unavailable": true,
+ "status": "passed"
+ },
+ {
+ "name": "collect-3d",
+ "dimension": 3,
+ "source_inputs": [
+ {
+ "path": ".gitignore",
+ "sha256": "3bb936ff6f84f3db041c75d6e207138a9107997cc9ad372621f657456c9c0665"
+ },
+ {
+ "path": "Assets/exit-arch/create.py",
+ "sha256": "5d9dc30a3f939376d2474cf958065e6daab140c7220444cedecd3bf5edf6e3d1"
+ },
+ {
+ "path": "Assets/exit-arch/manifest.json",
+ "sha256": "d72d44184d665148109de74782bc695d79392e43be12782e48096a7d79e37c4f"
+ },
+ {
+ "path": "Assets/exit-arch/manifest.json.faset-import.json",
+ "sha256": "7639d4fa33f2ac52e10d1cf79280a93aeb680399d217fda167acec1c6edcae00"
+ },
+ {
+ "path": "Assets/exit-arch/payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb",
+ "sha256": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3"
+ },
+ {
+ "path": "Assets/exit-arch/source.blend",
+ "sha256": "ff2676bec97ab778e531e87a185ad716049ea3b05b4a4f0027a6345737735035"
+ },
+ {
+ "path": "project.faset.json",
+ "sha256": "9a0ee78fa0ea56982a99cf707948a33db37266ab84de9d3f12a24aabb98afda5"
+ },
+ {
+ "path": "README.md",
+ "sha256": "a2378adc9dbd5ffb6bfa65abb7770051827d08279e48761046f30d932a5eab8c"
+ },
+ {
+ "path": "Scenes/main.scene.json",
+ "sha256": "b1b668a2d633deda0074b475460c82019dbcf592b76502906192eaf1f2345a7e"
+ },
+ {
+ "path": "Scripts/Extensions/Beacon.hpp",
+ "sha256": "650e75bbc55a3339647bcf67ba10fd9b20cece3531bb688b4221155e97959d5e"
+ },
+ {
+ "path": "Scripts/Gameplay.cpp",
+ "sha256": "c76fbb0bf28a85cc88732a905f2bc9be3e24c58d02cbf2ecccbf77c99093c029"
+ },
+ {
+ "path": "Scripts/Gameplay.hpp",
+ "sha256": "9d1fa36da50886fa7d84f8a8b3d1ae42856ae74aae1e52be5015b60977634dc0"
+ }
+ ],
+ "import": {
+ "asset_id": "5832763b-3ed0-44d6-9088-0b524f196a91",
+ "cache_hit": false,
+ "diagnostics": [],
+ "generation": "e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f",
+ "manifest": {
+ "asset_id": "5832763b-3ed0-44d6-9088-0b524f196a91",
+ "files": [
+ {
+ "path": "meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh",
+ "sha256": "3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071",
+ "size": 928
+ }
+ ],
+ "generation": "e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f",
+ "importer": "faset-gltf-1/cgltf-1.15",
+ "input_key": {
+ "bundle_sha256": "d72d44184d665148109de74782bc695d79392e43be12782e48096a7d79e37c4f",
+ "dependencies": {},
+ "importer": "faset-gltf-1/cgltf-1.15",
+ "settings": {},
+ "source": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3",
+ "target_profile": "desktop-static-pbr-v1",
+ "toolchain": {
+ "cgltf": "360db1a95480fe102ae9c69b27c5d101167ff5ba",
+ "stb": "2c980bb59875b0d32144a71867fbdebb2f77cd20"
+ }
+ },
+ "kind": "scene",
+ "materials": [
+ {
+ "alpha_cutoff": 0.5,
+ "alpha_mode": "OPAQUE",
+ "base_color": [
+ 0.2199999988079071,
+ 0.28999999165534973,
+ 0.3400000035762787,
+ 1.0
+ ],
+ "base_color_texture": -1,
+ "double_sided": true,
+ "emissive": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "emissive_texture": -1,
+ "format": "faset.material",
+ "id": "material-bb63b094febbf90bb7049c9bcf7587bc",
+ "metallic": 0.07999999821186066,
+ "metallic_roughness_texture": -1,
+ "name": "Weathered stone",
+ "normal_texture": -1,
+ "occlusion_texture": -1,
+ "roughness": 0.800000011920929,
+ "unlit": false,
+ "version": 1
+ }
+ ],
+ "meshes": [
+ {
+ "id": "mesh-fc069a07a87e0f831fd92efdbc4efa1f",
+ "name": "Cube.001",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh"
+ }
+ ]
+ },
+ {
+ "id": "mesh-0961e2a3f92977836a3aa80cab09277e",
+ "name": "Cube.002",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh"
+ }
+ ]
+ },
+ {
+ "id": "mesh-93b5b3e52cb6bb120fefb80e2d8e222b",
+ "name": "Cube.003",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh"
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "id": "node-cec6e8cea80cf5a98ba3263a0156bee4",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 1.4500000476837158,
+ 1.2999999523162842,
+ 1.0
+ ],
+ "mesh": 0,
+ "name": "Left post",
+ "parent_id": "",
+ "stable_source_id": true
+ },
+ {
+ "id": "node-5f8a90a6c4d27020d20bd4fa81d1d958",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 1.4500000476837158,
+ -1.2999999523162842,
+ 1.0
+ ],
+ "mesh": 1,
+ "name": "Right post",
+ "parent_id": "",
+ "stable_source_id": true
+ },
+ {
+ "id": "node-482463e486a8d1fd741340c653cd128f",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 3.0,
+ 0.0,
+ 1.0
+ ],
+ "mesh": 2,
+ "name": "Lintel",
+ "parent_id": "",
+ "stable_source_id": true
+ }
+ ],
+ "outputs": [
+ "node-cec6e8cea80cf5a98ba3263a0156bee4",
+ "node-5f8a90a6c4d27020d20bd4fa81d1d958",
+ "node-482463e486a8d1fd741340c653cd128f",
+ "mesh-fc069a07a87e0f831fd92efdbc4efa1f",
+ "mesh-0961e2a3f92977836a3aa80cab09277e",
+ "mesh-93b5b3e52cb6bb120fefb80e2d8e222b",
+ "material-bb63b094febbf90bb7049c9bcf7587bc"
+ ],
+ "payload_source": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-playable-exports\\Faset Café 世界\\collect-3d\\Assets\\exit-arch\\payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb",
+ "schema_version": 1,
+ "settings": {},
+ "source": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-playable-exports\\Faset Café 世界\\collect-3d\\Assets\\exit-arch\\manifest.json",
+ "source_sha256": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3",
+ "textures": []
+ },
+ "previous_generation": "",
+ "removed_output_ids": []
+ },
+ "generation": "e8819c35-cd05-45d9-b7f4-3de060f62836",
+ "configuration": "Release",
+ "standalone_directory": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-do2lq63x\\Faset Café 世界\\collect-3d",
+ "executable": "faset_player.exe",
+ "package_file_count": 23,
+ "asset_generations": {
+ "5832763b-3ed0-44d6-9088-0b524f196a91": "e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f"
+ },
+ "device": "SwiftShader Device (LLVM 10.0.0)",
+ "validation_enabled": false,
+ "validation_errors": 0,
+ "completed_frames": 120,
+ "summary_ms": {
+ "gpu": {
+ "max": 191.1372,
+ "min": 14.892,
+ "p50": 15.2367,
+ "p95": 20.1033,
+ "samples": 120
+ },
+ "render_call": {
+ "max": 192.1372,
+ "min": 15.1555,
+ "p50": 15.5375,
+ "p95": 20.4063,
+ "samples": 120
+ },
+ "renderer_cpu": {
+ "max": 192.1253,
+ "min": 15.1507,
+ "p50": 15.5268,
+ "p95": 20.3959,
+ "samples": 120
+ },
+ "renderer_readback_cpu": {
+ "max": 0.7794,
+ "min": 0.1471,
+ "p50": 0.1602,
+ "p95": 0.187,
+ "samples": 120
+ },
+ "simulation": {
+ "max": 0.5079,
+ "min": 0.2905,
+ "p50": 0.4613,
+ "p95": 0.4892,
+ "samples": 120
+ },
+ "snapshot": {
+ "max": 2.8905,
+ "min": 0.1883,
+ "p50": 0.2104,
+ "p95": 0.3207,
+ "samples": 120
+ },
+ "wall": {
+ "max": 196.1393,
+ "min": 15.8274,
+ "p50": 16.2321,
+ "p95": 21.1248,
+ "samples": 120
+ }
+ },
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 43,
+ "sha256": "0edc88eef9f641a780ef44664f58c811a22bd201c8d29e1fcb7531b88f251900"
+ },
+ "source_project_paths_unavailable": true,
+ "status": "passed"
+ }
+ ],
+ "finished_utc": "2026-09-18T03:04:35.903012+00:00"
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/probe.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/probe.json
new file mode 100644
index 0000000..f8a4dc0
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/probe.json
@@ -0,0 +1,32 @@
+{
+ "format": "faset.windows-vulkan-probe",
+ "version": 1,
+ "status": "passed",
+ "loader": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\sdk\\bin\\vulkan-1.dll",
+ "driver_manifest": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\driver\\vk_swiftshader_icd.json",
+ "driver_library": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\driver\\vk_swiftshader.dll",
+ "manifest": {
+ "file_format_version": "1.0.0",
+ "ICD": {
+ "library_path": ".\\vk_swiftshader.dll",
+ "api_version": "1.0.5"
+ }
+ },
+ "loader_debug": "all",
+ "pointer_bits": 64,
+ "icd_negotiate_result": 0,
+ "icd_interface_version": 7,
+ "enumerate_version_result": 0,
+ "loader_api_version": "1.4.341",
+ "create_instance_result": 0,
+ "devices": [
+ {
+ "name": "SwiftShader Device (LLVM 10.0.0)",
+ "api_version": "1.3.0",
+ "driver_version": 20971520,
+ "vendor_id": 6880,
+ "device_id": 49374,
+ "device_type": 4
+ }
+ ]
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/tests.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/tests.json
new file mode 100644
index 0000000..3151efd
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/tests.json
@@ -0,0 +1,206 @@
+{
+ "format": "faset.ctest-summary",
+ "version": 1,
+ "source_commit": "0f34b036313c011861dbfd5828ed45c4f7940b05",
+ "passed": 35,
+ "failed": 0,
+ "skipped": 0,
+ "source_log_sha256": "784a057ec9067fc35e38e3eb87804f583b55745147e72c009f84fb87112361ba",
+ "tests": [
+ {
+ "name": "authoring",
+ "status": "passed",
+ "seconds": 1.76
+ },
+ {
+ "name": "runtime_contracts",
+ "status": "passed",
+ "seconds": 0.26
+ },
+ {
+ "name": "assets_pipeline",
+ "status": "passed",
+ "seconds": 0.95,
+ "observations": [
+ "assets: geometry/PBR/texture, GLB/glTF, cache, rename, deletion, overrides, failure, cancellation, standalone PNG/JPEG OK"
+ ]
+ },
+ {
+ "name": "assets_blender_bundle",
+ "status": "passed",
+ "seconds": 0.42
+ },
+ {
+ "name": "render_graph",
+ "status": "passed",
+ "seconds": 0.25
+ },
+ {
+ "name": "render_offscreen",
+ "status": "passed",
+ "seconds": 0.62
+ },
+ {
+ "name": "render_sprite_alpha",
+ "status": "passed",
+ "seconds": 0.26
+ },
+ {
+ "name": "render_shader_reload",
+ "status": "passed",
+ "seconds": 2.65
+ },
+ {
+ "name": "render_window_lifecycle",
+ "status": "passed",
+ "seconds": 1.03,
+ "observations": [
+ "driver=windows stage=created",
+ "stage=resized width=360 height=300 resize_events=2",
+ "clipboard=unicode_roundtrip_passed",
+ "text_input_area=coordinate_conversion_passed",
+ "stage=minimized fresh_frames=12 minimize_events=1 focus_lost_events=1",
+ "stage=restored restored_events=1 activation_required=0 frames=54 validation_enabled=0 validation_errors=0"
+ ]
+ },
+ {
+ "name": "player_scene_contracts",
+ "status": "passed",
+ "seconds": 0.16
+ },
+ {
+ "name": "player_shutdown_diagnostics",
+ "status": "passed",
+ "seconds": 0.17
+ },
+ {
+ "name": "editor_mcp",
+ "status": "passed",
+ "seconds": 0.06
+ },
+ {
+ "name": "process_and_cook",
+ "status": "passed",
+ "seconds": 0.64
+ },
+ {
+ "name": "build_schema_publication",
+ "status": "passed",
+ "seconds": 7.29
+ },
+ {
+ "name": "editor_plugins",
+ "status": "passed",
+ "seconds": 0.24
+ },
+ {
+ "name": "editor_session_settings",
+ "status": "passed",
+ "seconds": 0.19
+ },
+ {
+ "name": "ui_widgets",
+ "status": "passed",
+ "seconds": 0.14
+ },
+ {
+ "name": "ui_render",
+ "status": "passed",
+ "seconds": 0.48
+ },
+ {
+ "name": "editor_ui_import_conflicts",
+ "status": "passed",
+ "seconds": 0.93
+ },
+ {
+ "name": "editor_ui_project_settings",
+ "status": "passed",
+ "seconds": 1.23
+ },
+ {
+ "name": "editor_ui_reload",
+ "status": "passed",
+ "seconds": 4.26
+ },
+ {
+ "name": "editor_ui_launcher",
+ "status": "passed",
+ "seconds": 0.65,
+ "observations": [
+ "Launcher Unicode/create/open/validation/recents/directory browser/keyboard passed. C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-проекты-1425bd32-d184-42d7-9ece-402897e8d0b2"
+ ]
+ },
+ {
+ "name": "editor_ui_templates",
+ "status": "passed",
+ "seconds": 2.98
+ },
+ {
+ "name": "editor_ui_gizmos",
+ "status": "passed",
+ "seconds": 1.16
+ },
+ {
+ "name": "editor_ui_authoring",
+ "status": "passed",
+ "seconds": 1.98
+ },
+ {
+ "name": "editor_mcp_stdio",
+ "status": "passed",
+ "seconds": 0.59
+ },
+ {
+ "name": "editor_gui_mcp",
+ "status": "passed",
+ "seconds": 4.66,
+ "observations": [
+ "Native GUI + MCP shared authoring, revision conflict, Undo, 12 fresh PNG captures and continued responsiveness passed"
+ ]
+ },
+ {
+ "name": "core",
+ "status": "passed",
+ "seconds": 0.16
+ },
+ {
+ "name": "tutorial_moving",
+ "status": "passed",
+ "seconds": 0.03
+ },
+ {
+ "name": "tutorial_following",
+ "status": "passed",
+ "seconds": 0.01
+ },
+ {
+ "name": "tutorial_spawning",
+ "status": "passed",
+ "seconds": 0.04
+ },
+ {
+ "name": "tutorial_physics",
+ "status": "passed",
+ "seconds": 0.1
+ },
+ {
+ "name": "playable_2d",
+ "status": "passed",
+ "seconds": 0.62
+ },
+ {
+ "name": "playable_3d",
+ "status": "passed",
+ "seconds": 1.34
+ },
+ {
+ "name": "editor_debug_overlay",
+ "status": "passed",
+ "seconds": 0.21,
+ "observations": [
+ "ImGui diagnostics, F12, font atlas, clipping and event isolation passed"
+ ]
+ }
+ ]
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/toolchain.json b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/toolchain.json
new file mode 100644
index 0000000..04b5e46
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/checkpoint5/toolchain.json
@@ -0,0 +1,23 @@
+{
+ "sources": {
+ "headers": {
+ "repository": "KhronosGroup/Vulkan-Headers",
+ "commit": "0d3f509e57041fbd073a1ee84cd9ccd36d148446",
+ "sha256": "e82005a6bd3289ce213232ef41e0f8722d1365ed72bf5cc4be56911c56bc30e0"
+ },
+ "loader": {
+ "repository": "KhronosGroup/Vulkan-Loader",
+ "commit": "32fcb949e253cbeb40cda7ea76122b492db579ae",
+ "sha256": "610fa9017226c49bc4f19398d94fce9e3c9ff94c14f6420f9fe24822707feacf"
+ },
+ "swiftshader": {
+ "repository": "google/swiftshader",
+ "commit": "1e80438d2b93ef36a7c05f8d2b81233bac0e3d16",
+ "sha256": "1c3a1afc397c7aa4d3275790bc9b451e80b144a1db665135d5519838bacf44a8"
+ }
+ },
+ "validation_layer": false,
+ "vulkan_sdk": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\sdk",
+ "driver": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\driver\\vk_swiftshader_icd.json",
+ "loader_only": false
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-manifest.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-manifest.json
new file mode 100644
index 0000000..9ad066a
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-manifest.json
@@ -0,0 +1,148 @@
+{
+ "asset_generations": {},
+ "build_fingerprint": "4f93c7bc328f4f1ec19cc143e94fca71cb3075f4fae8dc26a812d968426e015b",
+ "configuration": "Release",
+ "executable": "faset_player.exe",
+ "files": [
+ {
+ "path": "faset_player.exe",
+ "sha256": "4674615a5a89fb1151619d4cfc5a4e96743a036308739fdec95f72843bc9c586",
+ "size": 4278272
+ },
+ {
+ "path": "Notices/box2d/LICENSE",
+ "sha256": "68a3e676d7e94093b102d5cba0d4e04af812040d6f230c3db67a6664574e43d2",
+ "size": 1067
+ },
+ {
+ "path": "Notices/box3d/LICENSE",
+ "sha256": "da5e31a26bf3cfd5ba5c96d6823e480128c81e76c107ef9d3ee5d94789184b90",
+ "size": 1067
+ },
+ {
+ "path": "Notices/dependencies.json",
+ "sha256": "a54639ad2d9ad13c2e5f1ec90d6775f5dfc493656789b78c7e44debe2a378fdc",
+ "size": 2206
+ },
+ {
+ "path": "Notices/entt/LICENSE",
+ "sha256": "0785027ce472d7c61f05fba664a1d3ba6639c1593ced351ad9e4bed868765d99",
+ "size": 1097
+ },
+ {
+ "path": "Notices/Faset-NOTICE.txt",
+ "sha256": "30c2e7e80f5153b31ab57675e07246aef9165965d64e36022b426a26449ece3f",
+ "size": 204
+ },
+ {
+ "path": "Notices/json/LICENSE.MIT",
+ "sha256": "46a65cffd1ea955132d95a8dd921640714a8d6b537d2e4e482d31145ae95b603",
+ "size": 1076
+ },
+ {
+ "path": "Notices/sdl3/LICENSE.txt",
+ "sha256": "97f35b302b361680ec1e891e95d2d52097bb95abff361434916d99dc1305f127",
+ "size": 884
+ },
+ {
+ "path": "Notices/stb/LICENSE",
+ "sha256": "bebfe904b14301657e4e5d655c811d51fd31b97c455b9cc2d8600d6bac6cff63",
+ "size": 2510
+ },
+ {
+ "path": "README.txt",
+ "sha256": "c62b83aa59e8eec3b3508f9e9ad5e78eb4554a2369242c830debe8d5ffbab924",
+ "size": 229
+ },
+ {
+ "path": "scene.fscene",
+ "sha256": "0d7b221abc1cae5e9f1d04357c684ac6993f5878d634b4b950eec66dd8e55b2a",
+ "size": 6214
+ },
+ {
+ "path": "shaders/fragmentMain.reflection.json",
+ "sha256": "ba43159da6ef0e8c305ba9a88414551ec273c487cdc7d324403998ba2d296f10",
+ "size": 2777
+ },
+ {
+ "path": "shaders/fragmentMain.spv",
+ "sha256": "f5c4f289917ecab5d00d543c053aac1d10e6cca311fd172daf06d315160a3505",
+ "size": 7436
+ },
+ {
+ "path": "shaders/shadowMain.reflection.json",
+ "sha256": "3f785e549f40abad75115d5dfc16b409f81bbb0eced6281c6eda33c2eb439249",
+ "size": 2772
+ },
+ {
+ "path": "shaders/shadowMain.spv",
+ "sha256": "7643b4d688492b5ee923b9606f0b0e70343ca05fa67673838206119a6f86d8d8",
+ "size": 784
+ },
+ {
+ "path": "shaders/vertexMain.reflection.json",
+ "sha256": "4459cc3113377b7fbc41b880529cf5ad474ad07d299e033eb9169ac7849894cf",
+ "size": 2768
+ },
+ {
+ "path": "shaders/vertexMain.spv",
+ "sha256": "1ad2631c35d654f48166321ae43d4165043e1b919b14f1dc61caf97b1ada0898",
+ "size": 1224
+ },
+ {
+ "path": "Windows-Runtime.txt",
+ "sha256": "1c53b7b6890d4a10408acfa7a27760ca1b176bb43dba9c25f3e5d2ac2d7d15db",
+ "size": 227
+ }
+ ],
+ "format": "faset.export",
+ "generation": "260a10cf-3fe6-4689-ac7b-69b577954cc2",
+ "platform": "windows",
+ "prerequisites": [
+ "Windows x64",
+ "Vulkan 1.3 driver",
+ "Microsoft Visual C++ x64 Redistributable (Visual Studio 2022 or newer)"
+ ],
+ "renderer_profile": {
+ "api": "Vulkan 1.3",
+ "materials": [
+ "base-color factor and texture",
+ "metallic and roughness factors"
+ ],
+ "required_features": [
+ "dynamicRendering",
+ "synchronization2"
+ ],
+ "shadow_map": {
+ "resolution": 1024,
+ "world_extent": 40
+ },
+ "texture_sampling": "linear clamp, one mip level",
+ "unsupported_material_features": [
+ "normal maps",
+ "metallic-roughness maps",
+ "emissive and occlusion maps",
+ "alpha mode selection",
+ "unlit mode",
+ "per-material face culling"
+ ]
+ },
+ "scene_hash": "fdfa1c49cf78a1cf52cd41b201c35bb0b5f852c90b7626b2a7f17da3e2e3e24c",
+ "simulation": {
+ "fixed_delta": 0.016666666666666666,
+ "gravity": [
+ 0,
+ -9.81,
+ 0
+ ],
+ "max_catch_up_ticks": 4,
+ "physics_substeps": 4
+ },
+ "units": {
+ "angle": "radian",
+ "coordinates": "right-handed Y-up",
+ "distance": "metre"
+ },
+ "validation_log": "{\"dimension\":2,\"validated\":true}\r\n",
+ "version": 1
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-run.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-run.json
new file mode 100644
index 0000000..98bf435
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-run.json
@@ -0,0 +1,18 @@
+{
+ "arguments": [
+ "C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-2d\\faset_player.exe",
+ "--headless",
+ "--frames",
+ "120",
+ "--capture",
+ "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-2d\\verification.ppm",
+ "--profile",
+ "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-2d\\profile.json"
+ ],
+ "cwd": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\empty-working-directory",
+ "seconds": 0.5939999999999372,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "New round: collect the three gold cubes, then reach the green exit. E resets.\n{\"device\":\"SwiftShader Device (LLVM 10.0.0)\",\"dimension\":2,\"frames\":120,\"ticks\":120,\"validation_errors\":0}\n",
+ "stderr": "[Faset] Vulkan validation layer/debug-utils unavailable; validation disabled.\n"
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-validate.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-validate.json
new file mode 100644
index 0000000..5e31f68
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d-validate.json
@@ -0,0 +1,12 @@
+{
+ "arguments": [
+ "C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-2d\\faset_player.exe",
+ "--validate"
+ ],
+ "cwd": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\empty-working-directory",
+ "seconds": 0.031000000000062755,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "{\"dimension\":2,\"validated\":true}\n",
+ "stderr": ""
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d.png b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d.png
new file mode 100644
index 0000000..49a4fa6
Binary files /dev/null and b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-2d.png differ
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-manifest.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-manifest.json
new file mode 100644
index 0000000..1543ea9
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-manifest.json
@@ -0,0 +1,175 @@
+{
+ "asset_generations": {
+ "5832763b-3ed0-44d6-9088-0b524f196a91": "e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f"
+ },
+ "build_fingerprint": "460296d2322c47856e907b7c7ca070004d2a94f53e40a9bfb791d4dd8e9e9e45",
+ "configuration": "Release",
+ "executable": "faset_player.exe",
+ "files": [
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/current.json",
+ "sha256": "32a37e4497f1129c0c78f3ccab4c53e802afe60cabc7a445a31114bf071ff90a",
+ "size": 134
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f/manifest.json",
+ "sha256": "c13287d0ebbef75aa610af4a5d3e687e232b2450f3daaff6926fe6128250ead6",
+ "size": 4532
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f/meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f/meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh",
+ "sha256": "3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071",
+ "size": 928
+ },
+ {
+ "path": "assets/5832763b-3ed0-44d6-9088-0b524f196a91/generations/e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f/meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "faset_player.exe",
+ "sha256": "cb5f4167643d33adb11770f6746a9c29259abe6ff41fba9acc55aeb062a8c449",
+ "size": 4292096
+ },
+ {
+ "path": "Notices/box2d/LICENSE",
+ "sha256": "68a3e676d7e94093b102d5cba0d4e04af812040d6f230c3db67a6664574e43d2",
+ "size": 1067
+ },
+ {
+ "path": "Notices/box3d/LICENSE",
+ "sha256": "da5e31a26bf3cfd5ba5c96d6823e480128c81e76c107ef9d3ee5d94789184b90",
+ "size": 1067
+ },
+ {
+ "path": "Notices/dependencies.json",
+ "sha256": "a54639ad2d9ad13c2e5f1ec90d6775f5dfc493656789b78c7e44debe2a378fdc",
+ "size": 2206
+ },
+ {
+ "path": "Notices/entt/LICENSE",
+ "sha256": "0785027ce472d7c61f05fba664a1d3ba6639c1593ced351ad9e4bed868765d99",
+ "size": 1097
+ },
+ {
+ "path": "Notices/Faset-NOTICE.txt",
+ "sha256": "30c2e7e80f5153b31ab57675e07246aef9165965d64e36022b426a26449ece3f",
+ "size": 204
+ },
+ {
+ "path": "Notices/json/LICENSE.MIT",
+ "sha256": "46a65cffd1ea955132d95a8dd921640714a8d6b537d2e4e482d31145ae95b603",
+ "size": 1076
+ },
+ {
+ "path": "Notices/sdl3/LICENSE.txt",
+ "sha256": "97f35b302b361680ec1e891e95d2d52097bb95abff361434916d99dc1305f127",
+ "size": 884
+ },
+ {
+ "path": "Notices/stb/LICENSE",
+ "sha256": "bebfe904b14301657e4e5d655c811d51fd31b97c455b9cc2d8600d6bac6cff63",
+ "size": 2510
+ },
+ {
+ "path": "README.txt",
+ "sha256": "c62b83aa59e8eec3b3508f9e9ad5e78eb4554a2369242c830debe8d5ffbab924",
+ "size": 229
+ },
+ {
+ "path": "scene.fscene",
+ "sha256": "21c364140669ec82c6886102667b255df5ccdf0ec77e0ca64060f84dd7b86632",
+ "size": 8639
+ },
+ {
+ "path": "shaders/fragmentMain.reflection.json",
+ "sha256": "ba43159da6ef0e8c305ba9a88414551ec273c487cdc7d324403998ba2d296f10",
+ "size": 2777
+ },
+ {
+ "path": "shaders/fragmentMain.spv",
+ "sha256": "f5c4f289917ecab5d00d543c053aac1d10e6cca311fd172daf06d315160a3505",
+ "size": 7436
+ },
+ {
+ "path": "shaders/shadowMain.reflection.json",
+ "sha256": "3f785e549f40abad75115d5dfc16b409f81bbb0eced6281c6eda33c2eb439249",
+ "size": 2772
+ },
+ {
+ "path": "shaders/shadowMain.spv",
+ "sha256": "7643b4d688492b5ee923b9606f0b0e70343ca05fa67673838206119a6f86d8d8",
+ "size": 784
+ },
+ {
+ "path": "shaders/vertexMain.reflection.json",
+ "sha256": "4459cc3113377b7fbc41b880529cf5ad474ad07d299e033eb9169ac7849894cf",
+ "size": 2768
+ },
+ {
+ "path": "shaders/vertexMain.spv",
+ "sha256": "1ad2631c35d654f48166321ae43d4165043e1b919b14f1dc61caf97b1ada0898",
+ "size": 1224
+ },
+ {
+ "path": "Windows-Runtime.txt",
+ "sha256": "1c53b7b6890d4a10408acfa7a27760ca1b176bb43dba9c25f3e5d2ac2d7d15db",
+ "size": 227
+ }
+ ],
+ "format": "faset.export",
+ "generation": "66191118-07cc-477b-9dc7-1e870be5ebc3",
+ "platform": "windows",
+ "prerequisites": [
+ "Windows x64",
+ "Vulkan 1.3 driver",
+ "Microsoft Visual C++ x64 Redistributable (Visual Studio 2022 or newer)"
+ ],
+ "renderer_profile": {
+ "api": "Vulkan 1.3",
+ "materials": [
+ "base-color factor and texture",
+ "metallic and roughness factors"
+ ],
+ "required_features": [
+ "dynamicRendering",
+ "synchronization2"
+ ],
+ "shadow_map": {
+ "resolution": 1024,
+ "world_extent": 40
+ },
+ "texture_sampling": "linear clamp, one mip level",
+ "unsupported_material_features": [
+ "normal maps",
+ "metallic-roughness maps",
+ "emissive and occlusion maps",
+ "alpha mode selection",
+ "unlit mode",
+ "per-material face culling"
+ ]
+ },
+ "scene_hash": "ee12794145c14ba5b599c5d9ae21648cccdfa91c47ee7742549f60d5fe7bc3e0",
+ "simulation": {
+ "fixed_delta": 0.016666666666666666,
+ "gravity": [
+ 0,
+ -9.81,
+ 0
+ ],
+ "max_catch_up_ticks": 4,
+ "physics_substeps": 4
+ },
+ "units": {
+ "angle": "radian",
+ "coordinates": "right-handed Y-up",
+ "distance": "metre"
+ },
+ "validation_log": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\r\n{\"dimension\":3,\"validated\":true}\r\n",
+ "version": 1
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-run.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-run.json
new file mode 100644
index 0000000..dad7c5c
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-run.json
@@ -0,0 +1,18 @@
+{
+ "arguments": [
+ "C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-3d\\faset_player.exe",
+ "--headless",
+ "--frames",
+ "120",
+ "--capture",
+ "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-3d\\verification.ppm",
+ "--profile",
+ "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-3d\\profile.json"
+ ],
+ "cwd": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\empty-working-directory",
+ "seconds": 2.312999999999988,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "New round: collect the three gold cubes, then reach the green exit. E resets.\n{\"device\":\"SwiftShader Device (LLVM 10.0.0)\",\"dimension\":3,\"frames\":120,\"ticks\":120,\"validation_errors\":0}\n",
+ "stderr": "[Faset] Vulkan validation layer/debug-utils unavailable; validation disabled.\nwarning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n"
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-validate.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-validate.json
new file mode 100644
index 0000000..fbc41b3
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d-validate.json
@@ -0,0 +1,12 @@
+{
+ "arguments": [
+ "C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-3d\\faset_player.exe",
+ "--validate"
+ ],
+ "cwd": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\empty-working-directory",
+ "seconds": 0.01599999999996271,
+ "exit_code": 0,
+ "timed_out": false,
+ "stdout": "{\"dimension\":3,\"validated\":true}\n",
+ "stderr": "warning: material material-bb63b094febbf90bb7049c9bcf7587bc has features beyond the initial base-color/PBR renderer\n"
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d.png b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d.png
new file mode 100644
index 0000000..404942a
Binary files /dev/null and b/docs/validation/windows-software-vulkan-2026-09-18/final-source/collect-3d.png differ
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/evidence.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/evidence.json
new file mode 100644
index 0000000..407e251
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/evidence.json
@@ -0,0 +1,235 @@
+{
+ "format": "faset.validation-evidence",
+ "version": 1,
+ "status": "passed",
+ "scope": "Hosted Windows developer build, first-project UI contracts, software Vulkan and relocated Release games",
+ "source_checkout": {
+ "commit": "4cb82556de31268d2bde73948dd1ff1b6c02f162",
+ "fresh_checkout": true,
+ "clean_commit_match": true,
+ "checkout_step": "actions/checkout on a fresh GitHub-hosted runner; engine and game targets configured and built in this job"
+ },
+ "ci": {
+ "run_url": "https://github.com/emil28092005/Faset_Engine/actions/runs/35301244334",
+ "job_url": "https://github.com/emil28092005/Faset_Engine/actions/runs/35301244334/job/105465851154",
+ "started_utc": "2026-09-18T03:04:44Z",
+ "finished_utc": "2026-09-18T03:19:49Z",
+ "conclusion": "success",
+ "steps": [
+ {
+ "name": "Set up job",
+ "conclusion": "success"
+ },
+ {
+ "name": "Run actions/checkout@11d5960a326750d5838078e36cf38b85af677262",
+ "conclusion": "success"
+ },
+ {
+ "name": "Run actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065",
+ "conclusion": "success"
+ },
+ {
+ "name": "Visual Studio x64 environment",
+ "conclusion": "success"
+ },
+ {
+ "name": "Enable the documented Windows long-path developer profile",
+ "conclusion": "success"
+ },
+ {
+ "name": "Identify pinned Vulkan source cache",
+ "conclusion": "success"
+ },
+ {
+ "name": "Restore pinned Vulkan test tools",
+ "conclusion": "success"
+ },
+ {
+ "name": "Build official Vulkan loader and SwiftShader from pinned sources",
+ "conclusion": "success"
+ },
+ {
+ "name": "Save successfully built Vulkan test tools",
+ "conclusion": "skipped"
+ },
+ {
+ "name": "Probe Vulkan loader and SwiftShader before compiling the engine",
+ "conclusion": "success"
+ },
+ {
+ "name": "Fetch checksum-verified Slang compiler",
+ "conclusion": "success"
+ },
+ {
+ "name": "Configure full editor and Player",
+ "conclusion": "success"
+ },
+ {
+ "name": "Build full editor and tests",
+ "conclusion": "success"
+ },
+ {
+ "name": "CPU contracts and software GPU pixel tests",
+ "conclusion": "success"
+ },
+ {
+ "name": "Real Release exports, 2D and 3D execution, incremental Debug rebuild",
+ "conclusion": "success"
+ },
+ {
+ "name": "Export and relocate both checked-in playable games",
+ "conclusion": "success"
+ },
+ {
+ "name": "Preserve graphics and export evidence",
+ "conclusion": "success"
+ },
+ {
+ "name": "Post Run actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065",
+ "conclusion": "success"
+ },
+ {
+ "name": "Post Run actions/checkout@11d5960a326750d5838078e36cf38b85af677262",
+ "conclusion": "success"
+ },
+ {
+ "name": "Complete job",
+ "conclusion": "success"
+ }
+ ]
+ },
+ "environment": {
+ "runner_label": "windows-2025",
+ "observed_setup": [
+ "Microsoft Windows Server 2025",
+ "Image: windows-2025-vs2026",
+ "Version: 20260907.229.1",
+ "-- The CXX compiler identification is Clang 20.1.8 with MSVC-like command-line"
+ ],
+ "compiler": "Clang 20.1.8 clang-cl, x64 MSVC ABI",
+ "editor_configuration": "Debug, FASET_DEBUG_IMGUI=ON",
+ "export_configuration": "Release, independent Ninja build with custom project C++ sources",
+ "windows_long_paths_enabled": true,
+ "device": "SwiftShader Device (LLVM 10.0.0)",
+ "validation_layer_available": false
+ },
+ "tests": {
+ "total": 35,
+ "passed": 35,
+ "failed": 0,
+ "skipped": 0,
+ "details": "tests.json"
+ },
+ "first_project_evidence": {
+ "test": "editor_ui_launcher",
+ "observed": "Create/Open through the instrumented launcher, Unicode paths, recents, directory browsing, validation and keyboard navigation; actual retained UI and software-rendered frame"
+ },
+ "games": [
+ {
+ "name": "collect-2d",
+ "generation": "260a10cf-3fe6-4689-ac7b-69b577954cc2",
+ "configuration": "Release",
+ "frames": 120,
+ "validation_enabled": false,
+ "validation_errors": 0,
+ "source_paths_hidden": true,
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 7,
+ "sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a"
+ },
+ "export_compiler_evidence": [
+ "-- The C compiler identification is Clang 20.1.8 with MSVC-like command-line",
+ "-- The CXX compiler identification is Clang 20.1.8 with MSVC-like command-line"
+ ]
+ },
+ {
+ "name": "collect-3d",
+ "generation": "66191118-07cc-477b-9dc7-1e870be5ebc3",
+ "configuration": "Release",
+ "frames": 120,
+ "validation_enabled": false,
+ "validation_errors": 0,
+ "source_paths_hidden": true,
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 43,
+ "sha256": "0edc88eef9f641a780ef44664f58c811a22bd201c8d29e1fcb7531b88f251900"
+ },
+ "export_compiler_evidence": [
+ "-- The C compiler identification is Clang 20.1.8 with MSVC-like command-line",
+ "-- The CXX compiler identification is Clang 20.1.8 with MSVC-like command-line"
+ ]
+ }
+ ],
+ "limitations": [
+ "Software Vulkan on a GitHub-hosted Windows Server VM, not a physical desktop GPU qualification or performance benchmark.",
+ "Khronos validation layer is absent. Zero reported validation errors does not establish validation-layer coverage.",
+ "Fresh developer-toolchain setup and first-project tests are covered; no retail installer or manual OS IME composition acceptance is claimed."
+ ],
+ "original_ci_log_sha256": "ada23530651f10bba0e4aec1e0bbe3f4ba243c6dbf9dd5416a744598b4988552",
+ "retained_files": [
+ {
+ "path": "collect-2d-manifest.json",
+ "sha256": "53b70e2ffc6e4c455fa5cad21eee2735f1c3182e83ed3051b6b5457cb11af615",
+ "size": 4315
+ },
+ {
+ "path": "collect-2d-run.json",
+ "sha256": "9dcc203502d2504ffcc9dcfed4ecde118bda954ee8d4604e0b6992839390b731",
+ "size": 1011
+ },
+ {
+ "path": "collect-2d-validate.json",
+ "sha256": "ffd23bb53b1d0f7da885ec40f6ab932f3aee3cc17afc3c620abc16ec4a661d4c",
+ "size": 446
+ },
+ {
+ "path": "collect-2d.png",
+ "sha256": "c380583f2fd8bc09c5b0e1c6e755c35c3d64b5385ed66177b04d1bbdb532b236",
+ "size": 4525
+ },
+ {
+ "path": "collect-3d-manifest.json",
+ "sha256": "4f86450eec32e773fbdbfa93d0da69abab3056cf869b6fa1b4e4647fe27ccc3d",
+ "size": 5923
+ },
+ {
+ "path": "collect-3d-run.json",
+ "sha256": "cd21db5286b96f4d4a9a3e381563797230d0b1d8cdd8fbfb644eb272e9b82af6",
+ "size": 1127
+ },
+ {
+ "path": "collect-3d-validate.json",
+ "sha256": "6dedaca4e4ffa573b7991856e5f3464bf93f6e825192ad4c4d35693d731531ad",
+ "size": 562
+ },
+ {
+ "path": "collect-3d.png",
+ "sha256": "48ef9a82378f74e8ad5a0c438bb730773d684cce809afcef461756a38476375e",
+ "size": 20366
+ },
+ {
+ "path": "playable-report.json",
+ "sha256": "3783533ba50b9b4b2fe29fa3e13cbaf7c43b96d29dce8365fa72ae014bc960f1",
+ "size": 14528
+ },
+ {
+ "path": "probe.json",
+ "sha256": "0c85c12510dbb0d895faefb7d14f26935a5add675cf0477b29f543d72eed40d6",
+ "size": 1019
+ },
+ {
+ "path": "tests.json",
+ "sha256": "1115633850520f66159d204210249bd5eacf57e5b0f9c5f5f70834cd149a0634",
+ "size": 4731
+ },
+ {
+ "path": "toolchain.json",
+ "sha256": "969162d1f994724ff6f98d20353e62e3881477ebce98759ca325c8febb175176",
+ "size": 937
+ }
+ ]
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/playable-report.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/playable-report.json
new file mode 100644
index 0000000..f7498a7
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/playable-report.json
@@ -0,0 +1,435 @@
+{
+ "format": "faset.playable-export-verification",
+ "version": 1,
+ "started_utc": "2026-09-18T03:15:38.883680+00:00",
+ "platform": "win32",
+ "engine": "D:\\a\\Faset_Engine\\Faset_Engine",
+ "editor": "D:\\a\\Faset_Engine\\Faset_Engine\\build\\windows-debug\\faset_editor.exe",
+ "standalone_root": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl",
+ "frames_per_game": 120,
+ "status": "passed",
+ "projects": [
+ {
+ "name": "collect-2d",
+ "dimension": 2,
+ "source_inputs": [
+ {
+ "path": ".gitignore",
+ "sha256": "3bb936ff6f84f3db041c75d6e207138a9107997cc9ad372621f657456c9c0665"
+ },
+ {
+ "path": "project.faset.json",
+ "sha256": "27bd0e432381f8f884e78f6d68e9d0dc13d49222e70f3a5e34fef1d57d379b0b"
+ },
+ {
+ "path": "README.md",
+ "sha256": "7543b24c9ac87d6a7390d61d5289518e5f5725f3c0052675659f6da716883bdd"
+ },
+ {
+ "path": "Scenes/main.scene.json",
+ "sha256": "9e2ad049f60a9ff7f98e31061a8f107648fbf672e5b9292f53e6672e5bae66f1"
+ },
+ {
+ "path": "Scripts/Gameplay.cpp",
+ "sha256": "99fb965e6589b138049a2e6cf95c5c61baea70761ffab33082a8058c91a687ff"
+ },
+ {
+ "path": "Scripts/Gameplay.hpp",
+ "sha256": "9d1fa36da50886fa7d84f8a8b3d1ae42856ae74aae1e52be5015b60977634dc0"
+ }
+ ],
+ "generation": "260a10cf-3fe6-4689-ac7b-69b577954cc2",
+ "configuration": "Release",
+ "standalone_directory": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-2d",
+ "executable": "faset_player.exe",
+ "package_file_count": 18,
+ "asset_generations": {},
+ "device": "SwiftShader Device (LLVM 10.0.0)",
+ "validation_enabled": false,
+ "validation_errors": 0,
+ "completed_frames": 120,
+ "summary_ms": {
+ "gpu": {
+ "max": 129.9081,
+ "min": 1.8272,
+ "p50": 2.0341,
+ "p95": 2.6394,
+ "samples": 120
+ },
+ "render_call": {
+ "max": 131.02,
+ "min": 2.0275,
+ "p50": 2.2678,
+ "p95": 2.8731,
+ "samples": 120
+ },
+ "renderer_cpu": {
+ "max": 130.9907,
+ "min": 2.0248,
+ "p50": 2.2649,
+ "p95": 2.869,
+ "samples": 120
+ },
+ "renderer_readback_cpu": {
+ "max": 0.9709,
+ "min": 0.1456,
+ "p50": 0.155,
+ "p95": 0.1856,
+ "samples": 120
+ },
+ "simulation": {
+ "max": 0.4173,
+ "min": 0.267,
+ "p50": 0.2905,
+ "p95": 0.3238,
+ "samples": 120
+ },
+ "snapshot": {
+ "max": 0.4839,
+ "min": 0.1555,
+ "p50": 0.2226,
+ "p95": 0.2468,
+ "samples": 120
+ },
+ "wall": {
+ "max": 132.1731,
+ "min": 2.5367,
+ "p50": 2.7893,
+ "p95": 3.4346,
+ "samples": 120
+ }
+ },
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 7,
+ "sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a"
+ },
+ "source_project_paths_unavailable": true,
+ "status": "passed"
+ },
+ {
+ "name": "collect-3d",
+ "dimension": 3,
+ "source_inputs": [
+ {
+ "path": ".gitignore",
+ "sha256": "3bb936ff6f84f3db041c75d6e207138a9107997cc9ad372621f657456c9c0665"
+ },
+ {
+ "path": "Assets/exit-arch/create.py",
+ "sha256": "5d9dc30a3f939376d2474cf958065e6daab140c7220444cedecd3bf5edf6e3d1"
+ },
+ {
+ "path": "Assets/exit-arch/manifest.json",
+ "sha256": "d72d44184d665148109de74782bc695d79392e43be12782e48096a7d79e37c4f"
+ },
+ {
+ "path": "Assets/exit-arch/manifest.json.faset-import.json",
+ "sha256": "7639d4fa33f2ac52e10d1cf79280a93aeb680399d217fda167acec1c6edcae00"
+ },
+ {
+ "path": "Assets/exit-arch/payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb",
+ "sha256": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3"
+ },
+ {
+ "path": "Assets/exit-arch/source.blend",
+ "sha256": "ff2676bec97ab778e531e87a185ad716049ea3b05b4a4f0027a6345737735035"
+ },
+ {
+ "path": "project.faset.json",
+ "sha256": "9a0ee78fa0ea56982a99cf707948a33db37266ab84de9d3f12a24aabb98afda5"
+ },
+ {
+ "path": "README.md",
+ "sha256": "a2378adc9dbd5ffb6bfa65abb7770051827d08279e48761046f30d932a5eab8c"
+ },
+ {
+ "path": "Scenes/main.scene.json",
+ "sha256": "b1b668a2d633deda0074b475460c82019dbcf592b76502906192eaf1f2345a7e"
+ },
+ {
+ "path": "Scripts/Extensions/Beacon.hpp",
+ "sha256": "650e75bbc55a3339647bcf67ba10fd9b20cece3531bb688b4221155e97959d5e"
+ },
+ {
+ "path": "Scripts/Gameplay.cpp",
+ "sha256": "c76fbb0bf28a85cc88732a905f2bc9be3e24c58d02cbf2ecccbf77c99093c029"
+ },
+ {
+ "path": "Scripts/Gameplay.hpp",
+ "sha256": "9d1fa36da50886fa7d84f8a8b3d1ae42856ae74aae1e52be5015b60977634dc0"
+ }
+ ],
+ "import": {
+ "asset_id": "5832763b-3ed0-44d6-9088-0b524f196a91",
+ "cache_hit": false,
+ "diagnostics": [],
+ "generation": "e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f",
+ "manifest": {
+ "asset_id": "5832763b-3ed0-44d6-9088-0b524f196a91",
+ "files": [
+ {
+ "path": "meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh",
+ "sha256": "98b38aca7d2786c58a2265ba4d1f2255123f03d31d947e239232cf55bfdc2c97",
+ "size": 928
+ },
+ {
+ "path": "meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh",
+ "sha256": "3875c16ea628d4126373ebfe07816621fbad3961596a2fcd112f1eec0e378071",
+ "size": 928
+ }
+ ],
+ "generation": "e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f",
+ "importer": "faset-gltf-1/cgltf-1.15",
+ "input_key": {
+ "bundle_sha256": "d72d44184d665148109de74782bc695d79392e43be12782e48096a7d79e37c4f",
+ "dependencies": {},
+ "importer": "faset-gltf-1/cgltf-1.15",
+ "settings": {},
+ "source": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3",
+ "target_profile": "desktop-static-pbr-v1",
+ "toolchain": {
+ "cgltf": "360db1a95480fe102ae9c69b27c5d101167ff5ba",
+ "stb": "2c980bb59875b0d32144a71867fbdebb2f77cd20"
+ }
+ },
+ "kind": "scene",
+ "materials": [
+ {
+ "alpha_cutoff": 0.5,
+ "alpha_mode": "OPAQUE",
+ "base_color": [
+ 0.2199999988079071,
+ 0.28999999165534973,
+ 0.3400000035762787,
+ 1.0
+ ],
+ "base_color_texture": -1,
+ "double_sided": true,
+ "emissive": [
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ "emissive_texture": -1,
+ "format": "faset.material",
+ "id": "material-bb63b094febbf90bb7049c9bcf7587bc",
+ "metallic": 0.07999999821186066,
+ "metallic_roughness_texture": -1,
+ "name": "Weathered stone",
+ "normal_texture": -1,
+ "occlusion_texture": -1,
+ "roughness": 0.800000011920929,
+ "unlit": false,
+ "version": 1
+ }
+ ],
+ "meshes": [
+ {
+ "id": "mesh-fc069a07a87e0f831fd92efdbc4efa1f",
+ "name": "Cube.001",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-fc069a07a87e0f831fd92efdbc4efa1f-0.fmesh"
+ }
+ ]
+ },
+ {
+ "id": "mesh-0961e2a3f92977836a3aa80cab09277e",
+ "name": "Cube.002",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-0961e2a3f92977836a3aa80cab09277e-0.fmesh"
+ }
+ ]
+ },
+ {
+ "id": "mesh-93b5b3e52cb6bb120fefb80e2d8e222b",
+ "name": "Cube.003",
+ "primitives": [
+ {
+ "material": 0,
+ "path": "meshes/mesh-93b5b3e52cb6bb120fefb80e2d8e222b-0.fmesh"
+ }
+ ]
+ }
+ ],
+ "nodes": [
+ {
+ "id": "node-cec6e8cea80cf5a98ba3263a0156bee4",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 1.4500000476837158,
+ 1.2999999523162842,
+ 1.0
+ ],
+ "mesh": 0,
+ "name": "Left post",
+ "parent_id": "",
+ "stable_source_id": true
+ },
+ {
+ "id": "node-5f8a90a6c4d27020d20bd4fa81d1d958",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 1.4500000476837158,
+ -1.2999999523162842,
+ 1.0
+ ],
+ "mesh": 1,
+ "name": "Right post",
+ "parent_id": "",
+ "stable_source_id": true
+ },
+ {
+ "id": "node-482463e486a8d1fd741340c653cd128f",
+ "local_transform": [
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 1.0,
+ 0.0,
+ 0.0,
+ 3.0,
+ 0.0,
+ 1.0
+ ],
+ "mesh": 2,
+ "name": "Lintel",
+ "parent_id": "",
+ "stable_source_id": true
+ }
+ ],
+ "outputs": [
+ "node-cec6e8cea80cf5a98ba3263a0156bee4",
+ "node-5f8a90a6c4d27020d20bd4fa81d1d958",
+ "node-482463e486a8d1fd741340c653cd128f",
+ "mesh-fc069a07a87e0f831fd92efdbc4efa1f",
+ "mesh-0961e2a3f92977836a3aa80cab09277e",
+ "mesh-93b5b3e52cb6bb120fefb80e2d8e222b",
+ "material-bb63b094febbf90bb7049c9bcf7587bc"
+ ],
+ "payload_source": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-playable-exports\\Faset Café 世界\\collect-3d\\Assets\\exit-arch\\payload/ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3.glb",
+ "schema_version": 1,
+ "settings": {},
+ "source": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-playable-exports\\Faset Café 世界\\collect-3d\\Assets\\exit-arch\\manifest.json",
+ "source_sha256": "ee6c748a212905fc9c465cbe95c033e94b80be643624f4f240ad5353761205b3",
+ "textures": []
+ },
+ "previous_generation": "",
+ "removed_output_ids": []
+ },
+ "generation": "66191118-07cc-477b-9dc7-1e870be5ebc3",
+ "configuration": "Release",
+ "standalone_directory": "C:\\Users\\RUNNER~1\\AppData\\Local\\Temp\\faset-playable-exports-8qma4esl\\Faset Café 世界\\collect-3d",
+ "executable": "faset_player.exe",
+ "package_file_count": 23,
+ "asset_generations": {
+ "5832763b-3ed0-44d6-9088-0b524f196a91": "e8eb8805673cc22596d1c5b48fc6b8fbdf600d1c6a15c9633d14014a7eb1d11f"
+ },
+ "device": "SwiftShader Device (LLVM 10.0.0)",
+ "validation_enabled": false,
+ "validation_errors": 0,
+ "completed_frames": 120,
+ "summary_ms": {
+ "gpu": {
+ "max": 203.9357,
+ "min": 14.9149,
+ "p50": 15.2496,
+ "p95": 18.9976,
+ "samples": 120
+ },
+ "render_call": {
+ "max": 205.0598,
+ "min": 15.1706,
+ "p50": 15.5334,
+ "p95": 19.2678,
+ "samples": 120
+ },
+ "renderer_cpu": {
+ "max": 205.0432,
+ "min": 15.166,
+ "p50": 15.5286,
+ "p95": 19.2578,
+ "samples": 120
+ },
+ "renderer_readback_cpu": {
+ "max": 0.8953,
+ "min": 0.1466,
+ "p50": 0.1597,
+ "p95": 0.2174,
+ "samples": 120
+ },
+ "simulation": {
+ "max": 0.5335,
+ "min": 0.3274,
+ "p50": 0.4679,
+ "p95": 0.5036,
+ "samples": 120
+ },
+ "snapshot": {
+ "max": 3.3124,
+ "min": 0.1893,
+ "p50": 0.2114,
+ "p95": 0.2532,
+ "samples": 120
+ },
+ "wall": {
+ "max": 209.6105,
+ "min": 15.8408,
+ "p50": 16.2166,
+ "p95": 19.948,
+ "samples": 120
+ }
+ },
+ "capture": {
+ "width": 1280,
+ "height": 720,
+ "sampled_colors": 43,
+ "sha256": "0edc88eef9f641a780ef44664f58c811a22bd201c8d29e1fcb7531b88f251900"
+ },
+ "source_project_paths_unavailable": true,
+ "status": "passed"
+ }
+ ],
+ "finished_utc": "2026-09-18T03:19:42.166192+00:00"
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/probe.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/probe.json
new file mode 100644
index 0000000..f8a4dc0
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/probe.json
@@ -0,0 +1,32 @@
+{
+ "format": "faset.windows-vulkan-probe",
+ "version": 1,
+ "status": "passed",
+ "loader": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\sdk\\bin\\vulkan-1.dll",
+ "driver_manifest": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\driver\\vk_swiftshader_icd.json",
+ "driver_library": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\driver\\vk_swiftshader.dll",
+ "manifest": {
+ "file_format_version": "1.0.0",
+ "ICD": {
+ "library_path": ".\\vk_swiftshader.dll",
+ "api_version": "1.0.5"
+ }
+ },
+ "loader_debug": "all",
+ "pointer_bits": 64,
+ "icd_negotiate_result": 0,
+ "icd_interface_version": 7,
+ "enumerate_version_result": 0,
+ "loader_api_version": "1.4.341",
+ "create_instance_result": 0,
+ "devices": [
+ {
+ "name": "SwiftShader Device (LLVM 10.0.0)",
+ "api_version": "1.3.0",
+ "driver_version": 20971520,
+ "vendor_id": 6880,
+ "device_id": 49374,
+ "device_type": 4
+ }
+ ]
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/tests.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/tests.json
new file mode 100644
index 0000000..13067d9
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/tests.json
@@ -0,0 +1,206 @@
+{
+ "format": "faset.ctest-summary",
+ "version": 1,
+ "source_commit": "4cb82556de31268d2bde73948dd1ff1b6c02f162",
+ "passed": 35,
+ "failed": 0,
+ "skipped": 0,
+ "source_log_sha256": "1d2038ce1751098d5fe99cf3a8da9e743ce4bf1c0fa014613abbbd5dd6cedbe7",
+ "tests": [
+ {
+ "name": "authoring",
+ "status": "passed",
+ "seconds": 0.89
+ },
+ {
+ "name": "runtime_contracts",
+ "status": "passed",
+ "seconds": 0.21
+ },
+ {
+ "name": "assets_pipeline",
+ "status": "passed",
+ "seconds": 1.03,
+ "observations": [
+ "assets: geometry/PBR/texture, GLB/glTF, cache, rename, deletion, overrides, failure, cancellation, standalone PNG/JPEG OK"
+ ]
+ },
+ {
+ "name": "assets_blender_bundle",
+ "status": "passed",
+ "seconds": 0.28
+ },
+ {
+ "name": "render_graph",
+ "status": "passed",
+ "seconds": 0.14
+ },
+ {
+ "name": "render_offscreen",
+ "status": "passed",
+ "seconds": 0.64
+ },
+ {
+ "name": "render_sprite_alpha",
+ "status": "passed",
+ "seconds": 0.26
+ },
+ {
+ "name": "render_shader_reload",
+ "status": "passed",
+ "seconds": 2.56
+ },
+ {
+ "name": "render_window_lifecycle",
+ "status": "passed",
+ "seconds": 1.03,
+ "observations": [
+ "driver=windows stage=created",
+ "stage=resized width=360 height=300 resize_events=2",
+ "clipboard=unicode_roundtrip_passed",
+ "text_input_area=coordinate_conversion_passed",
+ "stage=minimized fresh_frames=12 minimize_events=1 focus_lost_events=1",
+ "stage=restored restored_events=1 activation_required=0 frames=54 validation_enabled=0 validation_errors=0"
+ ]
+ },
+ {
+ "name": "player_scene_contracts",
+ "status": "passed",
+ "seconds": 0.14
+ },
+ {
+ "name": "player_shutdown_diagnostics",
+ "status": "passed",
+ "seconds": 0.19
+ },
+ {
+ "name": "editor_mcp",
+ "status": "passed",
+ "seconds": 0.05
+ },
+ {
+ "name": "process_and_cook",
+ "status": "passed",
+ "seconds": 0.62
+ },
+ {
+ "name": "build_schema_publication",
+ "status": "passed",
+ "seconds": 6.47
+ },
+ {
+ "name": "editor_plugins",
+ "status": "passed",
+ "seconds": 0.17
+ },
+ {
+ "name": "editor_session_settings",
+ "status": "passed",
+ "seconds": 0.18
+ },
+ {
+ "name": "ui_widgets",
+ "status": "passed",
+ "seconds": 0.15
+ },
+ {
+ "name": "ui_render",
+ "status": "passed",
+ "seconds": 0.49
+ },
+ {
+ "name": "editor_ui_import_conflicts",
+ "status": "passed",
+ "seconds": 0.94
+ },
+ {
+ "name": "editor_ui_project_settings",
+ "status": "passed",
+ "seconds": 1.16
+ },
+ {
+ "name": "editor_ui_reload",
+ "status": "passed",
+ "seconds": 4.25
+ },
+ {
+ "name": "editor_ui_launcher",
+ "status": "passed",
+ "seconds": 0.67,
+ "observations": [
+ "Launcher Unicode/create/open/validation/recents/directory browser/keyboard passed. C:\\Users\\runneradmin\\AppData\\Local\\Temp\\faset-проекты-427259f4-0109-4b0c-b901-4af129291d3a"
+ ]
+ },
+ {
+ "name": "editor_ui_templates",
+ "status": "passed",
+ "seconds": 2.88
+ },
+ {
+ "name": "editor_ui_gizmos",
+ "status": "passed",
+ "seconds": 1.15
+ },
+ {
+ "name": "editor_ui_authoring",
+ "status": "passed",
+ "seconds": 1.94
+ },
+ {
+ "name": "editor_mcp_stdio",
+ "status": "passed",
+ "seconds": 0.57
+ },
+ {
+ "name": "editor_gui_mcp",
+ "status": "passed",
+ "seconds": 4.77,
+ "observations": [
+ "Native GUI + MCP shared authoring, revision conflict, Undo, 12 fresh PNG captures and continued responsiveness passed"
+ ]
+ },
+ {
+ "name": "core",
+ "status": "passed",
+ "seconds": 0.16
+ },
+ {
+ "name": "tutorial_moving",
+ "status": "passed",
+ "seconds": 0.03
+ },
+ {
+ "name": "tutorial_following",
+ "status": "passed",
+ "seconds": 0.02
+ },
+ {
+ "name": "tutorial_spawning",
+ "status": "passed",
+ "seconds": 0.04
+ },
+ {
+ "name": "tutorial_physics",
+ "status": "passed",
+ "seconds": 0.11
+ },
+ {
+ "name": "playable_2d",
+ "status": "passed",
+ "seconds": 0.62
+ },
+ {
+ "name": "playable_3d",
+ "status": "passed",
+ "seconds": 1.33
+ },
+ {
+ "name": "editor_debug_overlay",
+ "status": "passed",
+ "seconds": 0.22,
+ "observations": [
+ "ImGui diagnostics, F12, font atlas, clipping and event isolation passed"
+ ]
+ }
+ ]
+}
diff --git a/docs/validation/windows-software-vulkan-2026-09-18/final-source/toolchain.json b/docs/validation/windows-software-vulkan-2026-09-18/final-source/toolchain.json
new file mode 100644
index 0000000..04b5e46
--- /dev/null
+++ b/docs/validation/windows-software-vulkan-2026-09-18/final-source/toolchain.json
@@ -0,0 +1,23 @@
+{
+ "sources": {
+ "headers": {
+ "repository": "KhronosGroup/Vulkan-Headers",
+ "commit": "0d3f509e57041fbd073a1ee84cd9ccd36d148446",
+ "sha256": "e82005a6bd3289ce213232ef41e0f8722d1365ed72bf5cc4be56911c56bc30e0"
+ },
+ "loader": {
+ "repository": "KhronosGroup/Vulkan-Loader",
+ "commit": "32fcb949e253cbeb40cda7ea76122b492db579ae",
+ "sha256": "610fa9017226c49bc4f19398d94fce9e3c9ff94c14f6420f9fe24822707feacf"
+ },
+ "swiftshader": {
+ "repository": "google/swiftshader",
+ "commit": "1e80438d2b93ef36a7c05f8d2b81233bac0e3d16",
+ "sha256": "1c3a1afc397c7aa4d3275790bc9b451e80b144a1db665135d5519838bacf44a8"
+ }
+ },
+ "validation_layer": false,
+ "vulkan_sdk": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\sdk",
+ "driver": "D:\\a\\Faset_Engine\\Faset_Engine\\.cache\\windows-graphics\\driver\\vk_swiftshader_icd.json",
+ "loader_only": false
+}
diff --git a/examples/projects/collect-2d/README.md b/examples/projects/collect-2d/README.md
index 943d7f9..13725df 100644
--- a/examples/projects/collect-2d/README.md
+++ b/examples/projects/collect-2d/README.md
@@ -41,7 +41,7 @@ The Player window title and console identify the controls and objective; the gam
`project.faset.json` chooses `Scenes/main.scene.json`. The scene stores object/component IDs, transforms, physics settings, and entity references in the collector component. `Scripts/Gameplay.cpp` owns the round's transient C++ state and registers its editable schema. `speed` and `jump_speed` use metres per second.
-Change JSON and restart Play to see new level data. Change C++ or its schema, then stop, build, and restart; C++ hot reload is not implemented. Runtime pickup progress does not rewrite the authoring scene or create Undo entries.
+Edit the scene through the Inspector and restart Play to see new level data. Change C++ or its schema, then stop, build, and restart; C++ hot reload is not implemented. Runtime pickup progress does not rewrite the authoring scene or create Undo entries.
## Verify