Research-Stack/5-Applications/hutter_prize/scripts/verify_components.py
Devin AI e5f04ee6c3 refactor(infra): extract shared utilities from duplicated code patterns
Create 4-Infrastructure/lib/ with canonical implementations of:
- hashing.py: sha256_bytes, sha256_text, sha256_file
- q16.py: Q16_16 fixed-point constants and arithmetic
- jsonl.py: load_json, load_jsonl, write_jsonl, stable_json, canonical_json_bytes
- fraction_utils.py: Fraction serialization helpers for hardware probes

Refactor 66 files across 4-Infrastructure/{hardware,shim,infra} and
5-Applications/{scripts,tools-scripts,hutter_prize,text-to-cad} to import
from the shared library instead of maintaining local copies.

4-Infrastructure/auto/lib/q16.py now re-exports from lib.q16.

Net: -743 lines (490 added, 1233 removed)

Build: not applicable (Python-only change, py_compile verified on all 71 files)
Co-Authored-By: Allaun Silverfox <bigdataiscoming+9i37y6j2@protonmail.com>
2026-06-15 02:26:45 +00:00

76 lines
2.2 KiB
Python

#!/usr/bin/env python3
"""Verify tracked files against a SHA-256 lock manifest."""
from __future__ import annotations
import argparse
import json
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parents[3] / "4-Infrastructure"))
from lib.hashing import sha256_file
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--lock", required=True, help="Path to the JSON lock manifest.")
parser.add_argument(
"--root",
default=".",
help="Root directory used to resolve component paths from the lock file.",
)
parser.add_argument(
"--file",
action="append",
default=[],
help="Extra file to verify directly by path. If omitted, verify every locked component.",
)
return parser.parse_args()
def main() -> int:
args = parse_args()
lock_path = Path(args.lock).resolve()
root = Path(args.root).resolve()
data = json.loads(lock_path.read_text(encoding="utf-8"))
locked = {entry["path"]: entry["sha256"] for entry in data["components"]}
if args.file:
targets = []
for item in args.file:
path = Path(item).resolve()
try:
rel = path.relative_to(root)
except ValueError:
rel = path.relative_to(lock_path.parent)
targets.append((str(rel), path))
else:
targets = [(rel_path, root / rel_path) for rel_path in locked]
failures = []
for rel_path, full_path in targets:
expected = locked.get(rel_path)
if expected is None:
failures.append(f"{rel_path}: not present in lock manifest")
continue
if not full_path.is_file():
failures.append(f"{rel_path}: file missing")
continue
actual = sha256_file(full_path)
if actual != expected:
failures.append(
f"{rel_path}: sha256 mismatch (expected {expected}, got {actual})"
)
if failures:
for failure in failures:
print(failure, file=sys.stderr)
return 1
print("All tracked component hashes match the lock manifest.")
return 0
if __name__ == "__main__":
raise SystemExit(main())