# 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: ```bat 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`.