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") args = ap.parse_args() path = ROOT / args.taxonomy if not Path(args.taxonomy).is_absolute() else Path(args.taxonomy) data = yaml.safe_load(path.read_text(encoding="utf-8")) if path.exists() else {} lifecycle_fields = data.get("required_lifecycle_fields") if isinstance(data, dict) else [] if not isinstance(lifecycle_fields, list): lifecycle_fields = [] missing = [field for field in REQUIRED_FIELDS if field not in lifecycle_fields] ok = not missing payload = { "formula_id": "FACTOR_LIFECYCLE_V1", "gate": "PASS" if ok else "FAIL", "missing_fields": missing, "required_field_count": len(REQUIRED_FIELDS), } out = ROOT / "Temp" / "factor_lifecycle_v1.json" out.write_text(json.dumps(payload, ensure_ascii=False, indent=2), encoding="utf-8") print(json.dumps(payload, ensure_ascii=True, indent=2)) return 0 if ok else 1 if __name__ == "__main__": raise SystemExit(main())