Files
Fr0zkaandClaude Opus 5.5 87041290dd docs+tool(assembler): round L17 report; readable shading in the Linux capture tool
The capture tool gains --shade=readable (directional light, soft ambient, height tint) and an
optional --tile-edges overlay; display only. The L17 Core fix is NOT merged: its owner/Core chunk
scale change (8 m -> 4 m) moves every stratum and leaves the SurfaceWorld spawn camera over a void
(reviewer before/after renders). Kept on wip/l17-fi-scale. The FloatingIslands full-XY
boundarySeal cap is the likely real cause of the false floors and needs a separate minimal fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CSFYgsdW8ejZSyiMf4qRSX
2026-10-20 05:53:17 +02:00

12 KiB
Raw Permalink Blame History

VoxelForge L17 — FloatingIslands boundary report

Branch assembler/world, starting HEAD 9a7c87e. No cache code was changed. The shared evaluator version is now 7; the recipe schema stays at 1.

Cause and fix

FloatingIslands uses the sparse FloatingIslandFieldV1 manifest field. SurfaceWorld uses the separate planar Heightfield2D field. The owner voxel is 12.5 cm and the Core voxel is 25 cm, so one 32-voxel owner chunk is 16 Core voxels / 4 m. Several shared paths divided Core positions by 32 directly, treating that chunk as 8 m. That doubled stratum bounds, selected the wrong generator route near the SurfaceWorld boundary, and made the legacy layer envelope extend over empty FloatingIslands space.

The FloatingIslands boundarySeal also had been applied as a solid cap over all XY. At the owner’s flat-square probe (-11.612444,-118.221237) m, the raw island field is air: at Z=3.25 m it was +81,809 subvoxels. The old seal added −82,065, yielding −256 (−1 Core voxel, or −25 cm); at Z=3.50 m it yielded −1 subvoxel (−0.098 cm), then air again at Z=3.75 m. The wrong 8 m legacy layer bound produced a second false top near Z=8 m (old world density at 7.75 m was −0.743 Core voxels; at 8 m it was +0.073). The owner’s 4.5 m LOD0 jump is real mesh geometry created by those bad boundaries, often inside a tile; it is not a renderer artifact or island relief. Nested clipmap rectangles made its placement look like a tile-boundary-only issue.

The fix uses the resolved owner/Core scale for manager lookups, layer bounds, readiness, and adjacent native strata; removes the XY-wide FloatingIslands seal cap and its all-solid proof; and clips adjacent native FI/SW signed-distance fields at their shared physical boundary. This is in Core and applies to every generator route. SurfaceWorld still uses Heightfield2D.

The cave-floor lead does not match the samples. Cave and floor influence were exactly zero at the flat square, the island center, and the sampled ledge/ring point. The native FI field and its island or connector bounds account for the surface. The owner world compiled 70 rooms, 69 tunnels and 2 passages in this run; those legacy primitives do not contribute to the measured FI ledge.

Before/after measurements

RingProbe.py samples upward-facing mesh surfaces on adjacent XY tile edges only when the tiles’ vertical bands overlap. Values are median / p95 / maximum absolute height difference, in cm. n/a means this sparse-island export had no same-band LOD0↔1 surface pair after removing the false cap; it is not a zero-error result. Higher rings include the deep SurfaceWorld boundary and other deep surfaces, so those rows are not all FloatingIslands ground.

LOD edge Before (cm) After (cm)
0→1 3.451 / 8.920 / 449.158 (266 samples) n/a (no same-band pair)
1→2 26.642 / 148.262 / 149.862 (514) 0 / 0 / 0 (234)
2→3 0.134 / 198.730 / 773.318 (596) 0 / 0 / 0 (207)
3→4 3.269 / 47.875 / 188.531 (277) 0 / 0 / 0 (288)
4→5 29.975 / 130.496 / 445.444 (544) 0 / 0 / 30.957 (258)
5→6 12.234 / 127.224 / 536.573 (266) 12.234 / 127.224 / 536.573 (266)
6→7 29.013 / 301.752 / 42,624.479 (264) 28.892 / 291.861 / 945.477 (264)
7→8 83.843 / 1,225.416 / 3,755.407 (275) 83.843 / 1,225.416 / 3,755.407 (275)

The valid worst pre-fix LOD0↔1 sample is the false cap: 3.500 m vs 7.992 m, a 449.158 cm difference. Upward-face within-tile span p95 / maximum changed from 4.490 / 4.491 m to 1.186 / 1.927 m on LOD0. The remaining LOD0 span is the actual island shape. LOD1–3 after-fix upward faces at the measured lower boundary are exactly at −60 m. The island tops around the matched camera are roughly −30 to −25 m.

