# World assembler S10 / M3 Round 14 — cheaper far ring Date: 2026-10-19. Base: S9 / `e7586a1`. No commit, push or stash. ## Result The planar far path now samples the LOD8 interior at the spacing that LOD8 marching cubes can represent. At 25 cm, that is 512 voxels / 128 m per MC cell. Globally aligned 128-voxel (32 m) strips remain along tile boundaries. LOD4–LOD7 coordinates and the 2 cm agreement tolerances are unchanged. Far recipe version is 3; far mesh hashes change, while density and LOD0–LOD3 remain unchanged. On the owner SurfaceWorld plan, the warmed eight-tile BuildHost LOD8 full-tile p95 fell 76.7%, from 59.848 ms to 13.933 ms. In the fresh 6 m/s actor spawn trace, the 2,578 initial tile jobs used 26.870 worker-seconds; the LOD8 share was 4.288 seconds. Round13’s S8 spawn reference was about 41 worker-seconds, with 18.798 seconds in its 306 LOD8 jobs. Initial readiness was 7.117 s, below the 7.7 s target. The active 3×3 walkable ring was ready in 0.490 s, and all 512 LOD0 tiles were ready at 1.428 s. ## Count first — exclusive cost and duplicate columns The counters are measured per tile. Column evaluation is timed only around uncached column work. MC, ground and cap counters subtract column time from their respective wall intervals. The mesh assembly window covers final payload flattening and optional diagnostic hashing. Each p95 is computed independently, so these p95 values are not additive. | LOD8 warmed p95, BuildHost 25 cm | S9 | S10 | Change | |---|---:|---:|---:| | Full tile | 59.848 ms | 13.933 ms | −76.7% | | Column evaluation | 31.319 ms | 7.478 ms | −76.1% | | Marching cubes | 2.667 ms | 2.359 ms | −11.6% | | Ground refinement | 11.666 ms | 1.690 ms | −85.5% | | Cap refinement | 10.029 ms | 1.330 ms | −86.7% | | Mesh assembly and diagnostic hash | 5.445 ms | 1.095 ms | −79.9% | | Column-cache misses | 9,679 | 2,287 | −76.4% | The high-cost S9 sample generated 8,192 ground triangles, removed 531 coarse ground triangles, and generated 6,732 cap triangles. S10 generated 968 ground triangles, removed 534, and generated 840 cap triangles. The geometric checks below pass at the same tolerance. The fresh W12 Standalone overlap capture counted 153 LOD8 tiles. S10 evaluated 106,219 unique XY columns and repeated 32,738 neighboring tile evaluations, including 30,446 cross-worker repeats. The same-binary step-128 control counted 660,283 unique columns, 44,319 neighboring repeats and 41,665 cross-worker repeats. This confirms that cross-worker duplicates remain, while the coarser interior removes most column work without sharing cache state between workers. | Fresh W12 Standalone pipeline | Default step 0 | Negative control step 128 | |---|---:|---:| | LOD8 worker sum | 3.206 s | 13.534 s | | LOD8 unique XY columns | 106,219 | 660,283 | | Repeated neighboring evaluations | 32,738 | 44,319 | | Cross-worker neighboring repeats | 30,446 | 41,665 | Both runs used the current v3 binary. Step 128 restores S9 sampling density, but retains the v3 hash salt; its far mesh hash is therefore expected to differ from S9’s v2 hash. ## BuildHost actor spawn and ring The fresh 6 m/s trace used the S9 movement, collision and backlog settings: Legacy order, Dynamic near reserve, collision lookahead on, 256 result cap, and a 12-CPU affinity mask. Per-LOD worker generation sums for the 2,578 initial generation ordinals were: | LOD | Initial tiles | Worker seconds | |---:|---:|---:| | 0 | 512 | 3.840 | | 1 | 448 | 3.781 | | 2 | 320 | 0.811 | | 3 | 272 | 2.093 | | 4 | 272 | 6.688 | | 5 | 208 | 1.535 | | 6 | 144 | 1.988 | | 7 | 96 | 1.846 | | 8 | 306 | 4.288 | | **Total** | **2,578** | **26.870** | At 6 m/s, initial readiness was 7.116525 s (2,578 desired, 2,617 loaded); spawn-tick p95/max was 1.824/4.993 ms. The support ring became ready at 0.490 s (9/9). The complete LOD0 set was ready at 1.427630 s, with a 0.990836 s measured build interval. Round13’s S9 6 m/s initial-ready value was 7.813133 s. At 40 m/s (4,000 cm/s), all 75 moving support-center arrivals from 30.205 s through 45.011 s had the full 9/9 walkable ring ready: 75/75, 100%. A stationary startup gate event before movement is excluded from that moving-center denominator. Initial readiness was 7.087272 s. Spawn-tick p95/max was 1.833/5.365 ms; the trace passed. ## Quality and determinism - S3 ground agreement: 72 shared route points; far LOD7 and LOD8 maximum error 0.0427 cm, cross-LOD error 0 cm, within 2 cm. The 100 cm datum-offset control measured 100.0427 cm and was detected. - S4 cap agreement: 128 shared points; maximum error 0.0504 cm, within 2 cm. The 100 cm datum-offset control measured 100.0015 cm and was detected. Cap census emitted all 385/385 requested bands. - Cap coverage: 2,520/2,520 upward rays hit the cap (100%); no profile-roof, mesh or clip-edge misses. - Core-off legacy passed at 12.5 cm. The M2 Hybrid V1 and V2 fixture sets each passed five analytic fixtures and border checks. SurfaceWorld and FloatingIslands passed BuildHost actor validation at 25 cm. Water stayed fixed; carve and fill remained unrestricted. - Standalone W1/W8/W12 produced identical hashes for the full 2,553-tile view: density `c10697a8f48380c7`, mesh `e75c9119a1498cd5`, payload `49a9a8d1835a6c8c`, topology `edcb23288b5e8724`. - BuildHost SurfaceWorld W1/W8/W16 matrix was stable: density `0cd2a1a4152ee4aa`, mesh `a06243aee16b65d5`, payload `c700162935c262d7`, topology `0af901aa42b452bc`. FloatingIslands W1/W8/W16 was stable: density `4dcfb37585d7d986`, mesh `f14f76fbf065c6ed`, payload `53035c45fd1a082e`, topology `23550100654a4ec3`. W16 was a logical partition with the process still capped to 12 executing CPUs. Far mesh hashes differ from S9 as expected under recipe version 3; current-build determinism passes. ## Matched captures All captures are 640×400 and under 22 KB. Each was produced at 60 fps with VSync on, then the Standalone viewer was closed after its back-buffer capture. Raw 1280×800 PNGs and run logs are under `Saved/BuildHost/Round14/CaptureRaw/`. | View | S9 sampling control, 128 voxels | S10 default, MC spacing | |---|---|---| | Far horizon, camera 0,-35,-487.94,0,-22 | [s9_far_horizon.jpg](captures/s9_far_horizon.jpg) (21.9 KB) | [s10_far_horizon.jpg](captures/s10_far_horizon.jpg) (18.0 KB) | | Cap, camera 0,-35,-487.94,0,22.42 | [s9_cap.jpg](captures/s9_cap.jpg) (10.8 KB) | [s10_cap.jpg](captures/s10_cap.jpg) (10.8 KB) | The cap is low contrast in this view, as in Round8; the 2 cm agreement, triangle census and ray coverage provide the cap acceptance evidence. ## Builds, commands and hashes Builds on the final source: ~~~powershell .\Tools\BuildVoxelForgeCoreHost.ps1 -MaxParallelActions 12 -TimeoutSeconds 900 .\Standalone\Build.ps1 -Target All -CompileWorkers 12 -BuildPriority Normal ~~~ The fresh Standalone determinism processes used the same command with workers 1, 8 and 12: ~~~powershell foreach ($workers in @(1, 8, 12)) { .\Standalone\bin\VoxelForgeCoreStandalone.exe --workers=$workers --world-assembler-prototype --stream-benchmark --stream-hash --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-priority=Normal --process-affinity=4095 --frame-limit=60 } ~~~ The current-build duplicate count and same-binary step-128 control used: ~~~powershell .\Standalone\bin\VoxelForgeCoreStandalone.exe --workers=12 --world-assembler-prototype --stream-pipeline --stream-hash --profile-far-column-overlap --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=0 --process-priority=Normal --process-affinity=4095 --frame-limit=60 .\Standalone\bin\VoxelForgeCoreStandalone.exe --workers=12 --world-assembler-prototype --stream-pipeline --stream-hash --profile-far-column-overlap --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --far-horizon-lod8-step=128 --process-priority=Normal --process-affinity=4095 --frame-limit=60 ~~~ Quality and BuildHost actor commands: ~~~powershell .\Standalone\bin\VoxelForgeCoreStandalone.exe --world-assembler-audit --workers=12 --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --process-priority=Normal --process-affinity=4095 --frame-limit=60 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -CoreVoxelSizeCm 25 -TimeoutSeconds 900 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -FloatingIslandsOnly -CoreVoxelSizeCm 25 -TimeoutSeconds 900 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -CoreOffTest -CoreVoxelSizeCm 12.5 -TimeoutSeconds 900 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -HybridFixturesOnly -CoreMesherRecipe WorldAssemblerHybridV1 -CoreVoxelSizeCm 25 -TimeoutSeconds 900 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -HybridFixturesOnly -CoreMesherRecipe WorldAssemblerHybridV2 -CoreVoxelSizeCm 25 -TimeoutSeconds 900 ~~~ The two fresh actor traces differed only in speed, 600 or 4,000 cm/s: ~~~powershell .\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -StreamingCollisionLookahead 1 -TestMoveDirection '0,1,0' -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 600 -TimeoutSeconds 900 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -StreamingCollisionLookahead 1 -TestMoveDirection '0,1,0' -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 4000 -TimeoutSeconds 900 ~~~ Final binary SHA-256: | Binary | SHA-256 | |---|---| | BuildHost UnrealEditor-VoxelForgeCore.dll | `D87CC56BACCDE6559705EEAEA7DB73D1A6ABF79484D37A3887B94A9FD62BABD3` | | BuildHost UnrealEditor-VoxelForge.dll | `9D0522ECC9A6AC52D9F3ACC2FD44399FE70F557C5F11D0203AB4C4B8EE75C198` | | BuildHost UnrealEditor-VoxelForgeEditor.dll | `AA196DA5A6DB3C84B5EC4F002AEBC787386DBB8F2798F5D1EEC03010BF642BBA` | | Standalone VoxelForgeCoreStandalone.exe | `E316D7E3E0B3D3639DAE61D6E2D1091F38C59A210B3B7DD8124928D21A8119A5` | ## Run notes, files and safety review - BuildHost and Standalone ran at Normal priority with no more than 12 executing CPUs; free memory was above 17 GB before the final launches. BuildHost peak private memory was 3.76 GiB for SurfaceWorld, 3.27 GiB for FloatingIslands, 3.39 GiB for the 6 m/s trace and 3.67 GiB for the 40 m/s trace. The Standalone overlap/control processes peaked below 0.72 GiB. No process exceeded 8 GiB, and no launch overlapped another Unreal/Standalone process. - Standalone’s first compile attempt failed in `StandaloneViewer.cpp` because one helper referred to `App` outside its scope; that reference was corrected and the final build passed. The existing `vswhere.exe` lookup warning and `VoxelStrateManager.cpp` C4838 warnings remained. - Three BuildHost CVar attempts (direct argument and two `ExecCmds` forms) read back zero and did not change the worker grid; that no-op CVar/harness path was removed. An early Standalone step-128 attempt also did not reach the pipeline; CLI pass-through was corrected and the final same-binary step-128 control above is effective. No CVar remains in the final source. - One high-pitch cap capture was black and was discarded. A separate early capture shell lacked its memory-probe type because the PowerShell session was fresh; that capture completed without a pre-launch memory gate. The matched final captures were rerun with the gate active. No `0xC0000142` occurred and no run needed retrying. - The only UECC directory was the pre-existing `UECC-Windows-F1A3EFD5469F5DD62E68EBBACAC84376_0000`, timestamped 2026-09-17; no new UECC folder was created. - No new source files. Changed source files and compile spots: | File | Compile spot | |---|---| | `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h`, `Standalone/Core/src/VoxelForgeCore.cpp`, `Standalone/Core/src/WorldAssemblerInternal.h` | VoxelForgeCore in Standalone and BuildHost | | `Standalone/Source/StreamingWorld.h`, `Standalone/Source/StandaloneViewer.cpp` | StandaloneViewer / VoxelForgeCoreStandalone.exe | | `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp` | BuildHost VoxelForgeEditor module | | `Tools/TestVoxelForgeCoreWorldHost.ps1` | PowerShell harness only; recipe-specific fixture logs | Async-safety review: no actor async source changed. Epoch checks, MPSC queues, EndPlay draining, worker `bShuttingDown` checks and `ModsLock` remain unchanged. Region-page publication, shared_ptr lifetime and concurrent eviction remain unchanged. New duplicate capture stays thread-local and is copied into the tile result; its worker-id hash is diagnostic only. UObject and RealtimeMeshComponent mutation remain on the game thread. No owner `.uproject`, editor, `.uasset`, or RealtimeMeshComponent file was modified. `git diff --check` passed. No commit, push or stash. ### Dialogue **User:** Keep the 12-thread cap; count exclusive LOD8 costs first, optimize the planar far path, and verify quality and determinism. **Codex:** The LOD8 interior now follows the MC spacing, with 128-voxel boundary strips preserved. The owner-plan LOD8 p95 fell from 59.848 ms to 13.933 ms; cap and ground gates, both BuildHost actor matrices, current-build worker hashes, and the 40 m/s support ring passed.