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. 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 inscripts/_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’stitle 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)
alert > warning > watch.
Known limitations
- Newsroom phrasing, not epidemiology. A press release that uses the
word “outbreak” once will be promoted to
alerteven if the situation is minor. Conversely, a serious situation reported without any of the keywords will fall through towatch. - English-only keywords. Non-English titles will systematically under-classify until the source is translated upstream.
- No multi-word context. “False outbreak rumor” will still match
outbreakand be promoted toalert.
Change protocol
If the keyword sets inDISEASE_ALERT_KEYWORDS or DISEASE_WARNING_KEYWORDS
change:
- Bump
ALERT_LEVEL_METHODOLOGY_VERSIONin the same file. The seeder stamps this onto the published payload asalertLevelMethodologyVersion, so a bump observably propagates to clients and the canonical key. - Update the table above to match.
- Add a regression test in
tests/disease-outbreaks-seed.test.mjscovering the new keyword behavior + at least one expected non-match (substring guard). - 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.mjs→detectAlertLevel - 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)
