Pulls weekly DHIS2 surveillance data, flags statistical aberrations with CDC's EARS and CUSUM methods, and publishes the results as a reviewable alert — over REST, signed webhooks, and FHIR.
Three stages, each independently testable and each responsible for one thing.
409.Before trusting any of them, all five ran against 200 synthetic series with a known, injected outbreak. These are the test's own printed numbers, copied in unedited — see RESULTS.md for the full methodology.
| Algorithm | Sensitivity | False alarms /100wk | Median delay |
|---|---|---|---|
| Moving-average Z | 0.650 | 1.143 | 2.0 wk |
| EARS C1 | 0.585 | 2.140 | 2.0 wk |
| EARS C2 | 0.805 | 2.155 | 2.0 wk |
| EARS C3 | 0.885 | 3.924 | 2.0 wk |
| CUSUM | 0.875 | 19.443 | 2.0 wk |
CUSUM's raw per-week false-alarm rate looks worse than it is — collapsed into episodes (consecutive alarmed weeks counted once) it's 1.705/100wk, close to EARS C3. Full breakdown in RESULTS.md.
All seven phases of the original plan, tagged and merged.
DetectedIssue outputEvery /api/v1/** and /fhir/** call needs a JWT bearer token. Full machine-readable spec at /v3/api-docs.
GET /api/v1/alerts?status=OPEN&algorithm=EARS_C3&page=0
GET /api/v1/alerts/{id}
POST /api/v1/alerts/{id}/acknowledge # ANALYST, ADMIN
POST /api/v1/alerts/{id}/resolve # ANALYST, ADMIN
POST /api/v1/alerts/{id}/dismiss # ANALYST, ADMIN -- reason required
POST /api/v1/sync # ADMIN
POST /api/v1/detection/run # ADMIN
GET /fhir/DetectedIssue/{id} # application/fhir+json
GET /fhir/metadata # public CapabilityStatement
GET /actuator/health # public