Following the 2026-05-20 isotonic recalibration, the next priority was making the Sentinel + classifier models auditable. Trust in a ML model isn't just calibration — it's the ability for a journalist or researcher to ask “why does the model say 67% for Iran?” and get an answer.
On 2026-05-21 we shipped six new transparency surfaces in a single session. The full set:
GET /v1/forecast/{cc}/7day — now returns
top_features (top-3 SHAP contributions) plus
interval_90 (90% conformal interval). Iran today:
block_rate_roll30_mean +0.183 ↑,
incident_count_7d +0.091 ↑,
month -0.082 ↓, interval [0.82, 0.92]. US today:
month -0.048 ↓, recent_shutdown +0.022 ↑,
interval [0.04, 0.14]. <20ms warm via permutation explainer
on the unwrapped XGBoost.
GET /v1/classifier/info — v3 GradientBoosting
bundle metadata: version, training date, full feature list,
LOCO eval breakdown (median F1 0.857, per-country IR AUC 0.953).
GET /v1/classifier/feature-importance — sorted
importance + share + a top3_share metric. v3 distribution:
rate_count_interaction 40.6%, measurement_count 21.6%,
rate_spike_interaction 11.2%. No single feature dominates —
contrast with v2's pathological 85% on the leaky
country_risk_tier.
GET /v1/sentinel/movers?days=N — biggest forecast
deltas vs N days ago. Joins today's sentinel_forecasts
snapshot against the closest snapshot N days back. Returns
movers_up + movers_down arrays with prior_risk + today_risk + delta.
Query params: days, direction, limit, min_abs.
A calibrated forecast is necessary but not sufficient. Without SHAP, a journalist asks “why is Ethiopia 88%?” and the best we could answer was “the model said so.” With SHAP, the answer is “30-day rolling block rate is unusually high (+0.18 contribution) and the 7-day incident count is up (+0.09).” That's the difference between black-box intelligence and citable intelligence.
The v3 classifier is on disk but not yet swapped into production prediction paths — that requires feature-vector alignment work which is out of scope for this session. The endpoints deliberately read v3 directly from disk so v3's honest numbers are public before the risky production swap.
Backend patches are in scripts/patch-forecast-shap.py,
scripts/patch-classifier-info-endpoints.py,
scripts/patch-classifier-metrics-schema.py,
scripts/patch-forecast-movers-endpoint.py. Each is
idempotent and writes a backup before modifying production code.
Worker proxy routes added in the API Worker’s router.