Sinusitis Therapy
A clinical decision service for acute sinusitis: it selects an antibiotic, computes the dose with renal adjustment, flags drug interactions, and explains its reasoning in plain English — all from decision tables you can read.
SinusitisTherapy is a demonstration of the DTRules engine, built for the Decision Management Community's "Agentic Medical Services" challenge. It is not medical advice and is not a certified clinical tool.
Three loosely coupled services
Each service is an independent decision table an agent can call on its own. A thin
orchestrator (Determine_Therapy) runs them in dependency order.
Medication & dosing
Determine_Medication_And_Dosing
Picks the drug of choice and the dose, frequency, and duration — accounting for penicillin allergy, age, and renal impairment.
Creatinine clearance
Determine_Creatinine_Clearance
Computes CCr with the Cockcroft–Gault formula from age, lean body weight, and serum creatinine.
Drug interactions
Check_Drug_Interactions
Flags conflicts between the recommended drug and the patient's active medications, appending a plain-English warning for each.
Determine_Therapy
CCr first, because dosing depends on it; medication before the interaction check, because interactions depend on the chosen drug.
A worked example
The challenge's reference request, run end to end.
The request
"I have a patient diagnosed with Acute Sinusitis. He is 58 years old, weighs 78 kg, and has a creatinine level of 1.85. Keep in mind that he is Penicillin-allergic and takes Coumadin."
The determination
Penicillin allergy overrides the age-based choice (beta-lactam cross-reactivity).
((140 − 58) × 78) / (1.85 × 72)
Renal adjustment — creatinine 1.85 > 1.4 and CCr < 50 overrides the age-based dose.
Levofloxacin may potentiate the anticoagulant effect of warfarin/Coumadin — monitor coagulation.
Runs as a live web interview
The hosted demo is a single self-contained Go binary
(cmd/sinusitis-web) that
//go:embeds the compiled rules — no files on disk at
runtime. It asks only for the patient details the rules actually reach, then computes the
therapy. See the interactive interview
for how that works.
Why it's the showcase
Multi-file authoring
One file per service, each owning a non-overlapping table-number range — a worked example of how DTRules projects scale.
Real math
Cockcroft–Gault creatinine clearance, computed in EL and verified by an integration test.
Knowledge as data
The drug-interaction table is driven by a CSV knowledge base, kept separate from the rules that consult it.
Plain-English rationale
Every recommendation explains itself, so a clinician — or an LLM agent — can audit the reasoning.
Agent-friendly
Loosely coupled services can be called individually, exactly as an LLM orchestrator would.
Embeddable
The whole rule set ships inside one static binary via //go:embed — nothing to
deploy alongside it.