from pathlib import Path
import ast,hashlib,json
run=Path(__file__).resolve().parent.parent
root=run/'Contextra_Fight_R5_Review_20261030'
manifest=json.loads((root/'sha256_manifest.json').read_text())
total=0
for rel,want in manifest.items():
 p=root/rel
 assert p.is_file() and p.resolve().is_relative_to(root.resolve())
 h=hashlib.sha256()
 with p.open('rb') as f:
  for block in iter(lambda:f.read(1024*1024),b''):h.update(block)
 assert h.hexdigest()==want,rel
 total+=p.stat().st_size
assert len(list(root.glob('*/B_R5_Space_Review.mp4')))==12
summary=json.loads((root/'validation.json').read_text());assert summary['observations']==11939
for p in (run/'helpers').glob('*.py'):ast.parse(p.read_text())
result=dict(status='PASS',files=len(manifest),bytes=total,observations=11939,videos=12)
(run/'reports/transfer_validation.json').write_text(json.dumps(result,indent=2))
for p in sorted(root.glob('*/data/replay_validation.json')):
 r=json.loads(p.read_text());added=[x['frame'] for x in r['changes'] if x['r5_event'] and not x['baseline_event']];removed=[x['frame'] for x in r['changes'] if x['baseline_event'] and not x['r5_event']]
 print(p.parent.parent.name,'red',len(r['red_frames']),'events',len(r['event_frames']),'event_added',added,'event_removed',removed)
print(json.dumps(result))
