"""Verify the complete model, runtime, and dependency-lock package.""" from __future__ import annotations import argparse import hashlib import json from pathlib import Path from typing import Sequence from .verify_model import verify_model from .verify_runtime import verify_runtime def _file_receipt(path: Path) -> dict[str, str | int]: resolved = path.resolve(strict=True) if not resolved.is_file(): raise RuntimeError(f"package artifact must be a regular file: {resolved}") return { "path": str(resolved), "bytes": resolved.stat().st_size, "sha256": hashlib.sha256(resolved.read_bytes()).hexdigest(), } def build_parser() -> argparse.ArgumentParser: parser = argparse.ArgumentParser(description=__doc__) parser.add_argument("--model-root", type=Path, required=True) parser.add_argument("--manifest", type=Path, required=True) parser.add_argument("--requirements-direct", type=Path, required=True) parser.add_argument("--requirements-lock", type=Path, required=True) return parser def main(argv: Sequence[str] | None = None) -> int: args = build_parser().parse_args(argv) report = { "schema_version": "procedure.ep15_merged3225.package_verify.v1", "status": "PASS", "model": verify_model(args.model_root, args.manifest), "runtime": verify_runtime(), "requirements": { "direct": _file_receipt(args.requirements_direct), "lock": _file_receipt(args.requirements_lock), }, } print(json.dumps(report, ensure_ascii=False, sort_keys=True)) return 0 if __name__ == "__main__": raise SystemExit(main())