# World assembler S9 / M3 Round 13 — support-ring lookahead **Result:** the support ring is ready at all tested center arrivals through 40 m/s horizontally, and through a scripted 50 m/s vertical descent. At 40 m/s the matched CVar-off control reached the ring at only 15/74 arrivals; lookahead reached it at 74/74. Initial readiness was 7.743 s with lookahead and 7.778 s without it. I did not reserve more workers, and I left the LOD8 geometry unchanged; its counted optimization plan is in §5. The lookahead is default-on through `voxel.StreamingCollisionLookahead=1`; `0` disables prediction. It follows the support tile, predicts 350 ms ahead (rounded up to one or two 8 m LOD0 tiles at the 25 cm owner scale), and promotes only rings already inside the desired clipmap. I first predicted from the stream center. The trace showed that this was one tile above the walkable center on this SurfaceWorld plan. I corrected both scheduler branches to predict and prioritize from `GetPlayerSupportTile`. No field or mesh arithmetic changed, so the recipe versions remain as-is. ## 1. Speed sweep Fresh BuildHost commandlets used the staged owner SurfaceWorld plan, seed 0, 25 cm Core scale, Legacy streaming order, Dynamic near reserve, apply boost 0, region concurrent admission 1, result backlog cap 256, Normal process priority, a 12-action host limit, and movement from 30 to 45 s. The S8 traces are the pre-lookahead baseline. Arrival readiness is the `walkable_gate.ready` value on the support-center-change event. Lag is the maximum time to a later 9/9 sample before the next support-center change; unresolved centers are counted separately. LOD0 missing is the number of `scheduler_admission` samples with any desired LOD0 key missing during 30–45 s. | Motion | S8 arrival-ready | S8 worst resolved lag / unresolved | S8 LOD0-missing frames | S9 arrival-ready | S9 worst lag / unresolved | S9 LOD0-missing frames | |---|---:|---:|---:|---:|---:|---:| | +Y 6 m/s | 11/11 (100%) | 0 ms / 0 | 168/838 (20.0%) | 11/11 (100%) | 0 ms / 0 | 165/839 (19.7%) | | +Y 12 m/s | 22/22 (100%) | 0 ms / 0 | 431/776 (55.5%) | 22/22 (100%) | 0 ms / 0 | 436/775 (56.3%) | | +Y 25 m/s | 46/46 (100%) | 0 ms / 0 | 625/677 (92.3%) | 46/46 (100%) | 0 ms / 0 | 627/679 (92.3%) | | +Y 40 m/s | 25/74 (33.8%) | 191.1 ms / 8 | 579/595 (97.3%) | 74/74 (100%) | 0 ms / 0 | 576/593 (97.1%) | | −Z 50 m/s | — | — | — | 93/93 (100%) | 0 ms / 0 | 605/626 (96.6%) | The matched 40 m/s CVar-negative control on the corrected source reached 15/74 centers (20.3%), with 196.3 ms worst resolved lag, 7 unresolved centers, and 574/590 LOD0-missing samples (97.3%). This isolates prediction from the support-center correction. The old S8 60 m/s + 400 m teleport remains a separate discontinuity case: 8/113 centers were ready at arrival, 3 more became ready before the next center, and 102/113 never reached 9/9. At 40 m/s the current run therefore supports **40 m/s as the highest tested horizontal speed**; it does not establish a higher horizontal ceiling. The 50 m/s trace used the harness's scripted downward actor movement through the staged owner plan, not a Chaos free-fall simulation in a shaft. The ring remained ready through all 93 center changes. Spawn did not regress in the matched 40 m/s pair: `initial_ready_s` was 7.743349 s on and 7.777605 s off, with spawn-tick p95 2.288 ms and 2.292 ms respectively. The S9 on-run initial-ready values at 6/12/25/40 m/s were 7.813133/7.815265/7.821660/7.743349 s. Movement begins at 30 s, and the lookahead adds no stationary-spawn requests. ## 2. Critical path at 40 m/s For 108 traced critical LOD0 jobs with complete tile-event joins, p50/p95 were: | Stage | p50 | p95 | |---|---:|---:| | Request → worker start | 0.02 ms | 9.59 ms | | Worker generation | 66.6 ms | 84.0 ms | | Result queue → game-thread apply | 9.3 ms | 17.7 ms | | Game-thread apply → mesh submit | 0.17 ms | 0.24 ms | | Mesh → collision submit | 0.01 ms | 0.02 ms | | RMC submit → body-update event | 37.6 ms | 85.9 ms | The body-update interval is the observable collision-ready delay; it is not an isolated Chaos CPU cook timer. Generation and body update dominate. Request-to-worker delay is small at the median, and game-thread apply/submission is below a quarter millisecond at p95. The lookahead gives the generation and body-update stages time to finish before support-center arrival. At 40 m/s the trace reported two lookahead tiles and three newly collision-promoted keys per scheduler rebuild, with zero desired keys outside the clipmap. Worker occupancy hit the 10-task limit, while the result queue peaked at 113 entries / 16.8 MB under the 256 cap and recorded no cap stops. Region compile time was 1.74 ms p50, 22.16 ms p95, 33.32 ms max; concurrent admission recorded no global scheduler skips. Those systems still consume time, but the matched CVar test shows prediction is sufficient at this plan's 40 m/s horizontal limit without adding reserved slots. ## 3. Output quality and determinism - BuildHost Core-off legacy passed at 12.5 cm. M2 HybridV1 and HybridV2 each passed five analytic fixtures plus border checks at 25 cm. - SurfaceWorld passed at 25 cm with collision, anchor movement, carve and travel checks. Its W1/W8/W16 actor hash matrix was stable: density `0cd2a1a4152ee4aa`, mesh `80a5b054b904b1a2`, payload `bf2f1b40dff38acc`, topology `56074198682d5e18`. Peak commandlet private memory was 3.90 GB. - FloatingIslands passed at 25 cm with fixed water, edits, collision and LOD0/1 coverage; the BuildHost actor matrix reported W1/W8/W16. Peak private memory was 3.25 GB. - The current Standalone W1/W8/W12 full-clipmap and per-LOD 0–8 density, mesh, payload and topology hashes match. Full-clipmap hash tuple: density `c10697a8f48380c7`, mesh `430d2be2bdd8b988`, payload `b7b33e14092225c9`, topology `c5c46d66606a819e`. Full-detail hashes also match. - The Standalone S4 audit passed: 385/385 far-cap bands, 128 agreement points (maximum 0.0504 cm under the 2 cm gate), the 100 cm offset negative control, and 2,520/2,520 cap-coverage rays. The current BuildHost SurfaceWorld S3 check passed 128 points with 0.0427 cm maximum far/near error and detected its 100 cm offset control. - A sampled Standalone W12 benchmark process peaked at 0.68 GB private memory. I did **not** run Standalone `--workers=16`: that implementation constructs 16 worker threads, which conflicts with the explicit 12-thread launch cap. Current Standalone W1/W8/W12 match, and the BuildHost SurfaceWorld and FloatingIslands W1/W8/W16 matrices passed. I requested whether the owner wants a one-run W16 exception; until then the 12-thread cap stands. No new `UECC-*` folder was present; the only folder was the existing 2026-09-17 crash. No geometry, field, density or recipe output changed. The far-horizon recipe stays at v2 and the SurfaceWorld plan identity stays unchanged. Water remains fixed for the season; player carve/fill remains unrestricted. ## 4. Goal 2 — counted LOD8 plan, optimization deferred The S8 cold owner trace measured 306 LOD8 jobs at 18.798 worker-seconds total (61.4 ms average, 79.8 ms p95, 94.7 ms max), 45.6% of worker time. Its full set reached readiness in about 7.7 s. The current 25 cm BuildHost feature-cost probe warmed eight LOD8 keys and reported p95 per-tile diagnostics: full/candidate feature path 59.508/59.585 ms, column computation 30.771 ms, marching cubes 6.018 ms, native ground+cap horizon refinement 48.205 ms, classification 0.0046 ms, feature list 0.0007 ms, and shell work 0.0001 ms (repair skipped). The profile counters are overlapping inclusive measurements, so they must not be summed. The same probe reported 15,529 field calls, 9,679 column-cache misses, 8,192 refined ground triangles, 531 ground triangles removed, and 6,732 cap triangles at the sampled high-cost LOD8 tile. `HeightfieldColumnCache` is a 65,536-entry thread-local cache keyed by global XY. It reuses columns within a worker, but does not share cache entries across workers. The current probe does not count cross-tile duplicate samples by worker, and does not split ground-refinement time from cap-refinement time. The next measurement should add exclusive counters for column evaluation, MC, ground refine, cap refine, classification, and cache hits/misses per tile and worker, then trace duplicate global columns across neighboring LOD8 jobs. No LOD8 optimization or far-mesh change was made this round, so no before/after far-horizon/cap captures were produced and the below-7.7 s Goal 2 target remains open. The counted next step is to prototype shared immutable heightfield-column pages for planar families, compare against sampling at displayed resolution and tolerance-based refinement skips, then rerun S3 ground/S4 cap gates (2 cm agreement, 100% coverage) and matched viewer captures at VSync/60 fps, closing the viewer right after each capture. Do not relax tolerances without a metre-scale error bound. ## 5. Builds, commands, binaries and run record BuildHost and Standalone builds passed on their first attempt. Standalone build printed the existing `vswhere.exe` lookup warning and C4838 conversions in `VoxelStrateManager.cpp:3974–3975`, then built both targets successfully. All commandlets were fresh, serial, Normal priority and below 8 GB; the largest sampled BuildHost private memory was 3.90 GB. No process exceeded the 15-minute step limit. Build commands: ```powershell .\Tools\BuildVoxelForgeCoreHost.ps1 -MaxParallelActions 12 -TimeoutSeconds 900 .\Standalone\Build.ps1 -Target All -CompileWorkers 12 -BuildPriority Normal ``` The final horizontal trace command (repeat with speeds `600`, `1200`, `2500`, and `4000` 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 ``` The pre-S9 baseline used the same staged plan and settings with the S8 binary, before the lookahead CVar existed; repeat with the same four speed values: ```powershell .\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 600 -TimeoutSeconds 900 ``` Vertical descent and the matched 40 m/s CVar-negative control: ```powershell .\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -StreamingCollisionLookahead 1 -TestMoveDirection '0,0,-1' -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 5000 -TimeoutSeconds 900 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -StreamingTraceOnly -StartupApplyBoost 0 -StreamingOrder Legacy -NearReserveMode Dynamic -CoreVoxelSizeCm 25 -StreamingCollisionLookahead 0 -TestMoveDirection '0,1,0' -CoreRegionConcurrentAdmission 1 -StreamingResultBacklogCap 256 -TestMoveSpeedCmPerSecond 4000 -TimeoutSeconds 900 ``` Quality commands: ```powershell .\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 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -CoreVoxelSizeCm 25 -TimeoutSeconds 900 .\Tools\TestVoxelForgeCoreWorldHost.ps1 -FloatingIslandsOnly -CoreVoxelSizeCm 25 -TimeoutSeconds 900 .\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 ``` Standalone determinism command template (fresh process, `--workers=1`, `8`, and `12`; `16` was not launched under the thread cap): ```powershell .\Standalone\bin\VoxelForgeCoreStandalone.exe --workers=1 --world-assembler-prototype --stream-benchmark --stream-hash --force-generate --clip-radius=3 --max-clip-level=8 --camera=0,-35,-487.94,0,-22 --process-priority=Normal --process-affinity=4095 --frame-limit=60 ``` One initial CVar-off command was rejected by PowerShell before launch because the movement vector was not quoted (`Cannot convert value to type System.String`). I retried with `-TestMoveDirection '0,1,0'`; the BuildHost run passed. No Unreal process launched for the rejected attempt. No other test/build attempt failed or retried. Binary SHA-256: | Binary | SHA-256 | |---|---| | UE 5.7 `UnrealEditor-Cmd.exe` | `ECCE9996191F7F7E69B3D104EECDD0E678AE69176FDCCD79828C3E75A0654D6D` | | S8 baseline BuildHost `UnrealEditor-VoxelForge.dll` | `8B82EE6C6FBB511AE766EB3D8646A7E9491952F41445CB62D49D71D0B9783418` | | S8 baseline BuildHost `UnrealEditor-VoxelForgeEditor.dll` | `B3BC5E61172C5B21D928A5ACB5F22F8D9E00179B481B675804838DE9A620010D` | | BuildHost `UnrealEditor-VoxelForge.dll` | `F542FC1F014190798485CC088470FD498D368D2E369639EAD32A0EEE8FDB1193` | | BuildHost `UnrealEditor-VoxelForgeCore.dll` | `0A1EB7BB27C3C74A4AA0996E0A24E74224D7B8FFFFF113B1071FA42E18E8375A` | | BuildHost `UnrealEditor-VoxelForgeEditor.dll` | `15B6460FD4E48D14CBE751C99447F06B62B44CF35FFD440AED106585AECEDC79` | | `Standalone/bin/VoxelForgeCoreStandalone.exe` | `FD4CD39CD49BB0E8429250295BD16FACA0A6FBE412240522AB79C086245978C0` | Trace JSONL and actor stdout remain under `Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/`. The initial lookahead results are retained in `Saved/BuildHost/Round13/BeforeSupportTileCorrection/`; Standalone hash logs and the S4 audit log are under `Saved/BuildHost/Round13/`. No file over 300 KB was added outside `Saved/BuildHost/`. No `.uproject`, editor, `.uasset`, RealtimeMeshComponent source, commit, push or stash was touched. Modified source files: - `Source/VoxelForge/Private/VoxelWorld.cpp` — CVar, support-centered lookahead and critical ring ordering; BuildHost `VoxelForge` runtime compile. - `Source/VoxelForge/Public/VoxelWorld.h` — private helper declarations; same runtime compile. - `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp` — movement-vector harness; BuildHost `VoxelForgeEditor` compile. - `Tools/TestVoxelForgeCoreWorldHost.ps1` — movement-vector and CVar arguments. New source files: none. Standalone source files were not changed. Documentation updated: `CODEMAP.md` §3.16 and `ARCHITECTURE.md` §8.30. Async-safety diff review: `Epoch` propagation/checks are untouched; all result queues remain `EQueueMode::Mpsc`; `EndPlay` still drains after active tasks finish; workers still check `bShuttingDown`; `ModsLock` and immutable region-page lifetime are unchanged; UObject and RMC mutation remain on the game thread. ### Dialogue **User:** Continue S9 from the 6 and 12 m/s lookahead traces after the service interruption. **Luna:** Resumed at the 25 m/s run, found and fixed the support/stream-center mismatch, then measured the corrected speed sweep and matched 40 m/s CVar control.