Implemented the next 4h-plan phase: dual-run support + explicit cutover gate.

This commit is contained in:
2026-04-06 19:09:20 +10:00
parent 1ef300d25e
commit 1e750e35d1
7 changed files with 238 additions and 20 deletions
+21 -2
View File
@@ -16,6 +16,8 @@ def parse_args() -> argparse.Namespace:
def load_json(path: str) -> dict[str, Any]:
p = Path(path)
if not p.exists():
raise FileNotFoundError(path)
with p.open("r", encoding="utf-8") as f:
return json.load(f)
@@ -42,8 +44,25 @@ def delta_str(base: float | None, cand: float | None) -> str:
def main() -> int:
args = parse_args()
baseline = load_json(args.baseline)
candidate = load_json(args.candidate)
try:
baseline = load_json(args.baseline)
except FileNotFoundError:
print(f"error: baseline report not found: {args.baseline}")
model_dir = Path("models")
if model_dir.exists():
candidates = sorted(model_dir.glob("rain_model_report*.json"))
if candidates:
print("available report files:")
for c in candidates:
print(f" - {c}")
print("hint: provide an existing 1h report path, or train a new 1h report first.")
return 2
try:
candidate = load_json(args.candidate)
except FileNotFoundError:
print(f"error: candidate report not found: {args.candidate}")
return 2
pairs = [
("precision", metric(baseline, "test_metrics", "precision"), metric(candidate, "test_metrics", "precision")),