from __future__ import annotations import json from pathlib import Path from refactor_master_helpers import ROOT, load_json def main() -> int: policy = load_json(ROOT / "Temp" / "rule_lifecycle_policy.json") errors: list[str] = [] if not policy: errors.append("rule_lifecycle_policy.json missing or invalid") summary = policy.get("summary") if isinstance(policy, dict) else {} rows = policy.get("rule_lifecycle_rows") if isinstance(policy, dict) else [] if not isinstance(summary, dict): errors.append("summary must be object") summary = {} if not isinstance(rows, list): errors.append("rule_lifecycle_rows must be list") rows = [] if int(summary.get("retired_rule_active_count") or 0) != 0: errors.append("retired_rule_active_count must be 0") if not bool(summary.get("active_rule_has_lifecycle_status")): errors.append("active_rule_has_lifecycle_status must be true") if int(summary.get("t20_evaluated_count") or 0) < 0: errors.append("t20_evaluated_count invalid") for idx, row in enumerate(rows): if not isinstance(row, dict): errors.append(f"row[{idx}] must be object") continue if not str(row.get("rule_key") or "").strip(): errors.append(f"row[{idx}].rule_key missing") if not str(row.get("policy_action") or "").strip(): errors.append(f"row[{idx}].policy_action missing") if not str(row.get("rule_state") or "").strip(): errors.append(f"row[{idx}].rule_state missing") result = { "formula_id": "RULE_LIFECYCLE_STRICT_V1", "row_count": len(rows), "retired_rule_active_count": int(summary.get("retired_rule_active_count") or 0), "active_rule_has_lifecycle_status": bool(summary.get("active_rule_has_lifecycle_status")), "gate": "PASS" if not errors else "FAIL", "errors": errors, } out = ROOT / "Temp" / "rule_lifecycle_strict_v1.json" out.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding="utf-8") print(json.dumps(result, ensure_ascii=False, indent=2)) return 0 if not errors else 1 if __name__ == "__main__": raise SystemExit(main())