# VoxelForge L30 Work is on `assembler/world`. The speed and look patches are saved separately under `Saved/Linux/l30/`; evaluator version is now 16 for the field change. No Unreal files were edited. Nothing was committed, pushed, or stashed. ## Ring measurement and fix I rasterized upward-facing triangles from the L29 mesh (skirt triangles excluded) over the same 409,600 pixels as the after field. At `(64, -32)`, the L29 field stayed almost flat at `-120.063 m` from radii 1–11 m, then broke at 12 m. The expected Gradient at radius 1 m is `-121.360 m`. This is a field defect, not shading: the probe is about 67 m from the passage mouth, and the raster has no skirts or readable-shading tint. The passage column flare is at that distant mouth as well. The upper FloatingIslands generator could leave native solid density in the air-side gap above a negatively displaced Gradient face. The constant band densities also snapped the face to Core voxel levels. The owner Gradient path now clears that gap with positive signed distance and writes negative signed distance below the face, allowing the mesh to interpolate its height. The after profile follows the resolved hash surface at every sampled radius. Match error fell from RMS `0.361765 m`, p95 `1.016178 m`, max `1.304169 m` to RMS `0.110357 m`, p95 `0.218531 m`, max `0.248818 m` (one Core voxel is `0.25 m`). Before/after captures use the same color ramp and bounds: - [L29 height map](captures/fi-floor-gradient-before-heightmap.jpg), [fixed height map](captures/fi-floor-gradient-after-heightmap.jpg) - [L29 readable render](captures/fi-floor-gradient-before.jpg), [fixed readable render](captures/fi-floor-gradient-after.jpg) ## Transition captures The maps cover the full 640×640 surface and are all below 300 KB. Gradient is the owner world without a mode override. Hard and Interleaved use fixture overrides; the resolved layouts record those modes. - [Hard](captures/transition-hard-heightmap.jpg) — flat interface. - [Gradient](captures/transition-gradient-heightmap.jpg) — owner field. - [Interleaved](captures/transition-interleaved-heightmap.jpg) — fixture override. ## Cost Five alternating W12 pairs, hashing off and `cache_hits=0`. First table is the separable speed-only build, whose hashes remain L29-identical. Second table is the final version-16 build. | Recipe | L24 | L29 | L30 speed-only | vs L24 | L30 final | vs L24 | |---|---:|---:|---:|---:|---:|---:| | SurfaceWorld | 1.566 s | 1.653 s | 1.606 s | +2.55% | 1.530 s | +2.68% | | FloatingIslands | 16.625 s | 16.779 s | 16.470 s | −0.93% | 16.543 s | +0.21% | Counter-enabled runs on the same plain W12 workload locate the saved work: | Recipe | Boundary calls | Window checks → evaluations | Fade calls | Boundary tile / point culls | Column Z tests → guards → radial rejects | SDF calls | |---|---:|---:|---:|---:|---:|---:| | SurfaceWorld | 19.95 M | 3.54 M → 739 k | 8.2 k | 8.99 M / 8.96 M | 1.87 M → 1.85 M → 1.58 M | 18.4 k | | FloatingIslands | 66.33 M | 8.00 M → 2.68 M | 8.6 k | 38.25 M / 23.63 M | 8.17 M → 8.14 M → 6.82 M | 83.4 k | The fade-tile cull skips 731 k SurfaceWorld and 2.67 M FloatingIslands fade evaluations; the column guard exits on nonpositive field values 272 k and 1.27 M times. Timing comes from uninstrumented binaries; the counts above use counter logging. ## Hashes and audits The speed-only v15 build matches all 12 L29 hash records for each recipe/compiler/worker matrix (W1/W8/W12), and all 12 records for each 24 m crossing matrix. That is 24 exact comparisons; all pass. The final v16 build is deterministic across both compilers and all worker counts, in the normal and 24 m crossing runs. Representative W12 hashes (`density / mesh / payload / topology`): | Recipe | Full detail | Whole view | |---|---|---| | SurfaceWorld | `ace56c8f205238ad / a9c603a1248de6b8 / ea55f1f4fcc6a894 / 5ea7bc78a1b678ae` | `0e8c5af01df96b14 / 70099e89b77811ed / dbce0fdcf6764126 / ddaf81a1228f9b4b` | | FloatingIslands | `ed550e0c8b182695 / 0e410a8e80a3e7f7 / 0751926f0c67d8a4 / f01208bc2f7841ec` | `4ee19ea6b6406ca6 / be648f94c899b47e / 310b525f31604f98 / 10366eb6dfce2384` | Exact-query hashes also match across v16 runs: SurfaceWorld `c949c4df2ce6f9d9 / 114c501e2d830d94 / e6011d3a248d4849`; FloatingIslands `7b7c50ac24ccadcc / efcba20c0c70c415 / e604823a249029bf`. - Interface audit: all 12 compiler/recipe/mode combinations pass; 4,221 columns each, zero holes and air samples, both negative controls reject. - The 16 L29 fixture-matrix replays pass passage safety/open-air, validator controls (10/10), L13 route parity, L9 proof checks (zero violations), and walkability. `FloorProfileBlend` still reports 2.544 vox in style 1 and 3.645 vox in style 3, unchanged from L29. - Audit scope caveat: the L29 files named `floating-islands` were run with `--recipe=surface-world`. With the actual `--recipe=floating-islands` option, the rock-column audit fails on all four styles on both L29 and L30: connected ends are 1/2, 3/4, 1/2, 3/4. The open-air audit passes. This is inherited, but means the L29 report's “two recipes” matrix did not exercise the FloatingIslands CLI recipe. ## Failed and retried runs - Broad air-gap experiments first lost a SurfaceWorld style-2 support sample. Route/radius masks and support restoration then caused open-air violations. Widening the fade restored that case, but measurement placed the ring far outside the fade, so those variants were discarded. The final owner-only gate and signed-distance face pass the targeted support audit. - Early speed variants missed the target: tile-only `+4.04%`, Z-point `+3.11%`, scalar path `+4.33%` vs L24. The final band and fade-tile culls meet the target. - The first counter-instrumentation compile failed; the counter hook was corrected and rebuilt with Clang and GCC. One duplicated timing sequence was discarded; only the clean five-pair runs are reported. - The first 24 m crossing comparison supplied an extra camera override and mismatched. Rerunning with the L29 camera setup and only `--camera-step=24,0,0` matches all hashes. - An early Hard export hit `std::bad_alloc`; retry passed. The first EGL render used an unwritable cache; retry with `XDG_CACHE_HOME` under `Saved/Linux/l30` passed. The first map conversion also stopped before the Hard/Interleaved maps; both were rerun individually and have full raster coverage. - The first passage-matrix summary script assumed a different marker order and reported failure; checking each audit marker by name confirms the core matrix passes. A `check=True` true-recipe control runner stopped on the expected L29 exit code 10; rerunning while recording return codes confirmed the same four inherited rock-column failures on L29 and L30. No build or run exceeded 30 minutes or remained stuck for 15 minutes. Builds and runs used CPUs 0–11, at most 12 workers, normal priority, and the 6 GiB address-space cap. No Unreal build was attempted. ## Orchestrator review (Claude) - Merged: the ring was a real field defect (air-side gap left solid, face snapped to voxel levels), now fixed (RMS 0.36 → 0.11 m). Cost back to SW +2.7% / FI +0.2% vs L24. The speed part is bit-identical; final v16 is deterministic. - Still visible: `fi-floor-gradient-after.jpg` shows faint concentric lines. Unknown whether that is residual geometry (≤0.25 m steps) or the readable shader's height-tint banding; L31 measures it. - **Important finding (thanks to Luna's caveat):** L29's "both recipes" passage matrix ran SurfaceWorld twice. On the real `--recipe=floating-islands`, the rock-column connected-ends audit fails in all 4 styles (1/2 or 3/4). Since L27, FI column results were never really tested. L31 priority.