from pathlib import Path
import json,hashlib,stat
H=Path(__file__).resolve().parent.parent;R=Path('/tmp/cdx-ai-disease-owned-flow-20261011')
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
def files(root):
 out=[]
 for p in sorted(root.rglob('*')):
  if not p.is_file() or p==H/'manifest.json':continue
  assert not p.is_symlink()
  out.append({'path':p.relative_to(root).as_posix(),'sha256':sha(p),'bytes':p.stat().st_size,'mode':oct(stat.S_IMODE(p.stat().st_mode))})
 return out
def oldproof():
 names=[('parallel-ai-core-scan-pay-20261011','cfda90d3fb84df1c73920f7b831c64d85e28bdfbd4a4b965086fe05a96d57b15'),('parallel-ai-direct002-20261011','45a587e9304011fa66ead8c07f1c876e5f86109a64848877ef3fddf65d5537dc'),('parallel-ai-api-customer-read12-20261011','0b3b521b2ce8cee62304ab85d402f2f6fa41c4fd4a82310fa14dc0fb243dd089'),('parallel-ai-api-customer-read12-20261011/failed-weight-retest','d05e1a1e7f7129f1cf0e34c0d69082b7bbfd4ea1d9fc43f4ac085fbcdb0bffdc'),('parallel-ai-api-customer-read12-20261011/final-weight-read','d3882bdf5b9c40b531f39044ea6d4f3a6e5e639fb55dcf57d9fa4a0aa87b8844')]
 names.append(('parallel-ai-user-weight-owned-flow-20261011','d313205f4377b037d2bd6cdfee4200b28ebed1373234eb0a7c44c38796429a55'))
 out={}
 for name,digest in names:
  m=H.parent/name/'manifest.json';assert sha(m)==digest;data=json.loads(m.read_text());count=0
  for root,entries in [(m.parent,data['public_files'])]+[(Path(g['root']),g['files']) for g in data['canonical_private_groups'].values()]:
   for e in entries:
    p=root/e['path'];assert sha(p)==e['sha256'] and p.stat().st_size==e['bytes'] and oct(stat.S_IMODE(p.stat().st_mode))==e['mode'];count+=1
  out[name]={'manifest_SHA':digest,'immutable_assets':count}
 return out
assert not (H/'manifest.json').exists()
groups={}
for lane in ('B','C'):
 p=R/f'private-{lane}-final';assert stat.S_IMODE(p.stat().st_mode)==0o700
 entries=files(p);assert all(x['mode']=='0o600' for x in entries)
 groups[lane]={'root':str(p),'directory_mode':'0o700','files':entries}
data={'status':'SEALED_OWNED_DISEASE_NONEMPTY_INITIAL_ORACLE_TOOL_ERROR_RETAINED','public_root':str(H),'public_files':files(H),'canonical_private_groups':groups,'old_seals_verified_immutable':oldproof(),'per_side':{'prepare_INSERT':0,'formal_INSERT':2,'formal_UPDATE':0,'HTTP':2,'marked_new_rows':2,'DELETE':0,'DDL':0},'unrelated_rows_unchanged':True,'own_resources_cleaned':True,'canonical_permissions':'All directories0700/files0600; raw tar retained original permissions; canonical log bytes unchanged','raw_runtime':str(R),'boundary':'Queue exact2 captured; Bind0 UserApi0run; no external HTTP','oracle_history':'First W1 string-success envelope misread retained, corrected source-only offline v2 without replay; original R1 frozen oracle passes','source_only_blocker':'CourseSchedule create/update both current frozen catalog lacks yoshop_user_course_schedule; no HTTP/DDL'}
(H/'manifest.json').write_text(json.dumps(data,ensure_ascii=False,indent=2)+'\n');print(json.dumps({'public':len(data['public_files']),'private':{k:len(v['files']) for k,v in groups.items()},'manifest_SHA':sha(H/'manifest.json')}))
