#!/usr/bin/env python3
import json,hashlib,stat,sys
from pathlib import Path
can=lambda x:json.dumps(x,sort_keys=True,separators=(",",":"),ensure_ascii=True).encode();sha=lambda b:hashlib.sha256(b).hexdigest()
r=Path(sys.argv[1]);v=json.loads((r/"verifier-input.json").read_text());m=json.loads((r/"candidate-manifest.json").read_text());inv=json.loads((r/"hash-inventory.json").read_text());assert sha((r/"candidate-manifest.json").read_bytes())==v["manifest_sha256"]; full=m.pop("full_candidate_digest");assert full==sha(can(m))==v["full_candidate_digest"];m["full_candidate_digest"]=full; actual={str(p.relative_to(r)) for p in r.rglob("*") if p.is_file()}; indexed={x["path"] for x in inv["entries"]};controls={"candidate-manifest.json","hash-inventory.json","verifier-input.json"};assert actual==indexed|controls
for x in inv["entries"]:p=r/x["path"];assert p.stat().st_size==x["bytes"] and sha(p.read_bytes())==x["sha256"]
assert (r/"status-pre.nul").read_bytes()==(r/"status-post.nul").read_bytes();assert m["readiness"]=="READY_FOR_GATE18_20_RECERTIFICATION";print(json.dumps({"status":"PASS","full":full,"core":m["core_candidate_digest"],"wheel":m["wheel_sha256"],"inventory_count":len(inv["entries"]),"unindexed":0,"delta_count":3,"production_parity":2,"ready":True},sort_keys=True))
