Skip to main content

Start here

The “Disease Outbreaks” panel tags each item ALERT, WARNING, or WATCH. Here is the honest version of what that tag is: It reads the headline. If the title or summary contains words like outbreak, emergency, epidemic, or pandemic, the item is tagged ALERT. Words like warning or spread make it WARNING. Everything else is WATCH. That is the whole mechanism. There is no model, no case-count threshold, and no epidemiological assessment behind it.
Treat this as a reading-order hint, not a health judgement. Because it matches words rather than meaning:
  • A minor press release that happens to say “outbreak” once is promoted to ALERT.
  • A genuinely serious situation described without those words falls to WATCH.
  • “False outbreak rumor” matches outbreak and is promoted to ALERT.
  • Non-English headlines systematically under-classify.
For a clinical assessment, go to the underlying WHO, CDC, or ProMED source — every item links to it.
The value of the tag is that it is reproducible and inspectable: you can read the item title and know exactly why it got the label it did. The rest of this page documents the keyword sets so that stays true.

Editorial weights

Levels are assigned by a keyword classifier in scripts/_disease-outbreaks-helpers.mjs::detectAlertLevel that matches whole-word tokens (case-insensitive) in the concatenated item title and description. The keyword set is editorial — it is not derived from a published classification index (ECDC, WHO EWARN, ProMED). Treat the level as an opinionated newsroom triage signal, not a clinical assessment.

Inputs

The classifier sees the item’s title and desc fields after they are normalized by the per-source parser:
  • WHO Disease Outbreak News (whoNormalizeItem)
  • CDC HAN and Outbreak News Today RSS (rssNormalizeItem)
  • ThinkGlobalHealth disease tracker, backed by ProMED-sourced real-time alerts (tghNormalizeItem)
There are no numeric scoring weights. The label is purely categorical and the order shown in the panel is alert > warning > watch.

Known limitations

  1. Newsroom phrasing, not epidemiology. A press release that uses the word “outbreak” once will be promoted to alert even if the situation is minor. Conversely, a serious situation reported without any of the keywords will fall through to watch.
  2. English-only keywords. Non-English titles will systematically under-classify until the source is translated upstream.
  3. No multi-word context. “False outbreak rumor” will still match outbreak and be promoted to alert.
These limitations are accepted for now because the source feeds are predominantly English-language press releases and the panel is positioned as a “what to look at next” surface rather than a risk score.

Change protocol

If the keyword sets in DISEASE_ALERT_KEYWORDS or DISEASE_WARNING_KEYWORDS change:
  1. Bump ALERT_LEVEL_METHODOLOGY_VERSION in the same file. The seeder stamps this onto the published payload as alertLevelMethodologyVersion, so a bump observably propagates to clients and the canonical key.
  2. Update the table above to match.
  3. Add a regression test in tests/disease-outbreaks-seed.test.mjs covering the new keyword behavior + at least one expected non-match (substring guard).
  4. Note the change in the next release’s changelog so cached / pre-rendered payloads can be invalidated if necessary.

See also

  • Source: scripts/_disease-outbreaks-helpers.mjsdetectAlertLevel
  • Consumer: src/components/DiseaseOutbreaksPanel.ts
  • Tests: tests/disease-outbreaks-seed.test.mjs
  • Tracking: #3791
  • Pattern reference: CII risk scoring methodology (same disclosure pattern, larger scope)