Voidly Atlas already clusters the 50 highest-signal countries into
DTW cohorts — groups of countries whose daily
censorship-signal shapes look alike under Dynamic Time
Warping (scripts/build-shutdown-cohorts-dtw.py). DTW is
the right distance here because it tolerates time-shifted phases:
country A can block an app three days before country B and still
land in the same cohort. The three recurring archetypes are
C1 (stable democracies),
C2 (bursty), and
C3 (persistent authoritarian).
But that clustering was a snapshot. It told you where a
country sat today, never whether it had moved. The cohort
migration tracker
(scripts/build-cohort-migration-tracker.py) closes that
gap: it recomputes the cohorts on a rolling 90-day window every
month, compares the new assignment to last month's, and emits
the list of countries that crossed cohorts — with a
direction-of-travel label and a fit confidence.
A country sliding from C1 → C3 — from a democracy-shaped signal pattern to an authoritarian-shaped one — is one of the cleanest leading indicators of a censorship regime change we can compute. It is not proof of anything on its own, but it is exactly the kind of structural shift a journalist or a human-rights researcher wants flagged early. The reverse move (C3 → C1) is just as newsworthy: it can mark a shutdown resolving or a country exiting a crisis posture.
Re-running clustering from scratch reassigns arbitrary cluster IDs
— “cluster 1” last month is not
“cluster 1” this month. Comparing raw IDs across runs
is meaningless. The tracker fixes this by giving each cluster a
stable semantic label derived from its
composition: anchor-set overlap (CN/RU/IR/MM… pull a cluster
toward C3_authoritarian; US/GB/DE/FR/CA… pull it
toward C1_democracy) plus centroid burstiness (the
fraction of days more than 1.5σ above the cluster mean). That
makes “C3 authoritarian” a stable noun across runs even
when the underlying member list shifts month to month.
The first snapshot pair compares the 90-day window ending today against the 90-day window ending 30 days ago — both computed from real evidence. Six countries changed cohort.
Four moved in the deteriorating direction (C1 → C3): Nigeria (confidence 0.53), Zimbabwe (0.51), Mexico (0.50), and Slovenia (0.46). Two moved the other way, improving (C3 → C1): Iraq (confidence 0.68) and Venezuela (0.66). The improving moves carry higher confidence here, which is itself a signal worth reading honestly: the four deteriorating countries land near the decision boundary between cohorts rather than deep inside C3.
Every caveat ships inline in the API response. The most important ones:
GET /v1/atlas/cohort-migration returns the recent
cohort changes; filter with ?direction=deteriorating or
?min_confidence=0.5.
GET /v1/atlas/cohort-migration/{cc} returns one
country's cohort history, one entry per monthly snapshot, so you
can see the trajectory. GET /v1/atlas/cohort-migration/info
documents the cohort labels, the severity ranking, and the
methodology. The tracker rebuilds monthly on the 1st at 06:00 UTC;
the history retains up to 24 snapshots.