A predictive shutdown contagion / chain model — given that country A had a confirmed censorship event today, score every other watched country by the probability that it will follow with its own event within N days.
This closes a missing piece in the Atlas measurement stack: we already had lead-lag cross-correlation (descriptive — who’s correlated with who, at what lag) and DTW cohorts (similarity by shape). What we did not have was the predictive piece: a model you can actually call on a fresh trigger event to get a ranked list of likely followers.
A pairwise XGBoost classifier on (trigger, follower, horizon) tuples. For each
confirmed-censorship event in country A at time t, we generate one row per candidate
follower country B and per horizon H ∈ {3, 7, 14} days. The label is
did_follow = 1 if B had any censorship/mixed event in (t, t+H].
Features computed strictly from data before t:
Trained on 2024-01-01 onwards (signal density explodes in 2024+; pre-2024 history is too sparse). Temporal holdout: last 45 days of trigger events. 17,622 train rows / 9,306 test rows, 12% / 25% positive rates.
| Horizon | AUC | Avg precision | Brier | n_test | Pos rate |
|---|---|---|---|---|---|
| 3d | 0.6457 | 0.350 | 0.141 | 3,102 | 16.8% |
| 7d (primary) | 0.6697 | 0.493 | 0.186 | 3,102 | 25.4% |
| 14d | 0.6920 | 0.597 | 0.227 | 3,102 | 33.5% |
| Overall (stacked) | 0.6984 | 0.513 | 0.185 | 9,306 | 25.2% |
Promote gate: primary AUC ≥ 0.65 AND at least 10 trigger-follower pairs with predicted P > 0.30. Passed: AUC 0.67 at 7d, 92 significant pairs.
Highest-scoring (trigger → follower) pairs at 7-day horizon on the test set, with the actual hold-out follow rate to ground-truth the score:
| Trigger | Follower | P(follow within 7d) | Actual follow rate |
|---|---|---|---|
| OM | JO | 0.990 | 1.00 (2/2) |
| OM | PK | 0.944 | 1.00 (2/2) |
| MA | JO | 0.936 | 0.67 (2/3) |
| OM | AZ | 0.926 | 1.00 (2/2) |
| MA | UZ | 0.922 | 0.67 (2/3) |
| NI | AZ | 0.921 | 1.00 (2/2) |
| OM | UZ | 0.911 | 1.00 (2/2) |
| EG | AZ | 0.890 | 0.80 (4/5) |
GET /v1/atlas/contagion-chain/{trigger}?horizon=7
— pulls the last 365 days of events from the Voidly DB, builds features as if the trigger fired today,
returns ranked candidate followers.
GET /v1/atlas/contagion-chain?trigger=RU&horizon=7
GET /v1/atlas/contagion-chain/info
| Endpoint | What it answers | Type |
|---|---|---|
/v1/atlas/lead-lag |
Who’s correlated with whom, at what lag? | Descriptive |
/v1/atlas/cohorts |
Which countries have the most similar incident shape over time? | Descriptive (DTW) |
/v1/sentinel/hte |
What’s the average treatment effect of an election on shutdown risk? | Causal (causal forest) |
/v1/atlas/contagion-chain |
Given a trigger event today, which countries are most likely to follow within N days? | Predictive |
/v1/sentinel/attribute |
Did THIS specific outage on country X at date Y reflect a real anomaly vs comparable democracies? | Counterfactual (SDID) |