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
12 KiB
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=1attempt 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.pywas 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.pyused 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.jsonwithout a resolved FI manifest and failed. It was rerun withSaved/Linux/l17-fi-owner-snapshot.jsonand passed. /usr/bin/timewas unavailable and an early process monitor mishandled a zombie child; the process-tree monitor inMeasureBuild.pyreplaced both attempts.git worktree addcould not write.git/worktrees; no worktree was created and no old commit was built outside the repository.- Mesa could not create
/home/jahni/.cachein 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
boundarySealapplied 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 intoassembler/world.