wip(assembler): M1 repair round -- raised block and cliff fixed; native 7x faster than legacy

Luna, M1 repair round: the rectangular raised block and the broken cliff shared one cause,
a type-2 solid AABB in the generated plan; it is now a tapered, terrain-following shelf, and
a negative-control audit catches the old box behaviour; seam classification check passes.
Bound audit 298 boxes / 8,046 samples, 0 misses. Evaluator and 120-tile density/mesh/payload/
topology hashes identical at W1/W8/W16. Cave regression: walkability 5,642/5,642, 64/64 tiles.
Legacy mismatch unchanged (0 biome mismatches, 18.14% signs).
Speed (matched workloads): 120-tile full detail 0.089 s native vs 0.625 s legacy; 529-tile
clipmap 3.858 s vs 11.687 s -- 2.29 s above the ~1.57 s aim; LOD8 dominates (165 unknown
tiles, 13.27 M field calls, 10.88 M column-cache misses).
My capture review: coast matches legacy closely; surface clean but a dark flat slab on the far
horizon; cliff shelf renders as a stack of thin plates with back faces showing (sub-voxel
shelf thickness suspected).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MmSoF64BbRFmk9C3p1VsBJ
This commit is contained in:
Fr0zkaandClaude Opus 5.5 committed 2026-10-09 01:22:30 +02:00
1 parent fcb16fd265
commit 2c20f9eaea
61 files changed
+4308 -165

No files matched your search

+158 -11
View File
@@ -1,13 +1,13 @@
# World assembler M1 report
M1 has four implementation rounds. The gates at the end of the milestone remain the agreed
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 4 — native foundations
## 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.
@@ -17,7 +17,7 @@ legacy bridge; and server field queries that do not depend on render meshes. The
- 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 4 — complete the surface recipe
## 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.
@@ -26,7 +26,19 @@ legacy bridge; and server field queries that do not depend on render meshes. The
- 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 4 — route and query readiness
## 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.
@@ -37,7 +49,7 @@ legacy bridge; and server field queries that do not depend on render meshes. The
- 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 4 of 4 — Unreal delivery and owner review
## 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.
@@ -166,7 +178,7 @@ climate-based assignment across the owner's four profiles, output-space ground a
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 3.
(`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
@@ -245,17 +257,152 @@ workers; maximum observed full-detail time was 6.636 s at the upward-facing clif
- 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 | ![Round 3 surface owner](Research/WorldAssemblerM1/round3/final/captures/surface-owner.jpg) | ![Round 3 surface native](Research/WorldAssemblerM1/round3/final/captures/surface-native.jpg) |
| Biome border | ![Round 3 border owner](Research/WorldAssemblerM1/round3/final/captures/border-owner.jpg) | ![Round 3 border native](Research/WorldAssemblerM1/round3/final/captures/border-native.jpg) |
| Coast | ![Round 3 coast owner](Research/WorldAssemblerM1/round3/final/captures/coast-owner.jpg) | ![Round 3 coast native](Research/WorldAssemblerM1/round3/final/captures/coast-native.jpg) |
| Cliff | ![Round 3 cliff owner](Research/WorldAssemblerM1/round3/final/captures/cliff-owner.jpg) | ![Round 3 cliff native](Research/WorldAssemblerM1/round3/final/captures/cliff-native.jpg) |
### 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.
### Remaining work by round
- **Round 2:** Evaluator-v2 surface recipe, matched 3D comparisons and expanded bounds audit are
implemented. The measured residual mismatch, rendered-water gap, and owner/native cliff difference
remain open for round 3 review; round 2 does not claim surface parity.
- **Round 3:** Add the finite-strate capsule route and support constraints, sweep it against the final
- **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:** Add the finite-strate capsule route and support constraints, sweep it against the final
composed field, and reject or repair any failing automatic plan. Verify full-evaluator W1/W8/W16
hashes. Measure collision readiness separately from query and mesh readiness; demonstrate a
headless/server field query without render meshes. Keep the route valid during all automatic
changes, leave player edits unrestricted, and keep seasonal water fixed.
- **Round 4:** Wire the reviewed manifest into the season asset/content-hash path and connect Core
- **Round 5:** Wire the reviewed manifest into the season asset/content-hash path and connect Core
behind `bUseVoxelForgeCore`; prove the flag-off legacy path is unchanged. Build only the isolated
BuildHost target here. The owner builds and reviews the in-game surface and walkable route.
Re-run the matched 23.085 s workload, report full-view and local query/collision readiness