from pathlib import Path import json,hashlib,zipfile root=Path(__file__).resolve().parents[1] payloads=[] for folder in ['evidence','model','agents','assets']: payloads.extend(p for p in (root/folder).rglob('*') if p.is_file() and '__pycache__' not in p.parts and p.suffix not in ['.pyc']) for n in ['journal.json','research.py','runner.py','verify_cycle.py','verification.json','README.md','Strategy_Review_After_C1634.md']: p=root/n if p.exists():payloads.append(p) for p in (root/'deliverables').iterdir(): if p.is_file() and p.suffix in ['.md','.pdf']:payloads.append(p) for n in ['build_record.py','prose.py','render_readers.py','new_reader_sections.md']: payloads.append(root/'prep'/n) payloads.extend((root/'prep').glob('phase*.py')) payloads=sorted(set(payloads),key=lambda p:p.relative_to(root).as_posix()) manifest={'format':'sha256 bytes exact payload manifest','files':{p.relative_to(root).as_posix():{'bytes':p.stat().st_size,'sha256':hashlib.sha256(p.read_bytes()).hexdigest()} for p in payloads}} m=root/'MANIFEST.json';m.write_text(json.dumps(manifest,indent=2)+'\n') archive=root/'deliverables/490d_C1585_C1634_Research_Evidence_20260929.zip' with zipfile.ZipFile(archive,'w',zipfile.ZIP_DEFLATED) as z: for p in payloads+[m]:z.write(p,p.relative_to(root).as_posix()) with zipfile.ZipFile(archive) as z: assert z.testzip() is None assert set(z.namelist())==set(manifest['files'])|{'MANIFEST.json'} for name,row in manifest['files'].items(): b=z.read(name);assert len(b)==row['bytes'] and hashlib.sha256(b).hexdigest()==row['sha256'] result={'archive':str(archive.resolve()),'payloads':len(payloads),'bytes':archive.stat().st_size,'sha256':hashlib.sha256(archive.read_bytes()).hexdigest()} (root/'prep/package_result.json').write_text(json.dumps(result,indent=2)+'\n') print(json.dumps(result))