#!/usr/bin/env python3
import json,re,sys
from pathlib import Path
p=Path(sys.argv[1]);d=json.loads(p.read_text());errs=[]
required=['title','domain','logline','protagonist','pov','cast','evidence','authorities','parts','visual_motif','closed_ending','safety','originality_audit']
errs += [f'missing {k}' for k in required if k not in d]
if len(d.get('cast',[]))!=6:errs.append('cast length')
names=[x.get('name') for x in d.get('cast',[])];
if len(set(names))!=6 or d.get('protagonist') not in names or d.get('pov')!=d.get('protagonist'):errs.append('cast/pov')
if [x.get('id') for x in d.get('evidence',[])]!=[f'E{i:02d}' for i in range(1,10)]:errs.append('evidence ids')
if any(not all(x.get(k) for k in ('setup','payoff','cannot_support','lawful_authority')) for x in d.get('evidence',[])):errs.append('evidence fields')
if [x.get('id') for x in d.get('authorities',[])]!=[f'A{i:02d}' for i in range(1,7)]:errs.append('authority ids')
if any(not x.get('scope') or not x.get('cannot_do') for x in d.get('authorities',[])):errs.append('authority fields')
if [x.get('part') for x in d.get('parts',[])]!=list(range(1,13)):errs.append('parts')
story_scope={k:d.get(k) for k in ('title','domain','logline','cast','evidence','parts','visual_motif','closed_ending')}
blob=json.dumps(story_scope,ensure_ascii=False).lower();forbidden=['băng cassette','băng cối','radio','đài phát thanh','phục chế âm thanh','siêu nhiên','ecg','bệnh viện','dầu khí','xăng dầu']
if any(x in blob for x in forbidden):errs.append('forbidden domain')
out={'status':'passed' if not errs else 'failed','errors':errs,'title':d.get('title'),'cast':names,'parts':len(d.get('parts',[]))};print(json.dumps(out,ensure_ascii=False));raise SystemExit(1 if errs else 0)
