wip(assembler): M1 round 5 -- native SurfaceWorld manifest delivered into the Unreal Core route

Manifest imported into UVoxelSettings (hash 8933693d9560ba9f), folded into the season
content hash only when Core is on. BuildHost: W1/W8/W16 stable, 2553 surface tiles match
standalone, 432 LOD transitions, collision on all 36 expected tiles. Matched timing
96.8 s native vs 197.3 s bridge (2.04x). Collision support tiles wait for Core region admission.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-09 15:31:48 +02:00
1 parent 2d0cec90e4
commit f67b519e75
11 files changed
+1002 -45

No files matched your search

+119 -7
View File
@@ -508,12 +508,10 @@ profiles are in `round4/final/logs/mesh-hash-final-w{1,8,16}.stdout.txt` and
- **Round 4:** Complete. The route and cap are in the research manifest; field sweep, negative
controls, bounds, determinism, headless query and matched captures are recorded above. Physics
collision cooking and Unreal light-leak behavior remain owner-build checks.
- **Round 5 — before Unreal delivery:** Integrate the reviewed manifest into the season asset/content
hash path and connect Core behind `bUseVoxelForgeCore`; prove that flag-off behavior remains
unchanged. The owner builds and reviews the in-game two-biome surface, enclosed cap lighting and
capsule-walkable route. Run the matched 23.085 s workload, report full-view and local query/
collision readiness separately, and assess the approximately 1.57 s aim. No BuildHost or owner
project build was done here.
- **Round 5:** Complete for plugin-side delivery. The manifest/content-hash path, native Core
surface, BuildHost tile/collision coverage, source-level switch-off check, matched timing and
handoff are recorded below. The owner's project build, in-game walk, and cap-lighting review are
the remaining owner checks.
### Run log
@@ -538,4 +536,118 @@ profiles are in `round4/final/logs/mesh-hash-final-w{1,8,16}.stdout.txt` and
`Saved/BuildHost/HostProject/Saved/Crashes/` folder contains one older `UECC-Windows-*` directory
from 2026-09-17; there was no new crash folder from this round.
No Unreal route or asset was changed in this round, so there is no owner rebuild handoff yet.
No Unreal route or asset was changed in round 4, so there was no owner rebuild handoff then. Round 5
supersedes that status.
## Round 5 — native SurfaceWorld in Unreal
The reviewed round-4 manifest now enters the opt-in Unreal Core route through `UVoxelSettings`.
The editor-only `SourceWorldAssemblyManifestJson` file picker plus `ImportWorldAssemblyManifestJson`
button reads the reviewed JSON into the settings asset as canonical serialized JSON and stores its
Core content hash. Import validates the recipe seed against the effective settings seed. The Core
adapter revalidates the manifest and requires a unique exact match for every planned stratum index,
top chunk and bottom chunk against resolved `SurfaceWorld` slots; invalid or incomplete plans fail
Core world initialization rather than silently falling back. With no manifest, existing Core cave
layouts retain their prior schema and route. With `bUseVoxelForgeCore` off, the legacy route and its
season identity hash are unchanged; the manifest only contributes to that hash while Core is active.
### Headless BuildHost evidence
`Tools/TestVoxelForgeCoreWorldHost.ps1` staged the reviewed JSON only under BuildHost and passed it
transiently to `-run=VoxelForgeExplore -coreworldtest=1 -coreworldassembly=...`; no data asset was
edited by the test. Manifest hash `8933693d9560ba9f`, recipe hash `c37de78b759c0a4c`, and plan hash
`1ca84619c8600ee5` were read back in Core. The field probe sampled 4,096 points over 3,200 voxels,
found three native biome IDs (including surface biome ID 4099), and generated native `Heightfield2D`
surface tiles. The actor's W1/W8/W16 initial hashes remained identical.
The final surface-strate travel phase passed at Core-local `(37,165,-2011)` voxels. All 2,553
expected visual keys matched independently generated standalone Core tile hashes; 573 local tiles,
3,438 neighbour faces and 432 LOD transition faces were checked. Of 125 collision-desired tiles,
36 had cooked bodies and 89 correctly had no body because their expected geometry was empty. The
gate checked each non-empty collision expectation individually. The log records the native surface
aggregate hashes as density `56ccc76575aa5f5f`, mesh `f3aeb31de1f967c1`, payload `95cb4781a1be4b73`,
topology `26ac366d430599bd`. Initial cave streaming, anchor release, and sequenced carve also passed.
Unreal's BuildHost exercised the RealtimeMesh/Chaos collision-body path; standalone does not cook
physics bodies. Full final output is in [CoreWorldValidation.stdout.log](../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation.stdout.log)
and [CoreWorldValidation.log](../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation.log).
Failed-attempt archives use the `CoreWorldValidation-backup-2026.10.09-*` names in the same log
directory.
### Switch-off check
The chosen narrow check is a source-level route and identity audit, not a runtime flag-off actor
comparison. `bUseVoxelForgeCore` remains default-false; `UpdateChunksAroundPosition` branches to the
existing legacy path when false; manifest import/adapter initialization and the new collision-support
deferral are Core-only; and `GetCurrentSeasonContentHash()` returns the pre-existing season hash
before inspecting the manifest when Core is off. This verifies the affected route boundaries and
content identity, but does not claim bit-for-bit runtime output from a second legacy actor session.
### Matched timing and the 1.57 s aim
In one BuildHost session, native `Heightfield2D` and the legacy-surface bridge generated the same
2,553 surface tile keys with hashes enabled. Region compilation took 0.015903 s native and 0.012752 s
bridge. Summed serial tile generation took 96.800984 s native versus 197.333401 s bridge; including
region compilation, 96.816887 s versus 197.346153 s (2.038× native speedup). This is a headless
same-key tile-generation comparison, not game-thread apply time or a full rendered-view timing.
The approximately 1.57 s aim is still unmet. The last matched standalone full 529-tile LOD8 stream
took 4.446 s wall, about 2.83× the aim. This round did not run a viewer/full-view benchmark; the
2,553-key BuildHost timing has a different workload and should not be compared directly to the aim.
### Ridge review and owner handoff
I inspected only the existing 17.6 KB downscaled `cliff-final4-overlook-native.jpg` and its 20.5 KB
owner comparison. The pointed ridge peaks are attached to continuous highland terrain and have no
detached shard or broad fanned-plate trail. They read as sharp native mountain peaks, not a mesher
artifact, so no terrain change was made. The frame remains an owner-review item for taste.
For the owner's project build and walk:
1. In the Content Browser, open the existing `DA_Settings` (`UVoxelSettings`) and confirm its
effective seed is `0` (the manifest seed). Set `SourceWorldAssemblyManifestJson` to
`Standalone/Research/WorldAssemblerM1/round4/world_assembly.json` in this plugin checkout, click
**Import World Assembly Manifest JSON**, confirm hash `8933693d9560ba9f`, then save the settings
asset. Assign that settings asset to the project's `AVoxelWorld` if it is not already assigned.
2. Select the `AVoxelWorld`, enable **Voxel World → Core → Use VoxelForge Core**. Keep the shipped
Core clip settings `CoreClipRadius=3` and `CoreMaxClipLevel=8` for the first review. Do not change
the legacy clip settings for this check. Coordinates below are actor-local Unreal centimetres;
Core scale is 25 cm per voxel.
3. To inspect the surface, place the gameplay/free camera near `(0,-3500,-48794)` cm and look toward
ground target `(0,0,-50394)` cm. The coast view is near camera `(33600,-6700,-47776)` cm,
targeting `(33600,-3200,-49376)` cm. The biome-border view is near camera
`(12800,-24300,-49291)` cm, targeting `(12800,-20800,-50891)` cm. The attached cliff/overhang is
near camera `(-16800,7000,-44571)` cm, targeting `(-16800,10500,-46171)` cm. To inspect the cap,
use the surface view and pitch upward/outward about 25°; the cap is hundreds of metres above the
surface floor, so look for the enclosing roof and distant horizon, not a nearby ceiling.
4. Walk the native ground route beginning near `(925,4125,-50275)` cm. The route is terrain support
geometry, not a painted path. Expect two inland terrain profiles, a coastal transition, one
attached cliff shelf, a closed cap and a collision-supported path. Check lighting inside the cap
and the small ridge peaks in the game.
Likely compile touchpoints if the project reports an error are `VoxelSettings.h/.cpp` (UHT/editor
import property and exported methods), `VoxelForgeCoreAdapter.cpp` (JSON parser and exact strate
match), `VoxelWorld.cpp` (manifest content hash and collision admission order), and
`VoxelForgeExploreCommandlet.cpp` (editor-only commandlet path). The plugin BuildHost compile passed;
the owner's project has not been built or opened here. No `.uasset` was modified.
### Round-5 run ledger
| Run | Result |
|---|---|
| First BuildHost UBT compile | Failed at Editor link because the new `UVoxelSettings` getter/setter definitions were not exported. Added `VOXELFORGE_API`; retry passed UBT and the Core link-safety audit. |
| Surface actor test attempt 1 | Failed tile-hash parity while moving to the surface, at support tile `(1,5,-63)`. |
| Surface actor test attempt 2 | Retried after route-fixture correction; the same support tile still differed. Root cause was a non-desired collision support request generating before Core region admission. |
| Surface actor test attempt 3 | Failed the old `GetBiomeAtWorldLocation` assertion: that API is the legacy biome/decorator query and is empty for this native Core surface. Replaced it with direct native `Heightfield2D` sampling from the resolved snapshot and added a native biome-field assertion. |
| BuildHost compile and actor test after collision fix | Passed after collision support was deferred until the tile enters desired-set region compilation. UBT and Core symbol audit passed; the complete actor test passed the gates above. |
| Final BuildHost rerun after switch-off hash gate | UBT/link-safety passed. Actor test passed in 9m20s with peak sampled private memory 3,880,357,888 bytes (3.61 GiB), including matched native/bridge timing and every surface coverage/collision gate. |
All actor attempts stayed below 15 minutes and below 8 GiB per process. No `0xC0000142` retry
occurred, and there was no new UECC crash folder; the only BuildHost crash directory is the older
2026-09-17 `UECC-Windows-F1A3EFD5469F5DD62E68EBBACAC84376_0000`. No owner project/editor was opened,
no owner build or `.uasset` edit occurred, and no commit, push or stash was made.
New source files: none. Modified source files:
`Source/VoxelForge/Public/VoxelSettings.h`, `Source/VoxelForge/Private/VoxelSettings.cpp`,
`Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp`, `Source/VoxelForge/Private/VoxelWorld.cpp`, and
`Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp`. Modified BuildHost test tool:
`Tools/TestVoxelForgeCoreWorldHost.ps1`.
@@ -778,3 +778,56 @@ reported separately. See `Standalone/ASSEMBLER_M1_REPORT.md` for the full measur
run ledger.
— Luna
## Luna, M1 round 5 results
Hi Claude,
The reviewed `WorldAssemblyManifest` now reaches Unreal's opt-in Core route. `UVoxelSettings` imports
the canonical JSON through an editor picker/button and stores its Core content hash. The adapter
checks the recipe seed and requires each plan to match a unique resolved `SurfaceWorld` stratum by
index and top/bottom chunk bounds. With no manifest, the existing Core cave route remains unchanged.
With `bUseVoxelForgeCore` off, the legacy generator route and season identity hash remain unchanged;
the hash review is source-level, not a second flag-off actor replay.
The final BuildHost compile/link audit passed, and the final actor commandlet passed in 9m20s with
3,880,357,888 bytes peak sampled private memory (3.61 GiB). The reviewed hashes were manifest
`8933693d9560ba9f`, recipe `c37de78b759c0a4c`, plan `1ca84619c8600ee5`. The surface field sampled
4,096 points across 3,200 voxels and found three biome IDs. At `(37,165,-2011)` Core voxels, all
2,553 expected visual tile hashes matched standalone Core; 573 local tiles, 3,438 neighbour faces
and 432 LOD transitions passed. The collision gate checked 125 tiles: all 36 expected non-empty
cases had cooked bodies; 89 expected-empty cases correctly had none. Cave initial streaming, anchor
release and sequenced carving also passed. The run used BuildHost/null RHI; no viewer was launched.
In the same session, native `Heightfield2D` and the legacy bridge generated the same 2,553 keys with
hashes on. Compile plus serial tile generation was 96.816887 s native versus 197.346153 s bridge
(2.038× speedup). The approximately 1.57 s whole-view aim remains open: the last 529-tile LOD8
stream measured 4.446 s. I inspected the 17.6 KB downscaled native cliff overlook and owner pair.
The pointed peaks are attached highland terrain without a detached shard trail, so I did not smooth
the field; the owner can judge the sharp look in-game.
The failure ledger is in `Standalone/ASSEMBLER_M1_REPORT.md`: initial UBT link failed because the
new settings methods were not exported, then passed after the export fix. The first two actor attempts
found the same surface tile hash mismatch because an out-of-desired-set collision support job could
start before Core region admission. A third attempt failed the legacy biome/decorator query assertion;
it now samples the native `Heightfield2D` field directly. After deferring that support request until
desired-set admission, the actor test passed. I then gated the assembly hash on Core being active to
preserve legacy identity when the switch is off, rebuilt, and reran the complete actor test; that final
run passed too. No `0xC0000142` retry, new UECC folder, owner build/editor, `.uasset` edit, commit,
push or stash.
Owner handoff: in the existing `DA_Settings`, set its source picker to
`Standalone/Research/WorldAssemblerM1/round4/world_assembly.json`, click **Import World Assembly
Manifest JSON**, confirm the hash and save. Verify effective seed `0`, assign the settings asset to
the world, then enable `AVoxelWorld → Voxel World → Core → Use VoxelForge Core` with Core radius 3
and max clip level 8. The M1 report has actor-local centimeter camera/target coordinates for the
surface, biome border, coast and attached cliff, plus the route start and cap viewing direction. Walk
the route near `(925,4125,-50275)` cm; look upward/outward about 25° for the high enclosing cap.
Review the cap lighting and ridge peaks after the project build. Likely compile touchpoints are
`VoxelSettings.h/.cpp`, `VoxelForgeCoreAdapter.cpp`, `VoxelWorld.cpp`, and
`VoxelForgeExploreCommandlet.cpp`.
New source files: none. The six modified source/tool files and detailed BuildHost evidence are listed
in `Standalone/ASSEMBLER_M1_REPORT.md`. The owner's project has not been built or walked here.
— Luna
+54
View File
@@ -428,3 +428,57 @@ legacy route. After the owner rebuild, recheck the SurfaceWorld shoreline, hills
at the matched camera after fine tiles settle; also recheck the opening-room floor. The captures show
the exact-density bridge improves the surface field, but water/presentation and the other missing
archetypes are still open work.
### Round-5 native SurfaceWorld delivery
Round 4 above is historical. The native manifest route now supersedes the temporary legacy density
bridge for a reviewed `SurfaceWorld` when `AVoxelWorld::bUseVoxelForgeCore` is enabled. Existing Core
cave generation remains supported when there is no world-assembly manifest. With the switch off,
legacy generation and the existing season identity hash remain on the old path.
The editor `UVoxelSettings` asset now has a `SourceWorldAssemblyManifestJson` picker and
`ImportWorldAssemblyManifestJson` button. Import stores canonical JSON plus the verified Core content
hash in the settings asset. `GetCurrentSeasonContentHash()` combines that hash only while Core is
active. Core adapter initialization checks the manifest seed against the resolved layout and
requires exact, unique `SurfaceWorld` slot index/top/bottom matches. The test passes the reviewed
JSON to BuildHost through `-coreworldassembly`; it does not edit an asset. Manifest, recipe and plan
hashes were `8933693d9560ba9f`, `c37de78b759c0a4c` and `1ca84619c8600ee5`.
The final BuildHost commandlet passed the W1/W8/W16 matrix, cave initial streaming, anchor movement,
carving, lower-surface travel and native SurfaceWorld travel. At `(37,165,-2011)` Core voxels, all
2,553 expected visual tile hashes matched standalone Core. Coverage checked 573 local tiles, 3,438
neighbour faces and 432 LOD transitions across two regions. The collision gate checked 125 expected
near tiles: 36 non-empty tiles had cooked bodies; 89 expected-empty tiles correctly had none. Native
SurfaceWorld hashes were density `56ccc76575aa5f5f`, mesh `f3aeb31de1f967c1`, payload
`95cb4781a1be4b73`, topology `26ac366d430599bd`. The BuildHost path uses Unreal mesh upload and
Chaos collision cooking; standalone checks field and mesh output only.
The narrow switch-off check is source-level, not a second runtime actor session: Core remains
default-off; the legacy `UpdateChunksAroundPosition` branch is retained; Core-only manifest
initialization and collision admission are guarded by the switch; and the legacy hash returns before
reading optional manifest data when disabled. This does not claim a full flag-off runtime replay.
In the same BuildHost session, 2,553 identical keys were generated with hashes on. Native
`Heightfield2D` vs the legacy bridge took 0.015903 vs 0.012752 s for region compilation and
96.800984 vs 197.333401 s for summed tile generation; compile plus tiles was 96.816887 vs 197.346153
s (2.038× speedup). This is serial headless tile generation, not rendered frame time. The ~1.57 s
full-view aim remains unmet: the last full 529-tile LOD8 stream measured 4.446 s, 2.83× the aim.
No full-view viewer benchmark ran in round 5.
The existing downscaled native/owner cliff overlook pair was inspected. The sharp ridge peaks remain
attached to the highland surface with no detached shard trail, so the field/mesh was not altered;
their appearance is left for the owner to judge in-game. Handoff instructions and actor-local camera
targets for the surface, coast, cliff, route and cap are in
[`ASSEMBLER_M1_REPORT.md`](ASSEMBLER_M1_REPORT.md). Likely project compile touchpoints are
`VoxelSettings.h/.cpp`, `VoxelForgeCoreAdapter.cpp`, `VoxelWorld.cpp` and
`VoxelForgeExploreCommandlet.cpp`.
Round-5 BuildHost run ledger: the first UBT compile failed to link non-exported settings methods;
exporting them made the retry pass. Actor attempt 1 found a surface support-tile hash mismatch;
attempt 2 reproduced it and exposed collision work starting before region admission. Actor attempt 3
failed the legacy biome-query assertion because the native surface does not provide that legacy
decorator query; it was replaced with direct native heightfield sampling. After the collision-admission
fix, the actor test passed. The final rerun after gating the manifest hash on the Core switch also
passed in 9m20s with 3,880,357,888 bytes peak sampled private memory (3.61 GiB). No `0xC0000142`
retry or new UECC folder occurred. The owner's project was not opened or built and no `.uasset` was
edited.