wip(assembler): round L21 -- resolved strate layout snapshot + validator (no world change)
Core ResolvedLayoutSnapshotV1 (canonical JSON, stable identity): per strate stable ID, generator, recipe, interior bounds in metres, ceiling/bedrock bands as Core really applies them, transition mode/width, dispatch provenance. Validator: compat mode reports today's deviations; strict mode enforces ceiling -> content -> bedrock -> next ceiling (owner rule), two separate bands, nominal contiguity, interpenetration only within the declared EVoxelStrateTransition width; 7 negative controls rejected. Findings: SW built at -120..-632 m although the params say -60 m; a 60 m unowned gap filled by analytic FI fallback; no active bedrock bands; transitions ignored by Core. All L19 hashes unchanged (28 + 14 crossing runs). The Unreal adapter exports resolved_layout (uncompiled here). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CSFYgsdW8ejZSyiMf4qRSX
This commit is contained in:
1 parent
5d5447dc32
commit
8753f6dbe4
12 files changed
+1347
-3
No files matched your search
@@ -0,0 +1,203 @@
|
||||
# World Assembler L21 — resolved strate layout
|
||||
|
||||
This round adds a read-only layout snapshot and validator. It does not change density or mesh
|
||||
evaluation.
|
||||
|
||||
## Snapshot and current stack
|
||||
|
||||
World identity is `owner-world/seed/0`; Core voxel size is 0.25 m, owner voxel size is 0.125 m, and
|
||||
all lattice origins are `(0,0,0)`. Intervals below are half-open `[bottom, top)` metres. Stable strate
|
||||
IDs are `owner-world/seed/0/strate/<index>/generator/<kind>`. The shared Core record uses canonical
|
||||
JSON schema v1 and an FNV-1a payload identity.
|
||||
|
||||
The required structure, top to bottom, is:
|
||||
|
||||
```text
|
||||
strate N ceiling band
|
||||
content
|
||||
bedrock band
|
||||
strate N+1 ceiling band
|
||||
content
|
||||
bedrock band
|
||||
```
|
||||
|
||||
Ceiling and bedrock remain distinct bands owned by their own strate. Their nominal edges touch; a
|
||||
separate `EVoxelStrateTransition` declaration describes possible interpenetration.
|
||||
|
||||
| Prototype | Order / stable suffix | Generator; recipe version | Interior/content (m) | Current ceiling | Current bedrock | Transition at lower interface |
|
||||
|---|---|---|---|---|---|---|
|
||||
| SurfaceWorld | 0 / `TunnelNetwork` | TunnelNetwork; `legacy.TunnelNetwork` v0 | `[-120, 8)` | No Core density band. Manager configures a 1 m upper `VF_ApplyBoundarySeal` at `[8,9)`, but the compiled analytic Core path does not apply it. | No Core density band. Manager configures a 1 m lower `VF_ApplyBoundarySeal` at `[-121,-120)`, but the compiled analytic Core path does not apply it. | Gradient, 2 chunks = 8 m by the 4 m manager chunk. Core does not apply it; manager/dispatch chunk widths are 4/8 m. |
|
||||
| SurfaceWorld | 1 / `SurfaceWorld` | SurfaceWorld; `SurfaceWorld.Heightfield2D` v1 | `[-632,-120)` | No separate volumetric band; cap profile is in content, with `AppendStratumBoundaryCeilings` mesh fallback. | None. | Gradient, 1 chunk = 4 m by manager units; no lower strate in this plan. Manager/dispatch widths are 4/8 m. |
|
||||
| FloatingIslands | 0 / `FloatingIslands` | FloatingIslands; `FloatingIslands.ClusterField` geometry v3 | `[-60,4)` | Active one-sided upper seal `[3.5,4)` = 0.5 m. It overlaps the content range by 0.5 m. | None in geometry v3. | Gradient, 2 chunks = 8 m. Core does not apply it; manager/dispatch widths are both 4 m. |
|
||||
| FloatingIslands | 1 / `SurfaceWorld` | SurfaceWorld; `SurfaceWorld.Heightfield2D` v1 | `[-632,-120)` | No separate volumetric band; cap profile is in content, with mesh fallback. | None. | Gradient, 1 chunk = 4 m; no lower strate in this plan. Manager/dispatch widths are 4/8 m. |
|
||||
|
||||
Dispatch provenance is recorded per stratum in the JSON snapshot:
|
||||
|
||||
- SurfaceWorld bounds come from `BuildSurfaceStratumPlan`, which converts each chunk with 32 Core
|
||||
voxels = 8 m. `NativeSurfaceDensityAt` selects with `floor(CoreZ/32)`, then calls
|
||||
`GetGeneratorTypeForChunk` / `GetStrateIndex`. The manager's owner chunk is 4 m.
|
||||
- FI bounds come from `BuildFloatingIslandStratumPlan`, which converts each 32-voxel owner chunk
|
||||
through the 12.5/25 cm owner/Core ratio = 16 Core voxels = 4 m. `NativeFloatingIslandDensityAt`
|
||||
uses the same conversion before the manager lookup.
|
||||
- Legacy TunnelNetwork selection uses the Core 32-voxel chunk lookup. The manager helper assigns
|
||||
the upper strate's transition to its lower interface.
|
||||
|
||||
SurfaceWorld strata carry four cap profiles, 33 route points and their attached passages. The FI
|
||||
strate carries four island anchors and its attached passages. The snapshot preserves these recipe
|
||||
anchors in their source fixed-point units.
|
||||
|
||||
The owner configuration’s non-Hard transitions are currently not honored by Core at these interfaces.
|
||||
`UVoxelStrateManager::GetGenerationParams` contains legacy vector blending, but Core’s compiled
|
||||
dispatcher selects the resolved/native per-strate fields without applying that blend. FI v3 calls
|
||||
`VF_ApplyUpperBoundarySeal` for its ceiling; player edit brushes are applied after the native field,
|
||||
so that seal remains diggable. Bands default to `diggable=true`, `protected=false`; protection is an
|
||||
explicit option.
|
||||
|
||||
```text
|
||||
Current SurfaceWorld plan, top → bottom
|
||||
TunnelNetwork ceiling [8,9) (configured; inactive in Core density)
|
||||
TunnelNetwork content [-120,8)
|
||||
TunnelNetwork bedrock [-121,-120) (configured; inactive in Core)
|
||||
SurfaceWorld ceiling: none
|
||||
SurfaceWorld content [-632,-120)
|
||||
SurfaceWorld bedrock: none
|
||||
|
||||
Current FI prototype, top → bottom
|
||||
FI ceiling [3.5,4) active, inset into FI content by 0.5 m
|
||||
FI content [-60,4)
|
||||
FI bedrock: missing
|
||||
Unassigned interval [-120,-60) = 60 m
|
||||
SurfaceWorld ceiling: none
|
||||
SurfaceWorld content [-632,-120)
|
||||
SurfaceWorld bedrock: none
|
||||
```
|
||||
|
||||
The SurfaceWorld and FI content interiors therefore do not overlap: the FI prototype has a 60 m gap.
|
||||
The owner manager slots meet at −60 m when both use 4 m owner chunks, but SurfaceWorld plan/query
|
||||
dispatch converts chunks at 8 m while FI converts at 4 m. In the gap, Core answers through the
|
||||
compiled analytic FloatingIslands fallback, not either planned recipe; probes at −68 m returned
|
||||
solid density −4.125. SurfaceWorld and TunnelNetwork content interiors touch at −120 m in the
|
||||
SurfaceWorld prototype, but Core does not apply the declared Gradient there.
|
||||
|
||||
## Compatibility validation and boundary probes
|
||||
|
||||
Compatibility mode accepted both layouts with seven reported issues apiece. SurfaceWorld reports
|
||||
unhonored transition, 4/8 m dispatch-unit ambiguity on both strates, and missing current-field
|
||||
ceiling and bedrock bands on both. FI reports its unhonored transition, missing FI bedrock, the
|
||||
0.5 m ceiling/content overlap, the 60 m uncovered interval, and missing SurfaceWorld ceiling and
|
||||
bedrock. These are recorded as compatibility deviations, not world changes.
|
||||
|
||||
Strict mode accepted a valid synthetic two-strate fixture. Its seven negative controls rejected:
|
||||
|
||||
| Control | Strict check that rejects it |
|
||||
|---|---|
|
||||
| Nominal band overlap | Bedrock(N) bottom must equal ceiling(N+1) top. |
|
||||
| Nominal band gap | The same exact nominal contiguity check. |
|
||||
| Missing bedrock | `bedrock.present` is required. |
|
||||
| Missing ceiling | `ceiling.present` is required. |
|
||||
| Wrong band order | Each band kind and the ceiling → content → bedrock edges must match. |
|
||||
| Gap between bedrock(N) and ceiling(N+1) | Their nominal endpoints must be equal. |
|
||||
| Interpenetration wider than transition | Explicit overlap must be at most the mode’s limit; this control uses 4,000,001 µm against a 4,000,000 µm Gradient zone. |
|
||||
|
||||
Hard has a 0 m limit. Gradient uses `TransitionBlendChunks × 4 m`; Interleaved adds its recorded
|
||||
two-manager-chunk warp amplitude to the blend width. The nominal bands still touch exactly; the
|
||||
separate interpenetration field records any permitted physical crossing. Current Core
|
||||
interpenetration is 0 m because it does not apply the declared blends.
|
||||
|
||||
Each plan audited 21 points: one Core voxel (0.25 m) below, at, and above every distinct content,
|
||||
active-band, configured-band, and transition-zone endpoint. The remaining points agreed with the
|
||||
snapshot. Every disagreement was an uncovered snapshot point answered by a named compiled analytic
|
||||
fallback:
|
||||
|
||||
| Prototype | Probe Z (m) | Actual Core dispatch | Density / occupancy |
|
||||
|---|---|---|---|
|
||||
| SurfaceWorld | −632.250 | `compiled-analytic/TunnelNetwork` | `+1`, air |
|
||||
| SurfaceWorld | 8.000, 8.250, 8.750, 9.000, 9.250 | `compiled-analytic/TunnelNetwork` | `+9.648438`, `+10.64844`, `+12.64844`, `+13.64844`, `+14.64844`; all air |
|
||||
| FI | −632.250 | `compiled-analytic/TunnelNetwork` | `+1`, air |
|
||||
| FI | −120.000, −119.750 | `compiled-analytic/FloatingIslands` | `−108.4793`, `−107.4969`; solid |
|
||||
| FI | −68.250, −68.000, −67.750, −60.250 | `compiled-analytic/FloatingIslands` | `−4.125`; solid at each point |
|
||||
| FI | 4.000, 4.250 | `compiled-analytic/FloatingIslands` | `+0.671875`, `+2.253906`; air |
|
||||
|
||||
Probe summaries: SurfaceWorld 6/21 disagreements; FI 9/21. Full per-point records are in
|
||||
`Saved/Linux/linux21/boundary-probes-{surface-world,floating-islands}.log`.
|
||||
|
||||
## Identity, output parity and cost
|
||||
|
||||
Snapshots round-tripped through canonical JSON. At W1/W8/W12 their bytes were identical per recipe:
|
||||
|
||||
| Recipe | Stable identity | Canonical JSON SHA-256 |
|
||||
|---|---|---|
|
||||
| SurfaceWorld | `resolved-layout-v1-fnv64:63cf4d2661149fcd` | `267586b3da9bc5c08c654c097559b205222f53c594c4c4332cb4929fd3d75c05` |
|
||||
| FloatingIslands | `resolved-layout-v1-fnv64:1d90167f37ef9323` | `7bb9e9d745de3a2edf4276f507a5e4c082ff86aa73d9c1ad7e77c1b4d8b8bea8` |
|
||||
|
||||
The 28 hash runs (both recipes, Clang `fp-contract=off` and GCC default, W1/W8/W12 and W12×5)
|
||||
matched all 12 L19 rows per run. The 14 dedicated 24 m crossing runs also matched all 12 L19
|
||||
crossing rows. The table gives the final Clang W12×5 rows, in density/mesh/payload/topology order;
|
||||
each equals its L19 reference.
|
||||
|
||||
| Scope | SurfaceWorld | FloatingIslands |
|
||||
|---|---|---|
|
||||
| Full detail | `0ee0579bd15cbbe4 / 32e5d4964d610fee / 1932b96ee4b1d910 / 69743c6bad3447dc` | `43034299d33f2536 / a41e8353ec4bbe9c / cd0e3e15eef827b0 / 0b3c3f13cc1d6f8a` |
|
||||
| Whole view | `c10697a8f48380c7 / 4197fc1072f0ff58 / 7b3e616ec9459851 / c879e35592bf33e5` | `00bc3607a7839854 / 4baa66127c2b0892 / e11ef05e851a1517 / 1278bc4b1fffb869` |
|
||||
| LOD 0 | `769f2a706d585a72 / 33eeeb39fa443816 / 645621a1d968983f / c2457ed905036c9d` | `ccf97d8e95163a35 / 3333fa0ddebdece2 / d1906bffc2b9d6f2 / a261f3d965e15c12` |
|
||||
| LOD 1 | `69cc5a5c0a2c60af / b48335f5410c57d5 / d15c5480162ab8ba / feca1bd025823604` | `25fa2f0fa7fbb6e6 / c549c519707ac1d7 / 66f797cde4ebdecf / 2383982a12a27ee5` |
|
||||
| LOD 2 | `85deed5683a77202 / 53469895987aeea2 / e55f8ae7e1532033 / d5feb12a0e85c09b` | `c0577decd8a02cab / 3ccf08b7be6edc5b / 0abcbbda5a06c110 / 11c77b71b606fe75` |
|
||||
| LOD 3 | `6518caefb3be7e7f / ec513c90b853a614 / f62fa1137ff17f82 / ccf1dcf681965816` | `386e0c0ef2d7c920 / 1ee2c82d34ad9918 / 000a6514ba018406 / 1b4523b19e90f305` |
|
||||
| LOD 4 | `62d4be96021992f4 / 42706847cb9c744a / eab76f9634e4b9bd / 207ffbb6ef184397` | `e8117a3a803be9f8 / 8a6c36cae1fe0e30 / c839f1b1629eff8c / 0ce9d7ea77b4f62b` |
|
||||
| LOD 5 | `5e4a8c38b8cea6fc / 76adc9ae86988e27 / 938975bf7cc6d94d / 42e135856abdbcac` | `ca6d1df453c6b600 / 02c90d834d9a3fb6 / 4364c37d526f4104 / 1b1cf40d25e50ddf` |
|
||||
| LOD 6 | `e036e95b9006945b / a880cc101a4ed957 / bd82f1aefad6dd89 / 5e9f3408345d95b3` | `6764e347b08603a0 / 46c6ed9a1f029b94 / 5b8dc9d5b7cb0d3d / a10a4a69a93eac4d` |
|
||||
| LOD 7 | `8ee358af56a30d8d / 5cbd8e5965a2cc3f / d4a7fe5d9e4bde30 / 4dd52cd090a9af78` | `c7cd1b483c598595 / a545eb567dc4a0df / b0a1fb225437e05a / 301d1b884c509550` |
|
||||
| LOD 8 | `c3458e1cbdb9c471 / fba3698d21dd1be0 / 77dfb814eac3a24c / c9514f1580c42449` | `7b6e9279b4993109 / cc63440d9867a18d / 12f5cec78b38fa1b / eed919db6db6b2a7` |
|
||||
|
||||
Exact-query rows (density/unclamped, detail, collision): SurfaceWorld `e4d4a8eb95b35933 / e4d4a8eb95b35933`,
|
||||
`efcba20c0c70c415`, `e604823a249029bf`; FloatingIslands `87e5c0dbf9ee9ee2 / 87e5c0dbf9ee9ee2`,
|
||||
`efcba20c0c70c415`, `e604823a249029bf`. The representative 24 m crossing W12×5 whole-view row is the
|
||||
SurfaceWorld row above; all crossing full-detail, LOD and exact-query rows matched the L19 crossing
|
||||
reference.
|
||||
|
||||
Five interleaved hashing-off W12 pairs against L19 measured SurfaceWorld medians 1.510 s old / 1.512 s
|
||||
new (+0.14%) and FI 13.487 s old / 13.381 s new (−0.79%). The opt-in snapshot is constructed once
|
||||
at plan time, outside tile workers; ordinary standalone evaluation does not request it. No hash rows
|
||||
were produced during these pairs.
|
||||
|
||||
Clang and GCC builds passed at 12 jobs. Final build peak process-tree/single-process RSS was
|
||||
2,697,676/450,248 KiB (Clang) and 4,570,704/897,024 KiB (GCC). The final evidence runner's maximum
|
||||
single-process RSS was 583,736 KiB. All runs used CPUs 0–11 and stayed below the per-run limit; no
|
||||
governor or system changes were made.
|
||||
|
||||
## Failed and retried runs
|
||||
|
||||
- An initial snapshot invocation omitted `--stream-benchmark --stream-pipeline` and exited 2; adding
|
||||
the required flags passed.
|
||||
- Early Clang builds caught a `strates` member typo, then an audit initializer/type error. Both were
|
||||
fixed; the final Clang builds passed.
|
||||
- The first complete evidence pass exited 1 at boundary probing because the audit read the host
|
||||
manager after the harness had released it. Dispatch provenance was moved to Core's live selector;
|
||||
the final audits passed.
|
||||
- One GCC build wrapper was interrupted (exit 130) while diagnosing an empty progress log, then
|
||||
rerun successfully. No runtime/hash run timed out or exceeded 15 minutes, and no L19 hash mismatch
|
||||
remained.
|
||||
|
||||
## Owner note
|
||||
|
||||
This records the present strata and confirms the selected ceiling → content → bedrock model. FI still
|
||||
has no floor in v3; SurfaceWorld has no volumetric floor or separate ceiling; the 8 m / 4 m dispatch
|
||||
conversions leave a 60 m FI-prototype gap answered by analytic fallback. Core currently ignores the
|
||||
configured transition blend at these interfaces. Bedrock and ceiling protection remain explicit
|
||||
options with diggable defaults. This round changes no world output.
|
||||
|
||||
The Unreal adapter adds only a separate `resolved_layout` JSON field beside `world_assembly`; that
|
||||
small edit could not be compiled on this Linux machine. No async path, density evaluator, hash input,
|
||||
or recipe version changed. No commit, push, or stash was made.
|
||||
|
||||
## Orchestrator review (Claude)
|
||||
|
||||
- Merged: read-only snapshot + validator, no world change (28 hash runs and 14 crossing runs equal L19;
|
||||
cost within noise). The Unreal adapter gains a 193-line `resolved_layout` export beside
|
||||
`world_assembly`. It is export-only, but UNCOMPILED here; it must be built on the owner PC.
|
||||
- Key facts for the owner: the authored params put the SW top at −60 m (4 m owner chunks), Core
|
||||
builds SW at −120…−632 m (8 m conversion); the 60 m between FI and SW is unowned and answered by
|
||||
the analytic FloatingIslands fallback as solid. No strate has an active bedrock band; SW has no
|
||||
ceiling band (mesh fallback only); configured Gradient transitions are ignored by Core.
|
||||
- To check next: whether the "ledges" ground seen under the islands is this fallback solid in the
|
||||
unowned gap rather than SW terrain (L19 attributed them to SW at about −60…−73 m).
|
||||
@@ -0,0 +1,165 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Constrained L21 snapshot, output-parity, crossing, and off-cost evidence."""
|
||||
import os
|
||||
import re
|
||||
import signal
|
||||
import statistics
|
||||
import subprocess
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[4]
|
||||
OUT = ROOT / "Saved/Linux/linux21"
|
||||
OUT.mkdir(parents=True, exist_ok=True)
|
||||
if not os.sched_getaffinity(0).issubset(set(range(12))):
|
||||
raise SystemExit("run under taskset -c 0-11")
|
||||
|
||||
BIN = {
|
||||
"clang-off": ROOT / "Standalone/bin/linux/VoxelForgeCoreHeadless-linux21-clang",
|
||||
"gcc-default": ROOT / "Standalone/bin/linux/VoxelForgeCoreHeadless-linux21-gcc",
|
||||
}
|
||||
OLD_CLANG = ROOT / "Standalone/bin/linux/VoxelForgeCoreHeadless-linux19-clang"
|
||||
OLD_GCC = ROOT / "Standalone/bin/linux/VoxelForgeCoreHeadless-linux19-gcc"
|
||||
DATA = ROOT / "Standalone/data/owner_world.json"
|
||||
HASH_ROW = re.compile(r"^\[Pipeline(?:FullDetailHash|WholeViewHash|LODHash|ExactQueryHash)\].*$", re.M)
|
||||
LODS = [(1, 1), (8, 1), (12, 1), (12, 2), (12, 3), (12, 4), (12, 5)]
|
||||
RECIPES = {
|
||||
"surface-world": "0,-35,-487.94,0,-22",
|
||||
"floating-islands": "-22,-19,-22.8,0,-4",
|
||||
}
|
||||
results = []
|
||||
|
||||
|
||||
def launch(name, argv, timeout=900):
|
||||
logfile = OUT / f"{name}.log"
|
||||
command = ["taskset", "-c", "0-11", "prlimit", "--as=6442450944", "--", *map(str, argv)]
|
||||
started = time.monotonic()
|
||||
peak_tree = 0
|
||||
peak_process = 0
|
||||
timed_out = False
|
||||
with logfile.open("w", encoding="utf-8") as stream:
|
||||
process = subprocess.Popen(command, stdout=stream, stderr=subprocess.STDOUT,
|
||||
start_new_session=True)
|
||||
while process.poll() is None:
|
||||
pending, seen, total = [process.pid], set(), 0
|
||||
while pending:
|
||||
pid = pending.pop()
|
||||
if pid in seen:
|
||||
continue
|
||||
seen.add(pid)
|
||||
try:
|
||||
pending.extend(int(x) for x in Path(f"/proc/{pid}/task/{pid}/children").read_text().split())
|
||||
values = {}
|
||||
for line in Path(f"/proc/{pid}/status").read_text().splitlines():
|
||||
if line.startswith(("VmRSS:", "VmHWM:")):
|
||||
key, amount, *_ = line.split()
|
||||
values[key] = int(amount)
|
||||
total += values.get("VmRSS:", 0)
|
||||
peak_process = max(peak_process, values.get("VmRSS:", 0), values.get("VmHWM:", 0))
|
||||
except (FileNotFoundError, PermissionError, ProcessLookupError, ValueError):
|
||||
pass
|
||||
peak_tree = max(peak_tree, total)
|
||||
if time.monotonic() - started > timeout:
|
||||
os.killpg(process.pid, signal.SIGTERM)
|
||||
try:
|
||||
process.wait(timeout=5)
|
||||
except subprocess.TimeoutExpired:
|
||||
os.killpg(process.pid, signal.SIGKILL)
|
||||
process.wait()
|
||||
timed_out = True
|
||||
break
|
||||
time.sleep(0.1)
|
||||
code = process.wait()
|
||||
elapsed = time.monotonic() - started
|
||||
rows = HASH_ROW.findall(logfile.read_text(encoding="utf-8", errors="replace"))
|
||||
results.append((name, code, elapsed, peak_process, peak_tree, timed_out, len(rows)))
|
||||
print(f"[L21Run] {name} exit={code} seconds={elapsed:.3f} peak_process_rss_kib={peak_process} "
|
||||
f"peak_tree_rss_kib={peak_tree} hash_rows={len(rows)} timed_out={str(timed_out).lower()}", flush=True)
|
||||
return logfile
|
||||
|
||||
|
||||
def base_args(binary, recipe, workers, hash_output=False, crossing=False):
|
||||
args = [binary, DATA, "--world-assembler-prototype", "--stream-benchmark", "--stream-pipeline",
|
||||
"--force-generate", "--clip-radius=3", "--max-clip-level=8", f"--workers={workers}",
|
||||
f"--camera={RECIPES[recipe]}", f"--recipe={recipe}"]
|
||||
if hash_output:
|
||||
args.append("--stream-hash")
|
||||
if crossing:
|
||||
args += ["--camera-step=24,0,0", "--region-crossing"]
|
||||
return args
|
||||
|
||||
|
||||
# Plan-time identities and canonical serialization at W1/W8/W12, both field recipes.
|
||||
snapshots = {}
|
||||
for recipe in RECIPES:
|
||||
for workers, repeat in [(1, 1), (8, 1), (12, 1)]:
|
||||
path = OUT / f"snapshot-{recipe}-w{workers}-r{repeat}.json"
|
||||
args = [BIN["clang-off"], DATA, "--world-assembler-prototype", "--stream-benchmark",
|
||||
"--stream-pipeline", f"--recipe={recipe}", f"--workers={workers}",
|
||||
f"--resolved-layout-output={path}", "--resolved-layout-only"]
|
||||
log = launch(f"snapshot-{recipe}-w{workers}-r{repeat}", args)
|
||||
if results[-1][1] != 0:
|
||||
raise SystemExit(f"snapshot plan failed: {log}")
|
||||
snapshots[(recipe, workers)] = path.read_bytes()
|
||||
if len({snapshots[(recipe, workers)] for workers in (1, 8, 12)}) != 1:
|
||||
raise SystemExit(f"snapshot serialization changed with worker count: {recipe}")
|
||||
print(f"[L21SnapshotIdentity] recipe={recipe} worker_counts=1,8,12 canonical_bytes=identical status=PASS", flush=True)
|
||||
|
||||
# Full matrix. Every row is compared against the L19 W12x5 reference.
|
||||
for recipe in RECIPES:
|
||||
for compiler, binary in BIN.items():
|
||||
for workers, repeat in LODS:
|
||||
name = f"matrix-{recipe}-{compiler}-w{workers}-r{repeat}"
|
||||
log = launch(name, base_args(binary, recipe, workers, hash_output=True))
|
||||
rows = HASH_ROW.findall(log.read_text(encoding="utf-8", errors="replace"))
|
||||
reference_name = f"{recipe}-{compiler}-w12-r5.log"
|
||||
reference = ROOT / "Saved/Linux/l19-matrix" / reference_name
|
||||
expected = HASH_ROW.findall(reference.read_text(encoding="utf-8", errors="replace"))
|
||||
if results[-1][1] != 0 or len(rows) != 12 or rows != expected:
|
||||
print(f"[L21HashMismatch] {name} expected_rows={len(expected)} actual_rows={len(rows)}", flush=True)
|
||||
raise SystemExit(1)
|
||||
|
||||
# The crossing matrix retains the 24 m two-view query proof on both compilers.
|
||||
for compiler, binary in BIN.items():
|
||||
for workers, repeat in LODS:
|
||||
name = f"crossing-{compiler}-w{workers}-r{repeat}"
|
||||
log = launch(name, base_args(binary, "surface-world", workers, hash_output=True, crossing=True))
|
||||
rows = HASH_ROW.findall(log.read_text(encoding="utf-8", errors="replace"))
|
||||
reference = ROOT / "Saved/Linux/l19-crossing" / f"{compiler}-w12-r5.log"
|
||||
expected = HASH_ROW.findall(reference.read_text(encoding="utf-8", errors="replace"))
|
||||
if results[-1][1] != 0 or len(rows) != 12 or rows != expected:
|
||||
print(f"[L21CrossingHashMismatch] {name} expected_rows={len(expected)} actual_rows={len(rows)}", flush=True)
|
||||
raise SystemExit(1)
|
||||
|
||||
# Five interleaved W12 pairs per recipe, hashing disabled. Alternate order by pair to reduce drift.
|
||||
off_pairs = {recipe: {"old": [], "new": []} for recipe in RECIPES}
|
||||
for recipe in RECIPES:
|
||||
for pair in range(1, 6):
|
||||
order = [("old", OLD_CLANG), ("new", BIN["clang-off"])] if pair % 2 else [("new", BIN["clang-off"]), ("old", OLD_CLANG)]
|
||||
for label, binary in order:
|
||||
name = f"offcost-{recipe}-pair{pair}-{label}"
|
||||
log = launch(name, base_args(binary, recipe, 12, hash_output=False), timeout=900)
|
||||
if results[-1][1] != 0:
|
||||
raise SystemExit(f"hashing-off cost run failed: {log}")
|
||||
off_pairs[recipe][label].append(results[-1][2])
|
||||
print(f"[L21OffCostPair] recipe={recipe} pair={pair} old_seconds={off_pairs[recipe]['old'][-1]:.3f} "
|
||||
f"new_seconds={off_pairs[recipe]['new'][-1]:.3f}", flush=True)
|
||||
for recipe, pair in off_pairs.items():
|
||||
old = statistics.median(pair["old"])
|
||||
new = statistics.median(pair["new"])
|
||||
print(f"[L21OffCostSummary] recipe={recipe} pairs=5 median_old_seconds={old:.3f} "
|
||||
f"median_new_seconds={new:.3f} delta_percent={(new-old)/old*100.0:.2f}", flush=True)
|
||||
|
||||
# Query the real compiled Core field at every distinct recorded stratum/band endpoint.
|
||||
for recipe in RECIPES:
|
||||
name = f"boundary-probes-{recipe}"
|
||||
args = base_args(BIN["clang-off"], recipe, 12, hash_output=False)
|
||||
args += ["--audit-resolved-layout-boundaries"]
|
||||
log = launch(name, args)
|
||||
if results[-1][1] != 0:
|
||||
raise SystemExit(f"Core boundary probes failed: {log}")
|
||||
|
||||
print(f"[L21EvidenceSummary] snapshots=6 matrix=28 crossing=14 off_cost_pairs=10 boundary_audits=2 status=PASS", flush=True)
|
||||
for name, code, elapsed, rss, tree, timed_out, rows in results:
|
||||
print(f"[L21RunDetail] {name} exit={code} seconds={elapsed:.3f} peak_process_rss_kib={rss} "
|
||||
f"peak_tree_rss_kib={tree} hash_rows={rows} timed_out={str(timed_out).lower()}", flush=True)
|
||||
Reference in new issue
Block a user