Skip to content

fix(forecast): ACLED conflict signal not produced in prod + health blindspot — conflict EMA blind to near-real-time (P1, #5097) #5099

Description

@koala73

Part of #5097. P1. Verified against code + prod 2026-07-09.

The forecast generator's ACLED (near-real-time conflict events) input is absent in production, and the outage is invisible to health monitoring.

Evidence

  • Generator reads conflict:acled:v1:all:0:0 unguarded (seed-forecasts.mjs:758,844); on miss it silently sets acledEvents = [] (:845).
  • Prod: EXISTS conflict:acled:v1:all:0:0 = 0, and seed-meta:conflict:acled-intel is absentseed-conflict-intel.mjs (which should write it, TTL 900s, :23/:283) is not producing output. (Fresh time-windowed ACLED keys conflict:acled:v1:all:<ts>:<ts> exist with ~90s TTL from the live API path, so ACLED reaches the product but not the forecaster's cache.)
  • acledEvents feeds computeEmaWindows(priorWindows, acledEvents, ucdpEvents) (:15482) — the conflict escalation EMA, a core driver of the flagship conflict domain.
  • api/health.js does not monitor acled/conflict-intel → nothing flagged it.

Consequence

Conflict-escalation is computed with zero near-real-time ACLED, leaning only on UCDP — the ~months-lagged academic feed. The whole conflict-forecast domain has been running partially blind, silently.

Fix

  1. Get seed-conflict-intel running/producing in prod (Railway; likely crashed/de-scheduled — see the diagnose-railway-seeders skill).
  2. Add health coverage for conflict:acled:v1:all:0:0 (+ seed-meta:conflict:acled-intel) so this can't recur silently.

Related: #5097, #4930, #5072.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: AI/intelAI analysis, intelligence findings, summarizationbugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions