- Export commandlet writes the live Core adapter's world_assembly + resolved layout pair; the headless owner path imports that pair (manifest/layout equal, layout_chunk_width_q validated). owner_world.json re-exported from the owner's staged assets on the Linux host. - Adapter SW route: Core clearance/radius floors, 0.5 m support search, outward-facing tie-break; passage mouth/mid radius floors match Core (36/24 owner voxels). - FI in Unreal now uses the legacy (compiled analytic) generator unless a plan is imported: the auto native-FI plan failed the passage audit on the owner plan (1843 blocked samples, 945 open-air violations). Owner decides whether native FI returns. - In-engine spawn traces per strate (3 each): SW GenerateTile 42.7 worker-s vs 20.1 headless for equal tile counts; LOD0 p95 45-169 ms in UE. - Fast tier green; all three passages pass on the shared plan. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
41 lines
9.4 KiB
Markdown
41 lines
9.4 KiB
Markdown
## Revised ranked divergences
|
||
|
||
1. **The audit’s compiled region changes which solidity query it uses.** **Changed:** this replaces the surface route builder as the top explanation. **Code read: both Unreal and headless bounds construction, plus the shared Core query.**
|
||
|
||
**[REPORT]** L68’s owner run used `workers=1`, `clip_radius=1`, `max_level=0`; its logged volume was only `(-64,-64,-2048)..(64,64,-1920)` and it passed. L69’s headless `probe-max8-old-camera` used `workers=12`, `clip_radius=3`, `max_level=8` and failed at the *same* voxel as Unreal. Both logs have the same source stamp, surface-plan hash, and resolved-layout identity. [L68 log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l68/logs/final-clang-owner.log:2>) [L69 headless log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l69/probe-max8-old-camera.log:2>) [L69 Unreal log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l69/traces/failed-strate0-trial1-default-settings.stdout.log:1113>)
|
||
|
||
**[CODE]** The validator samples manager passage segments every 0.5 Core voxels, rounds each coordinate, then calls `IsRock`. From the logged segment endpoints, `Count=ceil(88.84/0.5)=178`; at `j=47`, `T=47/178`, interpolation gives about `(-171.54,-138.40,-1794.15)`, which rounds to `(-172,-138,-1794)`. That is the logged first failure. [validator](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:10913>) [segment log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l69/traces/failed-strate0-trial1-default-settings.stdout.log:1113>)
|
||
|
||
**[CODE]** `IsRock` uses `EvaluateFast` when the point is outside the compiled region; inside, it reads the compiled `RockWords` bit. The region bounds are inclusive, and Core pads the requested minimum by only two voxels. [IsRock](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6066>) [Contains](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6946>) [build bounds](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:2358>)
|
||
|
||
**[INFERENCE, hand-derived]** In the L69 headless probe, the camera is at −374.569336 m; with 25 cm Core voxels that is about −1498.28 voxels, giving camera chunk −47. With clip radius 3, the level 1 ring’s lowest aligned tile is −28; at 64 voxels per tile, its origin is −1792. Two-voxel build padding makes `MinZ=-1794`. Levels 0 and 1 are full resolution (`full_res_clip_levels=2`), so the sample lies exactly on the inclusive compiled-region boundary. Its X and Y are also within that region. The L68 request filtered to level 0 and its logged bounds put this point outside; `IsRock` therefore took the `EvaluateFast` path there. The L69 headless and Unreal logs say the point is solid in the wider compile. [clipmap math](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/VoxelForge/Private/VoxelClipmapDesiredTiles.h:129>) [headless fine bounds](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamBenchmarkPipeline.h:1942>) [Unreal fine bounds](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:7717>)
|
||
|
||
This explains how the L68 pass can miss the compiled-region result at this point; it does **not** identify which primitive or density term set the compiled bit solid. The logs contain only the `IsRock` result, not its density or contributor. The worker count, camera, and clip settings also changed between L68 and L69, so their individual effects are not isolated.
|
||
|
||
2. **The two surface route planners produce different plans, but that does not explain this sample.** **Demoted from the prior top claim. Code read: both planners and the shared passage planner.**
|
||
|
||
**[CODE/REPORT]** Unreal’s adapter has its own bounded `BuildFiniteSurfaceRoute`; L69 selected center `(32,80)`, direction 6, half-length 16, and resolved the departure at `(8,16)`, floor −373.205 m. Headless uses `BuildFiniteStrateRoute`; its L69 log reports departure `(0,0)`, floor −375.819 m, and a lower reach clamp from 318.539 m to 232.500 m. [adapter route](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:248>) [headless route](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/WorldAssemblyPrototype.h:45>) [Unreal log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l69/traces/failed-strate0-trial1-default-settings.stdout.log:1055>) [headless log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l69/probe-max8-old-camera.log:41>)
|
||
|
||
**[CODE]** The walkability validator checks `Owner->Manager->GetPassages()` control points; those are distinct from the adapter’s SurfaceWorld route. **[REPORT]** The headless L69 run with its `(0,0)` route fails at the exact same sample. So the route-planner difference is real, but it does not reproduce the claimed Unreal-only failure.
|
||
|
||
3. **Native FI has no plan in the default headless owner run.** **Code read: both the headless assembly path and the Core binding/dispatch path. Runtime pointer value: inferred, not logged.**
|
||
|
||
**[CODE]** The default `FloatingIslandsRecipe` flag is false. With no canonical exported Core-plan pair, headless takes `AttachRound1WorldAssemblyPrototype`; it calls `AttachFloatingIslandWorldAssembly` only when that flag is true. The default prototype adds a SurfaceWorld plan, not an FI plan. [default flag](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamBenchmarkHeadless.cpp:65>) [plan-source branch](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamBenchmarkHeadless.cpp:1698>) [conditional FI attach](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamBenchmarkHeadless.cpp:1747>) [surface-plan append](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/WorldAssemblyPrototype.h:901>)
|
||
|
||
**[CODE]** `BindResolvedStratumFields` sets `Bound->IslandPlan` only when it finds an FI plan with the exact live strate index and top/bottom bounds. `NativeFloatingIslandDensityAt` then returns false on `!Bound->IslandPlan` at line 6604. The owner log’s `compiled-analytic/FloatingIslands` dispatch confirms the fallback path; it does not print the pointer. So for the default headless owner run, **`Bound->IslandPlan == nullptr` is inferred from the code path and dispatch log**, not read as a runtime value. [binding](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:361>) [gate](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6592>) [owner dispatch](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l68/logs/l66-owner.log:89>)
|
||
|
||
This is an FI divergence, not the direct cause at −448.5 m: the failed point is in the logged SurfaceWorld slot `[0,-63]`, while FI begins below it.
|
||
|
||
4. **The stale imported manifest is a separate branch, not the L69 default failure path. Units and width mostly converge when regenerated.** **Code read: both export/import sides; the stale bounds are report evidence.**
|
||
|
||
**[REPORT]** The imported FI plan had chunks `[-79,-16]` versus the live slot `[-93,-64]`, and the saved manifest lacked `layout_chunk_width_q`. **[CODE]** An imported plan with those bounds cannot bind to the live FI slot because the binder requires exact bounds equality. But L69’s failing Unreal run logs `generated_at_startup`, so that imported plan was not the active plan in that trace. [L69 report](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Linux69/REPORT.md:45>) [binding equality](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:366>) [generated-plan log](</home/jahni/VoxelM/Plugins/VoxelForge/Saved/Linux/l69/traces/failed-strate0-trial1-default-settings.stdout.log:1061>)
|
||
|
||
**[CODE]** Unreal derives width from the live manager and serializes Core/owner voxel sizes; headless uses root micrometres or the settings’ metre value, then computes Core width. Both resolve the effective 8 m layout width and 25 cm Core voxel size for the owner data. [Unreal serialization](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:2070>) [headless width fallback](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/OwnerWorldLoader.h:420>)
|
||
|
||
**[CODE]** The exporter writes both per-strate `passage_config` and a `passages` array, but `OwnerWorldLoader` rebuilds the manager with `Initialize` from the serialized strate settings; it does not load the exported passage points. Thus both Core paths regenerate manager passages instead of consuming that array. [export](</home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp:13813>) [loader](</home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/OwnerWorldLoader.h:449>)
|
||
|
||
## Smallest one-source design
|
||
|
||
Make the adapter’s existing canonical `ResolvedWorldSnapshot` the required owner input: export its `core_world_assembly_json` and `resolved_layout_json`, including exact units, layout width, live slot bounds, FI plan, and resolved passage geometry. The export commandlet already writes that pair. Make headless require and strictly validate it instead of generating a second SurfaceWorld route or omitting FI. Have the validator consume the same resolved passage geometry used by composition, and reject stale plan bounds or missing width rather than silently falling back.
|
||
|
||
The immediate finding is narrower: L68’s small compile window let this sample take `EvaluateFast`; L69’s wider compile put it on the packed-rock path, where both headless and Unreal report it solid. The packed-path density cause remains unidentified. |