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','package.json','catalog/stories.json','config/environment.json','baseline/baseline_review.json','visual/render.html','visual_harness.py','evidence/Component_Catalog_Visual_Regression_Evidence_Record_v1.template.json','evidence/learner_evidence.json','transfer/README_TASK.en-US.md','transfer/README_TASK.fa-IR.md']
for f in required: ck('file:'+f,(ROOT/f).is_file(),'required learner file')
st=json.loads((ROOT/'catalog/stories.json').read_text('utf-8')); ids=[x.get('id') for x in st.get('stories',[])]
ck('starter.unsolved.missing_long_title','LongTitle' not in ids)
ck('starter.unsolved.missing_focus_visible','FocusVisible' not in ids)
ck('starter.unsolved.todo_declared',set(st.get('todo',[]))=={'LongTitle','FocusVisible'})
env=json.loads((ROOT/'config/environment.json').read_text('utf-8'))
ck('starter.unsolved.clock_live',env.get('clock_policy')=='live')
ck('starter.unsolved.random_uncontrolled',env.get('random_policy')=='uncontrolled')
ck('starter.unsolved.animation_allow',env.get('animation_policy')=='allow')
br=json.loads((ROOT/'baseline/baseline_review.json').read_text('utf-8'))
ck('starter.baseline_unreviewed',br.get('status')=='unreviewed' and not br.get('reviewed_states'))
ev=json.loads((ROOT/'evidence/learner_evidence.json').read_text('utf-8'))
for k in ['environment','story_inventory','baseline_authority','observations','diff_decisions','mutation','repair','transfer','oracle_boundary','residual_limitation','attestation']: ck('evidence.schema:'+k,k in ev)
ck('evidence.no_fabrication_default',ev.get('attestation',{}).get('browser_screenshots_were_actually_observed') is False and ev.get('attestation',{}).get('evidence_not_fabricated') is False)
ck('transfer.unsolved',not (ROOT/'transfer/catalog/stories.json').exists())
result={'schema':'WEB018_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)
