Shutdown Duration Forecast
If a shutdown happens, how long will it last? Random Survival Forest trained on 343 confirmed censorship incidents from Voidly Atlas. Reports median + interquartile range conditional on a critical / censorship scenario. Russia's Twitter block has lasted years; Sri Lanka's social-media block lasted days. Same probability, very different consequences — and this is the dimension that lets you tell them apart.
Spotlight scenario — "critical / censorship"
| Country | Median | P25 | P75 | IQR | Survival curve (S(t)) |
|---|---|---|---|---|---|
Iran IR | 5.0d | 3.0d | 5.0d | 2.0d | |
China CN | 5.0d | 5.0d | 16.1 wk | 108.0d | |
Russia RU | 5.0d | 3.0d | 5.0d | 2.0d | |
Egypt EG | 5.0d | 4.0d | 5.0d | 1.0d | |
Venezuela VE | 5.0d | 5.0d | 10.0d | 5.0d | |
Belarus BY | 5.0d | 3.0d | 5.0d | 2.0d | |
Cuba CU | 5.0d | 5.0d | 10.0d | 5.0d | |
Myanmar MM | 5.0d | 4.0d | 5.0d | 1.0d | |
Turkmenistan TM | 5.0d | 5.0d | 16.1 wk | 108.0d | |
Pakistan PK | 5.0d | 4.0d | 5.0d | 1.0d |
Sparklines on the right show S(t) at the 5 quantile cuts of the predicted distribution (P10 / P25 / P50 / P75 / P90). Taller and wider = more probability mass at longer durations.
Iran
median 5.0dIQR 3.0d → 5.0d · scenario: critical censorship
| S(t) | Hours | ≈ |
|---|---|---|
| 0.90 | 48 | 2.0d |
| 0.75 | 72 | 3.0d |
| 0.50 | 120 | 5.0d |
| 0.25 | 120 | 5.0d |
| 0.10 | 5952 | 35.4 wk |
China
median 5.0dIQR 5.0d → 16.1 wk · scenario: critical censorship
| S(t) | Hours | ≈ |
|---|---|---|
| 0.90 | 48 | 2.0d |
| 0.75 | 120 | 5.0d |
| 0.50 | 120 | 5.0d |
| 0.25 | 2712 | 16.1 wk |
| 0.10 | 6216 | 37.0 wk |
Russia
median 5.0dIQR 3.0d → 5.0d · scenario: critical censorship
| S(t) | Hours | ≈ |
|---|---|---|
| 0.90 | 48 | 2.0d |
| 0.75 | 72 | 3.0d |
| 0.50 | 120 | 5.0d |
| 0.25 | 120 | 5.0d |
| 0.10 | 8832 | 1.0 yr |
Egypt
median 5.0dIQR 4.0d → 5.0d · scenario: critical censorship
| S(t) | Hours | ≈ |
|---|---|---|
| 0.90 | 48 | 2.0d |
| 0.75 | 96 | 4.0d |
| 0.50 | 120 | 5.0d |
| 0.25 | 120 | 5.0d |
| 0.10 | 6312 | 37.6 wk |
Permutation feature importance (test set)
| Feature | Δ c-index when shuffled |
|---|---|
| first_seen_year | 0.0232 |
| prior_shutdowns_count_24mo | 0.0228 |
| first_seen_month | 0.0099 |
| severity_critical | 0.0055 |
| continent_Europe | 0.0031 |
| severity_warning | 0.0021 |
| continent_Africa | 0.0010 |
| type_mixed | 0.0009 |
Methodology
Random Survival Forest (RSF) is the survival-analysis equivalent of a random-forest classifier. Each tree splits the data to maximize the log-rank statistic between child nodes (instead of the Gini impurity a classification forest would use), and the ensemble averages cumulative hazard functions. Output is a full survival curve S(t) per row — we report the median (S(t)=0.5) and the P25 / P75 quantiles as a conditional-on-shutdown interval.
Censored observations are incidents that haven't ended yet (status = active) or that we only observed at a single point in time. For these we know only a lower bound on the true duration. Survival models specifically handle this — a censored row at 5 days tells the model "the true duration is at least 5 days," not "the duration is exactly 5 days." Treating censoring as the true endpoint would systematically under-estimate long shutdowns.
Concordance index (c-index) is the survival analogue of ROC AUC. For every pair of comparable rows it asks: did the model rank them in the correct order? Random guessing is 0.5; perfect ranking is 1.0. Our test-set c-index is 0.545.
Training set: 343 incidents from voidly_data.db with incident_type ∈ {censorship, mixed}. IODA disruption rows are excluded — see the 2026-05-21 forecast labelling fix in CLAUDE.md. Censoring rate 78% — most rows are still open (status = active) and contribute a right-censored signal to the trees.
Honest caveats:
- Single-point observations get a 24h floor before censoring kicks in. If we only ever observed an incident on one day we encode the partial information "at least 24h" rather than 0h.
- We treat status="active" as right-censored even when the incident may have actually ended weeks ago and just hasn't been marked resolved. This biases the model toward over-estimating duration for cohorts dominated by stale active rows.
- The 78% censoring rate is high — c-index from a survival model with this much censoring is less stable than the equivalent classification AUC. Treat the IQR seriously.
- Country features collapse to risk_tier + continent — we do not have enough per-country events to learn a country-specific hazard. Two countries in the same tier + continent will get similar predicted durations unless they diverge on severity, type, or prior-shutdown count.
API
Body fields: country (ISO 3166-1 alpha-2, required), severity ("critical" | "warning"), incident_type ("censorship" | "mixed"). Returns median_hours, P25/P75, IQR, the 5-point survival curve, the c-index of the model that scored it, and any honest caveats triggered by the input (e.g. unknown country).