from pathlib import Path
import argparse,json,sys,hashlib
from ledger_fixture import run_probe
ROOT=Path(__file__).resolve().parents[1]; STATUS=ROOT/'evidence/validation-status.json'
def write(o): STATUS.write_text(json.dumps(o,indent=2)+'\n')
def main():
 p=argparse.ArgumentParser(); p.add_argument('--confirm-local',action='store_true'); args=p.parse_args()
 if not args.confirm_local: write({'status':'NOT_RUN_CONFIRMATION_REQUIRED','runner_executed':False,'runtime_observations_claimed':False,'final_integrity_decision_claimed':False}); return 2
 sub=ROOT/'submission/decision.json'
 if not sub.exists(): write({'status':'NOT_RUN_INCOMPLETE_SUBMISSION','runner_executed':False,'runtime_observations_claimed':False,'final_integrity_decision_claimed':False}); return 2
 d=json.loads(sub.read_text()); cases=json.loads((ROOT/'fixture/probe-cases.json').read_text())['cases']; pol=json.loads((ROOT/'toolchain-policy.json').read_text()); expected=pol['expected_case_ids']; preds=d.get('predictions',{})
 if d.get('status')=='LEARNER_INCOMPLETE' or any(not d.get(k) for k in pol['required_decision_fields']) or set(preds)!=set(expected) or any(v is None for v in preds.values()): write({'status':'NOT_RUN_INCOMPLETE_SUBMISSION','runner_executed':False,'runtime_observations_claimed':False,'final_integrity_decision_claimed':False}); return 2
 if [c['id'] for c in cases]!=expected: write({'status':'NOT_RUN_CONTRACT_MISMATCH','runner_executed':False,'runtime_observations_claimed':False,'final_integrity_decision_claimed':False}); return 2
 obs=[]
 for c in cases: obs.append(run_probe(c['id']))
 prov={rel:hashlib.sha256((ROOT/rel).read_bytes()).hexdigest() for rel in pol['runtime_input_files_required']}
 out={'status':'RAN_LOCAL_FIXTURE','runner_executed':True,'runtime_observations_claimed':True,'final_integrity_decision_claimed':False,'scope':'BOUNDED_LOCAL_FIXTURE_ONLY','postgresql_runtime_claimed':False,'observations':obs,'provenance_sha256':prov}; write(out); print(json.dumps(out,indent=2)); return 0
if __name__=='__main__': sys.exit(main())
