From 0ff8d98786dbe52b580e62542ec985fe53b4b513 Mon Sep 17 00:00:00 2001 From: Fr0zka Date: Wed, 4 Nov 2026 07:10:34 +0100 Subject: [PATCH] wip: L174 Design50 steps 0-2 verified; v240 baselines; seams proven real (RED) End runs pass 48/48; overlap/turn census still fails; seam mismatches are real (one tile adds the passage carve, its neighbour's X8 fast path does not). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1 --- .../WorldAssemblerM3/Linux174/REPORT.md | 68 +++++++++++++++++++ Standalone/Tools/verify/baselines/README.md | 4 ++ ...hash-floating-islands-style2-v240.baseline | 12 ++++ ...er-hash-surface-world-style1-v240.baseline | 12 ++++ Standalone/Tools/verify/verify.py | 8 +-- 5 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 Standalone/Research/WorldAssemblerM3/Linux174/REPORT.md create mode 100644 Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v240.baseline create mode 100644 Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v240.baseline diff --git a/Standalone/Research/WorldAssemblerM3/Linux174/REPORT.md b/Standalone/Research/WorldAssemblerM3/Linux174/REPORT.md new file mode 100644 index 0000000..3250b7b --- /dev/null +++ b/Standalone/Research/WorldAssemblerM3/Linux174/REPORT.md @@ -0,0 +1,68 @@ +# L174 — resumed Design50 steps 0–2 + +**Seam verdict: real neighboring-tile density disagreements.** The final-source seed-0 seam audit compares samples on the same LOD and shared coordinates. It examined 7,579/7,579 tile pairs across LOD0 and LOD1, with zero exempt pairs, and found 58,829 mismatches. This is not a cross-LOD, rounding, tolerance, or non-shared-sample artefact. The mismatches are real output discontinuities; the positive/negative sign disagreement below is consistent with a visible seam, though this round did not capture a rendered crack. + +At LOD1, adjacent tiles `(0,1,-33)` and `(0,1,-32)` share the `z=-2048` voxel plane (`z=-512 m`). Their Z-axis captures use step 2 voxels and include these identical coordinates: + +| Shared coordinate (m) | Tile A density | Tile B density | Absolute delta | +|---|---:|---:|---:| +| `(16.5, 28.5, -512)` | `+0.781364381` | `-4.125` | `4.90636438` | +| `(15.5, 29, -512)` | `+0.54046756` | `-4.125` | `4.66546756` | +| `(16, 29, -512)` | `+1.36258674` | `-4.125` | `5.48758674` | + +**Measured:** all three samples are logged as LOD1, axis Z, with the same tile keys and exact world coordinates. Seed 0 has 6/6 landing discs and 6/6 end runs covered; there are no seam exemptions. The full capture and tagged output are in `Saved/Linux/l174/seam-reproduction/seed0.log`. + +The audit reads each generated tile’s captured `TileMesh.debugDensitySamples`; it maps the same world voxel coordinate into both arrays only when each capture’s step divides the coordinate delta exactly. It compares the captured float values directly. These deltas are several density units, so coordinate rounding or a tolerance threshold cannot explain them. + +**Composition trace, with limits:** a diagnostic-only trace (not built from the final source stamp) reports tile A’s input, graph, boundary, and stamp terms all as `-4.125`, then final values of `+0.781364381`, `+0.54046756`, and `+1.36258674` at the three points. The neighboring tile’s diagnostic X8 trace returns `-4.125` at all three through `packed_x8_base_only`; it reports one route candidate and one swept route, but no graph contribution. This supports the inference that the passage carve is applied on one tile path and omitted on the adjacent tile path. The exact dispatch predicate remains untraced. + +The audit compares the two generated tile outputs directly; it does not compare either against a separately recomposed reference order. A composition-order or dispatch difference may explain the two paths, but the exact cause remains untraced. + +### Controls + +- The archived L147-era owner control reports 0 mismatches, but it examines only 118 of 1,114 candidates: four pairs and 4,900 shared samples. Its narrower coverage makes it a limited control, not evidence that current full coverage should be zero. Log: `Saved/Linux/l174/control-l147/seed0.log`. +- The archived `assembler/world` control does not reach the seam audit. Prototype setup stops because finite-strate route candidates fail the composed-field capsule/support sweep. Its owner data SHA is the same as the current owner input (`38b33d30…`). No seam result can be inferred from this control. Log: `Saved/Linux/l174/control-assembler-world/seed0.log`. +- The final-source injected-mismatch control adds a `1e-6` discrepancy at a shared sample. It is tagged `injected=true`; the audit ends with `injected=DETECTED`, 58,830 mismatches, and `status=FAIL` (exit 10 as expected for this already-failing world). Log: `Saved/Linux/l174/seam-injection/seed0.log`. + +### Builds and owner hashes + +Fresh Clang 19 and GCC 14 builds from `HEAD` completed. Both rebuilt headless binaries print source stamp `36936204fc85614b1aa8f660c38009d36e65327722b7f7e9d7ec123755412d48`. Build logs are `Saved/Linux/l174/rebuild-clang.log` and `Saved/Linux/l174/rebuild-gcc.log`. + +Step 0 was audit-only. Its intermediate source stamp, `145eff57…`, produced W1 and W12 owner hash records matching the v239 canonical hashes for both recipes. Those logs predate steps 1–2, so they are evidence for step 0 at that source revision, not final-stamp evidence. On final stamp `36936204…`, W1 and W12 match each other across 12 canonical records for each recipe, but differ from v239 because steps 1–2 change passage geometry. A final-source cross-compiler check also matches all 13 pipeline hash outputs for both recipes across Clang and GCC at W1, W8, and W12 (`Saved/Linux/l174/hash-cross-compiler/`). `WorldAssemblyEvaluatorVersion` is now 240; the v240 baselines describe those final-source hashes. The fast tier stopped at the passage audit before reaching its hash gate. + +### Steps 1–2 verification + +- **End runs:** 48 measured across 16 seeds, zero audit failures. The 2% slope negative control is rejected as expected (`PassageEndRunNegativeControl`, status PASS). +- **Fixtures:** the frozen helix is rejected with 291 overlap pairs; the 160.007° hairpin is rejected with one end-turn violation. Both fixture checks pass. Logs: `Saved/Linux/l174/verify-fast/owner-floating-islands-style2-clang.log`. +- **Self-overlap and turns:** the 16-seed census still fails. It found six overlap pairs across seeds 1, 10, and 11; 23 end-turn violations across seeds 1, 3–10, 13–15; and zero landing-column violations. Step 2 is not complete. +- Three attempted step-2 fixes failed and were reverted: the closure smoke left two landing-column violations; the connector smoke left overlap/end-turn and five landing-column violations; the r241 endpoint-fillet attempt consumed the required straight end run (`passage/0-1/0 cannot round its end end turn outside the required straight run`). Per the stop rule, no fourth fix was attempted. +- `verify.py fast` fails at `owner-floating-islands-style2-clang` (exit 10, final stamp and recipe/style checks true). Its owner census reports 11 overlap pairs and one end-turn violation; its end-run audit and 2% control pass. The streaming-admission-order check passes. The canonical hash gate was not reached. Summary: `Saved/Linux/l174/verify-fast/fast-summary.json`. + +### Final-source 16-seed sweeps + +Both Tunnel Network and Vertical Shafts route checks ran for seeds 0–15 from the same final source stamp. Full per-seed tagged output and attribution are in `Saved/Linux/l174/final-sweeps-v240/`; aggregate: `summary.json`. + +| Measure | Result | +|---|---:| +| Overall seed rows passing every gate | 0/16 | +| Seam mismatch samples | 1,503,957 | +| Route / end-run / body tags | 1,432,668 / 56,900 / 14,389 | +| Disc / rim tags | 0 / 0 | +| Uncovered landing-disc regions | 5 seeds (2, 5, 6, 12, 15), one each | +| Exempt seam pairs | 0 | +| EndRunAudit | 48/48 pass | +| Tunnel Network route | 13/16 pass (seeds 2, 6, 13 fail) | +| Vertical Shafts route | 16/16 pass | +| Both blocked-route controls | 16/16 pass each | +| Per-seed negative controls | 16/16 pass | + +### Remaining work and checks not run + +The shared-sample seam mismatch and its exact dispatch cause remain unresolved. Step 2 still has overlap and end-turn failures; Tunnel Network misses three seeds, and five seeds have an uncovered landing disc. The assembler/world control could not reach seam auditing. No UE build or timing run was performed. No step 3 composer/stamp work or LayerPlanner refactor was started. + +The committed L174 change touches these Unreal `Source/` files for the Windows owner build: + +- `Source/VoxelForge/Private/VoxelMarchingCubesMesher.cpp` +- `Source/VoxelForge/Public/VoxelMarchingCubesMesher.h` + +The resumed verification added no C++ source edits. The working-tree changes are the v240 baseline files and verifier baseline references/documentation. `git diff --check` passes. diff --git a/Standalone/Tools/verify/baselines/README.md b/Standalone/Tools/verify/baselines/README.md index 45fbb9f..fa5ae01 100644 --- a/Standalone/Tools/verify/baselines/README.md +++ b/Standalone/Tools/verify/baselines/README.md @@ -11,3 +11,7 @@ verification gates. The gates now read this tracked directory instead of - `mouth/`: L35–L37 mouth-shape controls. - `ring/`: L30/L31 negative ring controls. - `capture/`: L34 reference camera records. +- `owner-hash/canonical/owner-hash-*-v239.baseline`: L173 geometry before the L174 + level-end-run and passage-overlap changes. +- `owner-hash/canonical/owner-hash-*-v240.baseline`: L174 canonical owner hashes after + Design50 steps 1–2; step 0 retained the v239 geometry and hashes. diff --git a/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v240.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v240.baseline new file mode 100644 index 0000000..d33cf19 --- /dev/null +++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-floating-islands-style2-v240.baseline @@ -0,0 +1,12 @@ +[PipelineFullDetailHash] tiles=960 density=0x91931a57a067fd92 mesh=0xa818654be89790ac payload=0x370ff80451105a39 topology=0x06e507557aa70173 +[PipelineWholeViewHash] tiles=2370 density=0x4e42aa6d94f49efd mesh=0xf5acd03d43b7e605 payload=0x47035635b87ac5a1 topology=0x92b34da1a238c7d0 +[PipelineLODHash] lod=0 tiles=512 density=0x2fd4c78685a43cfe mesh=0x50478cff1c1f8ca0 payload=0x54e48e57e0af26de topology=0x860c011cfdb9833a +[PipelineLODHash] lod=1 tiles=448 density=0x4b8d9a6dcd2942ad mesh=0x17e89b7087bfe711 payload=0x2389c109eb780db6 topology=0x7eccd4cf560d0630 +[PipelineLODHash] lod=2 tiles=320 density=0x46868633e08b17ac mesh=0xdd0822448da57441 payload=0xbf45172d7c5a5027 topology=0xec98f93611f212eb +[PipelineLODHash] lod=3 tiles=208 density=0x90cb81958614cc8c mesh=0x4239686b6ec7d9e8 payload=0x78de5e1ce55ec7e0 topology=0xb989353c3e5969a9 +[PipelineLODHash] lod=4 tiles=240 density=0xfb11591772a3d18e mesh=0xebf2baee8764591b payload=0xe491d7ac9c0061ad topology=0xd618ac33b95ce494 +[PipelineLODHash] lod=5 tiles=144 density=0x2f8b7b7fb1e67258 mesh=0x4cd508cbe97344fd payload=0x2b6e96a6050458c9 topology=0x4ff6d0eda8988573 +[PipelineLODHash] lod=6 tiles=96 density=0x0114a34c8b8d6113 mesh=0xb1fec4d01ae1fa44 payload=0x3e50cfd429b8e950 topology=0x08090c96d15c1618 +[PipelineLODHash] lod=7 tiles=96 density=0x3836ed8cfce73418 mesh=0x40bc6589c5fc1aac payload=0x677349bcae16790f topology=0x36e3aa53192e6a6b +[PipelineLODHash] lod=8 tiles=306 density=0x144f3c1fd722708b mesh=0xef77b28bf7fd9453 payload=0xe3f47b37fcd61489 topology=0x5a3c73e295494e04 +[PipelineExactQueryHash] probes=9 density=0x7b7c50ac24ccadcc unclamped=0x7b7c50ac24ccadcc detail=0xefcba20c0c70c415 collision=0xe604823a249029bf path=direct-Core-queries diff --git a/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v240.baseline b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v240.baseline new file mode 100644 index 0000000..f00a52e --- /dev/null +++ b/Standalone/Tools/verify/baselines/owner-hash/canonical/owner-hash-surface-world-style1-v240.baseline @@ -0,0 +1,12 @@ +[PipelineFullDetailHash] tiles=960 density=0xace56c8f205238ad mesh=0xa9c603a1248de6b8 payload=0xea55f1f4fcc6a894 topology=0x5ea7bc78a1b678ae +[PipelineWholeViewHash] tiles=2370 density=0x3b7675888782a484 mesh=0xe221831996b733ff payload=0xcc3da40ef7ba0c7d topology=0x90bf031cc34a60c6 +[PipelineLODHash] lod=0 tiles=512 density=0xcd6ab28cfa504aca mesh=0xf03dc80a669fca31 payload=0x397aded1c3d2d297 topology=0xb4a1dc84fabc1fe3 +[PipelineLODHash] lod=1 tiles=448 density=0xce6e713828b2a20a mesh=0x1cf408c25d67d18c payload=0x8a2b5d20571c997e topology=0x51cd985fe8e7d100 +[PipelineLODHash] lod=2 tiles=320 density=0xb1c67cbefb4743a0 mesh=0x22120a83b6cf0343 payload=0xac8316e045eae7cc topology=0x3f37d947ff7aff29 +[PipelineLODHash] lod=3 tiles=208 density=0x21de97d1ea265d68 mesh=0xae30b7a7179872d0 payload=0xc085d1bcb0fc47b0 topology=0xfef710a355b87606 +[PipelineLODHash] lod=4 tiles=240 density=0x0be8798407724eaf mesh=0x131c303cbbe51434 payload=0x2a90ecf0a2411ca0 topology=0xe3e054a371152e08 +[PipelineLODHash] lod=5 tiles=144 density=0xf20897ad272103a9 mesh=0x13d00b6253ae1f72 payload=0x0db3880693a962fa topology=0x462bd87a80f15e89 +[PipelineLODHash] lod=6 tiles=96 density=0xc040fcac457d6313 mesh=0x1ed132eeb718fb62 payload=0xcd0214e35577c6e3 topology=0x2c56c69e6fdcfd64 +[PipelineLODHash] lod=7 tiles=96 density=0xc2d419446355fdb8 mesh=0x4ea44452574fc84b payload=0xfd9779bedfc9ae0f topology=0x8948546e770c9b72 +[PipelineLODHash] lod=8 tiles=306 density=0x62db31696f2da831 mesh=0xd373f9e9481532fe payload=0x540a60526e0e3e46 topology=0xc725cb901e6dc335 +[PipelineExactQueryHash] probes=9 density=0xc949c4df2ce6f9d9 unclamped=0xc949c4df2ce6f9d9 detail=0x114c501e2d830d94 collision=0xe6011d3a248d4849 path=direct-Core-queries diff --git a/Standalone/Tools/verify/verify.py b/Standalone/Tools/verify/verify.py index 9bbc2a5..3113680 100644 --- a/Standalone/Tools/verify/verify.py +++ b/Standalone/Tools/verify/verify.py @@ -125,11 +125,11 @@ RECIPE_RE = re.compile( def owner_hash_baseline(recipe: str, style: int) -> tuple[Path, str]: if recipe == "surface-world" and style == 1: - return (BASELINES / "owner-hash/canonical/owner-hash-surface-world-style1-v239.baseline", - "L173-v239-combined-cave-planner") + return (BASELINES / "owner-hash/canonical/owner-hash-surface-world-style1-v240.baseline", + "L174-v240-Design50-steps1-2") if recipe == "floating-islands" and style == 2: - return (BASELINES / "owner-hash/canonical/owner-hash-floating-islands-style2-v239.baseline", - "L173-v239-combined-cave-planner") + return (BASELINES / "owner-hash/canonical/owner-hash-floating-islands-style2-v240.baseline", + "L174-v240-Design50-steps1-2") raise VerificationFailure(f"no pinned owner hash baseline for {recipe} style {style}")