Far-shell repair (81-96% of S2's LOD7/8 tile time) is skipped for certified SurfaceWorld tiles; ground and cap come from the shared planar heightfield. Near LOD0-3 hashes equal S2; far recipe version 1 salts LOD5+ identities. Cold first view 6.6 -> 3.4 s (aim 1.57 s). Not a visual sign-off: distant cap shows floating pieces, sprint streaming arrives late. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
172 lines
10 KiB
Markdown
172 lines
10 KiB
Markdown
# World assembler S3 / M3 Round 7
|
||
|
||
Date: 2026-10-18. Base: S2 / 6ddb834, building on S1 / d6e6942. No commit, push or stash.
|
||
|
||
## Result
|
||
|
||
The far-ground profile is now sampled directly from the native SurfaceWorld heightfield and the
|
||
S2 far-shell cost centre is largely removed. BuildHost checks pass, far LOD7/8 agree with the near
|
||
field within 0.043 cm at shared points, and LOD0–LOD3 hashes match S2 exactly.
|
||
|
||
This is not a horizon sign-off. Cold full-view presentation is still 3.42 s against the 1.57 s aim.
|
||
At 60 m/s the clipmap completes after the player has crossed the route, and the approach captures
|
||
show missing horizon/large faces during loading. The new cap is visible at distance, but its isolated
|
||
pieces and the persistent distant cliff need visual review. The captures do not prove a clean
|
||
approach/retreat with no visible pop.
|
||
|
||
## What changed and what the counters said
|
||
|
||
The owner-walk LOD8 hypothesis was mostly right about repair geometry and wrong about classification.
|
||
In S2's warmed eight-key timings, SurfaceWorld LOD7 spent 26.378/32.739 ms (81%) in far-shell repair
|
||
and LOD8 spent 135.960/168.545 ms (81%). FloatingIslands LOD8 spent 69.930/73.038 ms (96%). These
|
||
shell timings exclude LOD8 cap refinement. The old M1 Round 4 whole-clipmap measurement had 165
|
||
unknown LOD8 tiles, 13.27 M field calls and 49.8 s summed column time versus 1.85 s meshing. That
|
||
M1 window predates S1's relief changes, the shared feature lists and the single voxel-size source;
|
||
it is historical context, not a comparable S2 baseline.
|
||
|
||
The final SurfaceWorld actor route reports the following LOD7/8 tile p95 diagnostics. The sub-stage
|
||
percentiles are separate timers and are not additive; column-cache time overlaps native horizon work.
|
||
|
||
| LOD | Full tile p95 | MC mesh | Shell repair | Native horizon | Unknown boxes | Field calls | Column misses |
|
||
|---:|---:|---:|---:|---:|---:|---:|---:|
|
||
| 7 | 19.801 ms | 4.864 ms | 0.0001 ms | 13.156 ms | 1 | 6,167 | 3,025 |
|
||
| 8 | 58.346 ms | 6.013 ms | 0.0001 ms | 47.204 ms | 1 | 11,304 | 9,679 |
|
||
|
||
The shared broad-box classifier is not the current bottleneck: the route has one unknown box per
|
||
sampled far tile and classification is only a few microseconds. S2 repair connectors dominated.
|
||
After removing that work for certified SurfaceWorld tiles, native heightfield sampling/building is
|
||
the new LOD8 cost centre. I did not change noise octave evaluation.
|
||
|
||
### Owner timing comparison
|
||
|
||
Warmed BuildHost p95s use the staged 25 cm plans and eight owner keys per LOD; the S2 values are from
|
||
Round 6's same workload. These are tile timings, not rendered-frame percentiles.
|
||
|
||
| Family | LOD | S2 p95 | S3 p95 | Change |
|
||
|---|---:|---:|---:|---:|
|
||
| SurfaceWorld | 7 | 32.739 ms | 19.801 ms | -39.5% |
|
||
| SurfaceWorld | 8 | 168.545 ms | 58.346 ms | -65.4% |
|
||
| FloatingIslands | 7 | 20.409 ms | 13.112 ms | -35.8% |
|
||
| FloatingIslands | 8 | 72.923 ms | 24.638 ms | -66.2% |
|
||
|
||
S2 and S3 standalone stream benchmarks used the same owner JSON (SHA-256
|
||
289CD75597C5510FE8751102144FDC949D9B20B8BB23EEECDA37D049A49AD711), camera, 2,553 desired tiles,
|
||
12 workers and cold generation. CPU-only full-clipmap wall time was 6.099 -> 2.975 s (51% lower).
|
||
It is a different timing scope from the rendered viewer run.
|
||
|
||
The matched cold viewer runs used the owner walk camera, 12 workers, 60 fps with VSync and 2,553
|
||
tiles. S2 reached InitialClipmapReady at 6.567 s and first whole-view presentation at 6.622 s.
|
||
S3 reached them at 3.081 s and 3.420 s. The first presentation is still 2.18x the 1.57 s aim.
|
||
|
||
At the requested sprint speed, a cold approach from y=-1800 m at 60 m/s crossed 250 centers in
|
||
41.520 s. Nearest-tile ready p95 was 83.978 ms, maximum crossing wall time 40.050 s, and the full
|
||
clipmap completed at 42.339 s; status was FAIL. All 2,553 tiles eventually became resident, so this
|
||
is a late-horizon failure rather than a permanent missing-tile count. A second visual approach at
|
||
10 m/s from y=-900 m also failed its streaming gate: 50 crossings, 47.471 s elapsed, 134.014 ms
|
||
nearest-ready p95, 41.881 s maximum crossing wall time and InitialClipmapReady at 53.752 s. A
|
||
separate 60 m/s retreat run completed at 42.660 s and failed its latency gate as well.
|
||
|
||
## Shape agreement, determinism and regressions
|
||
|
||
The commandlet agreement check uses 128 shared LOD7/8 XY samples on the staged walk route. At each
|
||
point it compares far ground vertices to a near-field density root. Tolerance is 2 cm:
|
||
|
||
| Measure | Result |
|
||
|---|---:|
|
||
| Maximum LOD7 to near-field error | 0.0427 cm |
|
||
| Maximum LOD8 to near-field error | 0.0427 cm |
|
||
| Maximum LOD7 to LOD8 error | 0.0000 cm |
|
||
| Negative control, 100 cm datum offset | 100.0427 cm; detected |
|
||
|
||
The negative control fails the 2 cm gate as required. This checks the ground profile; the cap is
|
||
sampled from the same native heightfield at its shared 128-voxel grid, but this round did not add a
|
||
separate cap-to-near-root metric. That limitation and the visual cap artifacts remain open.
|
||
|
||
A direct S2/S3 full-clipmap hash comparison used --stream-hash at the same walk camera. All four
|
||
hashes below are identical per LOD, establishing the near terrain result:
|
||
|
||
| 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 |
|
||
|
||
The whole-clipmap density hash also matches S2: c10697a8f48380c7. S3's BuildHost SurfaceWorld
|
||
W1/W8/W16 hashes match at density 0cd2a1a4152ee4aa, mesh 96df0c8767fd98c6, payload
|
||
377dce268955d353 and topology 5165549880b1c16a. FloatingIslands W1/W8/W16 match at density
|
||
4dcfb37585d7d986, mesh 112f6f2486ac56c5, payload b2c0a75cf5b9f12a and topology dfffcf4a5e29a111.
|
||
|
||
Core-off legacy at 12.5 cm passes. M2 V1/V2 fixture repeats, borders, V2 MC identity and 125 doorway
|
||
phases pass. BuildHost's staged SurfaceWorld and FloatingIslands actor checks pass at 25 cm. Surface
|
||
edit, carve/fill, scale, reference and anchor checks pass. No 20 cm run was made.
|
||
|
||
## Visual evidence
|
||
|
||
All included images are 640x400 and under 300 KB. S2 and S3 stills are separate cold runs with the
|
||
same owner plan and 60 fps/VSync capture setup.
|
||
|
||
| View | S2 | S3 | Readout |
|
||
|---|---|---|---|
|
||
| Owner walk horizon | [before](captures/before_s2_surface.jpg) | [after](captures/after_s3_surface.jpg) | Broad ground shape is similar. |
|
||
| Cap at distance | [before](captures/before_s2_cap.jpg) | [after](captures/after_s3_cap.jpg) | S2 shows open sky; S3 shows the ceiling, with isolated-looking pieces. |
|
||
| Far view, y=-1800 m | [before](captures/before_s2_far.jpg) | [after](captures/after_s3_far.jpg) | The same tall cliff is present in both; S3 has a small detached-looking cap band. |
|
||
|
||
The 60 m/s approach and retreat captures are a failed streaming sequence, not a no-pop claim:
|
||
[approach 0.1 s](captures/approach_00.jpg), [15 s](captures/approach_02.jpg),
|
||
[32 s](captures/approach_04.jpg); [retreat 0.1 s](captures/retreat_00.jpg),
|
||
[15 s](captures/retreat_02.jpg), [32 s](captures/retreat_04.jpg). Horizon coverage is absent or
|
||
obscured during loading. The slower 10 m/s approach also shows large distant faces:
|
||
[start](captures/approach_normal_00.jpg), [15 s](captures/approach_normal_02.jpg),
|
||
[32 s](captures/approach_normal_04.jpg). Raw back-buffer PNGs and full logs remain under
|
||
Saved/BuildHost/Round7S3Evidence. VSync was on and the viewer was capped at 60 fps and closed at run
|
||
completion.
|
||
|
||
## Run ledger and limits
|
||
|
||
- BuildHost Core/UBT and standalone viewer builds pass, with at most 12 workers. One early commandlet
|
||
compile failed on C4456 variable shadowing; renaming the local fixed it. The final BuildHost source
|
||
build and link-safety audit pass.
|
||
- The first agreement audit had fewer than 64 shared points in the chosen p95 keys. A walk-route
|
||
LOD7/8 fallback was added; the 128-point audit now passes.
|
||
- The first OS screen-grab attempt failed with an invalid desktop handle. I added optional
|
||
render-loop back-buffer capture to StandaloneViewer and rebuilt; those captures work.
|
||
- One normal-speed capture launch exited before generation because Start-Process split a path at the
|
||
workspace's space. Correct quoting allowed the run to complete; its streaming status still failed.
|
||
A JPEG helper syntax error wrote no files and was corrected. A CIM memory query was denied, so
|
||
launch checks used GlobalMemoryStatusEx instead. No Unreal/viewer process overlapped another.
|
||
- The process working-set high-water observed during BuildHost actor runs was 3.1 GiB; flight viewer
|
||
runs stayed near 1.1 GiB. Free physical memory was above 4 GiB before launches. No run returned
|
||
0xC0000142, timed out or exceeded the 15 minute step limit. The BuildHost crash directory contains
|
||
only the existing 2026-09-17 UECC folder; no new UECC folder appeared.
|
||
- BuildHost emitted existing warnings for the optional NewDataAsset, certificate store and PIX
|
||
initialization. They did not fail the owner checks.
|
||
|
||
## Files and owner note
|
||
|
||
New source files: none.
|
||
|
||
Modified source/header files:
|
||
|
||
- Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h
|
||
- Standalone/Core/src/VoxelForgeCore.cpp
|
||
- Standalone/Core/src/FarShellsInternal.h
|
||
- Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp
|
||
- Standalone/Source/StandaloneViewer.cpp
|
||
|
||
Likely compile spots are the Core public API and implementation, the canonical Core shim/link audit,
|
||
the editor commandlet under BuildHost UBT/UHT, and the standalone viewer target. No generated header
|
||
was edited. CODEMAP section 3 and ARCHITECTURE section 8.24 describe the change.
|
||
|
||
The far recipe version is 1. It salts far mesh, payload and topology identities from LOD5 upward;
|
||
density hashes and LOD0–LOD3 identities remain unchanged. Bump it when changing this far mesh recipe.
|
||
The only family-specific planar representation is declared by SurfaceWorld's ground/cap heightfield.
|
||
FloatingIslands has no planar datum and keeps the shared 3D connector/field path. Player-edited tiles
|
||
continue through the authoritative field and repair path at every visible LOD.
|
||
|
||
Owner note: keep Core enabled at the existing 25 cm setting; no asset or owner-project change is
|
||
needed. The tile cost and near-hash checks pass, but the horizon is not ready for sign-off: cold
|
||
presentation misses the target, sprint streaming arrives late, and the captures do not prove a
|
||
pop-free transition. Do not treat these results as a completed visual acceptance.
|
||
|