Scripts
Score
#!/usr/bin/env python3
"""Validate and summarize a scorecard; blank scores stay unknown."""
import csv, sys
from pathlib import Path
p=Path(sys.argv[1]) if len(sys.argv)>1 else Path('templates/scorecard.csv')
rows=list(csv.DictReader(p.open(encoding='utf-8-sig',newline='')))
assert len(rows)==12,'expected 12 criteria'
total_weight=sum(float(r['weight']) for r in rows)
assert abs(total_weight-100)<1e-9, f'weights sum to {total_weight}, expected 100'
covered=weighted=0.0
unknown=[]
for r in rows:
score=r['score_0_to_5_blank_unknown'].strip()
if not score:
unknown.append(r['criterion_id']);continue
v=float(score)
if v<0 or v>5: raise ValueError(f"Invalid score for {r['criterion_id']}: {v}")
if not r['evidence_ids'].strip(): raise ValueError(f"Evidence IDs required for scored row {r['criterion_id']}")
w=float(r['weight']);covered+=w;weighted+=w*v/5
print(f'Coverage: {covered:.0f}/100 weighted points')
print('Observed score (covered criteria only): '+(f'{100*weighted/covered:.1f}/100' if covered else 'UNKNOWN'))
print('Unknown criteria: '+(', '.join(unknown) if unknown else 'none'))
print('WARNING: scores are heuristics, not probabilities or validated market demand.')