Checkpoint 4: harden native paths, authoring workflows and Player lifecycle
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
# Validation evidence
|
||||
|
||||
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.
|
||||
|
||||
- [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.
|
||||
- [Editor recovery](editor-recovery-linux-2026-09-18.json): killed Editor, explicit journal recovery, failed save/import/build and failed Player startup with last-good preservation.
|
||||
- [Native window boundaries](native-window-linux-2026-09-18.json): XWayland lifecycle, isolated Unicode clipboard, SDL text-input rectangles and the explicit native Wayland restore limitation.
|
||||
- [Linux native window and input boundaries](native-window-linux-2026-09-18.json): XWayland resize/minimize/restore and SDL text-input-area checks; isolated Xvfb Unicode clipboard roundtrip with restoration. Native Wayland restore remains unconfirmed; real OS IME composition was not tested.
|
||||
|
||||
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.
|
||||
@@ -0,0 +1,23 @@
|
||||
{
|
||||
"blender": "Blender 4.5.3 LTS",
|
||||
"asset_id": "54c039e4-c19f-4365-a9f8-a38416ec6e3f",
|
||||
"initial_generation": "499f254ce440ecb86118f2f6803f21013e763d35cfdba1c4356be7a457eec718",
|
||||
"renamed_generation": "963e996b59ba11c2f9dd9eba51b89e7ae3f3dce6f177e4adaf5682479cb204a8",
|
||||
"stable_output_ids": true,
|
||||
"removed_output_conflict": true,
|
||||
"failed_import_keeps_generation": true,
|
||||
"authoring_preserved": true,
|
||||
"live_editor": {
|
||||
"conflict_keeps_visible_generation": true,
|
||||
"instances": 2,
|
||||
"live_geometry_updated": true,
|
||||
"opaque_gameplay_preserved": true,
|
||||
"physics_fields_preserved": true,
|
||||
"placement_and_tint_preserved": true,
|
||||
"status": "passed",
|
||||
"validation_enabled": true,
|
||||
"validation_errors": 0
|
||||
},
|
||||
"source_context": "Shared Linux checkpoint 4 working tree around 5ac4db4; not a clean-commit result",
|
||||
"reproduce": "python3 tools/verify_blender_roundtrip.py --blender PATH --editor build/linux-debug/faset_editor --ui-probe build/linux-debug/faset_blender_editor_probe --output NEW_DIRECTORY"
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"format": "faset.editor-recovery-verification",
|
||||
"version": 1,
|
||||
"status": "passed",
|
||||
"checks": [
|
||||
"acknowledged unsaved edit survives killed Editor and explicit recovery",
|
||||
"failed save preserves live authoring and last saved file",
|
||||
"failed Player process is reported without changing authoring data",
|
||||
"Undo repairs the scene, then Play and Stop leave authoring unchanged",
|
||||
"failed C++ build keeps prior schema and reports stale status",
|
||||
"fixed C++ rebuild restores current schema status",
|
||||
"failed import preserves authoring"
|
||||
],
|
||||
"logs": [
|
||||
"build completed",
|
||||
"Gameplay schema loaded",
|
||||
"Play started in a separate Player process",
|
||||
"Player failed: unsupported component version\n",
|
||||
"Player exited with code 1",
|
||||
"build completed",
|
||||
"Gameplay schema loaded",
|
||||
"Play started in a separate Player process",
|
||||
"New round: collect the three gold cubes, then reach the green exit. E resets.\n{\"device\":\"NVIDIA GeForce RTX 2080 Ti\",\"dimension\":2,\"frames\":382,\"ticks\":103,\"validation_errors\":0}\n",
|
||||
"Play stopped; authoring scene unchanged",
|
||||
"build failed: Process exited with code 1; see job log; previous gameplay metadata remains available and is marked stale",
|
||||
"build completed",
|
||||
"Gameplay schema loaded",
|
||||
"Asset import failed: Cannot read: /home/emil/Desktop/Faset_Engine/.cache/recovery-checkpoint3-v3/project/Assets/missing.glb\n"
|
||||
],
|
||||
"engine_revision": "d834cfad67cd81d8c4998b90c16791361ca8c0f8",
|
||||
"execution_context": "Linux development desktop; Editor and source from the clean offline checkout; disposable sample project",
|
||||
"scope": "Crash recovery and last-good preservation. Graceful OnDestroy is verified separately by the later Player shutdown regression."
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
# Linux Release export baseline — 2026-09-18
|
||||
|
||||
Both checked-in playable projects passed real Editor export, standalone CPU validation and 120 offscreen frames after relocation. Their disposable source-project paths were hidden during launch; no `--scene` or `--assets` override was supplied. Copied project and executable paths contain `Faset Café 世界`. The 3D export includes the Blender exit-arch asset.
|
||||
|
||||
This is a measurement of the shared working tree around `5ac4db438dae5ee28e5619e62cf8d6647beecd52` plus in-progress checkpoint 4 changes. It is **not an exact clean-commit result**. The two Release generations are `48ec8546-3750-463f-9c4c-f76c3b933256` (2D) and `17281e17-9f4f-44f0-8821-6e0071e9a45b` (3D). [Evidence](evidence.json) retains project input hashes and build fingerprints; [2D](collect-2d-manifest.json) and [3D](collect-3d-manifest.json) manifests retain the exact executable, cooked data and shader hashes.
|
||||
|
||||
The same relocated executables then recorded 240 frames each, sequentially, without physics debug drawing or player input. Hardware: Ryzen 7 1700, 32 GiB RAM, RTX 2080 Ti 11 GiB, NVIDIA 595.84; Ubuntu 26.04, kernel 7.0.0-31. Build: Clang 21.1.8, Release `-O3 -DNDEBUG`, Vulkan 1.3, 1280×720, actual Khronos validation enabled. Both runs had zero validation errors. The desktop remained active; this was not an isolated benchmark machine.
|
||||
|
||||
Raw [2D](collect-2d-profile-240.json) and [3D](collect-3d-profile-240.json) profiles include every completed frame, including the first, with nearest-rank percentiles. Times below are p50 / p95 milliseconds:
|
||||
|
||||
- 2D: total measured frame 2.234 / 2.684; renderer call 1.865 / 2.221; GPU 0.565 / 0.579; readback 0.510 / 0.633; simulation 0.201 / 0.258; snapshot 0.170 / 0.215.
|
||||
- 3D: total measured frame 2.299 / 2.732; renderer call 1.884 / 2.180; GPU 0.588 / 0.600; readback 0.469 / 0.608; simulation 0.213 / 0.300; snapshot 0.181 / 0.257.
|
||||
|
||||
Live Vulkan allocations stayed at 15,750,288 bytes (2D) and 15,787,008 bytes (3D), about 15.02 and 15.06 MiB. Counts were 11 / 31 draws, 66 / 576 packed vertices per frame, and one fallback texture. A packed mesh can be drawn again for its shadow pass. These memory totals include aligned explicit allocations and exclude driver internals. First-frame startup from `main()` was 265.5 / 260.8 ms; OS loader time is excluded.
|
||||
|
||||
`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:
|
||||
|
||||
- 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.
|
||||
|
||||
Reproduce export validation from the repository with `python tools/verify_playable_exports.py --editor build/linux-debug/faset_editor --output <new-empty-directory>`. Run each retained standalone Player with `--headless --frames 240 --profile <output.json>` 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.
|
||||
|
||||
Captured 120-frame outputs:
|
||||
|
||||

|
||||
|
||||

|
||||
@@ -0,0 +1,143 @@
|
||||
{
|
||||
"asset_generations": {},
|
||||
"build_fingerprint": "5b1996b0fe44eeaa01ee1fd581f9f063f8c84147128e896541d27207dbab9aaa",
|
||||
"configuration": "Release",
|
||||
"executable": "faset_player",
|
||||
"files": [
|
||||
{
|
||||
"path": "scene.fscene",
|
||||
"sha256": "811242b85ede88c6d7920eeda5b7f6ae189db4d9e17d568cdfd230f27ce629b6",
|
||||
"size": 6496
|
||||
},
|
||||
{
|
||||
"path": "faset_player",
|
||||
"sha256": "ef12daa3a1e71ef9e9d933cfa0347249de86b5e8da3536e709a3899a731e4333",
|
||||
"size": 5809704
|
||||
},
|
||||
{
|
||||
"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": "48ec8546-3750-463f-9c4c-f76c3b933256",
|
||||
"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": "05ab2c3e5b152ab25867976c47635961f440f41d8cd0408732eb2d8d5b7800a8",
|
||||
"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
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 4.4 KiB |
@@ -0,0 +1,170 @@
|
||||
{
|
||||
"asset_generations": {
|
||||
"5832763b-3ed0-44d6-9088-0b524f196a91": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2"
|
||||
},
|
||||
"build_fingerprint": "5a516f5c4bded8f8e3f027b3dd2812a34b7f40b37e281c21ce87d7586fff88e4",
|
||||
"configuration": "Release",
|
||||
"executable": "faset_player",
|
||||
"files": [
|
||||
{
|
||||
"path": "scene.fscene",
|
||||
"sha256": "a7ac2dcd93dc9dce2d8ce860aa5dd838af2604dd7b40d5b50581d1a72bd5bf23",
|
||||
"size": 9218
|
||||
},
|
||||
{
|
||||
"path": "faset_player",
|
||||
"sha256": "a68c39af919d5c04db4985f36e3da4573f9a4c13862bc599cd85724ac6da22dc",
|
||||
"size": 5814720
|
||||
},
|
||||
{
|
||||
"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": "17281e17-9f4f-44f0-8821-6e0071e9a45b",
|
||||
"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": "6510f994ee01af5823614911fcdeff0fd433846d937ff1a65d5bf5fb08e45e8f",
|
||||
"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
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,312 @@
|
||||
{
|
||||
"format": "faset.validation-evidence",
|
||||
"version": 1,
|
||||
"status": "passed",
|
||||
"scope": "Linux relocated Release game export and offscreen small-scene measurement",
|
||||
"source_checkout": {
|
||||
"reference_commit": "5ac4db438dae5ee28e5619e62cf8d6647beecd52",
|
||||
"clean_commit_match": false,
|
||||
"description": "Shared working tree around 5ac4db4 plus in-progress checkpoint 4 work; builds were not made from a frozen clean commit. Exact exported binary/shader hashes are retained in each manifest."
|
||||
},
|
||||
"export_started_utc": "2026-09-18T01:46:06.267995+00:00",
|
||||
"export_finished_utc": "2026-09-18T01:49:50.149934+00:00",
|
||||
"host": {
|
||||
"os": "Ubuntu 26.04 LTS",
|
||||
"kernel": "7.0.0-31-generic x86_64",
|
||||
"cpu": "AMD Ryzen 7 1700 Eight-Core Processor (8 cores,16 threads)",
|
||||
"system_memory_bytes": 33571037184,
|
||||
"gpu": "NVIDIA GeForce RTX 2080 Ti",
|
||||
"gpu_memory_mib": 11264,
|
||||
"nvidia_driver": "595.84"
|
||||
},
|
||||
"configuration": {
|
||||
"build": "Release",
|
||||
"compiler": "Clang 21.1.8",
|
||||
"cxx_flags": "-O3 -DNDEBUG",
|
||||
"cmake": "4.2.3",
|
||||
"api": "Vulkan 1.3",
|
||||
"resolution": [
|
||||
1280,
|
||||
720
|
||||
],
|
||||
"presentation": "offscreen",
|
||||
"validation_enabled": true,
|
||||
"physics_debug": false,
|
||||
"frames_per_final_profile": 240,
|
||||
"fixed_delta_seconds": 0.016666666666666666,
|
||||
"simulation": "synthetic fixed timestep, no player input",
|
||||
"sampling": "nearest rank, all completed frames, cold first frame retained"
|
||||
},
|
||||
"verification": {
|
||||
"tool": "tools/verify_playable_exports.py",
|
||||
"project_copies_and_relocated_binaries_include": "Faset Café 世界",
|
||||
"steps": [
|
||||
"Copy exact checked-in sample project inputs",
|
||||
"Real Editor import of 3D Blender arch bundle",
|
||||
"Real Editor Release export",
|
||||
"Verify every package file size and SHA256",
|
||||
"Copy generation outside engine/source trees",
|
||||
"Hide disposable source-project paths",
|
||||
"Launch Player from unrelated empty cwd without scene/assets arguments",
|
||||
"CPU --validate then 120-frame offscreen capture and profile",
|
||||
"Additional 240-frame no-debug profile of each same relocated executable"
|
||||
],
|
||||
"validation_errors": 0
|
||||
},
|
||||
"projects": [
|
||||
{
|
||||
"name": "collect-2d",
|
||||
"dimension": 2,
|
||||
"generation": "48ec8546-3750-463f-9c4c-f76c3b933256",
|
||||
"build_fingerprint": "5b1996b0fe44eeaa01ee1fd581f9f063f8c84147128e896541d27207dbab9aaa",
|
||||
"scene_hash": "05ab2c3e5b152ab25867976c47635961f440f41d8cd0408732eb2d8d5b7800a8",
|
||||
"asset_generations": {},
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"package_file_count": 17,
|
||||
"source_project_paths_unavailable": true,
|
||||
"standalone_validation": "passed",
|
||||
"standalone_render_frames": 120,
|
||||
"capture": {
|
||||
"width": 1280,
|
||||
"height": 720,
|
||||
"sampled_colors": 7,
|
||||
"sha256": "f9d74067d87c1ebf30c6db372a26d93b7285791c8cb0307a24af5adb23bf201a"
|
||||
},
|
||||
"final_profile": "collect-2d-profile-240.json",
|
||||
"profile_recorded_at_utc": "2026-09-18T01:51:24.599491+00:00",
|
||||
"gpu_allocated_bytes": {
|
||||
"min": 15750288,
|
||||
"max": 15750288
|
||||
},
|
||||
"draw_calls": [
|
||||
11
|
||||
],
|
||||
"vertices": [
|
||||
66
|
||||
],
|
||||
"texture_count": [
|
||||
1
|
||||
],
|
||||
"summary_ms": {
|
||||
"gpu": {
|
||||
"max": 0.58912,
|
||||
"min": 0.563616,
|
||||
"p50": 0.564832,
|
||||
"p95": 0.57856,
|
||||
"samples": 240
|
||||
},
|
||||
"render_call": {
|
||||
"max": 5.705444,
|
||||
"min": 1.581003,
|
||||
"p50": 1.865269,
|
||||
"p95": 2.22086,
|
||||
"samples": 240
|
||||
},
|
||||
"renderer_cpu": {
|
||||
"max": 5.701056,
|
||||
"min": 1.578639,
|
||||
"p50": 1.861723,
|
||||
"p95": 2.216031,
|
||||
"samples": 240
|
||||
},
|
||||
"renderer_readback_cpu": {
|
||||
"max": 2.763424,
|
||||
"min": 0.432917,
|
||||
"p50": 0.509912,
|
||||
"p95": 0.632894,
|
||||
"samples": 240
|
||||
},
|
||||
"simulation": {
|
||||
"max": 0.513789,
|
||||
"min": 0.144743,
|
||||
"p50": 0.200708,
|
||||
"p95": 0.258247,
|
||||
"samples": 240
|
||||
},
|
||||
"snapshot": {
|
||||
"max": 0.25444,
|
||||
"min": 0.127029,
|
||||
"p50": 0.170341,
|
||||
"p95": 0.214946,
|
||||
"samples": 240
|
||||
},
|
||||
"wall": {
|
||||
"max": 6.089358,
|
||||
"min": 1.879436,
|
||||
"p50": 2.233955,
|
||||
"p95": 2.684014,
|
||||
"samples": 240
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "collect-3d",
|
||||
"dimension": 3,
|
||||
"generation": "17281e17-9f4f-44f0-8821-6e0071e9a45b",
|
||||
"build_fingerprint": "5a516f5c4bded8f8e3f027b3dd2812a34b7f40b37e281c21ce87d7586fff88e4",
|
||||
"scene_hash": "6510f994ee01af5823614911fcdeff0fd433846d937ff1a65d5bf5fb08e45e8f",
|
||||
"asset_generations": {
|
||||
"5832763b-3ed0-44d6-9088-0b524f196a91": "4a5bfcc1437a7b4d65c388da2beace0308cceda8e16503d08ce676260f21d5c2"
|
||||
},
|
||||
"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"
|
||||
}
|
||||
],
|
||||
"package_file_count": 22,
|
||||
"source_project_paths_unavailable": true,
|
||||
"standalone_validation": "passed",
|
||||
"standalone_render_frames": 120,
|
||||
"capture": {
|
||||
"width": 1280,
|
||||
"height": 720,
|
||||
"sampled_colors": 42,
|
||||
"sha256": "914060401de93d08b33bf09a1e210859e491a0060c331e5e2044f517356f4980"
|
||||
},
|
||||
"final_profile": "collect-3d-profile-240.json",
|
||||
"profile_recorded_at_utc": "2026-09-18T01:51:25.501500+00:00",
|
||||
"gpu_allocated_bytes": {
|
||||
"min": 15787008,
|
||||
"max": 15787008
|
||||
},
|
||||
"draw_calls": [
|
||||
31
|
||||
],
|
||||
"vertices": [
|
||||
576
|
||||
],
|
||||
"texture_count": [
|
||||
1
|
||||
],
|
||||
"summary_ms": {
|
||||
"gpu": {
|
||||
"max": 0.624064,
|
||||
"min": 0.58432,
|
||||
"p50": 0.58752,
|
||||
"p95": 0.600448,
|
||||
"samples": 240
|
||||
},
|
||||
"render_call": {
|
||||
"max": 4.807059,
|
||||
"min": 1.644403,
|
||||
"p50": 1.884165,
|
||||
"p95": 2.179593,
|
||||
"samples": 240
|
||||
},
|
||||
"renderer_cpu": {
|
||||
"max": 4.803463,
|
||||
"min": 1.626759,
|
||||
"p50": 1.880197,
|
||||
"p95": 2.174082,
|
||||
"samples": 240
|
||||
},
|
||||
"renderer_readback_cpu": {
|
||||
"max": 2.729419,
|
||||
"min": 0.398812,
|
||||
"p50": 0.468945,
|
||||
"p95": 0.608337,
|
||||
"samples": 240
|
||||
},
|
||||
"simulation": {
|
||||
"max": 0.441703,
|
||||
"min": 0.185701,
|
||||
"p50": 0.213223,
|
||||
"p95": 0.300146,
|
||||
"samples": 240
|
||||
},
|
||||
"snapshot": {
|
||||
"max": 0.740007,
|
||||
"min": 0.162066,
|
||||
"p50": 0.181302,
|
||||
"p95": 0.257285,
|
||||
"samples": 240
|
||||
},
|
||||
"wall": {
|
||||
"max": 5.902556,
|
||||
"min": 2.040269,
|
||||
"p50": 2.298847,
|
||||
"p95": 2.732225,
|
||||
"samples": 240
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"evidence_sha256": {
|
||||
"collect-2d-profile-240.json": "0141cb2ad6d31394b542d575dce3409fef82ff2e77fe91eb4a7183811471e36f",
|
||||
"collect-3d-profile-240.json": "bedf3a68df03c1af42bdb4d3b416d930c6e92fa6e99033c63ea9b17ae977c8c6",
|
||||
"collect-2d-manifest.json": "83a0c8a58dae07376c0db58ca58b115d9ecedb245bcba88bdcd5429796ba5be9",
|
||||
"collect-3d-manifest.json": "6374a6af5618a6c613b09978b2bf42300b1565808ded21bf9c2b82444027f252",
|
||||
"collect-2d.png": "c380583f2fd8bc09c5b0e1c6e755c35c3d64b5385ed66177b04d1bbdb532b236",
|
||||
"collect-3d.png": "98941a2004c3345da336294fa0e1b9e363922fc581c7a8612652ecbb0d764c07"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
"format": "faset.native-window-validation",
|
||||
"version": 1,
|
||||
"date": "2026-09-18",
|
||||
"platform": "Linux, KDE Wayland session and isolated Xvfb",
|
||||
"source_checkout": "Working tree around5ac4db4 plus checkpoint4 changes; not an exact clean-commit result",
|
||||
"fixture": "tests/render_window_tests.cpp",
|
||||
"cases": [
|
||||
{
|
||||
"surface": "XWayland in the active desktop",
|
||||
"result": "passed",
|
||||
"scope": [
|
||||
"resize convergence",
|
||||
"fresh readback while minimized",
|
||||
"native minimize/restore events",
|
||||
"live SDL display-scale getter",
|
||||
"native SDL text input start/stop",
|
||||
"drawable-pixel input-area conversion checked through SDL_GetTextInputArea"
|
||||
],
|
||||
"clipboard": "Skipped because the existing clipboard advertised non-text payload; no replacement attempted.",
|
||||
"log": "driver=x11 stage=created\nstage=resized width=360 height=300 resize_events=2\nclipboard=skipped_to_preserve_non_text_payload\ntext_input_area=coordinate_conversion_passed\nstage=minimized fresh_frames=12 minimize_events=1 focus_lost_events=1\nstage=restored restored_events=1 activation_required=0 frames=56 validation_enabled=1 validation_errors=0\n"
|
||||
},
|
||||
{
|
||||
"surface": "Private Xvfb server, SDL X11 driver",
|
||||
"result": "clipboard and input-area checks passed; lifecycle skipped",
|
||||
"scope": [
|
||||
"Unicode clipboard roundtrip through Renderer/SDL",
|
||||
"saved plain-text clipboard restored without logging contents",
|
||||
"native SDL text-input activation and rectangle conversion"
|
||||
],
|
||||
"limit": "No window manager; minimize request unconfirmed, so this is not minimize/restore acceptance.",
|
||||
"log": "driver=x11 stage=created\nstage=resized width=360 height=300 resize_events=2\nclipboard=unicode_roundtrip_passed\ntext_input_area=coordinate_conversion_passed\nSKIP: window system declined the minimize request\n"
|
||||
},
|
||||
{
|
||||
"surface": "Native Wayland in the active desktop",
|
||||
"result": "partial; restore acceptance unresolved",
|
||||
"scope": [
|
||||
"resize convergence",
|
||||
"12 fresh readbacks while SDL reported minimized"
|
||||
],
|
||||
"limit": "Compositor did not confirm restore/activation. SDL Wayland may synthesize its minimized flag because xdg-shell has no minimized-state acknowledgement; physical minimization is not independently established."
|
||||
}
|
||||
],
|
||||
"limits": [
|
||||
"No real OS IME composition session was performed.",
|
||||
"Synthetic text events in other tests do not substitute for real IME acceptance.",
|
||||
"Windows native clipboard/window behavior requires its own run.",
|
||||
"No clipboard contents were retained in logs or artifacts."
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
"format": "faset.offline-build",
|
||||
"version": 1,
|
||||
"revision": "d834cfad67cd81d8c4998b90c16791361ca8c0f8",
|
||||
"recorded_at_utc": "2026-09-18T01:33:07.301477+00:00",
|
||||
"seconds": 174.03467636999994,
|
||||
"returncode": 0,
|
||||
"network": "fresh user/network namespace; external connection must fail",
|
||||
"source": "git archive of committed HEAD; no existing build directory",
|
||||
"inputs": "prefetched archives + Slang; system compiler, SDK and development libraries",
|
||||
"tests": "full native build, CPU CTests; GPU/window execution verified separately"
|
||||
}
|
||||
Reference in New Issue
Block a user