- 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
9.4 KiB
Revised ranked divergences
-
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 headlessprobe-max8-old-camerausedworkers=12,clip_radius=3,max_level=8and 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; atj=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]
IsRockusesEvaluateFastwhen the point is outside the compiled region; inside, it reads the compiledRockWordsbit. 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;IsRocktherefore took theEvaluateFastpath there. The L69 headless and Unreal logs say the point is solid in the wider compile. clipmap math headless fine bounds Unreal fine boundsThis 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
IsRockresult, 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. -
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 usesBuildFiniteStrateRoute; 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. -
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
FloatingIslandsRecipeflag is false. With no canonical exported Core-plan pair, headless takesAttachRound1WorldAssemblyPrototype; it callsAttachFloatingIslandWorldAssemblyonly 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]
BindResolvedStratumFieldssetsBound->IslandPlanonly when it finds an FI plan with the exact live strate index and top/bottom bounds.NativeFloatingIslandDensityAtthen returns false on!Bound->IslandPlanat line 6604. The owner log’scompiled-analytic/FloatingIslandsdispatch confirms the fallback path; it does not print the pointer. So for the default headless owner run,Bound->IslandPlan == nullptris inferred from the code path and dispatch log, not read as a runtime value. binding gate owner dispatchThis 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. -
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 lackedlayout_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 logsgenerated_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_configand apassagesarray, butOwnerWorldLoaderrebuilds the manager withInitializefrom 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.