Explorer
/opt/struktur/AA-043-P43-R2-correct.py
← Zurück ↓ Download
import json,hashlib,os
D='/opt/struktur/reports/aa043-p43-r2/20260828T111347Z'; p=D+'/p43-r2-segmentation-audit.json'
d=json.load(open(p,encoding='utf8'))
for x in d['issues']:
 s=x.get('source',''); x['source_type']='youtube' if s.startswith('youtube:') else ('obsidian' if s.startswith('obsidian:') else 'unknown')
for x in d['controls']:
 s=x.get('source',''); x['source_type']='youtube' if s.startswith('youtube:') else ('obsidian' if s.startswith('obsidian:') else 'unknown')
d['by_source_type']={t:sum(x.get('source_type')==t for x in d['issues']) for t in ['youtube','obsidian','unknown']}
open(p,'w',encoding='utf8').write(json.dumps(d,ensure_ascii=False,indent=2))
# add a compact correction line without changing other conclusions
rp=D+'/AA-043-P43-R2.md'; s=open(rp,encoding='utf8').read(); old='Taxonomie, Source-Typen und Auditklassen stehen in `p43-r2-segmentation-audit.json`.'; new=old+' Korrigierte Issue-Verteilung nach canonical identity: YouTube='+str(d['by_source_type']['youtube'])+', Obsidian='+str(d['by_source_type']['obsidian'])+', unbekannt='+str(d['by_source_type']['unknown'])+'.'
if old in s: s=s.replace(old,new)
open(rp,'w',encoding='utf8').write(s)
# refresh manifest after correction
m={}
for n in os.listdir(D):
 p2=D+'/'+n
 if os.path.isfile(p2) and n!='SHA256SUMS.json': m[n]={'size':os.path.getsize(p2),'sha256':hashlib.sha256(open(p2,'rb').read()).hexdigest()}
open(D+'/SHA256SUMS.json','w',encoding='utf8').write(json.dumps(m,ensure_ascii=False,indent=2))
print(json.dumps({'by_source_type':d['by_source_type'],'report_sha256':hashlib.sha256(open(rp,'rb').read()).hexdigest(),'artifact_sha256':m['p43-r2-segmentation-audit.json']['sha256']},ensure_ascii=False))