"""Independent event-log recount, using sets and grouping rather than the runner's counters."""
import json,collections,hashlib,pathlib
p=pathlib.Path('.')
r=json.loads((p/'results.json').read_text())
events=[json.loads(x) for x in (p/'events.jsonl').read_text().splitlines()]
groups=collections.defaultdict(list)
for e in events:groups[e['runId']].append(e)
for row in r['results']:
 es=groups[row['runId']];ds=[e for e in es if e['type']=='delivery'];counts=collections.Counter(e['event'] for e in ds)
 actual={'followupAssessments':sum(e['type']=='assessment' for e in es),'uniqueDelivered':len(counts),'repeated':sum(n-1 for n in counts.values()),'wrong':sum(not e['correct'] for e in ds),'duplicateCount':sum(e['type']=='receive' and e['outcome']=='duplicate' for e in es)}
 assert all(row[k]==v for k,v in actual.items()),(row,actual)
 assert set(counts)=={f'follow-{i}' for i in range(120)}
 assert row['duplicateCount']==row['extraCopies']*132
assert len(groups)==36 and len(r['results'])==36
assert len(r['boundary'])==10 and all(x['status']=='pass' for x in r['boundary'])
bybatch={str(b):sorted({x['followupAssessments'] for x in r['results'] if x['batch']==b and x['variant']=='unsubscribe-oracle'}) for b in [1,8]}
out={'independent_recount':'pass','runs':36,'delivery_records':sum(e['type']=='delivery' for e in events),'duplicate_receives':sum(e['type']=='receive' and e['outcome']=='duplicate' for e in events),'oracle_assessments_by_batch':bybatch,'results_sha256':hashlib.sha256((p/'results.json').read_bytes()).hexdigest(),'events_sha256':hashlib.sha256((p/'events.jsonl').read_bytes()).hexdigest()}
(p/'audit.json').write_text(json.dumps(out,indent=2)+'\n');print(json.dumps(out,indent=2))
