from pathlib import Path import tarfile,hashlib,json R=Path.home()/'run/pets-knp';S=Path.home()/'KNP/pets-knp';archive=R/'model-and-proofs.tar.gz';files=[] for p in S.iterdir(): if p.is_file():files.append((p,'source/'+p.name)) for name in ['detectors','head-v2','head','checks','deployment-checks','eval-v2-smoke','eval-v2-final']: for p in (R/name).rglob('*'): if p.is_file():files.append((p,'runtime/'+str(p.relative_to(R)))) for name in ['dataset-manifest.json','final-summary.json','training-counts.npz','head-training.log','training-v2.log','encoding.log','collection.log','verify.log','eval-v2-final.log','api-checks.json','browser-checks.json','pets-desktop.png','pets-mobile.png','safe-scale-regression.json','pets_infer','pets_hidden','pets_readout','pets_worker']: p=R/name if p.is_file():files.append((p,'runtime/'+name)) for p in (R/'data').glob('*.npz'):files.append((p,'runtime/data/'+p.name)) for p in R.glob('*-build.json'):files.append((p,'runtime/'+p.name)) report=Path.home()/'KNP/reports/2026-10-15/Отчёт_Кошки_собаки.md' if report.exists():files.append((report,'REPORT.md')) with tarfile.open(archive,'w:gz') as t: for i,(p,rel) in enumerate(files): t.add(p,arcname=rel,recursive=False);(R/'bundle-progress.json').write_text(json.dumps({'current':i+1,'total':len(files),'done':i+1==len(files)})) sha=hashlib.sha256(archive.read_bytes()).hexdigest();(R/'model-and-proofs.tar.gz.sha256').write_text(sha+' '+archive.name+'\n');print(json.dumps({'bytes':archive.stat().st_size,'members':len(files),'sha256':sha}))