#!/usr/bin/env python3 from __future__ import annotations import argparse import json import zipfile from pathlib import Path ROOT = Path(__file__).resolve().parents[1] ALLOWED_TEMP_FILES = { "Temp/final_decision_packet_active.json", "Temp/final_decision_packet_v4.json", "Temp/operational_report.json", "Temp/operational_report.md", "Temp/release_dag_run_v1.json", "Temp/pipeline_runtime_profile_v1.json", "Temp/engine_harness_gate_result.json", "Temp/strategy_hardening_harness_v2.json", "Temp/data_integrity_100_lock_v2.json", "Temp/number_provenance_ledger_v4.json", "Temp/final_context_for_llm_v4.yaml", "Temp/live_replay_separation_v2.json", "Temp/formula_runtime_registry_v1.json", } REQUIRED_FILES = { "data_feed/AGENTS.md", "data_feed/README.md", "data_feed/package.json", "data_feed/gas_event_calendar.gs", "data_feed/runtime/active_artifact_manifest.yaml", "data_feed/Temp/final_decision_packet_active.json", "data_feed/Temp/operational_report.json", "data_feed/Temp/operational_report.md", "data_feed/Temp/release_dag_run_v1.json", "data_feed/Temp/pipeline_runtime_profile_v1.json", } def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--zip", required=True) args = ap.parse_args() zpath = Path(args.zip) with zipfile.ZipFile(zpath) as zf: names = set(zf.namelist()) missing = sorted(REQUIRED_FILES - names) temp_noise = sorted( name for name in names if name.startswith("data_feed/Temp/") and name.replace("data_feed/", "") not in ALLOWED_TEMP_FILES ) ok = not missing and not temp_noise payload = { "formula_id": "PACKAGING_POLICY_V2", "gate": "PASS" if ok else "FAIL", "missing_required_count": len(missing), "temp_noise_count": len(temp_noise), "missing_required": missing[:50], "temp_noise": temp_noise[:50], } print(json.dumps(payload, ensure_ascii=True, indent=2)) return 0 if ok else 1 if __name__ == "__main__": raise SystemExit(main())