"""Count supplied synthetic labels; semantic adjudication remains a learner task."""
import argparse,json,pathlib

def score(cases,results):
    expected={x['id'] for x in cases if x['split']=='heldout'}
    ids=[x['id'] for x in results]
    if len(ids)!=len(set(ids)) or set(ids)!=expected:raise ValueError('Result IDs must match held-out cases exactly once')
    groups={'both_pass':[],'improved':[],'regressed':[],'both_fail':[]}
    for x in results:
        for v in ('baseline','revision'):
            if not isinstance(x[v]['pass'],bool):raise ValueError('Pass labels must be Boolean')
            if x[v]['severity'] not in ('none','minor','major','critical'):raise ValueError('Unknown severity')
            if x[v]['pass'] and x[v]['severity']!='none':raise ValueError('Passing case cannot have failure severity')
        a=x['baseline']['pass'];b=x['revision']['pass']
        group='both_pass' if a and b else 'improved' if not a and b else 'regressed' if a and not b else 'both_fail'
        groups[group].append(x['id'])
    n=len(results)
    if not n:raise ValueError('Cannot score empty set')
    counts={v:sum(x[v]['pass'] for x in results) for v in ('baseline','revision')}
    critical={v:[x['id'] for x in results if x[v]['severity']=='critical'] for v in ('baseline','revision')}
    rates={v:counts[v]/n*100 for v in counts}
    return {'method':'declared labels of synthetic classroom fixtures; not live model measurements','evaluated_cases':n,'passing_counts':counts,'pass_percent':rates,'change_percentage_points':rates['revision']-rates['baseline'],'paired_groups':groups,'critical_cases':critical,'classroom_release_gates':{'minimum_pass_percent':90,'maximum_critical_failures':0},'revision_decision':'GO_FOR_OWNER_REVIEW' if rates['revision']>=90 and not critical['revision'] else 'HOLD','limitations':['Labels require human semantic review','Challenge-heavy sample does not estimate traffic prevalence','No real deployment or model calls performed']}
def main():
    p=argparse.ArgumentParser();p.add_argument('--output',default='evaluation_report.json');args=p.parse_args();here=pathlib.Path(__file__).resolve().parent
    report=score(json.loads((here/'evaluation_cases.json').read_text()),json.loads((here/'heldout_results.json').read_text()))
    pathlib.Path(args.output).write_text(json.dumps(report,indent=2)+'\n');print(json.dumps(report))
if __name__=='__main__':main()
