wip(assembler): M2 round 4 -- WorldAssemblerHybridV2: exact contacts, tagged tiles 1.18-1.27x MC

The round-3 'field contact error' measured hit-to-anchor distance; V2 contacts are 0 cm and on the zero
isosurface. Tagged-tile cost 5.7-6.7x -> 1.175-1.270x MC; organic 0.998x. Bound, shelf-thickness and route
audits rerun with negative controls; W1/W8/W16 stable; V1 and MarchingCubesV1 unchanged.

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-10 10:41:43 +02:00
1 parent 22a6b30494
commit 4661a445be
48 files changed
+106493 -71

No files matched your search

@@ -257,3 +257,90 @@ BuildHost work. The final passing commandlet and focused checks are described ab
No new UECC folder, process crash, or `0xC0000142` retry occurred in round 3. No owner project/editor was
opened or built; no `.uasset` was edited; no commit, push, or stash was made.
## Round-4 exact, low-cost hybrid (2026-10-10)
### Decision and contact diagnosis
Added `WorldAssemblerHybridV2` as a separately versioned, opt-in recipe. It keeps MC connectivity and snaps only interior LOD0 MC edge roots that cross a tagged type-2 box face to that face’s exact sub-voxel plane. Stable face keys and axis normals keep shared edge roots deterministic. Tile-border cells and LOD1+ remain MC. V1 code/output, Core-off behavior, and `MarchingCubesV1` remain unchanged; select V2 when previewing the hybrid.
The previous table’s “field-contact error” label was wrong: it measured Euclidean distance from the cooked Pawn trace hit to a hand-authored expected point, not the signed field residual. The fixture anchors were correct: the same five anchors now produce exact hits with V2. The old offset came from MC interpolating across a type-2 box face between lattice samples. `Heightfield2D::point` applies the box only inside it (`min(base,-depth)`); outside it returns the base field, so the sampled edge root need not lie on the analytic face. The riser’s face happened to align with the lattice. These probes were all interior LOD0 contacts in tile `(1,5,-63)`, which rules out the border/LOD1 fallback. V2 snaps the eligible MC roots directly; its correction does not use a QEF clamp or center penalty.
The commandlet now logs `expected_point_error_cm`, the hit-to-anchor delta, and `density_at_contact` separately.
| Cooked Pawn contact | Expected-point error | Core density at hit | Render/cooked bounds |
|---|---:|---:|---|
| Corner top | 0.000 cm | 0.000000 | match |
| Doorway lintel | 0.000 cm | 0.000000 | match |
| Riser face | 0.000 cm | 0.000000 | match |
| Ledge top | 0.000 cm | 0.000000 | match |
| Ledge underside | 0.000 cm | 0.000000 | match |
Each trace hit the actor and target RMC component on the Pawn channel; the actor Core hash matched the expected mesh. The full V2 actor run passed all five contacts, the Core-off content gate, and the existing initial, anchor, edit, carve/fill, surface-travel, and surface-strate-travel checks.
### Tagged-tile cost
Full actor-run production mesher timings for 32³ LOD0 tiles, measured after field sampling:
| Fixture | MC during V1 | V1 | V1 / MC | MC during V2 | V2 | V2 / MC |
|---|---:|---:|---:|---:|---:|---:|
| 90° corner | 2.263 ms | 16.082 ms | 7.106× | 2.204 ms | 2.799 ms | 1.270× |
| Doorway | 1.808 ms | 11.416 ms | 6.313× | 1.797 ms | 2.112 ms | 1.175× |
| 1 m riser | 1.936 ms | 11.416 ms | 5.898× | 1.922 ms | 2.264 ms | 1.178× |
| Cliff ledge | 2.225 ms | 12.418 ms | 5.580× | 2.209 ms | 2.748 ms | 1.244× |
| Organic cave | 1.992 ms | 1.990 ms | 0.999× | 2.031 ms | 2.026 ms | 0.998× |
All four tagged fixtures are under the 1.5× target. V1 remains available for versioned comparison and retains its 5.58–7.11× cost; use V2 for the owner preview. V2 triangle counts match MC on these fixtures, and every fixture repeat was deterministic. The same-LOD independent border check passed; the V2 border mesh matched MC exactly.
### Final-code audits and identity checks
The rebuilt standalone audit reran the requested audits with negative controls:
| Audit | Final result | Negative control |
|---|---|---|
| Bounds | 298 boxes, 8,046 samples; 0 missed and 0 unknown bounds | Deliberately wrong bound detected |
| Shelf thickness | 29,929 columns; minimum 2.000 voxels; 0 sub-voxel runs | Legacy control found 20,963 sub-voxel runs in 19,251 columns |
| Route sweep | 33 points, 32 segments, 530 centers and 143,630 field samples; 0 blocked, unsupported, or grade failures | Raised-route control found 530 unsupported centers |
All three audits passed. The evaluator stayed deterministic at W1/W8/W16 (`c5e0371612e927af` each). The BuildHost actor hash matrix also remained at the round-6 hashes for density `0x8cc18e2981c50c4e`, mesh `0x78e9c8ea42ff2965`, payload `0x380e8e11e76b47ca`, and topology `0x24e40452e99fe482`.
V2 also passed the native SurfaceWorld cliff check: type-4-only tile `(-22,13,-58)`, 10,231 vertices, 10,360 triangles, hash `0xfc7bd7a3cf997992`, bit-identical to MC. The full actor SurfaceWorld run checked 2,553 desired tiles, 3,438 neighbor faces, 432 LOD transitions, and 1,016 skirt tiles.
Evidence: [standalone audit log](round4/audit.stdout.log), [focused V2 fixture and 125-phase doorway log](../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-backup-2026.10.10-08.06.37.log), [full BuildHost actor log](../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation-backup-2026.10.10-08.20.33.log), and [V2 cliff check log](../../../Saved/BuildHost/HostProject/Plugins/VoxelForge/Saved/CoreWorldValidation/Logs/CoreWorldValidation.log).
### Doorway LOD failures with skirts
The five MC doorway failures remain topological failures of the standalone stitched-transition candidate. Every row has 3 seam-band boundary edges, 1 nonmanifold edge, and 1 unmatched loop. The raw fine/coarse contour mismatch is 18.57–20.48 cm and the transition-surface residual is 15.00–20.00 cm, below the 50 cm contour budget.
| Phase `(x,y,z)` m | Raw contour mismatch | Transition residual | Boundary / nonmanifold / unmatched |
|---|---:|---:|---:|
| `(0,0.15,0.15)` | 20.480 cm | 20.000 cm | 3 / 1 / 1 |
| `(0,0.20,0.20)` | 18.570 cm | 15.000 cm | 3 / 1 / 1 |
| `(0.05,0.15,0.15)` | 20.480 cm | 20.000 cm | 3 / 1 / 1 |
| `(0.05,0.20,0.20)` | 18.570 cm | 15.000 cm | 3 / 1 / 1 |
| `(0.10,0.15,0.15)` | 20.480 cm | 20.000 cm | 3 / 1 / 1 |
I regenerated the five failing phase pairs from independently meshed MC LOD0/LOD1 doorway tiles, then added the plugin’s normal-extruded, double-sided seam skirts at the round-2 comparison depths (1 m fine, 2 m coarse). In the matched CPU orthographic captures the seam opening is covered, but the skirt strips themselves are visible around the doorway. So the topology failures do not appear as open daylight gaps in this view; skirts can still be seen and may pop with camera movement. This is a static software-rendered diagnostic, not a live Unreal camera test.
Cases and meshes are in [the 750-row doorway sweep](round4/skirt-audit/seams.csv); the downscaled [skirts off/on contact sheet](round4/skirt-audit/captures/doorway_skirts_on_off_contact_sheet.jpg) shows all five failing phases. The production V2 policy still relies on skirts at LOD borders and keeps LOD1+ on MC.
### Build, source inventory, and run ledger
BuildHost UBT and the Core link-safety audit passed. The standalone Core/viewer build passed and produced `VoxelForgeM2Round4Audit.exe`; `vcvars64` printed a non-fatal missing-`vswhere.exe` message, and MSVC reported existing narrowing warnings in `VoxelStrateManager.cpp:3974–3975`. No build or test exceeded 15 minutes.
No permanent new source files were added. Modified implementation files are `Source/VoxelForge/Public/VoxelWorld.h`, `Source/VoxelForge/Private/VoxelWorld.cpp`, `Source/VoxelForge/Public/VoxelMarchingCubesMesher.h`, `Source/VoxelForge/Private/VoxelMarchingCubesMesher.cpp`, `Source/VoxelForge/Private/VoxelHybridSharpMesher.h`, the mirrored three files under `Standalone/Source/VoxelForge`, `Standalone/Core/include/VoxelForgeCore/VoxelForgeCore.h`, `Standalone/Core/src/VoxelForgeCore.cpp`, `Source/VoxelForgeEditor/Private/VoxelForgeExploreCommandlet.cpp`, and `Tools/TestVoxelForgeCoreWorldHost.ps1`. `ARCHITECTURE.md` and `CODEMAP.md` were updated. A temporary standalone skirt-export helper was built under `Saved/BuildHost` and removed after capture generation.
Likely compile touchpoints are the reflected enum in `VoxelWorld.h` (UHT), the VoxelForge runtime module, VoxelForgeCore, the VoxelForgeEditor commandlet, and the standalone `Build.ps1 -Target All` target.
| Run | Result |
|---|---|
| UBT attempt 1 | Failed in 50.5 s: `bCanSnapCell` was undeclared; changed the check to the V2 snap flag. |
| UBT attempt 2 | Failed in 8.8 s: standalone compatibility vectors do not support `operator[]`; added axis access helpers. |
| Final UBT + Core link audit | Passed; 16 parallel actions and Core symbol safety passed. |
| V2 fixture-only BuildHost | Passed, including fixture repeats, same-LOD border, and 125 doorway phases; commandlet reported 0 errors. |
| Full V2 actor BuildHost | Passed in about 11.5 min; peak sampled private memory 3,966,750,720 bytes (3.69 GiB); 0 engine errors. |
| V2 native cliff BuildHost | Passed in about 17 s; peak sampled private memory 2,130,636,800 bytes. |
| Standalone all-target build and bound/shelf/route audit | Passed; audit 24.2 s and peak sampled private memory 53,837,824 bytes. |
| Doorway skirt audit | Passed in 241.4 s; peak sampled private memory 214,925,312 bytes; CPU-only. |
No process crashed, no `0xC0000142` retry occurred, and no new `UECC-*` folder appeared. The only crash folder remains the older 2026-09-17 one. No owner project file or `.uasset` was changed, the owner’s editor/project was not opened or built, and no commit, push, or stash was made.