#!/usr/bin/env python3 """Validate every tracked DeepSeek review receipt against its JSON Schema. Usage (CI or local): python3 scripts/math-first/validate_deepseek_receipts.py Exits 0 if every receipt under shared-data/artifacts/deepseek_review/ matches shared-data/schemas/deepseek-review-receipt.schema.json, or if no receipts exist yet. Exits 1 on any validation failure. """ from __future__ import annotations import json import sys from pathlib import Path try: from jsonschema import Draft202012Validator except ImportError: print("SKIP: jsonschema not installed (pip install 'jsonschema>=4.21')") sys.exit(0) REPO_ROOT = Path(__file__).resolve().parents[2] SCHEMA_PATH = REPO_ROOT / "shared-data" / "schemas" / "deepseek-review-receipt.schema.json" RECEIPTS_DIR = REPO_ROOT / "shared-data" / "artifacts" / "deepseek_review" def main() -> int: if not SCHEMA_PATH.exists(): print(f"SKIP: schema not found at {SCHEMA_PATH}") return 0 schema = json.loads(SCHEMA_PATH.read_text()) validator = Draft202012Validator(schema) receipts = sorted(RECEIPTS_DIR.glob("*.receipt.json")) if RECEIPTS_DIR.exists() else [] if not receipts: print("No receipts to validate") return 0 failures = 0 for path in receipts: try: data = json.loads(path.read_text()) except json.JSONDecodeError as exc: print(f"FAIL {path.relative_to(REPO_ROOT)}: invalid JSON — {exc}") failures += 1 continue errors = list(validator.iter_errors(data)) if errors: print(f"FAIL {path.relative_to(REPO_ROOT)}:") for err in errors: print(f" {err.json_path}: {err.message}") failures += 1 else: print(f"OK {path.relative_to(REPO_ROOT)}") if failures: print(f"\n{failures} receipt(s) failed validation", file=sys.stderr) return 1 print(f"\n{len(receipts)} receipt(s) validated OK") return 0 if __name__ == "__main__": raise SystemExit(main())