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:
1 parent
2d0cec90e4
commit
f67b519e75
11 files changed
+1002
-45
No files matched your search
@@ -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
|
||||
@@ -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.
|
||||
Reference in new issue
Block a user