Files
QuantEngineByItz/tools/validate_formula_owner_coverage_v1.py
T

58 lines
2.5 KiB
Python

from __future__ import annotations
import json
from pathlib import Path
import yaml
from refactor_master_helpers import ROOT, extract_formula_ids, extract_formula_outputs, load_yaml
def main() -> int:
formulas = load_yaml(ROOT / "spec" / "13_formula_registry.yaml").get("formula_registry", {}).get("formulas", {})
owners = load_yaml(ROOT / "spec" / "ownership_map.yaml").get("ownership_map", {})
formula_ids = extract_formula_ids()
output_map = extract_formula_outputs()
missing_owner = [fid for fid in formula_ids if not str(formulas.get(fid, {}).get("owner") or "").strip()]
missing_status = [fid for fid in formula_ids if not str(formulas.get(fid, {}).get("status") or "").strip()]
missing_outputs = [fid for fid, outs in output_map.items() if not outs]
normalized = {
"schema_version": "2026-06-06-formula-registry-normalized-v1",
"source": "spec/13_formula_registry.yaml",
"formula_count": len(formula_ids),
"formulas": [
{
"formula_id": fid,
"owner": formulas.get(fid, {}).get("owner"),
"status": formulas.get(fid, {}).get("status"),
"output_fields": output_map.get(fid, []),
}
for fid in formula_ids
],
}
norm_path = ROOT / "spec" / "03_formulas" / "formula_registry.normalized.yaml"
norm_path.parent.mkdir(parents=True, exist_ok=True)
norm_path.write_text(yaml.safe_dump(normalized, sort_keys=False, allow_unicode=True), encoding="utf-8")
result = {
"formula_id": "FORMULA_OWNER_COVERAGE_V1",
"formula_count": len(formula_ids),
"owner_coverage_pct": round((len(formula_ids) - len(missing_owner)) / len(formula_ids) * 100.0, 2) if formula_ids else 0.0,
"output_field_coverage_pct": round((len(formula_ids) - len(missing_outputs)) / len(formula_ids) * 100.0, 2) if formula_ids else 0.0,
"missing_owner_list": missing_owner[:200],
"missing_status_list": missing_status[:200],
"missing_output_field_list": missing_outputs[:200],
"owner_map_concepts": len(owners) if isinstance(owners, dict) else 0,
"gate": "FAIL" if missing_owner or missing_status or missing_outputs else "PASS",
}
out = ROOT / "Temp" / "formula_owner_coverage_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())