#!/usr/bin/env python3
from pathlib import Path
import json,hashlib,datetime,shutil
P='gacmai_20260717_184527';R=Path('/data/video-pipeline/GacMaiAudio/project')/P;A=R/'artifacts'
def sha(p):return hashlib.sha256(p.read_bytes()).hexdigest()
src=A/'locked_outline_candidate.json';val=A/'outline_validation.json';audit=A/'outline_release_audit.json';dst=A/'locked_outline_canonical.json'
for p in (src,val,audit):
 if not p.exists():raise SystemExit(f'missing {p.name}')
if dst.exists():raise SystemExit('canonical outline already exists')
h=sha(src);v=json.loads(val.read_text());q=json.loads(audit.read_text())
if v.get('status')!='passed' or v.get('sha256')!=h:raise SystemExit('validation mismatch')
if q.get('verdict')!='pass' or q.get('source_sha256')!=h or q.get('source_modified') is not False:raise SystemExit('audit mismatch')
shutil.copy2(src,dst);assert sha(dst)==h
receipt={'status':'passed','project_id':P,'outline_sha256':h,'validation_sha256':sha(val),'audit_sha256':sha(audit),'writer_dispatch_authorized':True,'promoted_at':datetime.datetime.now(datetime.timezone.utc).isoformat()};(A/'outline_release_manifest.json').write_text(json.dumps(receipt,indent=2)+'\n')
for n in ('status.json','project.json'):
 p=R/n;d=json.loads(p.read_text());d['stage']='story_writing';d['outline_sha256']=h;d['writer_dispatch_authorized']=True;p.write_text(json.dumps(d,ensure_ascii=False,indent=2)+'\n')
print(json.dumps(receipt))
