from __future__ import annotations import argparse import json from pathlib import Path import yaml ROOT = Path(__file__).resolve().parents[1] REQUIRED_KEYS = [ "spec/RetirementAssetPortfolio.yaml", "AGENTS.md", "spec/13_formula_registry.yaml", "spec/12_field_dictionary.yaml", "Temp/final_decision_packet_v4.json", "spec/46_low_capability_execution_pack.yaml", ] def _bundle_map(path: Path) -> dict[str, str]: data = yaml.safe_load(path.read_text(encoding="utf-8")) or {} content = data.get("bundle_content") if isinstance(data.get("bundle_content"), dict) else {} return {str(k): str(v) for k, v in content.items()} def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--full", default="dist/retirement_portfolio_bundle.yaml") ap.add_argument("--compact", default="dist/retirement_portfolio_compact.yaml") ap.add_argument("--ultra", default="dist/retirement_portfolio_ultra_compact.yaml") args = ap.parse_args() paths = [ROOT / args.full, ROOT / args.compact, ROOT / args.ultra] missing = [str(p) for p in paths if not p.exists()] if missing: payload = {"formula_id": "COMPACT_BUNDLE_EQUIVALENCE_V1", "gate": "FAIL", "missing": missing} print(json.dumps(payload, ensure_ascii=True, indent=2)) return 1 maps = [_bundle_map(path) for path in paths] anchor = maps[0] mismatches: list[str] = [] for required in REQUIRED_KEYS: src = anchor.get(required.replace("/", "__").replace(".", "_")) if src is None: mismatches.append(f"missing:{required}") continue for idx, bundle_map in enumerate(maps[1:], start=2): other = bundle_map.get(required.replace("/", "__").replace(".", "_")) if other != src: mismatches.append(f"bundle{idx}:{required}") ok = not mismatches payload = { "formula_id": "COMPACT_BUNDLE_EQUIVALENCE_V1", "gate": "PASS" if ok else "FAIL", "bundle_count": len(paths), "checked_keys": REQUIRED_KEYS, "mismatches": mismatches[:200], } out = ROOT / "Temp" / "compact_bundle_equivalence_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())