On 2026-05-20, a deep audit of Voidly Atlas surfaced a problem with the Sentinel shutdown forecast that had been hiding in plain sight for at least 30 days: the model was severely miscalibrated — by roughly 15× — in the prediction range where 99% of forecasts actually live.
Voidly's own /v1/sentinel/accuracy endpoint already
published the prod_rolling block showing this. Sorted by predicted
probability bucket:
The base XGBoost ranks correctly (higher prediction ⇒ higher observed) but says “5% risk” when the actual rate is 60-80%. Brier 0.59, calibration MAE 0.60. The shipped forecasts looked falsely confident in safety.
The cleanest correction for this kind of systematic
underestimation is isotonic regression: fit a
monotonic map from predicted probability to observed probability,
then apply it after the base model. We refit on 810 live (forecast,
outcome) pairs spanning the last ~30 days from the
sentinel_outcomes table — every prediction that's had
time to settle against a real outcome.
Implementation took ~30 lines of Python (sklearn
IsotonicRegression + a lookup table) plus four small
edits to forecast_api.py: load the calibrator at
startup, apply CALIBRATOR.predict([raw_prob]) after
MODEL.predict_proba(), gate by the 30-country watched
set (so US/JP/DE/GB don't get extrapolated). Restart the service.
sentinel_outcomes. Cron job coming.
risk_tier as a feature
— a partial leakage we know about. A v2 retrain without
risk_tier is queued; this refit is the cheap-and-effective patch
while the deeper retrain bakes.
Code is at scripts/refit-isotonic-calibration.py in
the public repo. Inputs: sentinel_outcomes table.
Output: forecast_calibrator_v2_isotonic_prod.pkl. The
full refit metrics (before/after Brier, MAE, per-bin breakdown)
are at ml-deploy/forecast_calibration_refit.json on
the Vultr ML server.