-
feat(02-03): implement per-class ECE/Brier + eval_metrics builder
- per_class_ece (D-CAL-04, D-CAL-07: 10 equal-width bins; sklearn calibration_curve uniform strategy)
- per_class_brier + per_class_brier_baseline with UNIFORM_PRIOR_PROB = 1/10 (D-CAL-04, D-CAL-05)
- per_class_classification_report returns Python float/int at the JSON boundary (Pitfall 8)
- per_mode_macro_f1 subsets eval rows by ACTUAL network_mode column (D-MASK-04, OQ-4 resolution)
- build_eval_metrics composes the eval_metrics.json schema (Pattern 11) with explicit
np->Python float casts so json.dumps never raises TypeError
- 12 tests passing; mypy clean; ruff clean