Unreleased
Changed / Added / Changed / Security / Fixed
- Fire detections summary key for the risk-scores and temporal-anomaly rebuilds (#9509): seed-fire-detections now also publishes wildfire:fires-summary:v1 (per Tier-1-country fire intensity rows, the pre-cap detection total and the FIRMS observation clock, with seed-meta:wildfire:fires-summary) beside the 2-5 MB canonical wildfire:fires:v1. The CII build and the temporal-anomalies rebuild read the summary (154 KB for 5,716 detections on 2026-10-21) instead of the canonical key, whose GET measured 1.3-2.1 s from a laptop against the 1.5 s Redis deadline; a timed-out read rejected the whole risk-scores build and failed the temporal content clock closed. The CII fire boost formula is unchanged; it now counts every detection of the fetch instead of the first 10,000 rows of the capped canonical array. While the summary is absent the readers recompute it from the canonical key. The wildfiresSummary health probe is softened until the seeder's first publish writes seed-activated:wildfire:fires-summary.
- IOM DTM regions in MCP (#9014): get_displacement_data takes view: "regions" and returns the latest survey round of each IOM Displacement Tracking Matrix operation in dtmRegions, with IDPs by cause, first-level region and region-to-region route, and IOM DTM attribution. It reads only the DTM snapshot and is stale after 48 hours or when the newest round is over 90 days old, matching /api/health. No new tool (#9357).
- Internal displacement surges in cross-source signals (#9014): IDMC Internal Displacement Updates now emit CROSS_SOURCE_SIGNAL_TYPE_DISPLACEMENT_SURGE for up to five countries whose last 30 days reach 5,000 people and three times their monthly average of the previous five months. detectedAt is the latest displacement date, because IDMC publishes a median of three weeks late. The CII formula is unchanged.
- CII formula v14: hosting-location cyber data and a country's own military activity no longer score, worldwide (2026-10-21). The cyber boost (up to 12) is removed: every cyber feed it read (AbuseIPDB, Feodo Tracker, URLhaus, C2Intel, OTX) places the abusive IP, C2 server or malware URL where it is hosted, not the country under attack, so it scored datacenter countries (Oct 20: US 129 rows, China 172, UK 40, against Ukraine 2 and none for Israel, Saudi Arabia or Yemen), and AbuseIPDB's 500 CRITICAL rows vanished whenever its blacklist call failed (cause not logged; the daily request cap is one possibility), moving the UK, France, Germany and the US by up to 12 points overnight. Security now counts only foreign military flights and vessels located in the country, at the v13 weight; own flights followed the operator anywhere in the world, so routine RAF and French training sorties kept the UK, France, Germany and the US at Security 95-100. The cyber seeder also keeps its last good 24h AbuseIPDB list when the blacklist call fails instead of publishing none, so the cyber panel and map stop flapping. riskScores health coverage now needs the conflict and news families (minRecordCount 2). On Oct 21 live inputs: UK 33 -> 20, France 43 -> 28, Germany 34 -> 20, US 33 -> 21; Saudi Arabia, Yemen, Israel and Syria unchanged; Ukraine, Russia and Iran lose only their hosting-location cyber points and at most two own-military points. combinedScore values fall for countries that hosted flagged infrastructure or flew their own aircraft; the risk-score cache key family moves to risk:scores:sebuf:v14 and emitted methodology_version is now v14.
- Cross-border movements and CII formula v13: add separately dated UK daily arrivals and CBP monthly encounters beside UNHCR ODP reports, with source health, country/route API filters, an opt-in MCP movement view, and distinct death markers. Fresh source-confirmed arrival surges add five CII points once per explicitly named country. Stock, encounters, deaths, and stale reports do not trigger this boost. combinedScore can rise by five points. The risk-score cache key family moves to risk:scores:sebuf:v13 and emitted methodology_version moves to v13. Additional route sources remain blocked by permission or access, so global coverage acceptance is incomplete.
- CII formula v12: a country under attack keeps rising, and recovers once the strikes stop, worldwide (2026-10-19). v11 counted strikes only through a 72h term inside Conflict, which carries 18% of the composite, so Saudi Arabia scored 54 on Oct 19 under repeated missile and drone strikes. Each country now carries a daily strike intensity: the larger of confirmed strikes from the Middle East strike feed (critical 4, high 2, elevated 1, moderate 0.5; the relay keeps a 30-day per-country tally in conflict:strike-pressure:v1) and, worldwide while ACLED is dark, GDELT coverage of air, drone, missile and artillery strikes aimed at the country as a share of its coverage (a fourth counter in gdelt:bulk:country-events:v1; days stored before it are rebuilt from the archive). Strike pressure decays that with a three-day half-life and enters the composite as a floor (40 at pressure 5, rising 8 per doubling, to 70) and a boost of up to 10. The 72h strikeBoost leaves Conflict. Replayed on Oct 19: Saudi Arabia 53 -> 63, Yemen 85 -> 89, Iran 71 -> 73, Russia 76 -> 79, Ukraine 70 -> 71, Israel 56 -> 57; calm countries are unchanged on every replayed date, and a country returns to its v11 level 10-14 days after its last strike. combinedScore values move up for struck countries and down slightly where only the old 72h term had counted; the risk-score cache key family moved to risk:scores:sebuf:v12 and emitted methodology_version is now v12, so clients should re-baseline.
- CII formula v11: a sustained crisis scores, and geo events follow real borders, worldwide (2026-10-19). v10 scored GDELT conflict and protest coverage only against each country's own 28-day median, so a month-long campaign raised its own norm and read as calm (Saudi Arabia's Conflict term was 0 on Oct 19). Each GDELT term is now the larger of that escalation and a sustained level, the conflict- or protest-coded share of the country's articles over the last seven complete days, which is 0 at the noise floor every country carries (14% conflict, 2% protest) and needs at least 200 articles. The shared GDELT cap rises from 50 to 70. Replayed to Oct 19: Yemen Conflict 68, Saudi Arabia 41, Israel 25; the US, GB and China stay at 0. Separately, fires, GPS jamming, earthquakes, climate anomalies, strikes and military flights and vessels are now placed by point-in-polygon against Natural Earth 1:50m borders instead of overlapping bounding boxes, which had put Jizan in Yemen, Bahrain in Saudi Arabia, Kuwait City in Iraq and Baltic GPS jamming in Russia and had dropped Hawaii and Alaska. Strike events carry their countryCode. combinedScore values move both ways; the risk-score cache key family moved to risk:scores:sebuf:v11 and emitted methodology_version is now v11, so clients should re-baseline.
- CII formula v10: GDELT escalation stands in for ACLED in Conflict and Unrest (2026-10-19). Without ACLED access the ACLED event terms were 0 for every country, so the October 2026 Riyadh strikes and France's nationwide riots never reached the index. While the ACLED API returns no events, Conflict and Unrest each add a term of up to 50 points scored from GDELT material-conflict and protest coverage against each country's own 28-day median, so heavily covered countries such as the US and GB do not score on ordinary news days. New standalone health dataset gdeltCountryEvents (gdelt:bulk:country-events:v1). combinedScore values rise for countries in an escalation; the risk-score cache key family moved to risk:scores:sebuf:v10 and emitted methodology_version is now v10, so clients should re-baseline.