from __future__ import annotations import argparse import json from pathlib import Path from typing import Any ROOT = Path(__file__).resolve().parents[1] DEFAULT_SCORE = ROOT / "Temp" / "data_integrity_score_v1.json" DEFAULT_OUT = ROOT / "Temp" / "data_integrity_100_lock_v1.json" def _load(path: Path) -> dict[str, Any]: if not path.exists(): return {} try: x = json.loads(path.read_text(encoding="utf-8")) except Exception: return {} return x if isinstance(x, dict) else {} def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--score", default=str(DEFAULT_SCORE)) ap.add_argument("--out", default=str(DEFAULT_OUT)) args = ap.parse_args() sp = Path(args.score) op = Path(args.out) if not sp.is_absolute(): sp = ROOT / sp if not op.is_absolute(): op = ROOT / op score_json = _load(sp) score = float(score_json.get("score") or 0.0) m = score_json.get("metrics") if isinstance(score_json.get("metrics"), dict) else {} placeholder_safety = float(m.get("placeholder_safety_pct") or 0.0) required_comp = float(m.get("required_field_completeness_pct") or 0.0) gate = "PASS_100" if score >= 100.0 and placeholder_safety >= 100.0 and required_comp >= 100.0 else "FAIL_NOT_100" reasons = [] if score < 100.0: reasons.append("DATA_INTEGRITY_SCORE_NOT_100") if placeholder_safety < 100.0: reasons.append("PLACEHOLDER_SAFETY_NOT_100") if required_comp < 100.0: reasons.append("REQUIRED_COMPLETENESS_NOT_100") out = { "formula_id": "DATA_INTEGRITY_100_LOCK_V1", "gate": gate, "reasons": reasons, "metrics": { "data_integrity_score": score, "placeholder_safety_pct": placeholder_safety, "required_field_completeness_pct": required_comp, }, "target": { "data_integrity_score": 100.0, "placeholder_safety_pct": 100.0, "required_field_completeness_pct": 100.0, }, } op.parent.mkdir(parents=True, exist_ok=True) op.write_text(json.dumps(out, ensure_ascii=False, indent=2), encoding="utf-8") print(json.dumps(out, ensure_ascii=False, indent=2)) return 0 if __name__ == "__main__": raise SystemExit(main())