A separate exploratory column comparison initially reported a 34.7 m difference by pairing an island top near −25 m with a −60 m SurfaceWorld surface from a vertically disjoint tile. That comparison was rejected: it is not a same-band ring seam. The saved RingProbe.py output is the cross-LOD evidence used above.

History, viewer and SurfaceWorld

Prebuilt L7, L9, L12, L13 and L14 binaries/logs all have the same legacy hashes: whole-view D/M/P/T 92ba6a57a8690c00 / 9c6b56dfab6241c9 / 82394dd7c368a061 / 445e40bdb69b0bdb; full-detail 93ee3b6fb6b446f3 / 3ebc72d2027ab80b / cd5f55a96de12458 / 2f61c29af247b547. The pattern predates L7; these measurements show no output change at L9 or L13. S9 e7586a1, S12 212814a and S14 ec2afe9 do not contain the headless pipeline source, so they cannot be measured this way. No old commit was rebuilt: git worktree add failed because .git/worktrees is read-only, and the available old binaries were used as-is.

The headless mesh export has nonempty tiles at all LODs 0–8 (matched view counts: 15, 64, 40, 48, 48, 96, 48, 48, 153). The standalone viewer initializes all nine bShowLevel flags to true and its draw loop visits all streaming batches. There is no evidence that a whole LOD is absent from generated data or globally filtered by the viewer. The screenshot’s dark square cannot be mapped to a particular tile/LOD from this Linux export; a localized viewer draw/upload or camera issue remains unconfirmed. No viewer change was made because the Windows D3D11 build and capture are unavailable here. The Unreal comparison does not identify the cause of that square.

SurfaceWorld L1 hashes changed for the shared coordinate fix. Old L14 LOD1 D/M/P/T was 5043975b1e5b5a3d / 1c2a5658f10fdeaa / 23b6779ef35c3a0a / 1a6d2e2d152b4f84; L17 is 393ad79fd8c07132 / 47c9ba17e9f5ceaa / d5d6a948ac880e17 / 8b85ea08b2c440c4. Before, readiness was 0/27; now it is 27/27 on the near ring. The old mapping selected the wrong route at the SurfaceWorld stratum; the corrected mapping selects its manifest Heightfield2D plan. Page/native route parity and exact queries pass, so this is the intended shared-route output change.

Gates, captures and limits

All 28 determinism rows passed: FI and SW, Clang 19 -ffp-contract=off and GCC 14 default, W1/W8/W12 with five W12 repeats. Each recipe had one unique full, whole, nine-LOD and exact-query hash tuple across all configurations. FI whole-view D/M/P/T is 8339509b4d5ec231 / 70e5b2b9085b517c / 4e72e53745f20ed0 / 1a2643e5138e0407; SW whole-view is b286ee4f4c38b7fc / 6862deb8ab9c2af9 / f23480a4953457f9 / 62977edfd04b3afe.

FI route parity: 8 page pairs, 14 higher-LOD exact pairs, 782,026 exact samples, zero mismatches; uniform proof: 19,288 blocks / 25,672,328 samples / zero violations. SW: 5 page and 9 native-only pairs, 814,625 exact samples, zero mismatches; uniform proof: 13,297 blocks / 17,698,307 samples / zero violations. Readiness negative controls were caught. The Clang FP-contraction-off and GCC default builds passed; the Core startup FP self-test did not reject either. No async/MPSC/Epoch code changed; FLazy, shared column caches, L9/L12 proof paths and L13 route binding remain in the tested build.

Readable Linux capture mode adds directional light with soft ambient, gentle height tint, and an optional faint tile-edge overlay. Five 1600×900 JPEGs, all below 300 KB, are in captures/:

  • floating-islands-flat-square-before.jpg / floating-islands-flat-square-after.jpg: same owner probe camera (-11.6124,-118.2212,-19.8452) m, yaw 0, pitch 0, before/after.
  • floating-islands-island-view-before.jpg / floating-islands-island-view-after.jpg: same low island camera (-22,-19,-22.8) m, yaw 0, pitch −4°, before/after.
  • surface-world-l1-readable-tiles.jpg: SurfaceWorld L1 sanity view, camera (0,-35,30) m, yaw 0, pitch −60°.

All are 1600×900 JPEGs; SHA256 is included for byte-level review.

