Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Linux28/REPORT.md
T
Fr0zkaandClaude Opus 5.5 f23ab7b9fa wip(L28): passage columns/routes culled per tile (BVH); cost back near L24, bit-identical to L27
GenerateMesh scopes passage queries to the tile's sample bounds with a feature AABB BVH plus
per-passage segment BVHs; L9 proof boxes use a passage-bound BVH. Whole view vs L24: FI ~0%, SW
+3.7% (reviewer interleaved). All hashes equal L27; all passage/route/proof audits pass.

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

8.1 KiB
Raw Blame History

Linux L28 — tile-bounded columns and passages

Branch: wip/l25-helix, based on L27. No commit. No Unreal files changed.

Cost and culling

The plain interleaved baseline puts the L27 overhead in tile streaming/meshing, not shape compilation: mean whole-view time was 2.058 s versus L24's 1.527 s for SurfaceWorld (+34.8%), and 19.961 s versus 16.699 s for FloatingIslands (+19.5%). Shape time stayed near 0.46 s (SurfaceWorld) and 0.97 s (FloatingIslands). The initial extra work was passage composition inside the map-wide density sampling loop.

GenerateMesh now enters a passage-query scope using the exact inclusive tile sample bounds, including the normal halo. A conservative feature AABB BVH supplies candidate route segments, columns and mouth support. Long route nearest-distance searches use a per-passage segment BVH. L9 proof boxes use a separate passage-bound BVH; disjoint roots reject far boxes without scanning segments. If a native-only negative-control shape has no proof index, its box check falls back to a conservative linear test.

Instrumented full-view counts (diagnostic build; 2,370 desired tiles):

Recipe Composition samples Column guard: calls / tiles Exact column SDF: calls / tiles Route band samples / tiles Route SDF unions / tiles Route samples skipped / tiles Feature candidates: tiles / total
SurfaceWorld 12,039,941 1,885,887 / 692 3,017 / 4 1,380,907 / 870 164,337 / 543 7,470,572 / 1,792 8 / 1,222
FloatingIslands 58,019,623 7,619,575 / 689 7,213 / 6 1,902,086 / 708 62,507 / 89 54,848,675 / 2,212 14 / 1,331

The exact column SDF is spatially culled. The cheaper radial guard remains in tiles sharing the column's Z slab because positive SDF values can lower positive base density; a broader tile skip would need an exact bound on that field. This is part of the remaining SurfaceWorld cost. Per composition sample, the profile counted 0.125 carve-segment tests, 0.036 support-segment tests and 0.0136 route SDF unions in SurfaceWorld; FloatingIslands counted 0.0125, 0.0028 and 0.00108. Column guards ran on 15.7% / 13.1% of samples, while the complex column SDF ran on 0.025% / 0.012%.

Interleaved whole-view cost

Five W12 quartets ran in order L24, L28a, fresh L27-source build, L28b. Hashing was off. Values below are means of the five samples; raw samples are in Saved/Linux/linux28-r28-finalfix-cost5-{recipe}-{l24,l27,r28a,r28b}-p1..p5.log. L24 used Saved/Linux/l24-source/bin/linux/VoxelForgeCoreHeadless-linux24-clang19; L27 was rebuilt from the current L27 source for this comparison.

Recipe L24 L27 L28a L28b L28a / L28b vs L24
SurfaceWorld 1.527 s 2.058 s 1.592 s 1.605 s +4.30% / +5.12%
FloatingIslands 16.699 s 19.961 s 16.651 s 16.787 s -0.29% / +0.53%

FloatingIslands returned to L24 cost. SurfaceWorld misses the ~3% target by 1.3–2.1 percentage points. Its remaining excess is about 69–80 ms in streaming wall time and 13–15 ms in shape time; the density-aware radial guard and per-tile query setup/traversal remain. The guard cannot be removed bit-exactly without a proven upper bound on the incoming positive density.

Bit parity and audits

Final Clang and GCC binaries match L27 for both recipes at W1, W8 and W12: all 12 hash records per run match (full detail, whole view, LOD0–8, exact query). This is 12 compiler/recipe/worker combinations with zero mismatches. Logs: Saved/Linux/linux28-r28-hash-finalfix-{clang,gcc}-{surface-world,floating-islands}-w{1,8,12}.log.

Representative hashes, equal to L27:

