Inspiration
WHO projects a shortage of 11.1 million health workers by 2030, concentrated in Africa and the Eastern Mediterranean. Separately, 2.2 billion people are offline, 96% of them in low and middle income countries. Those are the same places.
A community health worker walking a village has the hardest decision in medicine, which is who needs to travel now and who can wait, and the least support in making it. Every triage tool assumes a clinic at the other end and a network to reach it.
What it does
A health worker works a caseload: add who is waiting, assess each person, mark them seen. Each assessment is typed or spoken in plain language and comes back as a WHO triage category, red, yellow or green. Not a diagnosis. The decision the worker actually has to make.
Every clinical claim opens the government source it came from. A patient's profile can raise urgency, and each rule quotes the line that justifies it. When the worker gets back in range, the caseload syncs to a base device at the clinic, where a supervisor sees what was assessed and what still needs review.
Nothing needs a network. No API, no account, no server. The model, the corpus and the index all sit on the device.
Scope is chest pain only, and that is deliberate. I reviewed 71 candidate source chunks and kept 8, mostly because the sources with the best clinical detail cannot legally be redistributed. The architecture is the claim, not the coverage.
The part that took the most work
A small model left alone will invent a citation, copy a symptom out of a source document and attribute it to the patient, tell someone to take a cardiac drug, and answer confidently about a condition it has never read a word about. All four happened here.
Each one now has a guard in app code that removes it and shows on screen what was removed and why. The model proposes, deterministic code disposes. A prompt instruction cannot hold a safety property, because the next sampling run can ignore it.
Results
A held-out set of 22 cases, frozen before the training data was written and checked for leakage, 3 runs per case.
| base | tuned | |
|---|---|---|
| correct, majority of 3 | 45.5% | 81.8% |
| yellow cases correct | 3/19 | 21/21 |
| answers citing nothing that resolves | 9/33 | 0/53 |
Yellow is the whole result. Red and green are easy; the judgment call is the middle, and the base model could barely produce one.
What I learned
Safety here was almost never about the model. Every real failure was caught by deterministic code reading the model's output, not by a better prompt.
The architecture, the fine-tune, the guard list, the measurements and the failures are all in the README and the build log.
Log in or sign up for Devpost to join the conversation.