#!/usr/bin/env python3
import json,sys,subprocess,hashlib,re
from pathlib import Path
validator=Path(__file__).with_name('gacmai_20260717_184527_validate_outline.py')
rows=[]
for name in sys.argv[1:]:
 p=Path(name);cp=subprocess.run(['python3',str(validator),str(p)],capture_output=True,text=True);result=json.loads(cp.stdout) if cp.stdout.strip() else {'status':'failed','errors':['no validator output']}
 if result.get('status')!='passed':rows.append({'path':str(p),'eligible':False,'validation':result});continue
 d=json.loads(p.read_text());beats=[x['beat'] for part in d['parts'] for x in part['paragraphs']];e={f'E{i:02d}':0 for i in range(1,10)};a={f'A{i:02d}':0 for i in range(1,7)}
 for part in d['parts']:
  for x in part['paragraphs']:
   for k in x['evidence_ids']:e[k]+=1
   for k in x['authority_ids']:a[k]+=1
 explicit=sum(any(n in b for n in d['cast']) for b in beats);avg=sum(len(b) for b in beats)/144;generic=sum(bool(re.search(r'^(Cô|Họ|Mọi người|Một cuộc|Một tài liệu)\b',b)) for b in beats);score=explicit*2+min(avg,300)-generic*3+sum(v>1 for v in e.values())*10+sum(v>1 for v in a.values())*10
 rows.append({'path':str(p),'eligible':True,'sha256':hashlib.sha256(p.read_bytes()).hexdigest(),'explicit_actor_beats':explicit,'average_beat_chars':round(avg,2),'generic_openings':generic,'evidence_distribution':e,'authority_distribution':a,'mechanical_score':round(score,2),'validation':result})
rows.sort(key=lambda x:(x.get('eligible',False),x.get('mechanical_score',-1)),reverse=True);print(json.dumps({'status':'passed','ranking':rows,'note':'mechanical ranking only; independent full-read audit remains blocking'},ensure_ascii=False,indent=2))
