needle / scripts /summarize_coverage.py
Leon4gr45's picture
Upload folder using huggingface_hub (part 2)
25a2c1c verified
Raw History Blame Contribute Delete
6.36 kB
"""Aggregate recorded observations without re-labeling or hiding failures."""
import hashlib
import json
from pathlib import Path
import platform
import os
import subprocess
import re
import statistics
import math
from collections import Counter
OUT=Path('benchmarks/coverage/results')
SUITES=['frozen','heldout','heldout-reserve','coverage-development','coverage-heldout','coverage-adversarial','coverage-reserve']
def main():
paired={}
for suite in SUITES:
paired[suite]={}
for label in ['before','after']:
d=json.loads((OUT/(label+'-'+suite+'.json')).read_text());s=d['summary'];clear=s['clear_trials']
paired[suite][label]={**s,'false_abstention_rate':s['false_abstention_count']/clear if clear else None,'clear_latency_ms':d['clear_latency_ms'],'peak_rss_mib':float(d['server_memory']['VmHWM'].split()[0])/1024,'exact_repeat_stability':d['exact_outcome_call_repeat_stability'],'clear_failure_reasons':dict(Counter(r['reason'] for r in d['rows'] if r['expected_tool'] and not r['correct']))}
assert json.loads((OUT/('before-'+suite+'.json')).read_text())['dataset_sha256']==json.loads((OUT/('after-'+suite+'.json')).read_text())['dataset_sha256']
original=json.loads((OUT/('before-'+suite+'.json')).read_text())['rows']
candidate=json.loads((OUT/('after-'+suite+'.json')).read_text())['rows']
old={(r['id'],r['repeat']):r for r in original}
matched=[(old[(r['id'],r['repeat'])],r) for r in candidate if r['expected_tool'] and r['correct'] and old[(r['id'],r['repeat'])]['correct']]
def quantile(values):
values=sorted(values)
return {'p50':statistics.median(values),'p95':values[math.ceil(len(values)*.95)-1],'p99':values[math.ceil(len(values)*.99)-1]} if values else None
paired[suite]['matched_correct_trials']=len(matched)
paired[suite]['matched_correct_latency_ms']={label:quantile([pair[i]['latency_ms'] for pair in matched]) for i,label in enumerate(['before','after'])}
after=[v['after'] for v in paired.values()]
gates={'all_evaluated_false_executables_zero':all(v['false_executable_selections']==0 for v in after),'frozen_clear_97_percent_rounded':round(paired['frozen']['after']['clear_exact_accuracy']*100,1)>=97.,'reserve_clear_at_least_75_percent':paired['heldout-reserve']['after']['clear_exact_accuracy']>=.75,'fresh_reserve_safety_zero':paired['coverage-reserve']['after']['safety_executable_selections']==0,'fresh_reserve_clear_exact':paired['coverage-reserve']['after']['clear_exact_accuracy'],'new_heldout_false_abstentions_reduced':paired['coverage-heldout']['after']['false_abstention_count']<paired['coverage-heldout']['before']['false_abstention_count'],'independent_human_labels_available':False,'actual_opencode_mcp_client_tested':False,'actual_hf_cpu_tested':False}
payload={'base_commit':'9c3db09e3889ea70b2e53e1d4acec2b3a4c5f624','runtime_commit':subprocess.check_output(['git','log','-1','--format=%H','--','intent_guard.py','context_adapter.py'],text=True).strip(),'branch':'needle-gateway-v2-coverage','methodology':'Synthetic same-author pre-frozen labels; two repeats are paired observations, not independent samples. Local CPU Docker only. Original fixtures unchanged. Fresh reserve frozen before final reference hardening; earlier heldout retained as regression. No post-reserve-result tuning.','gates':gates,'recommendation':'NO-GO','total_candidate_trials':sum(v['trials'] for v in after),'total_candidate_false_executables':sum(v['false_executable_selections'] for v in after),'paired':paired,'dataset_sha256':{str(p):hashlib.sha256(p.read_bytes()).hexdigest() for p in [Path('benchmarks/qualification/scenarios.json'),*Path('benchmarks/intent').glob('*.json'),*Path('benchmarks/coverage').glob('*.json')]},'runtime_requirements_sha256':hashlib.sha256(Path('requirements.txt').read_bytes()).hexdigest(),'model_manifest_sha256':hashlib.sha256(Path('needle-assets.sha256').read_bytes()).hexdigest(),'host':{'python':platform.python_version(),'architecture':platform.machine(),'logical_cpus':os.cpu_count(),'memtotal':next(l.strip() for l in Path('/proc/meminfo').read_text().splitlines() if l.startswith('MemTotal:'))}}
for label in ['before','after']:
workflow=json.loads((OUT/(label+'-workflow.json')).read_text())
payload[label+'_workflow']={k:workflow[k] for k in ['correct_steps','steps','executed_steps','all_routing_steps_correct','post_edit_tests_passed','warm_incremental','tool_only_delta']}
payload['paired_cpu_state']={label:json.loads((OUT/(label+'-state-cpu.json')).read_text()) for label in ['before','after']}
payload['dataset_freeze_commits']={'development_and_first_heldout':'70b23a9','adversarial':'9fb5976','fresh_reference_reserve':'3b53284'}
payload['tests']={}
for label,name in [('host','host-tests.txt'),('offline_cpu','offline-cpu-tests.txt')]:
log=(OUT/name).read_text();passed=re.search(r'(\d+) passed',log)
payload['tests'][label]={'passed':int(passed.group(1)) if passed else None,'real_model_included':4 if label=='host' else 0,'real_model_deselected':4 if label=='offline_cpu' else 0}
for label in ['before','after']:
workflow=json.loads((OUT/(label+'-workflow.json')).read_text())
payload[label+'_workflow']['incorrect_executable_selections']=sum(bool(r['response']['choices'][0]['message'].get('tool_calls')) and not r['correct'] for r in workflow['rows'])
payload['gates']['disposable_workflow_complete']=payload['after_workflow']['all_routing_steps_correct'] and payload['after_workflow']['post_edit_tests_passed']
finite_keys=['all_evaluated_false_executables_zero','frozen_clear_97_percent_rounded','reserve_clear_at_least_75_percent','new_heldout_false_abstentions_reduced','fresh_reserve_safety_zero']
payload['finite_test_gate']='PASS' if all(gates[k] for k in finite_keys) else 'FAIL'
(OUT/'summary.json').write_text(json.dumps(payload,indent=2)+'\n')
print(json.dumps({'finite_test_gate':payload['finite_test_gate'],'gates':gates,'total_candidate_trials':payload['total_candidate_trials'],'total_candidate_false_executables':payload['total_candidate_false_executables']},indent=2))
if payload['finite_test_gate']!='PASS':raise SystemExit('NO-GO: finite routing gate failed; all artifacts retained')
if __name__=='__main__':main()