Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Linux70/R37-researcher-notes.md
T
Fr0zkaandClaude Opus 5.5 bd68aee1ca parity: Unreal and headless resolve the same four-strate plan (L70, v214)
- 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
2026-10-27 06:22:48 +01:00

9.4 KiB
Raw Blame History

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 L69 headless log L69 Unreal log

    [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 segment log

    [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 Contains build bounds

    [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 headless fine bounds Unreal fine bounds

    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 headless route Unreal log headless log

    [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 plan-source branch conditional FI attach surface-plan append

    [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 gate owner dispatch

    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 binding equality generated-plan log

    [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 headless width fallback

    [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 loader

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.