Capture Bytes SHA256
floating-islands-flat-square-before.jpg 70,166 c41ed7645735ebefea97fbc1aed167b66a3e06c019c25b1c7d8cae9449713999
floating-islands-flat-square-after.jpg 47,612 f8fb5f937ac65be9db70a41473c7a10d7f35943ba6ef5c94ab03fde9ded5c544
floating-islands-island-view-before.jpg 70,813 5c7a8eda446f51a51ab22e45ed7286bf4180e69d8e3b2180780349facadacd32
floating-islands-island-view-after.jpg 51,429 3aeedef903fce62e81ea1f07bb460dd2beb42b893bbd9bf29220973951295b4c
surface-world-l1-readable-tiles.jpg 53,351 23f1753ed100c87607e22d2adc4f8e8a2856b8af3f1d37aa4f4cec9420a92b93

Clang/GCC compile peak RSS was 435,588 / 902,000 KiB. Determinism peak was 538,140 KiB; FI/SW route-audit peaks were 621,404 / 763,112 KiB. The governor remained powersave; runs were limited to CPUs 0–11, at most 12 workers, 6 GiB address space; llvmpipe used 12 threads.

Failed or retried attempts

  • The first headless invocation omitted the explicit owner-world input; it was rerun with Standalone/data/owner_world.json.
  • An initial SurfaceWorld export failed the native-only readiness guard; corrected owner/Core mapping and rerun passed.
  • A SurfaceWorld --max-clip-level=1 attempt expanded to 35,435,983 tiles and failed the bounded compiler (20.985 s, 3,988,160 KiB peak RSS). Retried with --max-level=1 (960 tiles), which passed.
  • BoundaryProbe.py was first called with unsupported named Z arguments; rerun with positional bounds passed.
  • The first XY-only ring comparison mixed vertically disjoint surfaces; replaced by the overlapping-band RingProbe.py used above. The exploratory column probe was also rejected for pairing different vertical bands.
  • The first offscreen SurfaceWorld command reversed scene/output arguments and failed to open the mesh; rerun with the documented order passed.
  • The first density-probe invocation used Standalone/data/owner_world.json without a resolved FI manifest and failed. It was rerun with Saved/Linux/l17-fi-owner-snapshot.json and passed.
  • /usr/bin/time was unavailable and an early process monitor mishandled a zombie child; the process-tree monitor in MeasureBuild.py replaced both attempts.
  • git worktree add could not write .git/worktrees; no worktree was created and no old commit was built outside the repository.
  • Mesa could not create /home/jahni/.cache in the read-only environment, disabled shader caching, and completed all captures. No file was written outside the repository.

Windows confirmation

Run from the repository root on Windows to capture the low island view:

VoxelForgeCoreStandalone.exe --world-assembler-prototype --recipe=floating-islands --clip-radius=3 --max-clip-level=8 --workers=12 --camera=-22,-19,-22.8,0,-4 --capture=Standalone\Research\WorldAssemblerM3\Linux17\captures\floating-islands-windows.png --frame-limit=60

For isolation, repeat with --capture-only-lod=0 through --capture-only-lod=8, changing the capture filename each time. Please send the all-level image and the isolated image matching the dark square; those will identify whether it is a per-tile draw gap or a particular LOD payload.

Orchestrator review (Claude) — NOT MERGED

  • The fix breaks SurfaceWorld. I exported the L1 view (camera 0,-35,-487.94) from L14 and from L17 and rendered both in the new readable mode (Saved/Linux/claude/sw/{before,after}-{l1,hz}.jpg). After L17, the ground under the spawn camera is gone (black void below), the terrain sits far away, and the mesh export shrank from 58.7 MB to 31.7 MB. Halving the strate chunk size (8 m → 4 m) moves and squashes every stratum: a world change, not a fix.
  • What the approved world uses: the Core world the owner played and approved places strata with 8 m chunks (32 Core voxels of 25 cm). The "owner chunk = 4 m" claim must be checked against what the Unreal Core route actually does (AVoxelWorld::CoreVoxelSizeCm, the Core bridge, ResolvedWorldSnapshot), not assumed.
  • Probably real and separable: the FloatingIslands boundarySeal applied as a solid cap over all XY (the false floors at 3.5/8 m). That needs its own minimal fix with SurfaceWorld unchanged.
  • Still open in FloatingIslands after the fix: dark tile-aligned rectangles on the ground (the L17 "after" captures, lower left).
  • Kept on side branch wip/l17-fi-scale. Only the capture tool's readable shading (LinuxOffscreenCapture.cpp) is taken into assembler/world.