diff --git a/Standalone/Research/WorldAssemblerM3/Linux64/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux64/REPORT.md new file mode 100644 index 0000000..a261e52 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux64/REPORT.md @@ -0,0 +1,130 @@ +# L64 Linux baseline + +## Empty top-strate result + +**SurfaceWorld is not empty.** U2’s gate report says its sampled top window had 0 triangles, but does not give the camera/window coordinates. With the current owner file (SHA-256 `f42f96adca58…`), the correct SurfaceWorld windows mesh on Clang: the file `viewer_start` `(0, 0, -496 m)` gives 9/27 nonempty LOD0 tiles and 36,864 triangles; the resolved route arrival `(38.75, 70.75, -374.121 m)` gives 9/27 and 25,672; the departure mouth `(-6.75, 25.25, -376.307 m)` gives 11/27 and 33,582. The binding is `SurfaceWorld-native`; the 57 boundary probes had 0 dispatch disagreements. This points to the gate’s sample window placement, not an empty field or wrong generator binding. The precise U2 sample point cannot be confirmed from its report. + +There is a separate owner-plan defect: strict layout validation rejects `passage/0-1/0` because its lower mouth is at z = −822.06 m, 78.56 m below FloatingIslands’ content band (bottom −743.5 m; that point is in TunnelNetwork). The plan’s passage audit also fails; details are below. + +## Bisect + +All 57 commits in `a176d07^..3202193` were exported and built with Clang 19, `-ffp-contract=off`, `-j12`, taskset CPUs 0–11, a 6 GiB address-space limit, and `TMPDIR` under `Saved/`. 56 built. `3e443bf` (L37/R1) fails to compile on an extra `)`; its following L37 fix `7f2d84d` builds. The timing matrix has 402 successful runs: three shuffled/interleaved passes per recipe and data/commit configuration. Every run used the same view `(−12, −118, −20 m)`, 12 workers, `--force-generate`, clip radius 3, max clip level 8, LOD8 step 0, hash off. The fixed data was `3202193` (`7b095f9b…`) for every commit; commits before L24 also ran the pre-L24 file (`289cd755…`). + +**Not Core.** On fixed data, SurfaceWorld LOD0 worker time per tile is 10.05 ms at L14 and 12.78 ms at L61 (1.27×); whole-view is 4.31 s and 5.02 s (1.16×). The summed worker time across LOD0–8 is 31.2 s and 38.7 s (1.24×). This does not reproduce the Windows roughly 2× per-tile rise, so the cause is on the Unreal side: U1 or the adapter’s Core driving path. No Core fix was made; `Source/` was untouched. + +`W/F/N/Σ/L0` below means whole-view seconds / first-tile seconds / near-ring seconds / summed worker-seconds across LOD0–8 / LOD0 worker-ms per tile. Each parenthesized percent is the delta against L14 for the same recipe and data file. L0 steps mark upward changes of at least 10% versus the previous successful commit in that dataset. For LOD0 p50/p95, builds before L55 lack tile-drain counters; later values are from separate `--instrument-tile-drain` passes on the same view/data (SW then FI, ms). Those opt-in passes have force-generation off, as required for the counters, and do not contribute to the timing medians. + +| Round | Commit | Data | SW W/F/N/Σ/L0 (Δ%) | FI W/F/N/Σ/L0 (Δ%) | L0 step ≥10% | LOD0 p50/p95 SW; FI (ms) | +|---|---|---|---|---|---|---| +| L14 | `a176d07` | 3202193 | 4.31 (+0%) / 1.71 (+0%) / 1.76 (+0%) / 31.2 (+0%) / 10.05 (+0%) | 23.57 (+0%) / 3.21 (+0%) / 3.61 (+0%) / 236.6 (+0%) / 166.93 (+0%) | — | — | +| L14 | `a176d07` | pre-L24 | 4.53 (+0%) / 1.61 (+0%) / 1.67 (+0%) / 34.6 (+0%) / 11.71 (+0%) | 26.34 (+0%) / 3.91 (+0%) / 4.70 (+0%) / 291.3 (+0%) / 236.10 (+0%) | — | — | +| L15 | `a6cd7cf` | 3202193 | 4.26 (-1%) / 1.44 (-16%) / 1.49 (-15%) / 32.1 (+3%) / 10.50 (+5%) | 23.88 (+1%) / 3.67 (+15%) / 4.30 (+19%) / 249.3 (+5%) / 179.96 (+8%) | — | — | +| L15 | `a6cd7cf` | pre-L24 | 2.96 (-35%) / 1.33 (-17%) / 1.36 (-18%) / 19.4 (-44%) / 5.30 (-55%) | 27.50 (+4%) / 3.62 (-7%) / 4.33 (-8%) / 297.1 (+2%) / 247.25 (+5%) | — | — | +| L16 | `9a7c87e` | 3202193 | 3.59 (-17%) / 1.60 (-6%) / 1.65 (-6%) / 23.9 (-23%) / 8.47 (-16%) | 23.94 (+2%) / 3.92 (+22%) / 4.26 (+18%) / 256.3 (+8%) / 182.06 (+9%) | — | — | +| L16 | `9a7c87e` | pre-L24 | 4.49 (-1%) / 1.75 (+9%) / 1.81 (+9%) / 32.7 (-5%) / 10.08 (-14%) | 26.57 (+1%) / 3.66 (-6%) / 4.65 (-1%) / 271.7 (-7%) / 231.16 (-2%) | SW ↑90.2% | — | +| L17 | `8704129` | 3202193 | 3.95 (-8%) / 1.51 (-12%) / 1.56 (-11%) / 29.9 (-4%) / 9.06 (-10%) | 24.71 (+5%) / 3.95 (+23%) / 4.67 (+29%) / 264.2 (+12%) / 176.04 (+5%) | — | — | +| L17 | `8704129` | pre-L24 | 2.93 (-35%) / 0.87 (-46%) / 0.94 (-44%) / 26.0 (-25%) / 8.88 (-24%) | 25.58 (-3%) / 2.40 (-38%) / 3.11 (-34%) / 278.4 (-4%) / 231.14 (-2%) | — | — | +| L18 | `dcf0763` | 3202193 | 4.08 (-5%) / 1.55 (-9%) / 1.60 (-9%) / 31.4 (+1%) / 10.92 (+9%) | 29.75 (+26%) / 3.56 (+11%) / 4.42 (+22%) / 317.7 (+34%) / 257.73 (+54%) | SW ↑20.5%, FI ↑46.4% | — | +| L18 | `dcf0763` | pre-L24 | 4.02 (-11%) / 1.65 (+3%) / 1.70 (+2%) / 28.4 (-18%) / 6.94 (-41%) | 25.67 (-3%) / 4.14 (+6%) / 4.96 (+6%) / 258.9 (-11%) / 177.66 (-25%) | — | — | +| L19 | `811c4b7` | 3202193 | 4.79 (+11%) / 1.80 (+5%) / 1.85 (+5%) / 36.5 (+17%) / 12.45 (+24%) | 26.15 (+11%) / 2.54 (-21%) / 3.15 (-13%) / 283.8 (+20%) / 235.00 (+41%) | SW ↑14.1% | — | +| L19 | `811c4b7` | pre-L24 | 3.51 (-23%) / 0.80 (-50%) / 0.86 (-49%) / 32.4 (-6%) / 9.34 (-20%) | 25.38 (-4%) / 3.94 (+1%) / 4.64 (-1%) / 259.8 (-11%) / 213.94 (-9%) | SW ↑34.6%, FI ↑20.4% | — | +| L20 | `6f9c7bd` | 3202193 | 4.52 (+5%) / 1.74 (+2%) / 1.78 (+1%) / 33.3 (+7%) / 12.08 (+20%) | 23.30 (-1%) / 2.36 (-27%) / 3.22 (-11%) / 253.6 (+7%) / 173.02 (+4%) | — | — | +| L20 | `6f9c7bd` | pre-L24 | 4.32 (-5%) / 1.65 (+2%) / 1.69 (+1%) / 31.9 (-8%) / 10.91 (-7%) | 22.85 (-13%) / 2.18 (-44%) / 3.41 (-27%) / 229.8 (-21%) / 170.36 (-28%) | SW ↑16.8% | — | +| L20 review | `5d5447d` | 3202193 | 4.76 (+11%) / 1.63 (-4%) / 1.70 (-3%) / 35.1 (+13%) / 11.85 (+18%) | 25.93 (+10%) / 3.91 (+22%) / 4.78 (+33%) / 275.4 (+16%) / 227.96 (+37%) | FI ↑31.8% | — | +| L20 review | `5d5447d` | pre-L24 | 4.50 (-1%) / 1.65 (+3%) / 1.72 (+3%) / 34.5 (-0%) / 11.83 (+1%) | 27.01 (+3%) / 3.09 (-21%) / 3.87 (-18%) / 284.0 (-3%) / 225.37 (-5%) | FI ↑32.3% | — | +| L21 | `8753f6d` | 3202193 | 4.26 (-1%) / 1.50 (-12%) / 1.56 (-11%) / 33.0 (+6%) / 11.30 (+12%) | 26.21 (+11%) / 3.80 (+19%) / 5.09 (+41%) / 268.6 (+14%) / 192.22 (+15%) | — | — | +| L21 | `8753f6d` | pre-L24 | 3.78 (-17%) / 1.02 (-37%) / 1.12 (-33%) / 33.1 (-4%) / 10.18 (-13%) | 23.71 (-10%) / 3.73 (-5%) / 4.60 (-2%) / 260.3 (-11%) / 196.70 (-17%) | — | — | +| L22 | `55c26a0` | 3202193 | 4.01 (-7%) / 1.48 (-13%) / 1.55 (-12%) / 28.9 (-7%) / 10.23 (+2%) | 35.34 (+50%) / 4.74 (+48%) / 5.49 (+52%) / 369.9 (+56%) / 240.61 (+44%) | FI ↑25.2% | — | +| L22 | `55c26a0` | pre-L24 | 4.13 (-9%) / 1.58 (-2%) / 1.64 (-2%) / 30.4 (-12%) / 11.32 (-3%) | 33.67 (+28%) / 3.50 (-11%) / 4.07 (-13%) / 360.8 (+24%) / 273.30 (+16%) | SW ↑11.2%, FI ↑38.9% | — | +| L23 | `71d09a8` | 3202193 | 3.38 (-21%) / 1.54 (-10%) / 1.60 (-9%) / 22.0 (-29%) / 9.67 (-4%) | 33.92 (+44%) / 3.21 (+0%) / 3.77 (+4%) / 359.9 (+52%) / 234.50 (+40%) | — | — | +| L23 | `71d09a8` | pre-L24 | 4.34 (-4%) / 1.70 (+6%) / 1.76 (+5%) / 31.5 (-9%) / 10.93 (-7%) | 30.60 (+16%) / 4.29 (+10%) / 5.16 (+10%) / 316.1 (+9%) / 222.51 (-6%) | — | — | +| L24 | `cb9236c` | 3202193 | 2.83 (-34%) / 0.95 (-44%) / 1.03 (-42%) / 17.5 (-44%) / 6.50 (-35%) | 36.87 (+56%) / 4.38 (+37%) / 5.18 (+44%) / 404.1 (+71%) / 298.88 (+79%) | FI ↑27.5% | — | +| L25 | `ef789aa` | 3202193 | 4.29 (-0%) / 1.72 (+1%) / 1.78 (+1%) / 30.8 (-1%) / 10.86 (+8%) | 36.36 (+54%) / 2.18 (-32%) / 2.88 (-20%) / 387.8 (+64%) / 286.83 (+72%) | SW ↑67.0% | — | +| L26 | `37a2230` | 3202193 | 4.06 (-6%) / 1.69 (-1%) / 1.76 (-0%) / 32.4 (+4%) / 7.90 (-21%) | 43.11 (+83%) / 4.54 (+42%) / 5.28 (+46%) / 456.7 (+93%) / 325.35 (+95%) | FI ↑13.4% | — | +| L27 | `07b3fe2` | 3202193 | 4.10 (-5%) / 1.44 (-16%) / 1.49 (-16%) / 32.2 (+3%) / 9.12 (-9%) | 40.19 (+71%) / 3.68 (+15%) / 4.79 (+33%) / 441.3 (+87%) / 255.16 (+53%) | SW ↑15.4% | — | +| L28 | `f23ab7b` | 3202193 | 4.44 (+3%) / 1.72 (+1%) / 1.78 (+1%) / 32.1 (+3%) / 10.38 (+3%) | 32.25 (+37%) / 3.55 (+11%) / 4.26 (+18%) / 339.3 (+43%) / 248.36 (+49%) | SW ↑13.9% | — | +| L29 | `63c7e56` | 3202193 | 2.55 (-41%) / 0.72 (-58%) / 0.75 (-58%) / 21.5 (-31%) / 6.19 (-38%) | 34.47 (+46%) / 2.83 (-12%) / 3.64 (+1%) / 376.1 (+59%) / 265.76 (+59%) | — | — | +| L30 | `103d8b4` | 3202193 | 4.41 (+2%) / 1.59 (-7%) / 1.65 (-6%) / 32.1 (+3%) / 10.65 (+6%) | 36.40 (+54%) / 4.25 (+33%) / 4.96 (+37%) / 387.8 (+64%) / 303.13 (+82%) | SW ↑72.0%, FI ↑14.1% | — | +| L31 | `28069f0` | 3202193 | 3.12 (-27%) / 1.55 (-9%) / 1.61 (-8%) / 18.8 (-40%) / 7.23 (-28%) | 37.60 (+60%) / 4.14 (+29%) / 5.17 (+43%) / 407.7 (+72%) / 296.35 (+78%) | — | — | +| L32 | `d0158c6` | 3202193 | 4.88 (+13%) / 1.57 (-8%) / 1.71 (-3%) / 37.2 (+19%) / 12.07 (+20%) | 34.29 (+46%) / 2.85 (-11%) / 3.31 (-8%) / 362.5 (+53%) / 229.88 (+38%) | SW ↑66.9% | — | +| L33 | `b7a47be` | 3202193 | 2.65 (-38%) / 0.86 (-49%) / 0.89 (-50%) / 21.3 (-32%) / 9.38 (-7%) | 31.98 (+36%) / 2.91 (-9%) / 3.84 (+7%) / 350.3 (+48%) / 257.32 (+54%) | FI ↑11.9% | — | +| L34 | `49e29fc` | 3202193 | 4.40 (+2%) / 1.53 (-11%) / 1.58 (-10%) / 34.5 (+11%) / 10.81 (+8%) | 36.15 (+53%) / 4.22 (+31%) / 5.02 (+39%) / 378.7 (+60%) / 252.48 (+51%) | SW ↑15.3% | — | +| L35 | `ba01707` | 3202193 | 4.80 (+11%) / 1.77 (+4%) / 1.84 (+4%) / 36.0 (+15%) / 7.08 (-30%) | 35.01 (+49%) / 4.17 (+30%) / 4.96 (+37%) / 390.0 (+65%) / 289.50 (+73%) | FI ↑14.7% | — | +| L36 | `8be1c4d` | 3202193 | 3.67 (-15%) / 1.03 (-40%) / 1.08 (-39%) / 34.2 (+10%) / 10.92 (+9%) | 34.93 (+48%) / 2.72 (-15%) / 3.21 (-11%) / 384.8 (+63%) / 266.69 (+60%) | SW ↑54.2% | — | +| L37/R1 | `3e443bf` | 3202193 | — | — | compile fail | — | +| L37 fix/R2 | `7f2d84d` | 3202193 | 4.42 (+3%) / 1.73 (+1%) / 1.78 (+1%) / 32.2 (+3%) / 10.07 (+0%) | 38.96 (+65%) / 4.48 (+40%) / 5.25 (+46%) / 417.3 (+76%) / 259.39 (+55%) | — | — | +| R3 | `945225d` | 3202193 | 4.86 (+13%) / 1.85 (+8%) / 1.91 (+9%) / 35.3 (+13%) / 10.69 (+6%) | 33.96 (+44%) / 2.68 (-17%) / 3.43 (-5%) / 374.9 (+58%) / 266.08 (+59%) | — | — | +| L38/R4 | `cf57c87` | 3202193 | 3.14 (-27%) / 1.34 (-22%) / 1.36 (-23%) / 21.5 (-31%) / 5.96 (-41%) | 37.38 (+59%) / 4.72 (+47%) / 5.58 (+55%) / 396.3 (+67%) / 252.07 (+51%) | — | — | +| R5 | `88c54ea` | 3202193 | 3.37 (-22%) / 1.46 (-15%) / 1.56 (-11%) / 30.5 (-2%) / 11.09 (+10%) | 39.45 (+67%) / 3.52 (+10%) / 4.89 (+36%) / 416.6 (+76%) / 265.16 (+59%) | SW ↑85.8% | — | +| L39/R6 | `753cc9c` | 3202193 | 3.32 (-23%) / 0.86 (-50%) / 0.88 (-50%) / 21.7 (-31%) / 9.49 (-5%) | 37.03 (+57%) / 4.41 (+37%) / 5.56 (+54%) / 389.5 (+65%) / 232.40 (+39%) | — | — | +| L40/R7 | `efa9e89` | 3202193 | 4.57 (+6%) / 1.62 (-5%) / 1.68 (-4%) / 35.3 (+13%) / 10.78 (+7%) | 38.63 (+64%) / 3.39 (+6%) / 3.89 (+8%) / 412.4 (+74%) / 306.46 (+84%) | SW ↑13.6%, FI ↑31.9% | — | +| L41/R8 | `1abee91` | 3202193 | 4.30 (-0%) / 1.71 (+0%) / 1.81 (+3%) / 26.8 (-14%) / 8.08 (-20%) | 38.25 (+62%) / 2.88 (-10%) / 3.42 (-5%) / 413.8 (+75%) / 324.95 (+95%) | — | — | +| L42/R9 | `2566f53` | 3202193 | 4.37 (+1%) / 1.51 (-11%) / 1.56 (-11%) / 34.1 (+9%) / 10.05 (+0%) | 37.43 (+59%) / 2.15 (-33%) / 2.48 (-31%) / 427.7 (+81%) / 306.73 (+84%) | SW ↑24.4% | — | +| R9 | `497e974` | 3202193 | 4.55 (+6%) / 1.75 (+2%) / 1.79 (+2%) / 33.5 (+7%) / 10.31 (+3%) | 35.69 (+51%) / 4.87 (+52%) / 5.68 (+57%) / 372.0 (+57%) / 257.01 (+54%) | — | — | +| L43/R10 | `422dd77` | 3202193 | 3.54 (-18%) / 1.60 (-6%) / 1.69 (-4%) / 23.7 (-24%) / 8.14 (-19%) | 37.50 (+59%) / 2.92 (-9%) / 3.37 (-7%) / 401.3 (+70%) / 320.95 (+92%) | FI ↑24.9% | — | +| L44 | `036bd53` | 3202193 | 3.48 (-19%) / 0.95 (-44%) / 1.03 (-41%) / 30.2 (-3%) / 10.30 (+3%) | 36.78 (+56%) / 4.32 (+35%) / 5.20 (+44%) / 390.7 (+65%) / 239.12 (+43%) | SW ↑26.6% | — | +| L45/R12 | `f13b145` | 3202193 | 4.50 (+5%) / 1.67 (-2%) / 1.75 (-1%) / 33.9 (+9%) / 10.38 (+3%) | 38.59 (+64%) / 4.50 (+40%) / 5.26 (+46%) / 410.7 (+74%) / 300.28 (+80%) | FI ↑25.6% | — | +| L46/R13 | `e016f6a` | 3202193 | 4.15 (-4%) / 1.93 (+13%) / 2.01 (+14%) / 31.3 (+1%) / 9.64 (-4%) | 38.45 (+63%) / 4.10 (+28%) / 4.99 (+38%) / 406.5 (+72%) / 296.82 (+78%) | — | — | +| L47/R14 | `c091e44` | 3202193 | 4.70 (+9%) / 1.84 (+8%) / 1.90 (+8%) / 35.6 (+14%) / 10.76 (+7%) | 39.16 (+66%) / 4.03 (+26%) / 4.72 (+31%) / 420.2 (+78%) / 274.84 (+65%) | SW ↑11.6% | — | +| L48/R15 | `3073d1b` | 3202193 | 4.66 (+8%) / 1.54 (-10%) / 1.65 (-7%) / 37.4 (+20%) / 11.89 (+18%) | 37.86 (+61%) / 3.98 (+24%) / 4.82 (+33%) / 406.9 (+72%) / 289.92 (+74%) | SW ↑10.5% | — | +| R16 | `6110f11` | 3202193 | 4.72 (+10%) / 1.47 (-14%) / 1.59 (-10%) / 33.1 (+6%) / 10.39 (+3%) | 35.86 (+52%) / 2.42 (-25%) / 3.66 (+1%) / 400.1 (+69%) / 284.96 (+71%) | — | — | +| R17 | `b9ccff4` | 3202193 | 3.78 (-12%) / 1.33 (-22%) / 1.36 (-22%) / 34.4 (+10%) / 10.78 (+7%) | 38.70 (+64%) / 4.79 (+49%) / 5.58 (+55%) / 409.9 (+73%) / 282.19 (+69%) | — | — | +| L50/R18-R19 | `ca85e87` | 3202193 | 4.95 (+15%) / 1.76 (+3%) / 1.84 (+4%) / 38.2 (+22%) / 11.85 (+18%) | 36.53 (+55%) / 4.80 (+50%) / 5.20 (+44%) / 381.1 (+61%) / 251.21 (+50%) | — | — | +| L51/R20 | `7555025` | 3202193 | 4.44 (+3%) / 1.61 (-6%) / 1.67 (-5%) / 33.8 (+8%) / 10.63 (+6%) | 18.33 (-22%) / 2.32 (-28%) / 2.80 (-22%) / 174.2 (-26%) / 180.36 (+8%) | — | — | +| L51 | `c42c785` | 3202193 | 4.47 (+4%) / 1.61 (-6%) / 1.67 (-5%) / 32.2 (+3%) / 9.50 (-5%) | 14.36 (-39%) / 2.78 (-13%) / 3.17 (-12%) / 140.5 (-41%) / 131.17 (-21%) | — | — | +| L52/R21 | `408c14b` | 3202193 | 4.49 (+4%) / 1.58 (-7%) / 1.65 (-6%) / 35.5 (+14%) / 11.05 (+10%) | 12.50 (-47%) / 4.75 (+48%) / 5.20 (+44%) / 102.9 (-57%) / 125.17 (-25%) | SW ↑16.3% | — | +| L53/R22 | `20f6c98` | 3202193 | 4.42 (+3%) / 1.66 (-3%) / 1.83 (+4%) / 29.4 (-6%) / 9.54 (-5%) | 11.57 (-51%) / 3.77 (+17%) / 4.18 (+16%) / 112.4 (-52%) / 134.18 (-20%) | — | — | +| L54/R23 | `9458217` | 3202193 | 4.62 (+7%) / 1.50 (-12%) / 1.56 (-12%) / 35.6 (+14%) / 11.17 (+11%) | 14.71 (-38%) / 4.59 (+43%) / 5.11 (+42%) / 123.4 (-48%) / 137.96 (-17%) | SW ↑17.1% | — | +| L54 | `e35a77f` | 3202193 | 2.66 (-38%) / 0.77 (-55%) / 0.81 (-54%) / 22.6 (-27%) / 8.05 (-20%) | 12.72 (-46%) / 2.50 (-22%) / 3.18 (-12%) / 94.6 (-60%) / 92.67 (-44%) | — | — | +| L55/R24 | `aee1487` | 3202193 | 4.16 (-3%) / 1.73 (+1%) / 1.79 (+2%) / 27.7 (-11%) / 8.99 (-11%) | 10.74 (-54%) / 1.45 (-55%) / 1.65 (-54%) / 111.8 (-53%) / 146.17 (-12%) | SW ↑11.7%, FI ↑57.7% | 4.65/11.20; 94.70/122.83 | +| L56/R25 | `4e64b75` | 3202193 | 3.11 (-28%) / 0.76 (-55%) / 0.79 (-55%) / 28.0 (-10%) / 10.12 (+1%) | 9.68 (-59%) / 2.65 (-17%) / 3.23 (-10%) / 87.3 (-63%) / 95.93 (-43%) | SW ↑12.5% | 4.61/11.62; 97.07/124.52 | +| L57/R26 | `1e3e04b` | 3202193 | 5.11 (+19%) / 1.59 (-7%) / 1.67 (-5%) / 43.7 (+40%) / 14.12 (+41%) | 12.83 (-46%) / 2.48 (-23%) / 2.83 (-21%) / 125.4 (-47%) / 130.60 (-22%) | SW ↑39.6%, FI ↑36.1% | 4.77/11.47; 86.41/114.69 | +| L58/R27 | `6c6cc37` | 3202193 | 3.72 (-14%) / 0.93 (-46%) / 0.98 (-44%) / 33.5 (+7%) / 10.09 (+0%) | 9.00 (-62%) / 1.93 (-40%) / 2.13 (-41%) / 85.1 (-64%) / 95.95 (-43%) | — | 4.62/11.10; 86.08/114.90 | +| R28 | `fbae82e` | 3202193 | 4.85 (+13%) / 1.85 (+8%) / 1.90 (+8%) / 35.9 (+15%) / 11.24 (+12%) | 10.47 (-56%) / 2.18 (-32%) / 2.42 (-33%) / 99.6 (-58%) / 109.15 (-35%) | SW ↑11.5%, FI ↑13.8% | 4.71/11.40; 85.49/114.11 | +| L60 | `c0c204b` | 3202193 | 3.22 (-25%) / 1.46 (-14%) / 1.49 (-16%) / 21.0 (-33%) / 8.59 (-15%) | 11.36 (-52%) / 2.61 (-19%) / 2.99 (-17%) / 101.0 (-57%) / 96.22 (-42%) | — | 5.21/11.99; 85.26/114.07 | +| L61/R31 | `1359578` | 3202193 | 5.02 (+16%) / 1.79 (+5%) / 1.86 (+6%) / 38.7 (+24%) / 12.78 (+27%) | 13.38 (-43%) / 2.92 (-9%) / 3.26 (-10%) / 126.2 (-47%) / 131.47 (-21%) | SW ↑48.8%, FI ↑36.6% | 5.01/11.65; 85.11/113.95 | +| R32 | `3202193` | 3202193 | 3.69 (-14%) / 1.61 (-6%) / 1.71 (-3%) / 27.2 (-13%) / 11.06 (+10%) | 12.73 (-46%) / 2.60 (-19%) / 2.94 (-18%) / 124.2 (-48%) / 131.70 (-21%) | — | 4.89/11.24; 86.41/114.52 | + +## Four-strate U2 baseline + +The local mesh windows are all nonempty and deterministic at W1/W8/W12 on Clang and GCC. Each hash vector matched across all six compiler/worker configurations. The cost numbers are medians of three W12 full-view runs using the comparable clip-radius-3 speed-matrix configuration, with each camera in the named stratum. Because the owner plan fails strict ownership and passage validation, these full-view cost runs use a temporary diagnostic binary that continues after those validators; no in-tree Core or Unreal `Source/` file was changed; the bypass is confined to `Saved/Linux/l64/u2cost/export`. The cost cameras were SW `viewer_start` `(0, 0, -496 m)`, FI passage-1 upper mouth `(19.166, -14.200, -732.201 m)`, TN passage-1 lower mouth `(19.166, -14.200, -753.374 m)`, and VS passage-2 lower mouth `(−20.063, −5.068, −900.354 m)`. The SW local mesh window above is the resolved route arrival, not its cost camera. + +| Strate (chunks; content band) | Core generator path | Local window (nonempty/27; triangles) | Determinism | Whole-view W/F/N/Σ/L0 | Arrival→departure audit | +|---|---|---|---|---|---| +| SW (0…−63; −503.5…7.5 m) | SurfaceWorld-native | route spawn: 9/27; 25,672 | W1/W8/W12 Clang/GCC: PASS | 6.34/0.63/0.80/68.8/60.39 | SW route fails: 24/33 points unsupported; SW→FI interface fails | +| FI (−64…−93; −743.5…−504.5 m) | compiled-analytic/FloatingIslands (legacy) | passage 1 upper mouth: 21/27; 93,149 | W1/W8/W12 Clang/GCC: PASS | 8.41/0.53/0.97/95.1/74.21 | SW→FI lower mouth out of band; FI→TN interface fails | +| TN (−94…−109; −871.5…−744.5 m) | compiled-analytic/TunnelNetwork (legacy) | passage 1 lower mouth: 13/27; 65,248 | W1/W8/W12 Clang/GCC: PASS | 6.50/0.53/0.79/71.6/56.33 | FI→TN and TN→VS interfaces fail | +| VS (−110…−125; −999.5…−872.5 m) | compiled-analytic/VerticalShafts (legacy) | passage 2 lower mouth: 5/27; 4,761 | W1/W8/W12 Clang/GCC: PASS | 3.39/0.52/0.54/34.6/14.51 | TN→VS: 3 unsupported; floor ripple 3.57 cm > 2.5 cm | + +Across the three interface audits, 0/3 passages passed. In addition to the out-of-band 0–1 mouth, passage 1–2 has floor ripple 4.78 cm (2.5 cm limit), and 2–3 has 3.57 cm ripple; unsupported/blocked samples also remain. Native caves and lattice are not enabled in this plan; TN and VS use their legacy analytic evaluators. + +## Failed runs + +- Historical build `3e443bf` (L37/R1) failed at `ShapeWorldInternal.h:1554` with an extra `)`; the next L37 fix built and was measured. The corrected bisect has 402/402 successful timing runs. An earlier discarded invocation used unsupported `--data=` syntax and was replaced by the positional data path. +- `verify.py --tier fast --out Saved/Linux/l64` in the copied legacy-plan shadow reached the motif fixture and exited 1: `motif-slice1-capsule-reachability-clang` rejected its motif override because it did not resolve to a SurfaceWorld strate. Its hard-coded two-strata style map does not validate U2; U2 boundary, determinism, and passage audits are reported above. A first stale-source-stamp refusal was corrected by copying the L37 audit script into the shadow. +- The first U2 whole-view SW pass exited at the passage walkability gate (`65/7,729` samples solid). The cost table reruns use the same diagnostic binary for all four strata with route validation bypassed, and retain the audit failure. A first build attempt also used a nonexistent `TMPDIR`; it was corrected and the diagnostic build passed. + +Evidence is under `Saved/Linux/l64`: `runs-spawn-correct.json` and `runs-spawn-correct/`, `profiles-spawn.json`, `u2probe/determinism.json`, `u2probe/passage-audit-clang.log`, `u2probe/boundary-dispatch.log`, `u2cost/speed-cost.json`, and `verify-fast.log`. + +## Orchestrator review (Claude) + +**The bisect timings are inflated by machine contention.** I was building Unreal Engine on cores 12–19 during this +round (memory bandwidth and disk I/O), and adjacent commits swing ±40%. A clean re-measure on a quiet machine +(6 interleaved runs each, same binaries, data `owner_world-3202193.json`, same command and camera): + +| Build | Whole view (median of 6) | Worker-s, LOD0–8 | LOD0 ms/tile | +|---|---:|---:|---:| +| L14 `a176d07` | ≈1.55 s | 12.62 | 3.99 | +| L61 `1359578` | ≈1.72 s | 14.65 | 4.99 | + +**Core regressed about +16% in worker time and +25% per LOD0 tile, not ×2.** The owner's Windows trace shows about +33 ms per LOD0 tile p95, roughly 6× Core's per-tile cost here, so most of the Windows regression is on the Unreal side +or isn't a like-for-like comparison (R33: U1's trace was not a controlled A/B, at 2,578 tiles). Core's own +16% is +plausibly R33 suspect #1: per-sample `ApplyResolvedStrateComposition` (L23) plus the per-sample passage loop (L37). +**The new four-strate plan has real defects:** +- passage 0–1's lower mouth is out of FI's band; +- all three interfaces fail their audits; +- FI, TN and VS run on legacy evaluators; +- the full view costs 3.4–8.4 s per strate. + +Next: get the Linux UE build to compile, then trace the Unreal path itself for L14 vs HEAD here. diff --git a/Standalone/Research/WorldAssemblerM3/Research33/REPORT.md b/Standalone/Research/WorldAssemblerM3/Research33/REPORT.md new file mode 100644 index 0000000..c8e7ce7 --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Research33/REPORT.md @@ -0,0 +1,66 @@ +# R33 — Revised report + +## Ranked suspects + +1. **Resolved-layout composition on density samples — strongest match for per-tile cost ×2.** This path was absent at L14. L23 changed a Core sample return from boundary-band handling to full composition: + + ```diff + - return ApplyEditBrushes(ApplyResolvedStrateBoundaryBand(NativeDensity,X,Y,Z),X,Y,Z); + + return ApplyEditBrushes(ApplyResolvedStrateComposition(NativeDensity,X,Y,Z),X,Y,Z); + ``` + + The new call is at [ShapeWorldInternal.h](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:3017). `ApplyResolvedStrateComposition` runs graph lookup, boundary-band composition, passage carving, optional stamps and floor caps at [line 1819](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:1819). L37 also added this per-sample passage scan: + + ```cpp + for(const auto& passage:ResolvedLayout->passages) + ``` + + at [line 957](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:957), before the early return at [line 966](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:966). + + The Unreal adapter emits the resolved layout, including ceiling, bedrock and planned passages, at [VoxelForgeCoreAdapter.cpp:1751](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1751), [line 1765](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1765), and [line 1785](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1785). That serialization dates to L22; it was not added by U1. The L14 adapter and Core sample path had no `resolved_layout_json`, `ResolvedLayout`, or `ApplyResolvedStrateComposition`. + + **Call chain:** `BuildDesiredTiles` takes the Core branch at [VoxelWorld.cpp:10988](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:10988); `BuildCoreDesiredTiles` calls `World->desiredTiles()` at [line 10525](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:10525). A missing key reaches `LoadCoreTile`, which launches a worker and calls `World->generateTile()` at [line 13293](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13293). Core mesh sampling then reaches the changed density return above. This multiplies work across existing samples in eligible native-field tiles; it does not increase their sample count. The checked-in standalone manifest has no `resolved_layout_json`, so the Linux headless bisect may not exercise this Unreal-fed composition path. + + **Windows experiment:** There is no existing toggle for the whole composition. For the cheapest broad test, temporarily omit the `Root->SetStringField(TEXT("resolved_layout_json"), …)` line at [VoxelForgeCoreAdapter.cpp:1785](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1785), rebuild Runtime, and rerun the same `-StreamingTraceOnly` command. Keep tile keys, LODs and cells per tile fixed. A large fall in per-LOD worker time supports this path; little change refutes it as the dominant cost. This is a measurement-only geometry change. If it falls, a follow-up can isolate passages by constructing the Core world from `Snapshot->withoutResolvedLayoutPassages()` at [VoxelWorld.cpp:7663](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:7663). A drop there implicates passage scanning/carving specifically. + +2. **Authored CoreGeometry — conditional for the current re-saved assets; ruled out for the U1 trace by its report.** U1 added the optional property at [VoxelStrateDefinition.h:125](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateDefinition.h:125). The adapter skips definitions with no recipe or authored arrays: + + ```cpp + if (!Definition || !HasCoreGeometry(*Definition)) continue; + ``` + + at [VoxelForgeCoreAdapter.cpp:1037](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1037). When active, native recipes, stamps, rooms or tunnels can add per-sample field work. The U1 report says its old assets had CoreGeometry off and arrays empty ([report lines 135–140](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Unreal1/REPORT.md:135)). U2 shows all four `DA_Strate` asset hashes changed, while `DA_Settings` did not ([report lines 9–15](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Unreal2/REPORT.md:9)); it does not audit whether CoreGeometry is active. + + **Windows experiment:** In the Asset Editor, for each active `DA_Strate1–4`, set `CoreGeometry.GeneratorRecipe=None` and clear `Stamps`, `Rooms`, and `Tunnels`. Rerun and compare tiles in those strates. A fall confirms authored geometry was contributing; no change refutes it. If those fields are already empty, this cannot explain the result. + +3. **L44’s expanded shape-free proof — limited to cold, pre-compile tiles near passage columns.** The native-only path was already present at L14; L44 did not disable it for Unreal. It added a conservative support-column envelope in `ResolvedPassageTouchesBox`, beginning with `if(passage.controlPoints.size()>=2)` at [VoxelForgeCore.cpp:1275](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:1275). Before shape compilation, Unreal calls `isTileShapeFree()` and caches the result at [VoxelWorld.cpp:13100](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13100). Core selects native-only generation while the shape is not ready at [VoxelForgeCore.cpp:2007](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:2007), then checks the proof again inside tile generation. + + This can move passage-column tiles from the early native-only path to the compiled-shape path. It cannot explain a doubled cost across every steady-state tile. The proof check itself is per tile, not per density sample. + + **Windows experiment:** Add a temporary log at the successful `LoadCoreTile` admission point recording tile key and `bShapeReady`; correlate those entries with worker times and the existing `[VoxelForgeCoreRuntime] compiled=1` log at [VoxelWorld.cpp:7792](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:7792). If slow jobs are mostly post-compile, this is refuted. If they cluster among pre-compile tiles near the passage envelope, temporarily revert only L44’s added column-bound block and compare those same tiles. A drop supports an eligibility-path effect; the revert is diagnostic because it weakens the shape-free correctness proof. + +4. **A profiling or hash-audit switch left on — possible multiplier, but no evidence it was enabled.** Core density hashing is disabled by default (`bCaptureVoxelForgeCoreHashesForValidation=false` at [VoxelWorld.h:315](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelWorld.h:315)); `Options.hashDensity` receives that value at [VoxelWorld.cpp:13284](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13284). The density and tile profiling CVars also default to zero at [VoxelWorld.cpp:265](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:265) and [line 446](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:446). These switches existed at L14. + + **Windows experiment:** Append `-voxel.ProfileTileGeneration=0 -voxel.ProfileDensity=0 -voxel.ProfileDensityFull=0 -voxel.PerfAttribution=0 -voxel.SampleStacks=0` to the Unreal launch, and confirm the actor’s `bCaptureVoxelForgeCoreHashesForValidation` is false. A large fall confirms an override was active; no change rules this out. U1’s documented trace command contains no profiling flags, but its report does not record effective INI values. + +5. **Floating-island upper seal — low and version-gated.** L18 added the upper-seal call at [ShapeWorldInternal.h:6514](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6514); it is reached only for a floating-island recipe with `geometryVersion` 3 (the surrounding branch is `geometryVersion<4` at [line 6504](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/ShapeWorldInternal.h:6504)). The L22 generated recipe version is 4, so the normal generated path skips it. It cannot explain all tiles. + + **Windows experiment:** First log the active floating-island recipe version. If it is 3, run once with `-voxel.TunnelAblateBoundarySeal=1`. A fall limited to Floating Islands tiles supports this operation; no change refutes it. At version 4 or later, this test is inapplicable. + +## Unreal path versus standalone + +Unreal serializes the resolved layout during initialization, parses it into `ResolvedWorldSnapshot`, and constructs the Core `World` at [VoxelWorld.cpp:7610](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:7610) and [line 7663](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:7663). The headless worker also calls `CoreWorld->desiredTiles()` and `CoreWorld->generateTile()` ([StreamingWorld.h:606](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamingWorld.h:606), [line 903](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamingWorld.h:903)). Its checked-in owner manifest does not include the resolved-layout field, which Core parses only when that field is present ([VoxelForgeCore.cpp:989](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:989)). + +Unreal’s `worker_task_s` includes more than `generateTile()`: after Core returns, it copies vertices, normals, UVs, colors and indices into Unreal arrays and builds the RealtimeMesh stream set before stamping the worker end time ([VoxelWorld.cpp:13333](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13333), [line 13358](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13358)). That can make Unreal tiles costlier than standalone tiles in absolute time, especially if content emits more geometry. The copy path predates L14. Unreal tile and compile work also uses `UE::Tasks::Launch`; those tasks execute asynchronously and can overlap on workers, so reported elapsed task time can include scheduler contention ([Epic Tasks System documentation](https://dev.epicgames.com/documentation/unreal-engine/tasks-systems-in-unreal-engine)). + +The shared-cache settings show no LOD0 discrepancy: both paths default to `useSharedColumnCache=true` and `memoizeMcGradients=true`; Core forces direct-mapped column caching for `lod<=2` in either caller at [VoxelForgeCore.cpp:2003](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Core/src/VoxelForgeCore.cpp:2003). `VoxelClipmapDesiredTiles` gained bounded wide-division helpers, but Core `BuildDesiredTiles` returns through `BuildCoreDesiredTiles` before the legacy helper path at [VoxelWorld.cpp:10988](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:10988). Those changes do not add density-sample work. + +The other named U1 changes are outside the tile worker hot path: `VoxelSettings::PostLoad` migrates units once when loading assets at [VoxelSettings.cpp:31](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelSettings.cpp:31); `StrateManager::Initialize` resolves metre values into cached slot values at [VoxelStrateManager.cpp:1430](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelStrateManager.cpp:1430); `VoxelContentManager::Initialize` parses resolved-layout anchors at [VoxelContentManager.cpp:332](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelContentManager.cpp:332). The Core native SurfaceWorld and Floating Islands sample adapters do not call those conversions per sample. Content landmark checks can affect ticks if authored, but they are not tile-worker density work. + +`FullResClipLevels`, `CoarseTileCells`, `CoreClipRadius`, and `CoreMaxClipLevel` still need a like-for-like value check. They alter tile-set composition and/or cells per tile, not the composition cost per existing sample. U1’s `compiled=1` log prints clip radius, max level and voxel size; compare those and per-LOD cell counts with L14 before interpreting total worker-seconds. + +## Asset provenance and limits + +U1 says its timing run used the “current owner plan” at 25 cm and reports 2,578 initial tiles ([Unreal1 report lines 64–78](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Unreal1/REPORT.md:64)). Its audited BuildHost assets are the old U1 hashes, and it says no packages were saved ([lines 135–171](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Unreal1/REPORT.md:135)). U2 records new hashes for all four `DA_Strate` assets, the same `DA_Settings` hash, and a regenerated four-strata/four-passage manifest ([Unreal2 report lines 9–25](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Research/WorldAssemblerM3/Unreal2/REPORT.md:9)). The best reading is that U1’s trace used the old U1 asset set, not today’s re-saved packages. The U1 trace itself does not embed asset hashes, however, and the local L14 report is Linux headless rather than the Windows baseline. L14’s loaded Windows asset hashes and exact clip settings are unknown, so content parity is unproven. + +U1 reports a cold worker sum of 34.777 seconds, while the request’s rounded regression figure is about 30 seconds. The report also says the comparison was not a controlled A/B. I did not inspect the owner’s raw BuildHost traces or verify effective Windows INI overrides. No scripts, builds, tests, binaries, or source edits were performed. \ No newline at end of file diff --git a/Standalone/Research/WorldAssemblerM3/Research33/first-pass.md b/Standalone/Research/WorldAssemblerM3/Research33/first-pass.md new file mode 100644 index 0000000..0a3cbcb --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Research33/first-pass.md @@ -0,0 +1,19 @@ +# Ranked suspects + +1. **Resolved passage and strata geometry** — [VoxelForgeCoreAdapter.cpp](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelForgeCoreAdapter.cpp:1584), [VoxelStrateTypes.h](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelStrateTypes.h:2074). The adapter sends each strate’s passage settings into Core’s resolved layout. The default passage style changed from Straight to Worm, with one connection and 20 segments by default. L18–L37 also added shared ceiling/bedrock composition, planned passages, support geometry, transitions, and mouth fades. These can add field queries and mesh crossings where tiles overlap them. U1 confirms CoreGeometry is empty in the owner assets, but does not report the effective passage settings. **Windows check:** log each strate’s resolved style, connection count, segments, planned route count, plus tile vertices and Core time. Then run a diagnostic A/B with a duplicate settings asset set to `Connections=0`. This changes geometry, so compare only cost and sample counts. + +2. **Unreal may mesh a wider Z band than standalone.** [VoxelWorld.cpp](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13270) sets Core mesher options but leaves band limits at their unbounded defaults. Standalone sets `bandMinZVoxel` and `bandMaxZVoxel` from the current strate when its content-cut setting is active ([StreamingWorld.h](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamingWorld.h:823)); those bounds restrict mesher sampling. Core also applies its own band limit to eligible native SurfaceWorld tiles, so this mainly affects other or non-native-safe tiles, and only when they cross the band. **Windows check:** add a temporary `voxel.CoreStrateBand` switch to pass the standalone-equivalent bounds; compare matched tile keys, density sample counts, and Core time. + +3. **Unreal’s post-Core mesh conversion.** [VoxelWorld.cpp](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13333) copies Core vertices and indices into Unreal arrays and builds an RMC stream set after `generateTile`. Standalone also copies the mesh, but into CPU vectors. This wrapper code was not changed in the range; larger meshes from the new geometry could still make this stage costly. **Windows check:** log separate durations for `generateTile` and conversion/`BuildTileStreamSet`, with vertex and index counts. The existing cycle boundaries bracket these stages at lines 13296 and 13358. + +4. **Shape-free readiness can affect startup scheduling, not steady tile cost.** [VoxelWorld.cpp](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13100) caches `isTileShapeFree` results while compilation is pending and admits proven native-only tiles. Core uses the same native-only rule in standalone; L44 did not disable it for Unreal. A stricter proof could delay initial submissions or raise tick cost during compilation, but should not double worker time after the shape is ready. **Windows check:** count shape-free/dependent checks and requests while `bShapeReady=false`; record `nativeOnlyRoute` for early tiles. + +5. **Legacy-only hot helpers and optional background work are low-probability suspects.** L60’s unsigned hash fix in [VoxelCaveMorphology.h](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelCaveMorphology.h:261) can affect legacy noise evaluation, but is not the Core tile field path. L61’s clipmap arithmetic is scheduling/bookkeeping; the bounded seal helper is for legacy density generation. Density-volume fills are separate tasks and default off ([VoxelSettings.h](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Public/VoxelSettings.h:317)). **Windows check:** confirm Core remains enabled, hash capture/profile are off, and the density-volume startup log says disabled. If investigating legacy fallback, profile its density field separately. + +The source defaults for `FullResClipLevels` (2), `CoarseTileCells` (16), `CoreClipRadius` (3), and `CoreMaxClipLevel` (8) did not change in this range. U1 reports the owner’s clip radius/max level as 3/8. Its unit migration preserved the audited physical heights, transitions, gap, and 8 m layout width, so those migrations do not indicate a resolution increase. The shared column cache is Core-owned and enabled by default in both paths; standalone explicitly enables it. Unreal’s gradient memoization defaults on too. Core forces direct-mapped indexing for LOD 0–2 regardless of the Unreal cache CVar, so that CVar is not a useful LOD0 fix. + +## Adapter vs standalone + +Unreal serializes the owner assets into a resolved snapshot, parses it, creates `VoxelForgeCore::World`, then requests tiles through `World::generateTile` ([initialization](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:7591), [tile request](/home/jahni/VoxelM/Plugins/VoxelForge/Source/VoxelForge/Private/VoxelWorld.cpp:13288)). Standalone’s headless streamer also calls that Core method ([StreamingWorld.h](/home/jahni/VoxelM/Plugins/VoxelForge/Standalone/Source/StreamingWorld.h:882)). They share the Core field and mesher, but differ in task scheduling, tile post-processing, and the Z-band options noted above. CoreGeometry resolution, JSON conversion, anchor parsing, and layout-unit conversion happen at initialization; U1’s owner assets have no CoreGeometry, so those additions do not resolve stamps or graphs per tile. + +For the Windows run, use a Task Graph Insights trace (`-trace=default,task`) to compare worker availability and task contention alongside the stage timings; Epic documents task lifecycle tracing in [Task Graph Insights](https://dev.epicgames.com/documentation/unreal-engine/task-graph-insights-in-unreal-engine-5?lang=en-US). The checked-in U1 report contains the timing and asset audit, but the raw `Saved/BuildHost` logs were not present in this checkout. \ No newline at end of file