What this is

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.

Why a cohort shift matters

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.

The hard part: stable cohort identity

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.

What the first run found

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.

Read this honestly

Every caveat ships inline in the API response. The most important ones:

How to use it

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.