Research-Stack/scripts/math-first/validate_deepseek_receipts.py
Devin AI c233d648e6 chore(infra): remove rs-surface from flake.nix (Garnix shutdown) and add math-first CI scripts
- Remove rsSurface and rsSurfaceImage Nix package definitions (Garnix is
  being shut down; build rs-surface directly with cargo when needed)
- Add scripts/math-first/ Python validators (receipt validation, claims
  registry validation, math evidence gate + tests) required by CI workflows

Co-Authored-By: Allaun Silverfox <bigdataiscoming+9i37y6j2@protonmail.com>
2026-06-16 01:06:01 +00:00

69 lines
2 KiB
Python
Executable file

#!/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())