#!/usr/bin/env python3 from __future__ import annotations import argparse import yaml from pathlib import Path ROOT = Path(__file__).resolve().parents[1] def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--registry", default="spec/13_formula_registry.yaml") ap.add_argument("--out", default="spec/factor_lifecycle_registry.yaml") args = ap.parse_args() reg_path = ROOT / args.registry out_path = ROOT / args.out if not reg_path.exists(): print(f"Registry not found: {reg_path}") return 1 try: data = yaml.safe_load(reg_path.read_text(encoding="utf-8")) except Exception as e: print(f"Failed to parse registry: {e}") return 1 formulas = data.get("formula_registry", {}).get("formulas", {}) factors = [] for fid, formula in formulas.items(): # Build basic factor structure for lifecycle management factor = { "factor_id": fid, "formula_id": fid, "hypothesis": formula.get("notes", "Expert prior hypothesis for quant edge"), "owner": formula.get("owner", "quant_architect"), "promotion_gate": "draft", "required_data": formula.get("inputs", []), "position_sizing_impact": "diagnostic", "exit_impact": "none", "golden_cases": [], "retirement_condition": "drawdown_limit_breach" } factors.append(factor) lifecycle_registry = { "schema_version": "factor_lifecycle_registry.v1", "description": "Lifecycle states (draft, shadow, candidate, active, retired) for all registered quant factors", "factors": factors } out_path.parent.mkdir(parents=True, exist_ok=True) out_path.write_text(yaml.safe_dump(lifecycle_registry, sort_keys=False, allow_unicode=True), encoding="utf-8") print(f"Successfully generated lifecycle registry: {out_path}") return 0 if __name__ == "__main__": import sys sys.exit(main())