#!/usr/bin/env python3 """Run one fused verdict evaluator and seal its complete result units.""" from __future__ import annotations import argparse import json import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src")) from repro_control.archives import safe_extract_tar_gz from repro_control.artifacts import finalize_attempt, verify_read_back from repro_control.hashing import atomic_write_json, sha256_file from repro_control.heartbeat import heartbeat, marker from repro_control.runtime import ( assert_evaluation_isolated, configure_scientific_runtime, load_job_manifest, require_control_freeze, verify_science_spec, ) def main() -> int: parser = argparse.ArgumentParser() parser.add_argument("--science-spec", type=Path, required=True) parser.add_argument("--job-manifest", type=Path, required=True) parser.add_argument("--control-dir", type=Path, required=True) parser.add_argument("--freeze-sha256", required=True) parser.add_argument("--unit-manifest", type=Path) parser.add_argument("--output-dir", type=Path) parser.add_argument("--eval-archive", type=Path) parser.add_argument("--eval-destination", type=Path, default=Path("/data/eval")) parser.add_argument("--imports-archive", type=Path) parser.add_argument("--imports-destination", type=Path, default=Path("/imports")) parser.add_argument("--dry-run", action="store_true") args = parser.parse_args() spec = verify_science_spec(args.science_spec) manifest = load_job_manifest(args.job_manifest, freeze_sha256=args.freeze_sha256) assert_evaluation_isolated(manifest) if manifest["logical_id"] not in spec["evaluators"]: raise SystemExit("unregistered evaluator logical identity") require_control_freeze( args.control_dir, args.freeze_sha256, manifest["science_spec_sha256"], ) configure_scientific_runtime() if args.dry_run: print( json.dumps( { "contract_verified": True, "logical_id": manifest["logical_id"], "outcomes": {}, } ) ) return 0 if args.unit_manifest is None or args.output_dir is None: raise SystemExit("--unit-manifest and --output-dir are required for execution") if sha256_file(args.unit_manifest) != manifest["hashes"]["config"]: raise SystemExit("evaluator unit manifest hash mismatch") args.output_dir.mkdir(parents=True, exist_ok=False) if args.eval_archive: safe_extract_tar_gz(args.eval_archive, args.eval_destination) if args.imports_archive: safe_extract_tar_gz(args.imports_archive, args.imports_destination) marker("GPU_READY", manifest["logical_id"]) from repro_control.evaluation import evaluate_units with heartbeat(f"SCIENTIFIC_EVAL:{manifest['logical_id']}"): evaluate_units(args.unit_manifest, args.output_dir / "results.json") atomic_write_json( args.output_dir / "evaluation-receipt.json", { "format": 1, "logical_id": manifest["logical_id"], "attempt_id": manifest["attempt_id"], "unit_manifest_sha256": sha256_file(args.unit_manifest), "results_sha256": sha256_file(args.output_dir / "results.json"), "outcomes": {}, }, ) finalize_attempt( args.output_dir, logical_id=manifest["logical_id"], attempt_id=manifest["attempt_id"], expected_outputs=manifest["expected_outputs"], ) verify_read_back( args.output_dir, logical_id=manifest["logical_id"], attempt_id=manifest["attempt_id"], ) marker("DONE", f"{manifest['logical_id']} {manifest['attempt_id']}") return 0 if __name__ == "__main__": raise SystemExit(main())