from pathlib import Path
import json,sys
ROOT=Path(__file__).resolve().parent
checks=[]
def ck(i,c,d=''): checks.append({'id':i,'pass':bool(c),'detail':'' if c else d})
required=['README.en-US.md','README.fa-IR.md','implementation.py','fake_downstream.py','evidence/Error_Boundary_Retryability_Record_v1.template.json','evidence/learner_evidence.json','transfer/README_TASK.en-US.md','transfer/README_TASK.fa-IR.md','transfer/transfer_decision.json']
for f in required: ck('file:'+f,(ROOT/f).is_file(),'required learner file')
src=(ROOT/'implementation.py').read_text('utf-8')
ck('starter.intentionally_broken','# BROKEN_STARTER' in src)
ck('starter.todo.public_mapping','TODO: separate domain meaning' in src)
ck('starter.todo.raw_leak','TODO: remove raw internal-detail leakage' in src)
ck('starter.todo.retry','TODO: compute retryability' in src)
ck('starter.leaks_repr','repr(error)' in src)
ck('starter.generic_code',"'operation_failed'" in src)
ck('starter.all_5xx_retry','>= 500' in src)
ev=json.loads((ROOT/'evidence/learner_evidence.json').read_text('utf-8'))
for k in ['implementation_artifact','cases','observations','mutation','transfer','observation_inference_separation','residual_limitation','attestation']: ck('evidence.schema:'+k,k in ev)
ck('evidence.no_fabrication_default',ev.get('attestation',{}).get('api_behavior_actually_observed') is False and ev.get('attestation',{}).get('evidence_not_fabricated') is False and ev.get('attestation',{}).get('browser_or_at_evidence_claimed') is False)
tr=json.loads((ROOT/'transfer/transfer_decision.json').read_text('utf-8'))
ck('transfer.unsolved',tr.get('status')=='TODO' and tr.get('independent') is False)
result={'schema':'WEB004_LAB_PUBLIC_PREFLIGHT_v1','checks':checks,'passed':sum(c['pass'] for c in checks),'total':len(checks),'runtime_execution_claimed':False,'verdict':'PASS' if all(c['pass'] for c in checks) else 'FAIL'}
print(json.dumps(result,indent=2)); raise SystemExit(0 if result['verdict']=='PASS' else 1)
