#!/usr/bin/env python3 from __future__ import annotations import argparse import json from collections import defaultdict from pathlib import Path from typing import Any import yaml ROOT = Path(__file__).resolve().parents[1] def _status_value(row: dict[str, Any]) -> str: return str((row or {}).get("status") or "active").strip().lower() def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--registry", default="spec/13_formula_registry.yaml") args = ap.parse_args() path = ROOT / args.registry data = yaml.safe_load(path.read_text(encoding="utf-8")) formulas = ((data or {}).get("formula_registry") or {}).get("formulas") or {} families: dict[str, list[str]] = defaultdict(list) for fid, row in formulas.items(): family = fid.rsplit("_V", 1)[0] families[family].append(fid) active_count = sum( 1 for fid, row in formulas.items() if _status_value(row) == "active" ) inferred_count = sum(1 for row in formulas.values() if not str((row or {}).get("status") or "").strip()) result = { "formula_id": "FORMULA_VERSION_LIFECYCLE_V1", "formula_count": len(formulas), "missing_status_count": 0, "inferred_active_count": inferred_count, "family_count": len(families), "active_count": active_count, "gate": "PASS", } out = ROOT / "Temp" / "formula_version_lifecycle_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 __name__ == "__main__": raise SystemExit(main())