#!/usr/bin/env python3 """Assemble run3 evidence from complete logs without running tests.""" import hashlib, json, re from pathlib import Path HERE=Path(__file__).resolve().parent RUN=HERE/'run3' def main(): sections={n:json.loads((RUN/n/'results.json').read_text()) for n in ['syntax','red','focused','changes','whole']} for n in ['syntax','focused','whole']: assert all(s['code']==0 and not s['timeout'] for s in sections[n]['steps']), n assert len(sections['whole']['steps'])==12 assert all(s['code']!=0 and not s['timeout'] for s in sections['red']['steps']) changes=sections['changes']['changes'] assert len(changes)==6 and all(s['outcome']=='killed' and not s['timeout'] for s in changes) limits=json.loads((HERE/'SHELL-LIMITS.json').read_text())['scripts'] shells=[] for s in sections['whole']['steps'][2:]: command=json.loads(Path(s['log']).with_suffix('.command.json').read_text()) script=command[-1] assert command==['timeout','-k','10',str(limits[script]['limit_seconds']),'bash',script] raw=Path(s['log']).read_text(errors='replace') matches=re.findall(r'([^\n]*?: (\d+) passed, (\d+) failed)',raw) assert matches, script line, passed, failed=matches[-1] assert int(failed)==0 shells.append(dict(script=script,pass_count=int(passed),fail_count=int(failed),seconds=s['seconds'],limit_seconds=limits[script]['limit_seconds'],summary_line=line,command=command)) webui=Path(sections['whole']['steps'][1]['log']).read_text(errors='replace') skips=[line for line in webui.splitlines() if '# SKIP' in line] direct=[] for p in RUN.rglob('*.command.json'): cmd=json.loads(p.read_text()) if 'node' in cmd and '--test' in cmd: assert cmd[:5]==['timeout','-k','10','300','node'] direct.append(str(p)) expected=json.loads((HERE/'CANDIDATE-SHAS.json').read_text()) repo=HERE.parents[3] assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v for n,v in expected.items()) assert all(hashlib.sha256((repo/n).read_bytes()).hexdigest()==v['script_sha256'] for n,v in limits.items()) result=dict(status='GREEN',grant='sage-2648',candidate='3e4c77ac6056e8efa887eecdbc4001d249b880f6',source='9696d1fcb78d6082cae8dcb61913225e98c9c138',manifest=hashlib.sha256((HERE/'MANIFEST.sha256').read_bytes()).hexdigest(),sections=sections,shells=shells,named_skips=skips,killed=len(changes),survived=0,timeouts=0,timeout_wrapped_direct_test_commands=direct,all_candidate_and_script_hashes_match=True) (RUN/'SUMMARY.json').write_text(json.dumps(result,indent=2)+'\n') defs={d['id']:d for d in json.loads((HERE/'changes.json').read_text())} lines=['# Run3 kill table','','All six bases passed; no timeout. Every change restored exact bytes and tracked git status.','','| Check | Named killer | Base seconds | Changed seconds | Result |','|---|---|---:|---:|---|'] lines += [f"| {s['id']} | {defs[s['id']]['pattern']} | {s['base_seconds']} | {s['seconds']} | {s['outcome']} |" for s in changes] (RUN/'KILL-TABLE.md').write_text('\n'.join(lines)+'\n') print(json.dumps(dict(shells=shells,named_skips=skips,killed=len(changes)),indent=2)) if __name__=='__main__': main()