#!/usr/bin/env python3 from __future__ import annotations import argparse import json from pathlib import Path import yaml ROOT = Path(__file__).resolve().parents[1] REQUIRED_FIELDS = { "factor_id", "hypothesis", "market_regime_applicability", "horizon", "decay_half_life", "input_fields", "formula_id", "data_quality_requirements", "expected_edge_formula", "conflict_precedence", "position_sizing_impact", "exit_impact", "golden_cases", "shadow_start_date", "activation_threshold", "retirement_condition", "owner", } def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--taxonomy", default="spec/43_quant_factor_taxonomy.yaml") ap.add_argument("--template", default="suggest/factor_rfc_template.yaml") args = ap.parse_args() taxonomy = yaml.safe_load((ROOT / args.taxonomy).read_text(encoding="utf-8")) or {} template = yaml.safe_load((ROOT / args.template).read_text(encoding="utf-8")) or {} missing_taxonomy = [f for f in REQUIRED_FIELDS if f not in (taxonomy.get("required_lifecycle_fields") or [])] missing_template = [f for f in REQUIRED_FIELDS if f not in template] ok = not missing_taxonomy and not missing_template payload = { "formula_id": "FACTOR_CONTRACT_V1", "gate": "PASS" if ok else "FAIL", "missing_taxonomy_fields": missing_taxonomy, "missing_template_fields": missing_template, } out = ROOT / "Temp" / "factor_contract_v1.json" out.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") print(json.dumps(payload, ensure_ascii=False, indent=2)) return 0 if ok else 1 if __name__ == "__main__": raise SystemExit(main())