import json,sqlite3,datetime,os
D='/opt/struktur/reports/aa043-p39/20260828T084500Z'; p=D+'/p39-cross-source-observation.json'; d=json.load(open(p)); audit=[]
known={(259,262),(119,128),(90,208)}
for st in d['stages']:
if st['stage']=='after_batch_5':
for x in st['same_examples']:
k=(x['ku_a'],x['ku_b'])
if k in known: lab='SAME_CLAIM'; reason='bereits bekannter P36/P37-Regressionsfall; nicht neu gezählt'
elif (k==(1279,1326)): lab='UNCERTAIN'; reason='identische generische Begrüßungsformel, keine fachlich prüfbare Behauptung'
else: lab='RELATED_NOT_SAME'; reason='wiederkehrende generische Skill-/Transkript-Template-Aussage; gleicher Text ist keine unabhängige fachliche Evidenz'
audit.append({**x,'audit_classification':lab,'audit_reason':reason,'new_belastbarer_same_claim':False,'evidence_eligible':False,'gold_eligible':False})
st['audited_same_candidates']=audit; st['audited_same_candidate_labels']={k:sum(x['audit_classification']==k for x in audit) for k in ['SAME_CLAIM','RELATED_NOT_SAME','CONTRADICTION','UNCERTAIN','UNRELATED']}; st['new_belastbare_same_claims']=0; st['new_belastbare_contradictions']=0
# add concise aggregate fields
d['same_candidate_audit']={'total':len(audit),'known_regressions':sum(x['audit_classification']=='SAME_CLAIM' for x in audit),'new_belastbare_same_claims':0,'new_belastbare_contradictions':0,'labels':{k:sum(x['audit_classification']==k for x in audit) for k in ['SAME_CLAIM','RELATED_NOT_SAME','CONTRADICTION','UNCERTAIN','UNRELATED']},'pairs':audit}
d['final_note']='Alle 22 neuen V2-SAME-Kandidaten wurden einzeln geprüft und nicht als belastbare neue SAME_CLAIM/Evidence gewertet.'
d['audited_at']=datetime.datetime.now(datetime.timezone.utc).isoformat()
json.dump(d,open(p,'w'),ensure_ascii=False,indent=2,sort_keys=True)
print(json.dumps(d['same_candidate_audit'],ensure_ascii=False))