import pathlib,subprocess,sys,os,json,ast
ROOT=pathlib.Path(__file__).resolve().parents[1]
q=subprocess.run([sys.executable,str(ROOT/'src/static_preflight_q1.py')],capture_output=True,text=True,env={**os.environ,'PYTHONDONTWRITEBYTECODE':'1'})
checks=[]
for line in q.stdout.splitlines():
    if line.startswith('PASS '): checks.append(('q1_'+line[5:].strip(),True))
    if line.startswith('FAIL '): checks.append(('q1_'+line[5:].strip(),False))
def c(n,x): checks.append((n,bool(x)))
tool=json.loads((ROOT/'toolchain-policy.json').read_text()); req=json.loads((ROOT/'requirements.json').read_text()); pol=json.loads((ROOT/'fixture/golden-policy.json').read_text()); ev=json.loads((ROOT/'evidence/Secret_Scope_and_Lifecycle_Record_v1.template.json').read_text()); tr=json.loads((ROOT/'transfer/changed-context.template.json').read_text()); dec=json.loads((ROOT/'submission/decision.template.json').read_text()); val=json.loads((ROOT/'evidence/validation-status.json').read_text())
c('q2_runtime_python_only',tool.get('allowed_runtime')==['python-stdlib'])
c('q2_irreversible_forbidden',tool.get('irreversible_side_effects_forbidden') is True)
c('q2_requirements_negative',req.get('must_preserve_negative_evidence') is True)
c('q2_requirements_transfer',req.get('changed_context_transfer_required') is True)
c('q2_requirements_owner_blank',req.get('owner_acceptance_must_be_blank') is True)
c('q2_requirements_secret_forbidden',req.get('real_secret_material_forbidden') is True)
c('q2_policy_human_no_direct',pol.get('human_direct_read_default') is False)
c('q2_evidence_blank',ev.get('owner_acceptance')=='' and ev.get('changed_context_decision')=='' and ev.get('negative_evidence')==[])
c('q2_transfer_blank',tr.get('final_decision')=='' and tr.get('residual_risk')=='')
c('q2_decision_blank',dec.get('bounded_decision')=='' and dec.get('owner_acceptance')=='')
c('q2_validation_unrun',val.get('status')=='NOT_RUN' and val.get('owner_acceptance')=='')
for n,ok in checks: print(('PASS' if ok else 'FAIL'),n)
print(f'SUMMARY {sum(x[1] for x in checks)}/{len(checks)} PASS')
raise SystemExit(0 if q.returncode==0 and all(x[1] for x in checks) else 1)