Recipe Full detail: density / mesh / payload / topology Whole view: density / mesh / payload / topology Exact query: density / detail / collision
SurfaceWorld ace56c8f205238ad / a9c603a1248de6b8 / ea55f1f4fcc6a894 / 5ea7bc78a1b678ae 117547e5e18c6847 / db5fa276315ff2d4 / b4e9d01d70413fea / 03caf881fa047f1c c949c4df2ce6f9d9 / 114c501e2d830d94 / e6011d3a248d4849
FloatingIslands ed550e0c8b182695 / 0e410a8e80a3e7f7 / 0751926f0c67d8a4 / f01208bc2f7841ec 70ab5bc87dd174d2 / 6f357f9085a496f0 / 08ce7d4e036da65a / eb5eef04a5cb85d9 7b7c50ac24ccadcc / efcba20c0c70c415 / e604823a249029bf

The 24 m crossing matches fresh L27-source builds on both compilers and recipes: SurfaceWorld, 314 tiles: density 3561ea23485e359f, mesh e8331620fb0fb908, payload 765f7dad67c852aa, topology 3ccc09ac81c05d71. FloatingIslands: density e3d0ea833bca4215, mesh 6b3d0f148ed83d93, payload d6ed85f16acd895e, topology 9745683036522461.

Across 4 styles × 2 recipes, capsule walkability, open air, naturalness, no-long-bridge, strict-validator controls, route bindings and passage audits pass on final Clang/GCC binaries. Final passage logs are Saved/Linux/linux28-r28-finalpassage-{clang,gcc}-{surface-world,floating-islands}-style{0..3}.log.

The final route/proof/readiness matrix also passes in all 16 compiler/style/recipe runs: L13 route parity verifies 8/8 page pairs and 14 higher-LOD exact pairs with zero mismatches; the readiness guard catches its negative control; L9 reports zero proof violations. SurfaceWorld has 0 unknown blocks; FloatingIslands has 21,504 fallback/unknown blocks for each style. The diagnostic full-view profile queried 26,946 FI proof boxes with only 40 path-bound and 1 column-bound tests, so far boxes reject at the BVH root. These unknowns are not evidence of a fat passage bound. A fresh rerun of the saved L27 binary with the default owner input also reports 21,504; older L27 logs showing 17,408 did not reproduce. Final matrix logs are Saved/Linux/linux28-r28-finalmatrix-{clang,gcc}-{surface-world,floating-islands}-style{0..3}.log.

Two inherited SurfaceWorld FloorProfileBlend checks remain over the 2-voxel threshold in styles 1 and 3: 2.544 and 3.645 voxels. The same failures and values are in L27 logs for both compilers; other styles pass.

Invariants, edits and run history

Changed Core files: Standalone/Core/src/ShapeWorldInternal.h and Standalone/Core/src/VoxelForgeCore.cpp. Navigation/design docs and this report were updated. No Unreal edits or Unreal compile. L3 FP-contract preamble/self-test, L4 FLazy, L7 shared cache, L9/L12 proof rules, L11 readiness, L13 route binding, L18/L19 shared ceiling, L21/L22 layout and bands, L23–L27 passage behavior, ARCHITECTURE §8.10 and CLAUDE.md async rules remain intact.

Failed or retried runs:

  • First parity/readiness command omitted --stream-benchmark and --stream-pipeline; rerun with both.
  • Initial readiness negative-control crashed on an empty proof BVH in a temporary native-only shape. Added the conservative no-index fallback; final readiness checks pass.
  • The first final W1 hash command omitted the explicit owner data path and failed to open data under Saved/Linux. Preserved as linux28-r28-hash-finalfix-clang-surface-world-w1-attempt1-failed.log; rerun with Standalone/data/owner_world.json and all final W1/W8 hashes passed.
  • Initial moving-crossing comparison used stale L27 logs. Rebuilt L27 from source and reran; all four compiler/recipe hashes then matched.
  • Older saved L27 proof logs reported 17,408 FloatingIslands unknown blocks. Reran the saved L27 binaries and compared with final L28: both report 21,504, zero violations.
  • An exploratory composed-bound FloatingIslands W12 hash differed; the density-threshold variant restored equality and is the version measured here. An interrupted/empty Clang R15 build was rerun successfully.

No run exceeded 30 minutes or remained stuck for 15 minutes. Builds were Clang 19 and GCC 14, W12 CPU affinity 0–11, with the 6 GiB address-space cap. No commit, push or stash was performed.

Orchestrator review (Claude)

  • Re-run by me (W12, no hashing, interleaved): SW L24 1.455/1.485/1.484 s vs L28 1.502/1.539/1.555 s (median +3.7%). Accepted as the cost of the passage/column feature. FI is back to L24 cost.
  • Bit-identical to L27 (12/12 configs + crossing). With this, wip/l25-helix (L25–L28) is merged into assembler/world.
  • Note for later: the pre-existing SW FloorProfileBlend check over threshold in styles 1/3 (2.544/3.645 voxels) is unchanged since L27.