"""CLI: run gates G1..G5 for a pier (stops at the first failing gate unless --keep-going). usage: python run_gates.py [--gates G1 G2 ...] [--keep-going] The pier data dir holds params.json (generator) and expected.json (independent drawing values). """ import argparse import json import sys from pathlib import Path APP = Path(__file__).resolve().parents[1] sys.path.insert(0, str(APP)) from engine.gates import run_gate # noqa: E402 from engine.pipeline import gate_ids # noqa: E402 if __name__ == "__main__": ap = argparse.ArgumentParser() ap.add_argument("data") ap.add_argument("run") ap.add_argument("--gates", nargs="*", default=gate_ids()) ap.add_argument("--keep-going", action="store_true") a = ap.parse_args() data, run = Path(a.data), Path(a.run) out = [] for g in a.gates: rep = run_gate(g, data / "params.json", data / "expected.json", run, log=lambda m: print(m, flush=True)) out.append({k: rep[k] for k in ("gate", "verdict", "summary", "unplanned_fails", "secs")}) if rep["verdict"] != "PASS" and not a.keep_going: break (run / "gates_summary.json").write_text(json.dumps(out, ensure_ascii=False, indent=1), encoding="utf-8") sys.exit(0 if all(r["verdict"] == "PASS" for r in out) and len(out) == len(a.gates) else 1)