voidly

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.

c-index 0.545·n = 343·censoring 78%·promoted no·Raw JSON

Spotlight scenario — "critical / censorship"

CountryMedianP25P75IQRSurvival curve (S(t))
Iran
IR
5.0d3.0d5.0d2.0d
China
CN
5.0d5.0d16.1 wk108.0d
Russia
RU
5.0d3.0d5.0d2.0d
Egypt
EG
5.0d4.0d5.0d1.0d
Venezuela
VE
5.0d5.0d10.0d5.0d
Belarus
BY
5.0d3.0d5.0d2.0d
Cuba
CU
5.0d5.0d10.0d5.0d
Myanmar
MM
5.0d4.0d5.0d1.0d
Turkmenistan
TM
5.0d5.0d16.1 wk108.0d
Pakistan
PK
5.0d4.0d5.0d1.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.0d

IQR 3.0d5.0d · scenario: critical censorship

S(t)Hours
0.90482.0d
0.75723.0d
0.501205.0d
0.251205.0d
0.10595235.4 wk

China

median 5.0d

IQR 5.0d16.1 wk · scenario: critical censorship

S(t)Hours
0.90482.0d
0.751205.0d
0.501205.0d
0.25271216.1 wk
0.10621637.0 wk

Russia

median 5.0d

IQR 3.0d5.0d · scenario: critical censorship

S(t)Hours
0.90482.0d
0.75723.0d
0.501205.0d
0.251205.0d
0.1088321.0 yr

Egypt

median 5.0d

IQR 4.0d5.0d · scenario: critical censorship

S(t)Hours
0.90482.0d
0.75964.0d
0.501205.0d
0.251205.0d
0.10631237.6 wk

Permutation feature importance (test set)

FeatureΔ c-index when shuffled
first_seen_year0.0232
prior_shutdowns_count_24mo0.0228
first_seen_month0.0099
severity_critical0.0055
continent_Europe0.0031
severity_warning0.0021
continent_Africa0.0010
type_mixed0.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

# Predict shutdown duration for Iran, critical / censorship scenario
curl -X POST https://api.voidly.ai/v1/forecast/duration \
-H 'Content-Type: application/json' \
-d '{"country":"IR","severity":"critical","incident_type":"censorship"}'
# Metadata + per-country test-set residuals
curl https://api.voidly.ai/v1/forecast/duration/info

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).