Files
VoxelForge/Standalone/Research/WorldAssemblerM3/Linux156/FinalizeL156SeedSweep.py
T
Fr0zkaandClaude Opus 5.5 a751a01b11 research: headroom-only landings, band fit, bore exemption (L156; last landing round, kept as patch)
Band fit works (all chambers inside host bands, 16/16 seeds both sweeps); chamber support exemption + open-floor
control work; found a metres/subvoxel mix in the shell-opening predicate. Still fails: upper landing evaluated grade
22.85 deg over native ground; TN and VS sweeps 0/16; UE 30 m/s near coverage 39.0% vs 45.5%. Owner: stop forcing
landings after this round.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
2026-11-02 02:31:04 +01:00

62 lines
2.8 KiB
Python

#!/usr/bin/env python3
"""Recompute the full 16-seed sweep summaries and landing band margins."""
from __future__ import annotations
import json
from pathlib import Path
from PassageEnvelopeAudit import _landing_content_band_audit
ROOT = Path(__file__).resolve().parents[4]
OUT = ROOT / "Saved/Linux/l156/seeds"
def finalize(kind: str) -> dict:
directory = OUT / kind
partial = directory / "runs-partial.json"
results = json.loads(partial.read_text(encoding="utf-8")) if partial.is_file() else []
for row in results:
layout_path = ROOT / row["layout"]
bands = _landing_content_band_audit(
json.loads(layout_path.read_text(encoding="utf-8"))) if layout_path.is_file() else []
band_pass = len(bands) == 6 and all(entry["passed"] for entry in bands)
envelope = row.get("envelope_audit") or {}
envelope["landing_content_band"] = bands
envelope["landing_content_band_passed"] = band_pass
envelope["passed"] = bool(envelope.get("passed") and band_pass)
row["envelope_audit"] = envelope
checks = row.setdefault("checks", {})
checks["envelope"] = bool(envelope["passed"]
and envelope.get("outside_chamber_conflicts") == 0)
checks["envelope_negative_control"] = bool(
envelope.get("negative_controls") == envelope.get("negative_controls_expected") == 1)
checks["landing_content_band"] = band_pass
failed = [name for name, passed in checks.items() if not passed]
row["verdict"] = "PASS" if not failed else "FAIL"
row["reason"] = ", ".join(failed) if failed else "all requested gates pass"
results.sort(key=lambda row: row["seed"])
completed = len(results)
passed = sum(row["verdict"] == "PASS" for row in results)
missing = sorted(set(range(16)) - {row["seed"] for row in results})
summary = {"kind": kind, "source_stamp": (
"4bf096c0a06f72eb765ff8785d55c00ded946ed1bd1f39fa1914b3658ceb61f0"),
"completed": completed, "passed": passed, "failed": completed - passed,
"missing_seeds": missing, "status": "PASS" if completed == 16 and passed == 16 else "FAIL",
"results": results}
partial.write_text(json.dumps(results, indent=2) + "\n", encoding="utf-8")
(directory / "summary.json").write_text(json.dumps(summary, indent=2) + "\n",
encoding="utf-8")
print(f"[L156SeedSweepFinal] kind={kind} passed={passed}/{completed} "
f"missing={len(missing)} status={summary['status']}")
return summary
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--kind", choices=("tunnel-network", "vertical-shafts"), required=True)
args = parser.parse_args()
raise SystemExit(0 if finalize(args.kind)["status"] == "PASS" else 1)