frontend-patterns/research/evaluations/language-pilot-01/summarize.py

76 lines
4 KiB
Python
Raw Normal View History

"""Unmask frozen editorial judgments and verify all evidence before aggregation."""
import json
from pathlib import Path
from hashlib import sha256
ROOT = Path(__file__).resolve().parent
def read(name):
return json.loads((ROOT/name).read_text())
def digest(path):
return sha256(path.read_bytes()).hexdigest()
scores = read('editorial-scores-masked.json')
score_by_id = {a['answer']: a for a in scores['answers']}
assert len(score_by_id) == 12
rubric = {s['id']: s for s in read('scenarios.json')}
result = {'preregistration_commit':'6acbe6d', 'masked_scoring_commit':'3690af1',
'independent_human_review':'pending', 'interpretation':'exploratory descriptive counts only',
'score_sha256':digest(ROOT/'editorial-scores-masked.json'), 'conditions':{}, 'pairs':{}}
for condition in ['patterns','prose']:
result['conditions'][condition] = {'completed':0, 'failed':0, 'requirements_met':0,
'requirements_possible':0, 'criteria_met':dict.fromkeys(['C1','C2','R','Q'],0),
'unsupported_claims':0, 'calls':0, 'prompt_tokens':0, 'completion_tokens':0,
'total_tokens':0, 'elapsed_seconds':0, 'provider_reported_cost_usd':0,
'over_requested_word_limit':0, 'resolved_models':[], 'answers':[]}
for a in read('assignment.json'):
raw = ROOT/'raw'/a['run']; receipt = json.loads((raw/'receipt.json').read_text())
c = result['conditions'][a['condition']]
assert receipt['condition'] == a['condition'] and receipt['scenario'] == a['scenario']
assert receipt['freeze_sha256'] == digest(ROOT/'freeze.json')
assert receipt['prompt_sha256'] == digest(raw/'prompt.txt')
expected = ((ROOT/'instructions.txt').read_text()+'\nREFERENCE\n'+
(ROOT/f"pack-{a['condition']}.md").read_text()+'\nSCENARIO\n'+rubric[a['scenario']]['brief'])
assert expected == (raw/'prompt.txt').read_text(), 'Prompt contains unexpected input'
c['calls'] += receipt['service_requests_attempted']
c['elapsed_seconds'] += receipt['elapsed_seconds']
if receipt['status'] != 'completed':
c['failed'] += 1
continue
c['completed'] += 1
score = score_by_id[a['blind_id']]
assert digest(raw/'answer.md') == digest(ROOT/'masked'/(a['blind_id']+'.md')) == score['answer_sha256']
assert len(receipt['responses']) == 1
response = receipt['responses'][0]
assert response['finish_reason'] == 'stop'
assert response['content_sha256'] == digest(raw/'answer.md')
for key in ['prompt_tokens','completion_tokens','total_tokens']:
c[key] += response['usage'][key]
c['provider_reported_cost_usd'] += response['diagnostics']['provider_usage']['cost']
if response['model'] not in c['resolved_models']: c['resolved_models'].append(response['model'])
c['over_requested_word_limit'] += int(receipt['output_words'] > 220)
values = {k:v['score'] for k,v in score['criteria'].items()}
assert set(values)=={'C1','C2','R','Q'} and all(v in [0,1] for v in values.values())
met = sum(values.values()); unsafe=len(score['unsupported_claims'])
c['requirements_met'] += met; c['requirements_possible'] += 4
c['unsupported_claims'] += unsafe
for k,v in values.items(): c['criteria_met'][k] += v
record={'answer':a['blind_id'], 'run':a['run'], 'met':met, 'unsupported':unsafe, 'criteria':values}
c['answers'].append(record)
result['pairs'].setdefault(a['scenario'],{})[a['condition']]=record
for scenario,pair in result['pairs'].items():
p,b=pair['patterns'],pair['prose']
pm,bm=p['met'],b['met']; pu,bu=p['unsupported'],b['unsupported']
if pm==bm and pu==bu: outcome='tie'
elif pm>=bm and pu<=bu: outcome='patterns'
elif bm>=pm and bu<=pu: outcome='prose'
else: outcome='mixed'
pair['descriptive_advantage']=outcome
for c in result['conditions'].values():
c['missed_requirements']=c['requirements_possible']-c['requirements_met']
c['elapsed_seconds']=round(c['elapsed_seconds'],3)
c['provider_reported_cost_usd']=round(c['provider_reported_cost_usd'],7)
(ROOT/'summary.json').write_text(json.dumps(result,indent=2)+'\n')
print(json.dumps(result,indent=2))