Luna, M1 round 4 (resumed after the night stop): - Cliff: sub-voxel audit (29,929 half-voxel XY columns, min run 3.75 voxels, 0 subvoxel runs; old taper control exposes 20,963) and a root-line shelf at the two-voxel minimum. - Horizon slab = aliased LOD8 cap ceiling. The first fix hid the ceiling at LOD8 (challenged: enclosed, interior-lit strates); now the LOD8 cap is rebuilt deterministically from the native heightfield, skirts preserved; looking up and out shows the cap present. - Routes: review manifest with 33 stable-ID route points + capsule/support constraints; capsule sweep 0 blocked samples / 0 unsupported centres, negative control detected. - Server path: World::densityAt answers without render meshes. Physics cooking not available standalone. - Hashes (evaluator + 2,226-tile stream) identical at W1/W8/W16. LOD8: 4.446 s for 529 tiles, 14.25 M field calls, 165 unknown tiles. - Captures at 60 fps cap + vsync (owner's GPU coil whine). One cliff probe crossed the ~8 GB guard (7.69 GiB) and was stopped before capturing. My review: cap view matches legacy closely, no slab; native cliff is a clean attached ledge (cleaner than legacy); a few small spikes on the ridge top. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
542 lines
36 KiB
Markdown
542 lines
36 KiB
Markdown
# World assembler M1 report
|
||
|
||
M1 has five implementation rounds. The gates at the end of the milestone remain the agreed
|
||
two-biome SurfaceWorld in the owner's game, including coast, cliff/overhang, cap and a walkable
|
||
route; conservative bound audits; route sweep; identical evaluator hashes at W1/W8/W16; separate
|
||
local query/collision readiness and full-view timings; faster matched workload than the 23.085 s
|
||
legacy bridge; and server field queries that do not depend on render meshes. The approximately
|
||
1.57 s whole-view aim (2 × the 0.785 s cave-only Core measurement) is an aim, not an acceptance gate.
|
||
|
||
## Round 1 of 5 — native foundations
|
||
|
||
- Define the fixed-scale, versioned, hashed recipe and shipped-plan payload, including the Core
|
||
field-block contract and explicit field channels.
|
||
- Add a brute-force interval audit with a deliberately false bound as a negative control.
|
||
- Implement the first native `Heightfield2D` block with biome-map input and compare it with the
|
||
SurfaceWorld legacy bridge in the standalone viewer.
|
||
- Record current hashes, timings, audit results and a small owner/native capture pair. This round
|
||
establishes a heightfield baseline; it does not claim the final two-biome/coast/cliff/route gate.
|
||
|
||
## Round 2 of 5 — complete the surface recipe
|
||
|
||
- Add output-space biome blending, coast and beach shaping, cap detail, cliffs and bounded 3D
|
||
overhang exceptions with stable feature IDs and certified influence bounds.
|
||
- Keep unknown or intersecting exception intervals on the evaluation path. Expand the brute-force
|
||
audit across biome borders, cliffs, caps, negative coordinates and exception bounds.
|
||
- Measure surface field query cost separately from cave compilation and full-view rendering; tune
|
||
caches only after the workload and cache identity are fixed.
|
||
|
||
## Round 3 of 5 — repair the shipped surface before routes
|
||
|
||
- Diagnose and repair the raised rectangular surface patch and the floating cliff shard from
|
||
round 2. Add a negative-control regression for the former box feature and a seam/classification
|
||
continuity check.
|
||
- Profile plan setup, column-cache hits/misses, classifier outcomes, native field call types and
|
||
meshing by LOD. Improve native readiness until it beats legacy on the same matched workload;
|
||
measure the remaining distance to the approximately 1.57 s aim.
|
||
- Keep the bounds audit and its negative control, W1/W8/W16 evaluator and mesh hashes, legacy
|
||
mismatch metrics, and no-manifest cave path green. Save fresh matched surface, border, coast and
|
||
cliff captures.
|
||
|
||
## Round 4 of 5 — route and query readiness
|
||
|
||
- Ship the finite-strate plan with route points, support constraints and stable IDs. Sweep the actual
|
||
player capsule over the final composed field and repair/reject any failing candidate.
|
||
- Verify W1/W8/W16 evaluator hashes, route clearance/support and deterministic plan serialization.
|
||
- Keep the capsule-swept, supported route valid through generation and automatic/scripted changes.
|
||
Player carve/fill edits are unrestricted and may break or plug the route. Seas and rivers stay fixed
|
||
for the season, with shore behavior under edits measured separately.
|
||
- Report local field-query and collision readiness separately from render mesh readiness, and show
|
||
a server-side field query path that does not build or require render meshes.
|
||
|
||
## Round 5 of 5 — Unreal delivery and owner review
|
||
|
||
- Import the reviewed manifest into the season asset/content hash path and connect the native Core
|
||
evaluator behind `bUseVoxelForgeCore`, preserving the legacy path when the flag is off.
|
||
- Build only the isolated BuildHost target here; the owner builds the project. Review the two-biome
|
||
surface and route in-game, then publish matched workload timings, hashes, audit logs and captures.
|
||
- Close every M1 gate or name the failed gate, its evidence and the additional repair round needed.
|
||
|
||
## Round 1 results
|
||
|
||
### Deliverables
|
||
|
||
- Added the public recipe, shipped-plan, hash, channel, block-contract, interval, influence and
|
||
detail-envelope types in `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h`. Recipe and
|
||
evaluator schemas are version 1. All recipe, plan, feature, route and field coordinates use signed
|
||
1/256-voxel integers; the plugin's Core voxel remains 25 cm.
|
||
- Added manifest parse/finalize/validate/serialize and canonical FNV-1a 64 hashing in
|
||
`Standalone/Core/src/WorldAssemblerInternal.h`. Fields hash in declared order as little-endian
|
||
4/8-byte words. Hashes are 16 lowercase hex digits; JSON key order and whitespace are ignored.
|
||
The optional owner-snapshot `world_assembly` field matches the payload shape planned for the
|
||
season manifest. The current review artifact is
|
||
[`round1-manifest.json`](Research/WorldAssemblerM1/round1-manifest.json); season asset/hash-path
|
||
integration remains for round 4.
|
||
- Added native `Heightfield2D`: deterministic warped Voronoi biome selection with Q16 border blend,
|
||
fixed integer profile noise, ground and cap heights, signed density (`negative = solid`), declared
|
||
channels, a conservative global interval, unbounded XY/finite-stratum-Z influence and an explicit
|
||
detail envelope. The current block reads `biome` and writes `height` and `rock`. Water, route and
|
||
surface-tag channels are declared for later blocks, not yet emitted by this block.
|
||
- Connected that block to native Core density queries and added the standalone audit/viewer switches.
|
||
`API.md` documents the current data format and its limits.
|
||
|
||
### Sample manifest and hashes
|
||
|
||
The viewer builds a sample from the owner's `type_4_SurfaceWorld.json` probe: one finite strate
|
||
(index 1, chunk Z -16 through -79), two synthetic stable biome IDs (4097 and 4098), no planned
|
||
features, and no route points yet. The compact manifest is 972 bytes.
|
||
|
||
| Content | Hash |
|
||
|---|---|
|
||
| Recipe | `5cc6cfb49073d366` |
|
||
| Plan | `9aa8b4c29a69233a` |
|
||
| Manifest | `c87ae279b0e26f53` |
|
||
| Heightfield sample stream, 4096 points | `fae2721c052aec5c` |
|
||
|
||
The sample block reports influence Z `[-2528, -480]` voxels, maximum displacement envelope
|
||
`247` voxels, and minimum feature size `25` voxels. These prototype ranges are not the final
|
||
composer-supported recipe envelope.
|
||
|
||
### Bounds and determinism audit
|
||
|
||
The brute-force audit tested 256 randomized boxes with a 3×3×3 sample grid per box (6,912 points).
|
||
It found zero missed bounds and zero unknown bounds. Its deliberately false one-sided interval was
|
||
rejected, so the negative control passed. This is evidence for the current Heightfield2D
|
||
implementation and audit path, not a proof for future field blocks or the final cliff/overhang
|
||
composition.
|
||
|
||
The 4,096-point evaluator output hash matched at W1, W8 and W16 (`fae2721c052aec5c`). The timing
|
||
scope was point evaluation only: W1 2.059 ms, W8 6.851 ms, W16 12.626 ms. W8 and W16 were slower
|
||
on this small batch, likely from thread-startup overhead; no parallel speedup was measured. These
|
||
numbers are not a full view or tile benchmark.
|
||
|
||
### Legacy comparison and captures
|
||
|
||
For the same 4,096 points, the direct legacy density query took 62.115 ms. The prototype's mean
|
||
absolute density error was 274.0383 voxels, maximum error 841.4257 voxels, with 2,261 sign
|
||
mismatches (55.2%). The prototype is therefore not yet a parity replacement for the legacy field.
|
||
The current biome map and two-profile output need further shaping against the reference.
|
||
|
||
The small top-down pair uses the same 3200-voxel XY span and one color ramp fitted to the observed
|
||
owner and native heights together (range `[-2273.12, -1410.26]` voxels): owner `GetSurfaceHeightAt`
|
||
reference and native Heightfield2D ground height. Each JPEG is below 6 KB.
|
||
|
||
| Owner reference | Native prototype |
|
||
|---|---|
|
||
|  |  |
|
||
|
||
The pair shows a large visible mismatch; it is a height-map comparison, not an in-game render. A
|
||
separate D3D window-backbuffer capture attempt was invalid: both viewer windows reported
|
||
`DXGI_STATUS_OCCLUDED`, the saved backbuffers were black, and the native prototype produced zero
|
||
mesh vertices/indices. The reduced diagnostic images were inspected only after downscaling. Do not
|
||
use those D3D files as visual evidence.
|
||
|
||
### Query, collision and view readiness
|
||
|
||
The audit compiled a Core world around the sample heightfield, queried 45 positions through
|
||
`World::densityAt`, and compared them with direct Heightfield2D evaluation. Maximum error was zero;
|
||
the sample Core compile took 35.608 ms; no tile mesh was generated
|
||
(`render_meshes_generated=0`). This verifies the local Core field-query path without render meshes
|
||
for this sample. It does not yet verify a dedicated-server build or the Unreal adapter.
|
||
|
||
The no-manifest cave Core path also passed a constrained regression smoke on the existing
|
||
`type_3_Maze.json` fixture: the 5,642-point walkability audit passed, all 27 player-neighborhood
|
||
tiles and all 64 requested LOD0 tiles generated, and full-detail readiness was 0.157 s at W16.
|
||
The shape compile was 0.100 s. This small 64-tile LOD0 run confirms the additive no-plan path still
|
||
works; it is not the 23.085 s matched workload or the 0.785 s cave-only whole-view baseline.
|
||
|
||
Collision cooking is not available in the standalone audit and was not measured. Full-view time was
|
||
also not measured by audit mode. Earlier small-view D3D attempt timings (owner 0.236 s, native
|
||
0.309 s) are not a valid full-view comparison because presentation was occluded and the native
|
||
view had no geometry. The 23.085 s matched-workload gate remains open. The ~1.57 s aim remains
|
||
reasonable, but round 1 has no valid full-view evidence to support or reject it.
|
||
|
||
## Round 2 results
|
||
|
||
### Round 1 mismatch diagnosis
|
||
|
||
Round 1 was structurally underfit, not mis-scaled or shifted by a constant height datum. The sample
|
||
used two synthetic biome profiles (IDs 4097 and 4098) and a reduced height model. The owner export
|
||
uses four resolved surface profiles and relief/moisture climate ranges; the baseline also omitted
|
||
the mountain and relief response, height warp, output-space profile blend, coast/beach and cliff
|
||
shaping, and per-biome cap detail added in evaluator 2. Both sides use 25 cm voxels, and the current
|
||
4,096-column check finds only a -1.366-voxel mean height offset. The owner and Core biome IDs now match on all 4,096
|
||
diagnostic columns. These measurements point to missing structure and profile assignment rather
|
||
than a unit conversion, datum offset, detail-noise phase, or biome-ID selection error.
|
||
|
||
This round changed those terms as a group, so the before/after result does not isolate each term's
|
||
individual contribution. On the same 4,096 density-query points, mean absolute error fell from
|
||
274.0383 to 17.2262 voxels, maximum density error from 841.4257 to 392.4136 voxels, and sign
|
||
mismatches from 2,261/4,096 (55.2%) to 743/4,096 (18.14%). The separate 4,096-column height
|
||
diagnostic now reports MAE 13.060 voxels, maximum error 203.728 voxels, correlation 0.96496 and
|
||
linear-fit slope 0.95136. Residual peaks and sign errors remain visible; this is not parity.
|
||
|
||
### Evaluator, manifest and audit
|
||
|
||
Evaluator 2 keeps schema 1 and fixed signed 1/256-voxel units while adding deterministic
|
||
climate-based assignment across the owner's four profiles, output-space ground and cap blending,
|
||
per-profile relief/height warp/beach/cliff/cap settings, fixed-season water outputs, and stable-ID
|
||
bounded 3D overhang exceptions. Player carve/fill edits remain unrestricted; route constraints only
|
||
apply to automatic system generation or changes. This sample has one bounded exception
|
||
(`09812c26310b90c9`) and no route yet; route planning and capsule sweep remain round 4.
|
||
|
||
The evaluator-v2 review manifest is 4,514 bytes. Recipe hash is `dbe949967c0dfbce`, plan hash is
|
||
`165a00c4a77ebae0`, and manifest hash is `203d7043158069f6`. The 4,096-sample evaluator hash is
|
||
`c5e0371612e927af` at W1, W8 and W16. Bounds audit passed with 298 boxes and 8,046 points: zero
|
||
missed and zero unknown bounds; 16 biome-border boxes, 16 cliff boxes, 9 cap boxes, 248
|
||
negative-coordinate boxes, and one exception box with 27 exception samples. The deliberately
|
||
wrong one-sided bound was detected.
|
||
|
||
The final interval audit followed one failed audit with 102 missed bounds. Inspection found the cap
|
||
range was overwritten by a global plan range and that plateau/beach and cliff envelopes were
|
||
incomplete. Those envelopes were corrected before the final run. The current result is a sampled
|
||
audit of this evaluator and recipe, not a mathematical proof for arbitrary future inputs.
|
||
|
||
### Matched 3D captures
|
||
|
||
Each pair uses the same camera for owner and native Core, with full-detail tiles ready before
|
||
capture. Images are 640×400 JPEGs; each file is 9,089–17,961 bytes. The native surface, border and
|
||
coast pairs broadly agree in silhouette. The cliff pair shows a remaining large difference: the
|
||
owner has an extreme noisy overhang, while the prototype currently emits the bounded, smoother
|
||
shelf. Water height/fill is emitted as a field sample, but a water overlay mesh is not implemented,
|
||
so the coast captures do not show rendered water.
|
||
|
||
| Site and shared viewer camera (x, y, z; yaw, pitch) | Owner reference | Native Core |
|
||
|---|---|---|
|
||
| Surface `(0, -35, -487.943; 0, -22)` |  |  |
|
||
| Biome border `(128, -243, -492.912; 0, -22)` |  |  |
|
||
| Coast `(336, -67, -477.755; 0, -22)` |  |  |
|
||
| Cliff `(-168, 70, -445.712; 0, 34)` |  |  |
|
||
|
||
`Present` continued to return `DXGI_STATUS_OCCLUDED`, including after bringing the viewer forward.
|
||
The first surface back-buffer file was black and was excluded. The foreground retry's copied
|
||
back-buffer was nonblack and visibly contained generated geometry; the final pairs above use that
|
||
verified capture path. This validates the native mesh/viewer path for these captures, but the
|
||
presentation status itself remains unresolved.
|
||
|
||
### Query, cave compile and full-view timings
|
||
|
||
| Measurement | Result | Scope |
|
||
|---|---:|---|
|
||
| Surface point queries W1 | 13.569 ms | 4,096 evaluator points, point evaluation only |
|
||
| Surface point queries W8 | 8.085 ms | same points, same field hash |
|
||
| Surface point queries W16 | 12.396 ms | same points, same field hash |
|
||
| Legacy owner density queries | 61.974 ms | same 4,096 points; reference timing, not a performance gate |
|
||
| Core world compile and query bridge | 36.295 ms; 45/45 exact | Surface recipe; `World::densityAt`, no render mesh |
|
||
| Existing cave-only shape compile | 0.100 s | no-manifest `type_3_Maze.json` smoke, from round 1 |
|
||
| Owner full-detail readiness | mean 2.882 s | 120 near tiles (64 LOD0 + 56 LOD1), 16 workers, four capture sites |
|
||
| Native Core full-detail readiness | mean 5.227 s | same tile count, workers and sites; range 4.401–6.636 s |
|
||
|
||
| Capture site | Owner | Native Core |
|
||
|---|---:|---:|
|
||
| Surface | 2.873 s | 4.401 s |
|
||
| Biome border | 2.904 s | 4.907 s |
|
||
| Coast | 2.877 s | 4.962 s |
|
||
| Cliff | 2.874 s | 6.636 s |
|
||
|
||
The cave compile and surface query figures are separate workloads. The surface viewer took longer:
|
||
the native 5.227 s mean is 81% above the owner's 2.882 s on these matched views. This 120-tile
|
||
clip-radius-1 workload is not the agreed 23.085 s matched-workload gate. All viewer runs used 16
|
||
workers; maximum observed full-detail time was 6.636 s at the upward-facing cliff camera.
|
||
|
||
### Round 2 run log
|
||
|
||
- The first evaluator build failed because the JSON parser version has no `IsBool`/`IsNull` methods.
|
||
The parser was changed to inspect the JSON value variant, and the next isolated build passed.
|
||
- The first expanded interval audit failed with 102 escaped samples. The envelope fixes described
|
||
above were applied and the final audit passed. No failing result was discarded from the report.
|
||
- The initial native D3D surface capture was black with an occluded presentation status. A
|
||
foreground recapture still reported the same status but its back-buffer contained visible mesh
|
||
geometry; only the verified foreground copy was used. All four final owner/native pairs are
|
||
downscaled and below 18 KB per image.
|
||
- Successful final standalone builds completed in under one minute with `/MP16`, Normal priority
|
||
and 16 CPUs. Existing `vswhere.exe` lookup output and C4838 narrowing warnings at
|
||
`VoxelStrateManager.cpp:3974-3975` remain nonfatal. No process exceeded the 15-minute limit or
|
||
8 GB cap; no `0xC0000142` retry occurred. The crash-folder check found only the pre-existing
|
||
`UECC-Windows-F1A3EFD5469F5DD62E68EBBACAC84376_0000` from 2026-09-17 and no new UECC folder.
|
||
- No owner project or BuildHost project was built. No `.uasset` was opened or changed. No new source
|
||
files were added.
|
||
|
||
## Round 3 results — repair before routes
|
||
|
||
### Defects and repairs
|
||
|
||
The raised block and the floating cliff shard came from the same shipped-plan feature: type 2 was
|
||
interpreted as a full solid AABB. The round-2 plan placed it at x `[-708,-636]`, y `[380,460]` and
|
||
z `[-1695,-1680]` voxels, so its flat top and vertical walls were expected consequences of the
|
||
recipe rather than a tile cache or seam error. The prototype now emits a type-4 terrain-following
|
||
tapered shelf. It samples the native base-height range over its footprint for finite Z bounds,
|
||
smoothly unions the shelf into the height field, and retains type-2 semantics for older plans.
|
||
|
||
The regression audit samples 25 points in baseline air above the shelf: the type-2 negative control
|
||
blocks all 25 while type 4 blocks zero. The audit also requires the negative control to be detected.
|
||
The tile-seam classifier check covers 50 boxes and 900 lattice points across 32-voxel seams with
|
||
zero false solid/air classifications. The former broad type-2 box would fail the shape audit.
|
||
|
||
The new cliff capture shows a single attached, tapered shelf without the floating slab and debris
|
||
trail from round 2. It is a coherent procedural cliff rather than a reproduction of the legacy
|
||
overhang's noisy, stair-stepped surface; visual and density parity with the owner is still not
|
||
claimed.
|
||
|
||
### Bounds, determinism and legacy comparison
|
||
|
||
The final bounds audit passed 298 boxes and 8,046 point samples with zero missed or unknown bounds;
|
||
its deliberately wrong-bound negative control was detected. W1/W8/W16 evaluator hashes all match
|
||
at `6d249c9e3b7c7a03`. The 120 full-detail tile set also has matching worker-count hashes:
|
||
|
||
| Hash | W1, W8 and W16 |
|
||
|---|---|
|
||
| Density | `66a43186eedce63d` |
|
||
| Mesh | `7a47273589966250` |
|
||
| Payload | `2488a207c3103f67` |
|
||
| Topology | `8a17eced70a37323` |
|
||
|
||
The 4,096-point owner comparison is unchanged to reported precision: biome mismatches `0/4096`,
|
||
height MAE `13.060` voxels, density MAE `17.2259` voxels, maximum density error `392.4136`, and
|
||
sign mismatches `743/4096` (`18.14%`). The residual errors are still visible and remain a later
|
||
parity task. The Core field query bridge remains exact at `45/45` points and generated no render
|
||
meshes.
|
||
|
||
The no-manifest `type_3_Maze.json` smoke passed: the cave shape compiled with 16 workers, the
|
||
walkability scan passed `5642/5642`, and the LOD0 stream benchmark generated `64/64` tiles. This
|
||
checks that the additive surface path leaves the existing Core cave path operational.
|
||
|
||
### Matched timing and stage profile
|
||
|
||
All timings below use the current standalone binary, Normal process priority, all 16 CPUs and the
|
||
same owner JSON. Full-detail comparisons use the same 120 tiles at each camera; the full-view pair
|
||
uses the same 529-tile surface clipmap.
|
||
|
||
| Site | Legacy 120 tiles | Native 120 tiles |
|
||
|---|---:|---:|
|
||
| Surface | 0.597 s | 0.063 s |
|
||
| Biome border | 0.630 s | 0.090 s |
|
||
| Coast | 0.611 s | 0.077 s |
|
||
| Cliff | 0.660 s | 0.124 s |
|
||
| Mean | **0.625 s** | **0.089 s** |
|
||
|
||
Native averages 7.1× faster for these matched full-detail tiles. On the full clipmap the legacy
|
||
run took `11.687 s` and native took `3.858 s` (`3.03×` faster, a 67.0% reduction). The `1.57 s`
|
||
whole-view aim remains unmet: this native stream-generation measurement is `2.288 s` over the aim,
|
||
or `2.46×` the aim. The separate cold viewer capture reached its initial 529-tile clipmap in
|
||
`4.35 s`.
|
||
|
||
The current native run reports plan construction at `6.928 ms` and the shape compile at about
|
||
`0.200 s`. Across the 529 streamed tiles, classification reported 29 solid, 196 air, 223 mixed and
|
||
273 unknown box outcomes, with 141 whole-tile meshing skips. Native field calls totaled 16,012,931:
|
||
13,438,461 float, 2,409,044 lattice and zero unclamped calls. The per-thread column cache recorded
|
||
4,281,385 hits and 11,731,564 misses; its column-compute worker-time sum was `53.450 s`. Classifier
|
||
worker time summed to `0.403 s` and mesher worker time to `4.372 s`. Worker-time sums include all
|
||
workers and are not wall-clock stages. `field_calls` includes direct classifier point probes;
|
||
float/lattice subtype counters count density callback routes and are a subset, not an additive split.
|
||
|
||
Per-LOD counts and worker-time sums from the same run:
|
||
|
||
| LOD | Tiles | Solid/air/mixed/unknown outcomes | Tile skips | Field calls | Column hits/misses | Column ms | Classify ms | Mesh ms |
|
||
|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|
||
| 0 | 64 | 0/145/111/0 | 61 | 213,514 | 143,665/69,849 | 175.241 | 186.663 | 24.231 |
|
||
| 1 | 56 | 0/30/26/0 | 30 | 1,196,327 | 1,119,642/76,685 | 213.300 | 147.698 | 282.340 |
|
||
| 2 | 56 | 25/10/21/0 | 35 | 116,048 | 98,725/17,323 | 48.601 | 40.382 | 36.108 |
|
||
| 3 | 56 | 4/9/27/16 | 13 | 292,692 | 184,235/108,457 | 456.442 | 24.875 | 500.537 |
|
||
| 4 | 56 | 0/2/26/28 | 2 | 265,988 | 2,478/263,528 | 1,161.266 | 2.182 | 1,249.532 |
|
||
| 5 | 40 | 0/0/12/28 | 0 | 189,010 | 167,312/21,698 | 113.963 | 0.068 | 193.681 |
|
||
| 6 | 24 | 0/0/0/24 | 0 | 163,809 | 89,504/74,305 | 384.186 | 0.033 | 137.596 |
|
||
| 7 | 12 | 0/0/0/12 | 0 | 303,587 | 83,067/220,520 | 1,050.500 | 0.029 | 100.605 |
|
||
| 8 | 165 | 0/0/0/165 | 0 | 13,271,956 | 2,392,757/10,879,199 | 49,846.610 | 0.667 | 1,847.241 |
|
||
|
||
LOD8 is the remaining cost center: its 165 tiles all received unknown tile classifications and none
|
||
could skip meshing. They account for 13,271,956 native field calls (13,033,696 float and 238,260
|
||
lattice), with 2,392,757 column hits and 10,879,199 misses. Column computation summed to `49.847 s`
|
||
across workers; classification took `0.667 ms` and meshing summed to `1.847 s`. These broad boxes
|
||
span mixed strata, so the single-stratum classifier cannot certify them. Most LOD8 points therefore
|
||
take the field path, and most require a new XY column. The 65,536-entry thread-local column cache
|
||
reduced LOD1 misses from 1,187,985 to 74,549, but did not reduce the LOD8 miss count; full-view wall
|
||
time moved from `4.062 s` to `3.830 s` in that cache-size comparison. A separate 3D point-cache
|
||
experiment had 1.94 million hits but left column misses and full-view time effectively unchanged
|
||
(`3.853 s` versus `3.830 s`), so that experiment was removed.
|
||
|
||
### Fresh matched 3D captures
|
||
|
||
The four owner/native pairs use the same cameras as round 2. Each image is 640×400 and below 22 KB.
|
||
The surface pair no longer shows the flat-topped block; border and coast maintain their broad
|
||
silhouettes; and the cliff pair shows the attached tapered shelf without a floating shard or debris
|
||
trail. The JPEGs are the inspection copies; raw back buffers remain under `captures/raw/`.
|
||
|
||
| Site | Owner reference | Native Core |
|
||
|---|---|---|
|
||
| Surface |  |  |
|
||
| Biome border |  |  |
|
||
| Coast |  |  |
|
||
| Cliff |  |  |
|
||
|
||
### Round 3 run log
|
||
|
||
- One initial full build failed on `shared_ptr` lacking `has_value`; the check was corrected and a
|
||
retry passed. A later full build compiled Core and passed the link-safety scan but the viewer
|
||
compile failed because three profile counters were declared in the other benchmark function's
|
||
scope. Moving them into the correct scope fixed the error; the final isolated build passed in
|
||
under one minute. It reported the existing `vswhere.exe` lookup message and C4838 conversion
|
||
warnings in `VoxelStrateManager.cpp:3974-3975`.
|
||
- The first final audit launch used the executable's default data location, which was absent. It
|
||
exited before generation. Rerunning with `Standalone/data/owner_world.json` passed all audits.
|
||
- A PowerShell capture-array expression combined the border capture path with later flags. The
|
||
owner and native launches then retried back-buffer capture against the malformed path (1,409 and
|
||
229 failed reads in their logs). Both built 2,226 unintended tiles. The owner attempt was stopped
|
||
after 46.2 s; the native attempt had reached initial clipmap readiness at 6.847 s. Working set
|
||
stayed around 1.0 GiB. The argument array was corrected and both matched border captures
|
||
succeeded at the intended 529 tiles. These were stopped capture launches, not crashes.
|
||
- One inspection pipeline using `tail.exe` failed with Win32 error 5; later inspections used
|
||
PowerShell. No `0xC0000142` occurred. No process exceeded the 15-minute limit or 8 GB cap.
|
||
- No owner editor was opened or closed and no owner project was built; no `.uasset` was opened or
|
||
changed. Only the standalone
|
||
BuildHost-compatible viewer was built. No new source files were added, and no commit, push or
|
||
stash was made.
|
||
|
||
## Round 4 results — cap geometry, route and query readiness
|
||
|
||
### Far cap and horizon
|
||
|
||
The LOD8 horizon slab came from the 3D marching-cubes surface being sampled at 256-voxel steps;
|
||
the broad triangles aliased the cap and hung below its native height. The LOD8 ceiling classifier
|
||
also used the legacy owner height query while the mesh used the native `Heightfield2D` plan. I
|
||
replaced the LOD8 ceiling geometry from that same native plan on a deterministic 128-voxel XY
|
||
grid. The generated cap is clipped to `cap >= ground` and the tile's Z interval. It replaces the
|
||
old unmasked ceiling triangles and preserves masked skirt triangles, so this repair rebuilds the
|
||
ceiling instead of omitting it. The cap normals face down into the enclosed strate.
|
||
|
||
The up-and-out pair was captured from the surface at `(0, -35, -487.943)`, yaw `0°`, pitch `25°`.
|
||
It shows a continuous far-cap silhouette in both owner and native views. This checks the visible
|
||
ceiling geometry in the standalone viewer; Unreal's interior lighting and light-leak behavior still
|
||
need owner validation. The surface pair was captured at the same position with pitch `-22°`.
|
||
|
||
In the 2,226-tile run, 153 LOD8 tiles received cap refinement on a 128-voxel grid, covering
|
||
626,308 cells and generating 1,252,688 triangles. The LOD8 tile extent is 8,192 voxels (2,048 m);
|
||
cap tile keys span x `-7..5`, y `-6..6`, z `-1`. The 529-tile cliff-site cost run refined 165 tiles
|
||
and generated 1,351,118 cap triangles.
|
||
|
||
| View | Owner reference | Native Core |
|
||
|---|---|---|
|
||
| Surface | [surface-owner.jpg](Research/WorldAssemblerM1/round4/final/captures/thumbs/surface-owner.jpg) | [surface-native.jpg](Research/WorldAssemblerM1/round4/final/captures/thumbs/surface-native.jpg) |
|
||
| Cliff overlook, pitch -34° | [cliff-final4-overlook-owner.jpg](Research/WorldAssemblerM1/round4/final/captures/thumbs/cliff-final4-overlook-owner.jpg) | [cliff-final4-overlook-native.jpg](Research/WorldAssemblerM1/round4/final/captures/thumbs/cliff-final4-overlook-native.jpg) |
|
||
| Looking up and outward at the cap, pitch 25° | [cap-upout-owner.jpg](Research/WorldAssemblerM1/round4/final/captures/thumbs/cap-upout-owner.jpg) | [cap-upout-native.jpg](Research/WorldAssemblerM1/round4/final/captures/thumbs/cap-upout-native.jpg) |
|
||
|
||
The fresh final4 cliff pair uses an overlook camera at `(-168, 0, -380)`, yaw `0°`, pitch `-34°`.
|
||
It is camera-matched, but still shows a visible owner/native shape difference; it is not evidence of
|
||
cliff parity. The native frame has no broad fanned-plate trail in this view. The route's analytic
|
||
field audit and the type-4 shelf negative control pass independently. Raw 640×400 viewer images and per-run logs are under
|
||
[`round4/final`](Research/WorldAssemblerM1/round4/final/). All viewer/capture runs used VSync and an
|
||
explicit 60 FPS cap.
|
||
|
||
### Finite-strate route and deterministic plan
|
||
|
||
The review manifest is [`world_assembly.json`](Research/WorldAssemblerM1/round4/world_assembly.json).
|
||
It contains one finite strate (chunk Z `-79..-16`), a type-4 shelf with stable ID
|
||
`09812c26310b90c9` and 33 route points, each with its own stable feature ID. The capsule constraints
|
||
are radius `348/256` voxel (0.34 m), height
|
||
`1802/256` voxel (1.76 m), maximum grade `17560/65536`, half-voxel sweep spacing, five support
|
||
probes with at least three required, one-voxel support search depth, and a four-voxel route corridor.
|
||
The serializer produced 7,565 bytes with canonical round-trip equality. Recipe, plan and manifest
|
||
hashes are `c37de78b759c0a4c`, `1ca84619c8600ee5` and `8933693d9560ba9f`.
|
||
|
||
The generator considered 648 route candidates, rejected 366 for grade, rejected none in the sweep,
|
||
and accepted 33. The actual capsule sweep sampled 530 centers / 143,630 field points: zero blocked
|
||
samples, unsupported centers or grade failures; minimum clearance was 63/256 voxel. Its deliberately
|
||
unsupported route control was detected at all 530 centers. Automatic generation and scripted changes
|
||
must preserve the swept route; player carve/fill remains unrestricted. Seasonal water remains fixed.
|
||
|
||
### Readiness, determinism and LOD8 cost
|
||
|
||
| Area | Result |
|
||
|---|---|
|
||
| Local field query | Ready without render meshes. `World::densityAt` compiled in 36.514 ms and matched all 78 audit samples, including all 33 route waypoints; zero render meshes generated. |
|
||
| Analytic route/collision validation | Ready. The capsule sweep above validates clearance/support against the composed field. |
|
||
| Physics collision cooking | Not provided by standalone Core; deferred to the Unreal adapter and owner build. |
|
||
| Render mesh | Separately exercised by the matched viewer captures and stream hashes below. |
|
||
|
||
The 4,096-point native query benchmark took 13.882/16.125/32.117 ms at W1/W8/W16 (point evaluation
|
||
only). Evaluator hash was `c5e0371612e927af` at all three worker counts. The 2,226-tile stream hashes
|
||
also match at W1/W8/W16:
|
||
|
||
| Hash | W1, W8 and W16 |
|
||
|---|---|
|
||
| Density | `e88539dde9407b0e` |
|
||
| Mesh | `c0495d0e5f3f6443` |
|
||
| Payload | `ea807397aa2d01f0` |
|
||
| Topology | `a0243e20433c69f5` |
|
||
|
||
The bounds audit passed 298 boxes / 8,046 samples with zero misses or unknown ranges and detected
|
||
its deliberately wrong-bound control. The cliff shelf audit examined 29,929 half-voxel XY columns,
|
||
found no sub-voxel runs (minimum observed thickness 2 voxels), and detected the legacy taper control
|
||
with 20,963 sub-voxel runs.
|
||
|
||
The matched 529-tile LOD8 cost run still had 165 unknown tiles and no whole-tile skips. LOD8 used
|
||
14,254,137 field calls and 11,678,652 column-cache misses; column computation summed to 54.040 s
|
||
across workers and meshing to 1.944 s. Against round 3's 13,271,956 calls, 10,879,199 misses and
|
||
1.847 s meshing sum, this is about 7.4% more calls, 7.3% more misses and 5.3% more mesher worker
|
||
time. The full 529-tile stream completed in 4.446 s wall time. Full per-worker hashes and LOD8
|
||
profiles are in `round4/final/logs/mesh-hash-final-w{1,8,16}.stdout.txt` and
|
||
`round4/final/logs/lod8-cost-cliff-final-w16.stdout.txt`.
|
||
|
||
### Round 4 run log
|
||
|
||
- Four isolated BuildHost-compatible standalone builds (`final` through `final4`) passed in under
|
||
40 seconds each, including Core link-safety checks. Builds continued to report the existing
|
||
missing `vswhere.exe` lookup and C4838 conversions at `VoxelStrateManager.cpp:3974-3975`.
|
||
No `0xC0000142` retry or compiler crash occurred.
|
||
- The first 64-voxel cap-grid capture completed but was superseded because its clipmap mesh was too
|
||
large. A later build labeled its 128-voxel grid diagnostic as 64; that log was discarded and the
|
||
label was corrected. A pitch-70 cap capture was black and excluded. An owner capture wrapper had
|
||
a PowerShell type-scope error and was rerun successfully. An initial overlook pair used the older
|
||
`WorldAssemblerM1Round4.exe` and was excluded; the owner/native pair linked above was recaptured
|
||
with `VoxelForgeAssemblerM1_round4_final4.exe`. The earlier pitch-34 and tight side-view frames
|
||
were poor comparisons and excluded. The final4 overlook captures exited in 26.4/6.9 s with peak
|
||
working sets 0.983/1.154 GB; both logged the explicit 60 FPS limiter and VSync.
|
||
- A focused native cliff probe crossed the approximately 8 GB process-memory guard (last external
|
||
sample 8.257 GB decimal / 7.69 GiB). The guard stopped the run before capture; its output is
|
||
excluded. This is the only process to cross the requested approximate cap. No run crashed and no
|
||
build, compile or audit exceeded 15 minutes.
|
||
- All successful viewer captures and stream benchmarks had VSync enabled and the frame limiter set
|
||
to 60 FPS; viewers exited after capture. The highest successful capture working set was about
|
||
1.52 GiB. No owner editor/project or `.uasset` was touched, and no new source files were added.
|
||
No commit, push or stash was made.
|
||
|
||
### Remaining work by round
|
||
|
||
- **Round 3:** The two visible defects are repaired and the native path is faster on both the matched
|
||
120-tile and 529-tile workloads. Residual owner mismatch, rendered-water gap, and the 1.57 s aim
|
||
remain open; LOD8 is the measured cost center.
|
||
- **Round 4:** Complete. The route and cap are in the research manifest; field sweep, negative
|
||
controls, bounds, determinism, headless query and matched captures are recorded above. Physics
|
||
collision cooking and Unreal light-leak behavior remain owner-build checks.
|
||
- **Round 5 — before Unreal delivery:** Integrate the reviewed manifest into the season asset/content
|
||
hash path and connect Core behind `bUseVoxelForgeCore`; prove that flag-off behavior remains
|
||
unchanged. The owner builds and reviews the in-game two-biome surface, enclosed cap lighting and
|
||
capsule-walkable route. Run the matched 23.085 s workload, report full-view and local query/
|
||
collision readiness separately, and assess the approximately 1.57 s aim. No BuildHost or owner
|
||
project build was done here.
|
||
|
||
### Run log
|
||
|
||
- First isolated full build compiled Core and passed the 199,209-line Core link-safety scan, then
|
||
failed at viewer link: the new inline API symbols were not emitted and the standalone build lacked
|
||
the GPU Far viewer implementation. No GPU Far source file exists in the standalone set.
|
||
- Retry adding the assumed `GpuFarViewer.cpp` failed at compile with `C1083` because that source file
|
||
is absent. The build was changed to use local CPU-viewer link stubs under ignored
|
||
`Standalone/Build/AssemblerM1/` output; Core remains GPU-free.
|
||
- The next full standalone build succeeded after moving the new API definitions out of line and
|
||
isolating the GPU viewer stubs. Another full build succeeded after adding the height-map capture;
|
||
a further build succeeded after adding manifest output; the final full rebuild after marking the
|
||
manifest API for Core export also succeeded. The latest full build succeeded after changing the
|
||
capture ramp to the observed shared height range. Each successful build took under one minute,
|
||
used `/MP16`, Normal priority and all 16 allowed CPUs; sampled compiler processes remained well
|
||
below 8 GB.
|
||
- Successful builds still print the environment's `'vswhere.exe' is not recognized` message and
|
||
existing C4838 narrowing warnings in `VoxelStrateManager.cpp:3974-3975`. These did not stop the
|
||
build. No `0xC0000142` retry occurred. A separate Git Bash `tail` inspection command failed with
|
||
access denied while opening a file; it made no changes.
|
||
- No BuildHost or owner-project build was run this round. The checked
|
||
`Saved/BuildHost/HostProject/Saved/Crashes/` folder contains one older `UECC-Windows-*` directory
|
||
from 2026-09-17; there was no new crash folder from this round.
|
||
|
||
No Unreal route or asset was changed in this round, so there is no owner rebuild handoff yet.
|