from pathlib import Path import argparse,json,hashlib,runpy ROOT=Path(__file__).resolve().parent.parent def load(name):return json.loads((ROOT/'sources'/name).read_text()) def read(name):return (ROOT/'sources'/name).read_text() def run(out): m=json.loads((ROOT/'SOURCE_MANIFEST.json').read_text());auth=[] for name,x in m.items(): p=ROOT/'sources'/name;assert p.stat().st_size==x['bytes'] and hashlib.sha256(p.read_bytes()).hexdigest()==x['sha256'],name;auth.append(name) c=load('PREVIOUS_CERTIFICATE.json') for key,name in [('data_sha256','PREVIOUS_DATA.json'),('results_sha256','PREVIOUS_RESULTS.json'),('checkpoint_sha256','PREVIOUS_CHECKPOINT.md'),('next_step_decision_sha256','PREVIOUS_NEXT_STEP.json')]:assert c[key]==m[name]['sha256'];auth.append('predecessor '+name) assert load('C444_CERTIFICATE.json')['data_sha256']==m['C444_DATA.json']['sha256'];auth.append('C444 data certificate') checks=[] def check(name,value): assert value,name assert name not in checks,name checks.append(name) data=runpy.run_path(str(ROOT/'evidence/CALCULATION.py'))['run'](load,read,check) step=json.loads((ROOT/'STEP.json').read_text())['number'];result={'step':f'C{step}','status':'passed','assertions_passed':len(checks),'checks':checks,'source_checks_passed':len(auth),'source_checks':auth,'canonical_or_graph_edits':False,'new_independent_agent_review':False} out.mkdir(parents=True,exist_ok=True) for name,obj in [('DATA.json',data),('RESULTS.json',result)]:(out/name).write_text(json.dumps(obj,ensure_ascii=False,indent=2)+'\n') print(json.dumps({'step':step,'checks':len(checks),'authentication':len(auth),'status':'passed'})) if __name__=='__main__': p=argparse.ArgumentParser();p.add_argument('--out',type=Path,required=True);run(p.parse_args().out)