Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Linux30/REPORT.md
T
Fr0zkaandClaude Opus 5.5 103d8b471e wip(assembler): round L30 -- FI floor ring defect fixed; transition cost recovered
The Gradient interface left native solid density in the air-side gap and snapped the face to
voxel levels (concentric ring steps on the FI floor). The owner Gradient path now writes signed
distance both sides; match error RMS 0.36 -> 0.11 m. Band and fade-tile culling cut transition
cost: whole view vs L24 SW +2.7%, FI +0.2%. Evaluator 16. Deterministic across compilers and
workers; interface and passage audits pass. Found: on the real FloatingIslands recipe, the
rock-column connected-ends audit fails (all styles); earlier matrices ran SurfaceWorld twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSFYgsdW8ejZSyiMf4qRSX
2026-10-21 11:40:27 +02:00

7.6 KiB
Raw Blame History

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:

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.

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.