Twelve to thirty, in one scan
We expanded the news board from twelve countries to thirty. The interesting parts weren't the eighteen new flags. They were that adding a country cost essentially nothing, that nine of the thirty still show no live pulse on a given day, and that the next twenty will be a one-line change. Here is what we did and what it means.
The news board is the high-frequency half of QGI. Each cell pairs two readings for a country-and-theme: a structuralscore, how closely that country's indicator trajectory resembles the historical run-up to a given kind of event, and a news pulse, how loud that theme is in the current news stream, measured as a z-score against the country's own baseline. When both are high the cell reads ACTIVE; when only the news is loud, SIGNAL; only the structure, LATENT; neither, QUIET. Until this week it covered twelve countries. Now it covers thirty.
The eighteen we added are an instability-first set: Ukraine, Russia, Syria, Iraq, Yemen, Israel, Afghanistan, Libya, Ethiopia, DR Congo, Somalia, Mali, Haiti, the Central African Republic, Mozambique, Zimbabwe, Turkey, and Indonesia. The board tracks where conditions are moving, not where we have an opinion; Russia and Israel are on it because they are primary conflict theaters, for the same reason Yemen and Sudan already were.
The marginal cost of a country is zero
Here is the part that changed how we think about coverage. The news pulse is built on the GDELT Global Knowledge Graph, eleven years of it, every news document since 2015 tagged with the countries and themes it touches. To bring a new country onto the board we scan that history once and tally its themes month by month.
A query against that history is billed by the bytes it reads, and it reads the same columns whether you filter to one country or forty. The country filter is applied afterthe read; it is free. So the scan that backfilled all eighteen new countries cost exactly what a scan for a single country would have: one pass, about 2.8 terabytes, somewhere between eleven and seventeen dollars depending on BigQuery's free-tier usage that month. The marginal cost of the nineteenth country, or the fiftieth, is essentially nothing.
That inverts the usual default. When each new country has a fixed price, you ration. When the price is a flat one-time scan no matter how many you add, the limit stops being the budget and becomes the question of which countries are worth a row on the board. We chose a wide net deliberately.
Why nine countries still show no live pulse
On top of the monthly board runs an hourly poller that nowcasts the same signal off the raw GDELT feed. It has a rule we consider non-negotiable: if a country produces too little news in the trailing twenty-four hours, fewer than two hundred English-language documents, its live cells go blank. Not zero. Blank, a dash. Absence of news is not calm; it is unknown, and we will not paint unknown as quiet.
On a normal day that gate blanks the live pulse for about nine of the thirty: Yemen, Libya, Somalia, Mali, the Central African Republic, Mozambique, and, already, three of the original twelve, Myanmar, Sudan, and Tunisia. These are real wars and real crises that the English-language news stream simply undercovers. The Central African Republic generated thirteen documents in the day we checked. Yemen, about a hundred. Their monthlyboard pulse is fine, there is enough signal over thirty days, but their live intraday cell honestly reports that right now, we don't have enough to say. Nothing about the expansion changed that behavior; it just added more countries that live near the floor.
A short detour worth admitting, because it is the kind of thing that bites you. Our first pass at checking whether a country had enough volume used a quick regular expression that pulled every two-letter token out of GDELT's location field. It happily counted region codes and feature codes as if they were countries, and inflated the numbers by something like thirty-fold. Yemen looked like it had thousands of documents a day. The honest per-country count is a hundred. The lesson is the boring one: the cheap measurement and the real measurement disagreed, and the real one is the one that ships.
No special-casing on the structural side
The structural score is the other half of every cell, and the new countries get it for free, but not because we hand-tuned anything. QGI's recipe fleet already scores 216 countries; a country's resemblance to the run-up of a civil war or a currency crisis is computed the same way for Ukraine as for Lebanon. So the new rows arrive on the board with both readings live from day one, structure and pulse, scored by the same machinery as the original twelve. There is no probationary tier where a new country shows news but no structure.
One file, the next twenty
The unglamorous reason this expansion took a day instead of a week is that we stopped to remove the duplication first. The country list used to be copy-pasted across eight scripts, the backfill, the rollups, the score join, the baseline, the live poller. Adding a country meant editing all eight and hoping you matched the spelling each time. Now there is one registry file. Every stage reads it; the backfill even auto-detects which countries are new and scans only those. Going from thirty to fifty is adding rows to that file and following a runbook. The marginal cost being zero only matters if the marginal effort is small too.
What this does and doesn't mean
A fuller board is not a more confident board. Every cell still says what it always said: how closely a country's structure rhymes with a historical pattern, and how loud the matching theme is in the news right now. It is resemblance and pressure, not a probability of an event. Thirty countries means we are watching thirty places that way, not that we have a forecast for thirty places. The blank cells are part of that honesty, not an exception to it.
And the choice of which thirty is a product judgment, not a measurement. We picked an instability watchlist, the places where the structure or the news is most likely to be doing something, and skipped the quiet high-income world that the board would only ever render QUIET. That is a curation call. It is the kind of call we would rather make in the open than launder through an algorithm.
Why this matters
The boring version of this post is “we added eighteen countries.” The real version is that scaling a measurement forces you to decide what you do when the measurement is thin, and the answer that protects the reader is the one that costs you coverage: show the dash, not the zero. A product optimizing for looking comprehensive fills every cell. We left nine of them blank on purpose, and wrote down why.
The thirty-country board is live now. The next twenty are a registry edit away.