# M3 Round 2 — FloatingIslands look and standalone gates **Result:** geometry version 2 gives the islands a deep, rough underside with separated tapered roots, variable-height placement, and broad arched connectors. Fresh matched CPU captures include overview, underside, edge/cliff, player-eye and route views. The measurable bounds, thickness, capsule-route and determinism gates pass. The native sample remains much denser than the owner field, so this is a deliberate routeable recipe rather than a visual-parity claim. ## Owner recipe and scale The legacy settings do not request a fixed island count. `IslandDensity=0.5` is a per-hashed-XY-site existence chance. The owner parameters are spacing 112 legacy voxels, radius fields 24–48 legacy voxels, thickness ratio 0.6, vertical jitter/top flatten 0.6, roughness 3, blend radius 6 and boundary seal 4. The production `Source` constant and plugin-root `CLAUDE.md` say a legacy voxel is 12.5 cm; Core uses 25 cm. Round 2 therefore queries the legacy field at twice each Core coordinate and maps owner lengths to Core lengths at 0.5 scale: | Setting | Owner | Round 2 Core | Physical intent at production scale | |---|---:|---:|---:| | Site spacing | 112 voxels | 56 voxels | 14 m | | Radius | 24–48 voxels | 12–24 voxels | 3–6 m radius | | Roughness | 3 voxels | 1.5 voxels | 0.375 m amplitude bound | | Blend radius | 6 voxels | 3 voxels | 0.75 m | | Boundary seal | 4 voxels | 2 voxels | 0.5 m | There is a scale conflict to resolve before importing this recipe. The frozen owner probe metadata and `Standalone/Source` mirror say 25 cm, and the radius comment describes 12–24 m diameters at that scale. Production `Source` and `CLAUDE.md` say 12.5 cm, which makes the same radius fields 6–12 m diameters. The audit uses the production 12.5 cm field, with legacy anchor `(48, 16, -1904.035)` mapped to Core `(24, 8, -952.016)`. Round 3 must fix the snapshot producer/metadata and publish one import scale contract; it must not silently choose between these interpretations. The native planner requires three route-connected primary islands, then uses the 0.5 density roll for optional off-route sites; this seed made one, for four islands and three connectors. That is a stated routeability constraint, not an owner fixed-count setting. Geometry version 2 adds a crust depth bonus of 0.15 radius and a root depth of 0.75 radius to the owner 0.6-ratio body. Total measured depth is 0.75 of island diameter. The deeper roots and guaranteed route account for the local density increase below. ## Visual review The round-1 reading was substantially right. Its low thickness ratio and `SmoothStep` taper drove the underside radius to zero at the bottom plane. The vanishing cross-section made the underside gradient collapse at a shared point and produced the radial crease/pinch. The old profile also had no independent roots, and its main route lay on a nearly straight chain. Version 2 gives the crust a broad, gently bowed bottom surface, then smooth-unions three or four seeded ellipsoid roots per island. Their lengths taper independently, so they do not converge at one apex. The bounded 6.3-Core-voxel contour warp breaks the silhouettes; 1.5-voxel surface roughness is faded to zero across a three-voxel surface band. The certified boxes include the contour warp, roughness and blend reach. The underside and edge captures show the additional mass and root lobes. The three primary islands form a bent, vertically fitted traversal. This seed also produces one higher side island that is not on the route. There are still three connectors because the route has to cross the three primary sites; they are 3 m wide, 1 m thick at the ends, and their underside sags by up to 2 m at midspan. Each is marked sharp-tag-ready. The captures show a rock-span profile rather than the old narrow straight rods, although the route-connected backbone remains visually legible as a chain. The route-island tops vary by about 0.67 m; the off-route island is about 1.46 m above the middle route island. The underside and edge captures are close views of the middle island so the larger cluster does not set their scale. The player-eye view is an offline perspective render from 1.8 m above the route floor, using the 25 cm Core voxel scale and the approximately 1.8 m player height. These are field-mesh review images, not Unreal camera, traversal, or collision evidence. | View | Capture | |---|---| | All five matched views | [Contact sheet](results/captures/contact_sheet.jpg) | | Cluster overview | [overview_matched.jpg](results/captures/overview_matched.jpg) | | Underside and roots | [underside_matched.jpg](results/captures/underside_matched.jpg) | | Thick crust and edge/cliff | [edge_cliff_matched.jpg](results/captures/edge_cliff_matched.jpg) | | Player-eye toward next island | [player_eye_matched.jpg](results/captures/player_eye_matched.jpg) | | Planned route | [route_matched.jpg](results/captures/route_matched.jpg) | The CPU renderer lowered its process priority. All images are 640×258 pixels individually; the contact sheet is 640×1,290 pixels and 71,668 bytes. Every JPEG is below 300 KB. Legacy/native pairs use the same target, camera and scale. The legacy side remains much smaller because it is the exact stochastic owner field at the same physical anchor, not a hand-expanded parity target. ## Standalone gates The final `Target All` Core build and the audit wrapper passed. The wrapper samples the same 32,768 physical query locations for legacy and native timing. | Gate | Final result | |---|---:| | Recipe / plan / manifest hashes | `5b8f27274bad89ba` / `ac33c9460b16337a` / `0db30684eaefa75e` | | Bounds | 515 boxes, 13,851 point samples, 74 unknown, **0 missed**; shrunken-box control detected | | Thickness | 4 islands; minimum depth/diameter 0.75 vs 0.70 required; all pass | | Thin-pad control | Ratio 0.2999; all 4 islands fail, control detected | | Route | 28 segments, 254 capsule centers, 69,088 capsule samples, 1,430 support probes; 0 blocked, 0 unsupported, 0 grade failures | | Minimum sampled density clearance | 78 subvoxels (0.305 Core voxel) | | Raised-route control (+8 voxels) | Detected: 254 unsupported centers, 0 blocked | | Field hash at W1 / W8 / W16 | `566b6115f1aaeb71` for all three; repeated plan stable | | Query timing, 32,768 locations | Legacy 64.64 ms; native 38.06 ms (0.589× legacy time, about 1.70× faster) | | Local sign / occupancy difference | 4.437% sign mismatch; 130 legacy-solid vs 1,380 native-solid samples | The sample contains 10.6× as many native-solid points as legacy (1,352 native-only and 102 legacy-only). This is a local sparse-field sample, not a global volume estimate. It confirms the native density difference visible in the matched images. The extra route backbone, thick crust and deep roots are the stated reasons; the native field is not being presented as owner occupancy parity. The audit reparsed the unchanged existing M1 round-1 manifest hash `c87ae279b0e26f53` and SurfaceWorld round-4 manifest hash `8933693d9560ba9f`. No existing Core world evaluator, SurfaceWorld recipe or mesher implementation was edited. The complete M2 mesher hash matrix was not replayed in this round; the M2 report records the prior fixture mesh hash `9d58e0603f1bf9c7` and cliff tile hash `fc7bd7a3cf997992`. Full audit data is in [audit.json](results/audit.json); the successful wrapper ledger is [run_ledger.txt](results/run_ledger.txt). Mesh extracts used for the captures and audit are in the same `results` directory. ## Round 3 — Unreal delivery plan 1. Reconcile the 12.5 cm production field with the 25 cm frozen-probe metadata at the snapshot producer. Add one explicit owner-to-Core length scale and reject payloads whose declared scale conflicts with it. 2. Add the recipe and seeded plan to the existing optional `world_assembly` import path. Parse via `ResolvedWorldSnapshot::FromJson`; validate schema/geometry versions, recipe/plan/manifest hashes, stable IDs, bounds and scale before generation. Preserve round-trip JSON and stable IDs. 3. Prove imported generation in a null-RHI BuildHost commandlet. Compare canonical plan/field hashes at W1/W8/W16 and exercise malformed-hash, unknown-version and mismatched-scale controls. 4. Build the islands and sharp-tag-ready spans through the selected mesher path. Check chunk borders, LOD transitions, route visibility and finite bounds in Unreal. Keep the Core field available to server queries without requiring render meshes. 5. Cook collision and sweep the actual player capsule over the imported route. Check floor support, clearance, grade and connector landings against cooked collision, then hand the owner the imported build, capture set, collision evidence, resolved scale note and exact source/hash manifest. Round 2 did not add Unreal import, cooked collision, BuildHost proof or owner hand-off evidence. ## Run ledger and scope The final build used four compile workers at BelowNormal priority and completed in about 51 seconds. The final audit completed in 1.65 seconds and peaked at 58.8 MiB private memory; the CPU renderer completed in about 2 seconds. No run approached the 15-minute limit, no process crash occurred, and there was no `0xC0000142` retry. The build emitted the existing French `vswhere.exe`-not-found warning and `VoxelStrateManager.cpp` double-to-float conversion warnings before succeeding. Every failed iteration before that final pass: | Failed run | Result and correction | |---|---| | Core `Target All` compile | Failed on one unqualified fixed-scale `Q`; qualified it and rebuilt successfully. | | Audit 1 | One unsupported route center at segment 36. | | Audit 2 | Diagnostic repeat showed support just beyond the 2.5-voxel search depth (solid by 3); extended/adjusted support fitting. | | Audit 3 | Used a stale Core library after source changes and repeated the route failure; rebuilt Core before continuing. | | Audit 4 | Raising the connector deck fixed support but caused 17 blocked capsule samples; reduced the route margin. | | Audit 5 | No blocked samples, but one unsupported center at segment 49 near a connector end; tapered endpoint detail. | | Audit 6 | After converting owner dimensions to production physical scale, the old 0.62-radius landing produced 17 blocked and 9 unsupported samples. | | Audit 7 | Top-detail attenuation alone left those same counts. | | Audit 8 | Diagnostic repeat located the route near a root-lobe edge; moving the landing to 0.38 radius and using a 1-voxel deck lift fixed it. | | Renderer run | The first renderer pass stopped after four views when a raster row reached `HEIGHT`; clamped the row to `HEIGHT - 1`, then regenerated all five captures successfully. | The repeated pre-final audit processes peaked at 44.6–58.8 MiB. No editor, viewer or GPU was launched. No owner project file, `.uasset` or `Source/` file was opened for writing or changed; no project build was run. No commit, push or stash was made. ### Source inventory New source file in this round: - `RenderFloatingIslandRound2.py` — CPU-only matched capture renderer. Modified source files: - `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h` - `Standalone/Core/src/FloatingIslandsInternal.h` - `Standalone/Research/WorldAssemblerM3/Round1/FloatingIslandsAudit.cpp` (extended for round-2 physical-scale and visual audits) Documentation and dialogue changes are in `Standalone/Core/API.md`, `Standalone/DESIGN_WORLD_ASSEMBLER.md`, `CODEMAP.md` and `Standalone/Research/OwnerShapeWorld/gpu_field_port/LUNA_DIALOGUE.md`.