#!/usr/bin/env python3
from pathlib import Path
import json,sys
root=Path(__file__).resolve().parent
checks=[]
def add(i,ok,detail): checks.append({'id':i,'pass':bool(ok),'detail':detail})
required=['README.en-US.md','README.fa-IR.md','package.json','starter/index.html','starter/vite.config.js','starter/src/main.js','starter/src/inspector.js','starter/src/assets/status-badge.svg','transfer/index.html','transfer/vite.config.js','transfer/src/main.js','transfer/src/course-helper.js','transfer/src/assets/course-badge.svg','evidence/Vite_Production_Build_Evidence_Record_v1.template.json']
for f in required: add('file:'+f,(root/f).is_file(),'required learner-package file')
add('transfer.no_stale_inspector',not (root/'transfer/src/inspector.js').exists(),'changed-context transfer must not retain guided inspector module')
rec=json.loads((root/'evidence/Vite_Production_Build_Evidence_Record_v1.template.json').read_text('utf-8'))
for k in ['tool_context','contract','observations','runtime_observation','interpretation','mutation','transfer','residual_limitation','attestation']: add('evidence:'+k,k in rec,'evidence field')
add('runtime.claim_default_false',rec.get('runtime_observation',{}).get('claimed') is False,'template must not fabricate runtime evidence')
starter=(root/'starter/src/main.js').read_text('utf-8')
add('starter.not_pre_solved.asset','/assets/status-badge.svg' in starter,'starter retains intentional broken asset assumption')
add('starter.not_pre_solved.lazy',"import('./inspector.js')" not in starter and 'import("./inspector.js")' not in starter,'starter does not pre-solve lazy boundary')
transfer=(root/'transfer/src/main.js').read_text('utf-8')
add('transfer.changed_asset_visible','course-badge.svg' in transfer,'transfer exposes changed asset requirement')
add('transfer.changed_optional_module_visible','course helper' in transfer.lower(),'transfer exposes changed optional module requirement without solving it')
vite_local=(root/'node_modules/vite/bin/vite.js').exists()
result={'schema':'WEB014_LEARNER_LOCAL_PREFLIGHT_v2','checks':checks,'passed':sum(c['pass'] for c in checks),'total':len(checks),'vite_runtime_available_locally':vite_local,'runtime_execution_claimed':False,'verdict':'PASS' if all(c['pass'] for c in checks) else 'FAIL'}
print(json.dumps(result,indent=2)); sys.exit(0 if result['verdict']=='PASS' else 1)
