# World assembler S4 / M3 Round 8 Date: 2026-10-19. Base: S3 / `d0f97bf`. No commit, push or stash. ## Result SurfaceWorld now has a continuous far ceiling at LOD5–8, projected from the same declared planar heightfield and closed at the owning strate's upper boundary. The staged owner's real plan and walk view pass cap census, root agreement and upward-ray coverage. LOD0–LOD3 hashes still match S3 and S2. The far recipe is version 2. FloatingIslands still shows open sky overhead; it has no declared planar cap, and that is expected for an open-air island strate. ## Count first: why S3 looked detached The pre-fix owner-camera audit found 361 far XY tiles and 786,153 profile samples; all profile samples had a roof. Of 401 cap bands requested, 401 emitted triangles, with 0 requested bands empty and 0 clipmap culls. So the proposed ground-height gate was not leaving requested cap bands unmeshed on this walk view. The 128-point cap-to-near-root check did fail: maximum vertical error was 823.8525 cm (one sample was -447.0469 voxels at the far cap versus -480.001 at the near root). The failure was the cap datum sitting above its owning boundary, which made the roof read as detached pieces. The 128-voxel lattice itself was not leaving empty bands. The fix is a render-surface projection to `(topChunkZ + 1) * 32` voxels, the owning strate's upper boundary. `Heightfield2D::point()` and density values remain unchanged. The far cap and its bounds use the shared projected height; the tile selector adds only non-overlapping cap bands. All samples use a global XY lattice so neighboring cap tiles share edges. LOD4 uses a 16-voxel grid step; LOD5–8 use 128 voxels. Post-fix audit: 385/385 requested cap bands emitted positive-area triangles (LOD4 88/88, LOD5 48/48, LOD6 48/48, LOD7 48/48, LOD8 153/153); 0 empty and 0 culled. Across 128 shared XY points, far cap to near-root error is at most 0.0504 cm (2 cm tolerance). A 100 cm datum-offset negative control measured 100.0015 cm and was detected. The S3 ground agreement still passes: max LOD7/8 to near-root error 0.0427 cm, cross-LOD error 0, and its 100 cm control is detected. Coverage uses emitted cap triangles, not the height profile alone. At each of 33 owner route points and two camera points, 72 upward rays span elevations 5, 10, 12, 15, 30, 45, 60, 75 and 90 degrees over eight azimuths. Result: 2,520/2,520 hit the cap before the far clip or clipmap edge (100%); 0 profile-roof, mesh or clip-edge misses. All 35 points individually reached 100%. This verifies the owner route and camera samples, not every possible point in the full strate volume. ## Visuals and fluting Matched captures use the Round 7 views, the same staged plan and camera positions, 60 fps/VSync, and the viewer closed after capture. Each S4 JPEG is 640x400 and under 19 KB. | View | S3 | S4 | Readout | |---|---|---|---| | Owner walk horizon | [S3](../Round7/captures/after_s3_surface.jpg) | [S4](captures/s4_walk_horizon.jpg) | Walk horizon view after cap repair. | | Cap at distance | [S3](../Round7/captures/after_s3_cap.jpg) | [S4](captures/s4_cap_distance.jpg) | The isolated-looking pieces are gone. | | Far view, y=-1800 m | [S3](../Round7/captures/after_s3_far.jpg) | [S4](captures/s4_far_y_minus_1800.jpg) | Far-cliff fluting remains. | | Looking straight up, far distance | — | [S4](captures/s4_far_straight_up.jpg) | Dark and low contrast; geometry/ray audit establishes the roof, pixels alone do not distinguish roof from dark sky. | Fluting is coarse marching-cubes sampling on steep ground faces. Each far tile spans 16 coarse cells per side: at 25 cm, LOD7's step is 256 voxels (64 m), LOD8's is 512 voxels (128 m). The strips cross tile faces rather than appearing only at LOD seams; they predate S4 in S2/S3. Certified SurfaceWorld tiles skip shell repair, native replacement affects upward-facing ground only, and this is not a normal or backface-culling artifact. Refining all steep faces would multiply far 3D mesh work by roughly eight; that is not a cheap shared fix, so S4 leaves it open. ## Timing, determinism and regression checks SurfaceWorld timings are warmed p95s over the same eight staged 25 cm owner keys per LOD as S3. Runs were serial at normal priority with no overlapping build or Unreal process. These are tile times, not frame times. | LOD | S3 full p95 | S4 full p95 | Delta | |---:|---:|---:|---:| | 7 | 19.801 ms | 19.8069 ms | +0.0059 ms (+0.03%) | | 8 | 58.346 ms | 58.4113 ms | +0.0653 ms (+0.11%) | The standalone cold full-clipmap benchmark took 3.107 s versus S3's 2.975 s on the same 2,553-tile, 12-worker workload: +132 ms (+4.4%). Far closure is therefore effectively flat in warmed owner tile p95, with a small whole-clipmap cost. LOD8 cap refinement covered 385 tiles / 757,540 grid cells and generated 1,515,082 cap triangles. * SurfaceWorld BuildHost at 25 cm: PASS; W1/W8/W16 stable at density `0cd2a1a4152ee4aa`, mesh `80a5b054b904b1a2`, payload `bf2f1b40dff38acc`, topology `56074198682d5e18`. * FloatingIslands BuildHost at 25 cm: PASS; W1/W8/W16 stable and standalone hashes match. Its plan contains 4 islands, 3 connectors and 28 route segments; water remains fixed. * Core off / legacy at 12.5 cm: PASS. * M2 HybridV1 and HybridV2 fixtures at 25 cm: PASS; each reports five analytic fixtures and one border fixture. * Standalone W1/W8/W16 determinism: PASS. Owner clipmap density hash remains `c10697a8f48380c7`. * LOD0–LOD3 hashes match S3 and S2 exactly: | LOD | Density | Mesh | Payload | Topology | |---:|---|---|---|---| | 0 | `769f2a706d585a72` | `33eeeb39fa443816` | `645621a1d968983f` | `c2457ed905036c9d` | | 1 | `69cc5a5c0a2c60af` | `b48335f5410c57d5` | `d15c5480162ab8ba` | `feca1bd025823604` | | 2 | `85deed5683a77202` | `53469895987aeea2` | `e55f8ae7e1532033` | `d5feb12a0e85c09b` | | 3 | `6518caefb3be7e7f` | `ec513c90b853a614` | `f62fa1137ff17f82` | `ccf1dcf681965816` | Far output changes are salted by far recipe v2 in mesh, payload and topology hashes from LOD4 upward. The final Standalone build and BuildHost Core compile/link-safety check pass. The editor commandlet uses explicit RealtimeMesh section ranges for cap-only and ground/cap tiles. Final reruns had no ensure. No new `UECC-*` folder appeared; the only crash directory is the pre-existing 2026-09-17 folder. No run hit `0xC0000142`; all commandlets stayed below 4 GiB peak private memory. The surface commandlet was the longest run at about 10 minutes, within the 15-minute limit. The Standalone build also printed nonfatal environment/compiler warnings: `vswhere.exe` was not recognized by the build script, and C4838 remains at `VoxelStrateManager.cpp:3974–3975`. ### Failed and retried runs * The first post-fix coverage pass used a camera above the roof and reported 97.143% (72 rays, all misses from that invalid origin). Re-running from the staged owner walk height passed 100%. * The first clamp used the wrong chunk boundary and altered point density, changing the LOD3 density hash. It was corrected to the upper boundary and render-only API; final LOD0–LOD3 hashes match S3. * One hash invocation omitted `--stream-benchmark` and entered the interactive viewer; it was stopped after 146 s and rerun with the correct mode. An absolute capture output path was split at the workspace spaces by `Start-Process`; relative paths worked. A JPEG helper syntax error was corrected. * An early BuildHost mesh apply raised an ensure when a cap material section did not yet exist. Explicit `CreateSection` ranges fixed it; final SurfaceWorld and fixture runs pass without a new crash or ensure. No `0xC0000142` retry was needed. ## Source and compile spots No new source file was added. Modified sources: * `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h`, `Standalone/Core/src/WorldAssemblerInternal.h`, `Standalone/Core/src/VoxelForgeCore.cpp` — shared cap declaration API, clipped render surface, conservative bounds, cap tile selection/emission, and far recipe version; compile through the Standalone Core build and BuildHost Core. * `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp` — owner cap census, agreement and ray coverage audit; compile through the editor module / BuildHost commandlet. * `Source/VoxelForge/Private/VoxelWorld.cpp` — explicit realtime mesh section ranges; compile through the VoxelForge runtime module. * `Standalone/Source/StandaloneViewer.cpp` — standalone audit and matched capture support; compile through `Standalone/Build.ps1 -Target All`. `CODEMAP.md` section 3 and `ARCHITECTURE.md` section 8.25 are updated. The API leaves the roof family choice in the declared plan, so future cave-in-mountain families can get a far roof by declaring one; no SurfaceWorld-only geometry rule is required. The owner need not change assets or settings: keep Core enabled at 25 cm. Sprint streaming order and the 1.57 s cold-view target were not changed or re-measured.