EXPLODING BACTERIAMed Decision Speed Tools

Roadmap

Two lists in one. The curated checklist (milestones, ideas) — tell me to add or mark things and it updates. And a live content status derived straight from the site: anything verified: false or missing data flags itself automatically, and clears the moment you fix it.

11%
9 of 84 MVP tasks done · 61 need your red-pen
69
Live content items
50 flagged — needs attention

🚀 MVP launch checklist

Must land before exploding-bacteria.com goes paid.

Clinical verification (red-pen)

The bottleneck this migration cannot speed up. Everything below renders now but is flagged verified:false until you sign off.

To do
Drug reference data for all 43 drugsClinicalNeeds you

Class / formulations / brand names are a factual rough draft. Eyeball the judgment calls: omadacycline→Tetracyclines, ethinyl-estradiol→OC component, pip-tazo & amp-sulbactam→"Penicillin".

To do
Sexual-assault PEP protocolClinicalNeeds you

Whole bundle is verified:false — doses, branch logic, the 8 give-all categories.

To do
CAP / Otitis dosing + notesClinicalNeeds you

Confirm the migrated values match the legacy Webflow source exactly.

To do
Metronidazole subtitle editClinical

Changed to "For pregnant and non-pregnant patients" — confirm that read.

To do
PO calc dosing data — MDT, formulations, configsClinicalNeeds you

Every poDosing number + drug mdt/po drives real doses and needs red-pen. Specifically flagged as GUESSES: cefpodoxime & cefprozil MDT (10% cephalosporin default — NOT in the AAP paper); amoxicillin-clavulanate po = the amox-component mg/mL (120 ES-600 / 80 / 40) — confirm these are the intended concentrations.

To do
IV dosing configs — red-pen (no source paper)ClinicalNeeds you

55 IV configs parsed from the Webflow CSV (rf / dose / range / max / freq). Builder built these by hand — no science paper backing them (unlike the PO MDT paper). All need verification.

To do
Diabetic Foot Infection — full page red-penClinicalNeeds you

New page ported from legacy diabetic-foot.js. Every dose/structure ported verbatim; 3 scenarios (IV withOUT-pseudo, IV WITH-pseudo, PO ladder of 6 coverage tiers). verified:false. Confirm values against the legacy source.

To do
DFI pseudomonas risk-factor text (Claude-authored)ClinicalNeeds you

The legacy risk-marker had no body in the page file (text lived in shared engine data). I authored a standard IDSA-style DFI list — water exposure/soaking, warm climate, severe/chronic wet wound, prior Pseudomonas, prior therapy failure. Verify the criteria + wording.

To do
DFI: Anti-MRSA marked REQUIRED in both IV regimensClinicalNeeds you

Ported faithfully from legacy data-required — both IV scenarios force an anti-MRSA pick (backbone + anti-MRSA). Confirm this is intended vs. an optional "consider" add-on like CAP.

To do
DFI: 4 new drug records need identity red-penClinicalNeeds you

cephalexin, dicloxacillin, tmp-smx, daptomycin created for the DFI port (class / brands / forms). Standard identity data, verified:false — eyeball before publish.

To do
CIWA-Ar — verify anchors, thresholds, attributionClinicalNeeds you

New scores tool (reassessment/trending test case), verified:false. (1) The 10-item 0–7 descriptor anchors are the standard CIWA-Ar (Sullivan 1989) — reproduced because altering a scoring instrument's anchors invalidates it (same call as the PSI criteria); it's a journal instrument, so confirm you're comfortable reproducing the scale verbatim. (2) Treatment thresholds I set: ≤9 minimal / 10–19 moderate (symptom-triggered benzos) / ≥20 severe — these VARY by protocol (some use 8 and 15); confirm against your order set. (3) Max score 67 (9×7 + orientation 0–4). Learn-tab citations are placeholders.

To do
PSI score — full red-pen: point weights, mortality bands + Class I / sex-adjust logicClinicalNeeds you

FULL-TOOL red-pen before publish: every one of the ~20 predictor point weights (age, sex, nursing-home, the 5 comorbidities, the 5 exam findings, the 6 labs) AND the 5 class bands (I–V) with their mortality ranges + dispositions. THEN the logic (both fixes are IN, you approved): female = age−10 (age.sexAdjust), and a real Step-1 screen → Class I when age ≤50 AND no comorbidity/exam predictor (the 10 criteria flagged screen:true; nursing-home + labs are NOT predictors). SAFETY GUARD I added beyond the textbook algorithm: Class I is only assigned when the point total is still in the lowest band (≤70), so a young patient whose labs push the total into Class III+ can never read as a reassuring "Class I · outpatient." (Note: a single low-age patient with one isolated lab still ≤70 — e.g. 40yo + pH 7.3 = 70 — remains Class I, which is textbook-faithful PSI; the teachDesc + footer already say clinical judgment overrides.) Confirm the guard, the predictor list, and whether you want that ceiling tighter. Class V (27%) still a candidate for a future dedicated `critical` colour tier. Learn-tab prose is a draft.

To do
HIV PEP algo — verify CDC source fidelityClinicalNeeds you

First shipped algo tool (/tools/hiv-pep), verified:false. Eligibility/timing logic + the definition cards (substantial vs negligible exposure) are mined from CDC nPEP guidance (public-domain, so reproduced closely — the safer choice for a legal-risk PEP tool). Confirm: the branch logic, the 72-hour window, the exposure-risk categorizations, and the hotline/attribution footer match current CDC.

To do
Hep B PEP algo — verify the status × source matrixClinicalNeeds you

Second algo tool (/tools/hep-b-pep), verified:false. Branching decision tree (vaccination status + anti-HBs response × source HBsAg → HBIG / vaccine / none) mined from CDC/ACIP. Confirm every matrix cell resolves to the right recommendation, and the boxed outcomes read correctly.

To do
CURB-65 — verify criteria + 30-day mortality bandsClinicalNeeds you

New scores tool (/tools/curb-65, embedded on CAP), verified:false. 5 criteria (C/U/R/B/65) are standard (Lim 2003, Thorax). CORRECTED: the source had inflated per-score mortality (scores 4–5 at 27.8–80.8%). Replaced with the canonical Lim 2003 grouped 3-tier — 0–1: ~1.5% (outpatient), 2: ~9.2% (short inpatient / supervised outpatient), 3–5: ~22% (inpatient, assess ICU). Confirm the grouped figures + disposition wording. Urea threshold shown as >19 mg/dL (>7 mmol/L).

To do
CAP ICU criteria (IDSA/ATS) — verify thresholdsClinicalNeeds you

New scores tool (/tools/cap-icu-criteria, embedded on CAP as "ICU Guidelines"), verified:false. FIXED: hypothermia threshold corrected from the source's ≤36.8°C (≈ normal temp) to the IDSA/ATS 2007 value, core temp <36°C. Remaining minor items to confirm: I kept PaO2/FiO2 <250 (guideline ≤250) and uremia >20 (guideline ≥20). Major criteria (mech ventilation; septic shock on pressors = automatic ICU) shown in the footer, not scored. Confirm the ≥3 minor-criteria threshold + attribution.

To do
DRIP score — verify criteria + thresholdClinicalNeeds you

New scores tool (/tools/drip, embedded on CAP), verified:false. Built from the real DRIP data (Webb 2016, AAC) after the earlier file mix-up was resolved: 4 major factors (2 pts each: recent antibiotics, SNF/LTACH/rehab, tube feeding, prior DRP) + 6 minor (1 pt each: recent hospitalization, chronic pulmonary disease, poor functional status, PPI/H2, wound care, MRSA colonization); ≥4 = high DRP risk → broad-spectrum (Pseudomonas/MRSA/ESBL). teachDesc + footer are Claude-authored (our voice, not copied) — red-pen the wording + the sens/spec figures.

To do
Alvarado score — verify MANTRELS weights + bandsClinicalNeeds you

New scores tool (/tools/alvarado), verified:false, standalone (no disease link). 8 MANTRELS criteria, max 10; RLQ tenderness + leukocytosis weighted 2, rest 1. Bands ≤4 low / 5–6 moderate (CT) / 7–8 high / 9–10 very high, per Alvarado 1986 (Ann Emerg Med). Search terms + subtitle Claude-authored (builder had none). teachDesc/teach mined into our voice. Legal/FDA: standardized instrument (facts/merger doctrine) — reproduced + attributed, informs-not-directs = fine. Note the built-in caveat: weaker in women of reproductive age.

To do
PAS (Pediatric Appendicitis Score) — verify criteria + bandsClinicalNeeds you

New scores tool (/tools/pas), verified:false, standalone. 8 criteria, max 10; cough/percussion/hopping tenderness + palpation tenderness weighted 2. Bands ≤3 low / 4–6 equivocal (US/MRI) / 7–10 high, per Samuel 2002 (J Pediatr Surg), ages 4–18. Search terms + subtitle Claude-authored. Same legal/FDA read as Alvarado.

To do
Tetanus PEP algo — verify wound/vax matrixClinicalNeeds you

New algo tool (/tools/tetanus-pep), verified:false. Clean vs dirty wound × vaccination history → 5 outcomes; the 10-yr (clean) vs 5-yr (dirty) booster thresholds are the crux, TIG never for clean wounds. Ported from CDC/ACIP-based legacy data; subtitle + search terms Claude-authored. Legacy outcome types (go/eval/stop) mapped to our SEVERITY scale (reassuring/caution/serious): no-vaccine=green, Tdap=amber, Tdap+TIG=red. Confirm the matrix + the immunocompromised TIG caveats.

To do
Rabies PEP algo — verify species/status branchesClinicalNeeds you

New algo tool (/tools/rabies-pep), verified:false. 6 questions → 10 outcomes, branching on exposure/species/animal status/severity. FOUND + FIXED: the legacy data eliminated an outcome id `pep_start` that does not exist in its own outcomes list (dangling ref, a silent no-op in the old engine) — our build guard rejected it; removed (it changed no logic, verified the rodent/livestock paths still resolve). Subtitle + search terms Claude-authored. Confirm the 10-day observation logic, the bat/unrecognized-bite framing, and the rodent "almost never" outcome.

To do
COPD "Does the Patient Need ABX?" algo — verify Anthonisen + Pseudo logicClinicalNeeds you

New CUSTOM algo tool (/tools/copd-abx), verified:false. Linear chain: ventilatory support → Anthonisen criteria → Pseudomonas risk → 4 outcomes. Tool TITLE is "COPD Exacerbation: Does the Patient Need ABX?" for standalone SEO/clarity; the COPD disease page section label should be exactly "Does the Patient Need ABX?" per builder. Reworded the source's "ABX selector ABOVE" → "the ABX selector" so the copy works in BOTH homes (standalone tool page + COPD embed). JUDGMENT CALL to confirm: legacy typed both no_abx AND po_standard as "go" → both render GREEN, so "no antibiotics" and "give standard antibiotics" share a colour. Faithful to your data, but red-pen whether po_standard should be amber.

To do
qSOFA — verify thresholdsClinicalNeeds you

New scores tool (/tools/qsofa), verified:false, standalone. 3 criteria (RR ≥22, GCS <15, SBP ≤100), 1 pt each; ≥2 = high risk. DE-ORG: clean — cites the Sepsis-3 definitions (2016), a named consensus definition rather than a society issuing a recommendation; no org named. Subtitle + search terms Claude-authored. NOTE: the high-risk band links directly to /tools/sofa (the source said "search SOFA in the search bar"); that is a HAND-MAINTAINED prose link, the one place we have one — it breaks silently if the SOFA slug changes. Confirm the deliberately-low thresholds (≥22 not ≥30; ≤100 not <90) and the "a low qSOFA does not rule out sepsis" framing.

To do
SOFA — verify the 6 organ tables; de-org rewrite appliedClinicalNeeds you

New scores tool (/tools/sofa), verified:false, standalone, reassess:true (serial scoring is the point — verified the reassessment UI + scoring). 6 systems x 0–4, max 24; 6 bands from <10% to >80% mortality. DE-ORG — REVISIT, THE RULE CHANGED UNDER THIS ONE: the source cited "Surviving Sepsis Campaign" TWICE as the authority (30 mL/kg bolus; norepinephrine first-line) and I stripped both at write time. The builder has since ruled (2026-07-15) that Surviving Sepsis is the ARCHETYPE of the new operational-mandate exception — it is wired into SEP-1 billing and hospital-wide protocol, so a clinician must comply regardless of the evidence, and we should NAME it as the mandate while flagging where we differ and showing both. So this strip is now arguably wrong in the other direction: the 30 mL/kg bolus in particular is exactly the case where our position may diverge from a mandate the user gets audited against. Decide whether to restore the naming (as mandate, not authority) + add a "where we differ" note. Vincent 1996 + Sepsis-3 kept (a study and a named definition). CONFIRM: all 6 organ tables (P/F, platelets, bilirubin, CV support, GCS, Cr/UO), the mortality percentages, and the footer's central nuance — Sepsis-3 asks for a SOFA INCREASE ≥2 from baseline, so a CKD patient sitting at their usual Cr 3.0 scores points on the absolute table but has zero change. Our tool scores the absolute value; the baseline delta is on the clinician.

To do
Ranson's — non-gallstone version only; verify criteriaClinicalNeeds you

New scores tool (/tools/ransons), verified:false, standalone. 11 criteria in two time-phased groups (5 at admission, 6 at 48h), one cumulative total, max 11; bands 0–2 mild / 3–4 severe / 5–6 critical / ≥7 near-100% mortality. FLAG: this is the NON-GALLSTONE (alcoholic/other) version — the gallstone version uses different thresholds (age >70, WBC >18k, glucose >220, LDH >400). Called out in teachDesc + footer, but a wrong-version application is a real risk; consider whether a gallstone variant is worth a second tool. Also inherent: the score needs 48h to complete, so it cannot drive admission-time disposition (BISAP can) — stated up front. DE-ORG: clean (Ranson 1974; BISAP/APACHE II/Revised Atlanta are scores and classifications, not orgs). Citation incomplete (no journal/PMID).

To do
Glasgow-Blatchford — verify thresholds + the sex-conditional Hgb scalesClinicalNeeds you

New scores tool (/tools/glasgow-blatchford), verified:false, standalone. First tool using the NEW `showWhen` conditional-criteria capability (see the Tools entry): a sex selector swaps between the male Hgb scale (0/1/3/6) and the female one (0/1/6). Verified the swap gates SCORING, not just display — male + Hgb 10–11.9 = 3, flipping to female drops it to 0 rather than double-counting. Sex itself scores 0; it only selects the scale. Bands: 0 and 1 = low (dischargeable) / 2–5 intermediate / ≥6 high. CONFIRM: the BUN bands (note the source's 22.4–28 and 28–70 ranges share boundaries — the engine picks the first match; check the intended edges), the sex-specific Hgb thresholds, and the GBS ≤1 safe-discharge claim (100% NPV). DE-ORG: clean (Blatchford 2000). Citation incomplete (no journal/PMID).

To do
Modified Centor — resolve the empiric-vs-test-then-treat POSITIONClinicalNeeds you

New scores tool (/tools/modified-centor), verified:false, standalone. Age (+1/0/−1, McIsaac) + 4 clinical criteria; range −1 to 5. First tool with NEGATIVE points — verified age ≥45 alone correctly yields −1 → "Very low risk". DE-ORG APPLIED AT WRITE TIME (not added to the sweep debt): the source teachDesc named IDSA (2012), ACP and AAFP as the source of recommendations; rewritten in our voice with the clinical substance unchanged ("the mainstream recommendation is test at ≥2, treat only if positive; empiric at ≥4 is permitted by some and remains controversial"). POSITION TO SETTLE — this is exactly a "takes positions where guidelines hedge" moment: the teachDesc argues stewardship/test-then-treat at every level, while the ≥4 band still says "consider empiric antibiotics". Those pull against each other; pick one. Related: ≥4 is coloured red (from the source's "high"), which arguably fights the stewardship message — at 4–5 GAS is still only ~50%. Citations incomplete (Centor 1981, McIsaac 1998 — no journal/PMID).

To do
NEWS2 — Scale 1 only; UK escalation language in a US productClinicalNeeds you

New scores tool (/tools/news2), verified:false, standalone, reassess:true (serial tracking is the point of the tool — verified NEWS 6→3 renders ▼3 GREEN, correct since lower NEWS = better; contrast GCS where ▼ is red). 7 parameters, max 20. FLAG 1 — SCALE 2 GAP: the source only supplies SpO₂ Scale 1, so a patient on a prescribed 88–92% target (hypercapnic respiratory failure) is OVER-scored here (SpO₂ 90 scores 3 on Scale 1, 0 on Scale 2). Caveated loudly in the label, the teach and the footer rather than scoring silently wrong — but a real gap; our engine can't offer "score Scale 1 OR Scale 2" without a zones-style change. FLAG 2 — US FIT: NEWS2 is a UK ward tool and its escalation tiers use UK language ("urgent ward-based review by a clinician with acute care competencies"); this product is US-centric, so confirm the escalation wording maps to US practice. Also dropped "mandated by NHS England" → "in national use since 2017" (de-org-adjacent; NHS is a public health service, closer to CDC than IDSA, but naming it as the mandating authority is unnecessary). No citation in source.

To do
MASCC — verify criteria; org-name grey zone; needs a citationClinicalNeeds you

New scores tool (/tools/mascc), verified:false, standalone. 7 criteria, max 26 (verified), low-risk ≥21. INVERTED like GCS — higher is better — so the bands run high=green / low=red; set higherIsBetter:true, which is semantically correct and future-proofs it (inert today because the tool isn't reassess). Default state is 9 = "High risk", i.e. it assumes the bad findings until you confirm otherwise — conservative, which suits a score where undertreating kills. DE-ORG GREY ZONE: "MASCC" IS an organisation (Multinational Association for Supportive Care in Cancer) — an actual professional association, closer to the rule's target than PECARN (a research network). But the score's authority is a primary study, and the tool is universally known by that name (cf. Glasgow/Ottawa, also institution names). My read: the NAME is the instrument's identity and is fine; we are not deferring to an MASCC guideline. Your call. NEEDS A CITATION — the source has none (believed Klastersky, J Clin Oncol 2000; VERIFY, do not ship from memory). UX to red-pen: the criteria are double negatives ("No hypotension" answered Yes/No) — faithful to the instrument's own wording, but confusing at the bedside.

To do
Ottawa ANKLE Rule — verify criteria + complete the citationClinicalNeeds you

New scores tool (/tools/ottawa-ankle-rule), verified:false, standalone. Built on the NEW `zones` engine capability (see the Tools entry) — two independent verdict cards (ankle malleolar zone / foot midfoot zone); inability to bear weight feeds BOTH. Verified the full 2x2, incl. the case the legacy digit-hack got WRONG: both foot criteria + zero ankle criteria now correctly reads "no ankle X-ray / foot X-ray indicated". FLAG: source citation is incomplete — "Stiell et al., 1992", no journal/PMID; complete + verify. Subtitle + search terms Claude-authored. Confirm the posterior-6cm emphasis, the ≥5 years applicability, and the Maisonneuve/Achilles caveats (the rule does NOT assess them).

To do
YEARS PE — built as the GENERAL algorithm; pregnancy version still openClinicalNeeds you

New algo tool (/tools/years-pe), verified:false, standalone. Built as the GENERAL (non-pregnant) YEARS per builder — the file supplied as "years-pe-pregnant.txt" actually contained the general algorithm (van der Hulle, Lancet 2017, 3,616 non-pregnant patients) with no trimester logic and no compression-ultrasound step. Retitled "YEARS Algorithm for Pulmonary Embolism" to match what it actually is, and added an explicit warning to the teachDesc + footer that this is the non-pregnant version and must NOT be applied in pregnancy. Mapped the unsupported def colour "secondary" → "dim". STILL OPEN: the pregnancy-adapted YEARS (van der Pol, NEJM 2019) is a genuinely different algorithm (leads with bilateral CUS for DVT signs to spare CTPA radiation) — a separate tool if you want it; needs its own data. Confirm the 500/1000 thresholds and the failure-rate figures.

To do
Ottawa Knee Rule — verify criteria + complete the citationClinicalNeeds you

New scores tool (/tools/ottawa-knee-rule), verified:false, standalone. 5 binary criteria, any positive → knee series (a simple binary — unlike the ankle rule, no two-zone split). Bands: 0 = no X-ray (green) / ≥1 = X-ray indicated (red). Folded the source's "hint" field (no schema equivalent) into the patellar label. DE-ORG: clean (Stiell, a study). FLAG: the source citation is incomplete — "Stiell et al., 1995" with no journal/PMID; complete + verify it. Subtitle + search terms Claude-authored. Confirm the applicability limits and the "negative rule = no fracture, not no injury" caveat.

To do
PECARN head injury — verify both age pathwaysClinicalNeeds you

New algo tool (/tools/pecarn-head-injury), verified:false, standalone. Age-split (<2 vs ≥2) → high-risk → intermediate-risk → 6 outcomes; verified the split routes correctly (under-2 asks palpable skull fracture, ≥2 asks basilar signs). Subtitle is the builder's (PECARN expansion + the question). DE-ORG GRAY ZONE to confirm: PECARN is an organisation name in the title — but it is a federally-funded RESEARCH NETWORK whose authority here is a primary study (Kuppermann, Lancet 2009, cited in the footer), not a consensus guideline like IDSA. My read: clean, and the rule is universally known by that name. Your call. Confirm the ciTBI percentages (4.4/4.3, 0.9/0.8, <0.02/<0.05) and the severe-mechanism thresholds (3ft vs 5ft).

To do
NEXUS C-Spine — verify the 5 criteriaClinicalNeeds you

New scores tool (/tools/nexus-c-spine), verified:false, standalone. 5 binary criteria, ALL must be negative to clear; any positive → CT. Bands: 0 = cleared (green) / ≥1 = imaging required (red) — red is consistent with its sibling Canadian rule, where the builder's own data types high-risk→image as red. DE-ORG: clean (cites Hoffman NEJM 2000 + Stiell NEJM 2003 — studies, not guidelines). Subtitle + search terms Claude-authored. Confirm the "distracting injury" framing (deliberately undefined in the original) and the 99.0% sensitivity figure.

To do
Canadian C-Spine Rule — verify 3-step logic + factor listsClinicalNeeds you

New algo tool (/tools/canadian-c-spine), verified:false, standalone. Sequential: high-risk → low-risk → active rotation 45°, 4 outcomes. Severity ladder is the builder's own: high-risk/no-low-risk → serious (red), can't-rotate → caution (amber, usually just spasm), cleared → green. DE-ORG: clean (Stiell NEJM 2003). Re-expressed the def cards from the legacy inline-style `<div style=...>` scaffolding into our standard <br> pattern; mapped an unsupported def colour "success"→"dim". Subtitle + search terms Claude-authored. Confirm the applicability limits (GCS 15, age ≥16, excludes known vertebral disease) and the dangerous-mechanism list.

To do
Ottawa SAH Rule — NEEDS A PRIMARY CITATIONClinicalNeeds you

New scores tool (/tools/ottawa-sah-rule), verified:false, standalone. 6 binary criteria; any positive → CT head then LP if negative. FLAG: the source had NO citation at all and no footer. I added a footer carrying the applicability limits + the CT time-decay caveat (~98% at 6h → ~86% at 72h) but deliberately did NOT invent a citation. Believed to be Perry JJ, et al. JAMA 2013 — VERIFY the reference + PMID before adding; do not ship from memory. Subtitle + search terms Claude-authored. Also confirm the 100% sensitivity claim (95% CI 97.2–100%) and the exclusion list.

To do
DE-ORG: rule the operational-mandate exception on the 3 gray-zone orgsClinicalNeeds you

The de-org rule gained a second exception (2026-07-15, builder): the OPERATIONAL MANDATE. Some org output is wired into hospital-wide protocol, order sets, core measures and BILLING (SEP-1), so the clinician must comply whether or not the evidence supports it — pretending it does not exist makes us useless at the bedside. For those we NAME the org as the mandate (never as the authority) and, where our position differs, show both and say why. The test is not "is it a society?" but "does this bind the user operationally regardless of the evidence?" — IDSA does not, Surviving Sepsis does. Per the rule I do not self-grant the exception, so THREE calls are queued for you: (1) SURVIVING SEPSIS / SCCM — ruled IN by you; the SOFA tool needs its strip revisited (see the SOFA entry). (2) AHA/ASA — drives stroke-centre certification + hospital stroke protocol; affects abcd2-tia. (3) PADIS / SCCM — ICU sedation targets are commonly unit protocol; affects rass, and NEWS2/NHS is adjacent. All three currently written in our own voice with no org named, which is the safe default until you rule.

To do
DE-ORG SWEEP — strip IDSA/ATS/GOLD/BTS references from 5 live toolsClinicalNeeds you

CLAUDE.md rule (2026-07-15): never cite/defer to a professional org as the authority — WE are becoming the authority. CDC/ACIP stays OK, and see the operational-mandate exception above (none of the 5 below qualify — these are advisory guidelines, not billing mandates). Primary literature (author·journal·year) or our own stated position only. Audit of what is ALREADY LIVE and violates it: (1) cap-icu-criteria — WORST: the org is the tool's identity, title is literally "IDSA/ATS ICU Criteria for CAP" (+ blurb/teachDesc/footer). The 9 minor criteria are a guideline CONSTRUCT, not one study — so this is the "some tools we might need to remove" case: either re-found it on the primary studies behind each criterion + rename neutrally (e.g. "Severe CAP: ICU Admission Criteria"), or DROP it. Builder's call. (2) lp-before-ct — footer "IDSA Practice Guidelines for Bacterial Meningitis" + teach "the IDSA risk factor list". Likely re-backable on the primary CT-before-LP derivation study (Hasbun et al., NEJM 2001 — VERIFY the citation/PMID before using; do not ship from memory). (3) curb-65 — footer "(British Thoracic Society)" is droppable (Lim WS, Thorax 2003 stands alone as primary lit); blurb "PSI is favored over CURB-65 by ATS/IDSA" is the BUILDER'S OWN wording — needs your rewrite, not mine. (4) psi — IDSA + ATS refs to strip. (5) copd-abx — footer "and GOLD guidelines" is droppable; Anthonisen 1987 is primary lit and stays. Mechanical drops are easy; the ICU tool + the CURB-65 subtitle need your judgment.

To do
LP-before-CT algo — verify contraindications + herniation criteriaClinicalNeeds you

New algo tool (/tools/lp-before-ct), verified:false. Linear: absolute contraindications → herniation risk (IDSA CT-before-LP criteria) → relative (correctable bleeding) → 4 outcomes. BY DESIGN it does NOT decide antibiotics — teachDesc says empiric therapy should already be running (2-hour CSF culture window). Title/subtitle/search terms Claude-authored. Confirm the absolute list (incl. platelets <20k), the 7 herniation risk factors, and the INR/platelet thresholds.

To do
Orbital vs Periorbital Cellulitis algo — verify hard signs + CT logicClinicalNeeds you

New algo tool (/tools/periorbital-orbital-cellulitis), verified:false. sepsis → hard signs → CT → 4 outcomes. MAPPING TO CONFIRM: the legacy used outcome types `critical`/`standard`, which our 3-tier SEVERITY scale doesn't have — mapped critical→serious (red: sepsis, orbital) and standard→caution (amber: both periorbital). Result: no green outcome, which is arguably right (every path has cellulitis). Also mapped a def colour "success"→"dim" (unsupported value; dim is the neutral tier and reads correctly for the Shared Signs card). Title/subtitle/search terms Claude-authored; added a footer (source had none) with no invented citation.

To do
Wells PE — 1.5 discrepancy RULED by the builder (canonical model kept)ClinicalNeeds you

RESOLVED 2026-07-15 — builder ruled: keep the canonical/stated model. The legacy source disagreed with itself at exactly one achievable value: its teachDesc stated three-tier low as "<2" while its code implemented `totalPoints <= 1`, so a Wells of 1.5 (tachycardia alone — a common patient) rendered "Moderate" when the stated rule says LOW. That mattered because at Wells <2 the patient is PERC-eligible and testable with nothing at all. Our bands (0 → low, 2 → moderate·unlikely, 4.5 → moderate·likely, 6.5 → high) already implement the stated model; no code change was needed, the ruling just confirms it. VERIFIED in-browser: 1.5 → "Low risk · PE unlikely", 4.5 → "Moderate risk · PE likely". First tool with FRACTIONAL points — 0.5 increments are exact in binary floating point, so no drift. STILL OPEN for red-pen: source gives "Phil Wells in 1998, revised 2000" with no journal — I did NOT invent one (contrast wells-dvt, where I supplied "Lancet 1997" from memory; that one still needs verifying). Confirm the ~1.3/~16/~37% prevalences.

To do
Sgarbossa — SOURCE BUG: the verdict text claims a finding the patient may not haveClinicalNeeds you

New scores tool (/tools/sgarbossa), verified:false, standalone. FLAG 1 — SOURCE BUG, FIXED, PLEASE CONFIRM: your updateOutput branches on the TOTAL to decide the verdict text — `totalPoints >= 5` renders "Concordant ST elevation present". But 5 is also reachable as criterion 2 (3) + criterion 3 (2), i.e. concordant ST DEPRESSION plus discordant elevation, with NO concordant ST elevation anywhere on the ECG. The tool would then describe a finding the patient does not have. Same class as the Ottawa Ankle digit-hack: encoding identity into a total. VERIFIED the failing case in the browser — 3+2=5 now renders "Sgarbossa POSITIVE · Meets the ≥3 threshold" and makes no claim about which criterion fired. All 8 combinations checked; the 5/3/2 weights + ≥3 threshold do produce the correct VERDICT for every combination, so only the flavour text was wrong and the points are kept as-is. FLAG 2 — I DELIBERATELY DIVERGED ON COLOUR, PLEASE RULE: your riskLevels type a score of 0 as risk-low (GREEN). Sgarbossa negative has 20–36% sensitivity and your own teachDesc says "it does NOT rule out MI". A green bar on a chest-pain LBBB patient asserts an all-clear the rule cannot deliver — the false-reassurance case our severity scale exists to prevent. I typed 0 AND 2 as caution (amber), so the tool has no green outcome at all — same precedent as periorbital cellulitis (every path has disease). Revert if you disagree. CITATION: "1996 (GUSTO-I)" + "Smith modification 2012", no journals — complete + verify.

To do
HEART Score — verify, and confirm the subjective-criteria framingClinicalNeeds you

New scores tool (/tools/heart-score), verified:false, standalone. 5 choice criteria x 0–2, max 10. Bands 0–3 low / 4–6 moderate / 7–10 high. Subtitle is the BUILDER'S OWN (supplied verbatim). DE-ORG: clean — no org in the source; TIMI/GRACE are named as SCORES being compared, not as authorities. CITATION: the source had NONE. I added "Six AJ, et al. 2008" from memory — LOWER CONFIDENCE, VERIFY OR REMOVE; the validation is believed Backus BE, et al. 2013 but I did not ship it. EMPHASIS I ADDED (confirm): the source calls History "the most subjective criterion"; I extended that into a stated limitation — two of five criteria are subjective, interrater agreement is good at the extremes and weakest in the middle, which is exactly where the 3-vs-4 discharge call happens. Also kept your point that known atherosclerotic disease auto-scores 2 (the most commonly missed distinction). Confirm the MACE percentages (0.9–1.7 / 12–16.6 / 50–65%).

To do
CHA₂DS₂-VASc — de-org rewrite was heavy here; confirm the thresholdsClinicalNeeds you

New scores tool (/tools/cha2ds2-vasc), verified:false, standalone. 1 choice (age 0/1/2) + 6 binaries, max 9. DE-ORG — THE HEAVIEST REWRITE OF ANY TOOL SO FAR, because this score's entire ACTION is a guideline number: the source cited "2024 ESC guidelines", "AHA/ACC still uses the full score", "AHA/ACC says men ≥2, women ≥3", "ESC says ≥2, consider at 1", "most guidelines say score it if...". All removed. Rewritten as OUR position (female sex is an age-dependent modifier, not an independent risk factor; if the only point is sex, do not anticoagulate) with the thresholds stated as what is COMMONLY used rather than as anyone's decree. Referenced the sex-free VARIANT by name (CHA₂DS₂-VA) instead of the guideline that introduced it — a fact about the instrument, not an appeal to an org, and more useful to a reader who will meet both. AHA/ACC is on the operational-mandate list for you to rule on (see the DE-ORG entry). DESIGN CATCH: at score 1 the bar led with "Consider anticoagulation" while the crucial "if this is female sex alone, do NOT" sat on line 4 — for a woman <65 scoring 1 from sex alone, the tool led with the OPPOSITE of the right answer. Reworded the band to "Low–moderate risk — depends on WHICH point" and put the sex caveat first. Our engine has no conditional BANDS (showWhen gates criteria only), so this is prose, not logic — if you want the verdict to actually branch on which point it is, that is an engine change; say the word. Confirm the %/yr figures.

To do
HAS-BLED — verify, and confirm the modifiable/not-modifiable regroupingClinicalNeeds you

New scores tool (/tools/has-bled), verified:false, standalone. 9 binaries. DE-ORG: clean (Euro Heart Survey is a study cohort). STRUCTURAL CHOICE TO CONFIRM: the source lists the 9 criteria in HAS-BLED letter order; I regrouped them into "Modifiable — the reason to score this at all" (uncontrolled HTN, labile INR, drugs, alcohol) and "Not modifiable — which is why the ones above matter" (renal, liver, stroke, prior bleed, elderly). Rationale: the source's own central message is that a high HAS-BLED is NOT a reason to withhold anticoagulation but a reason to FIX things — and the letter order buries which four you can actually fix. This breaks the mnemonic order, which is a real cost for anyone scanning by letter. Revert if you'd rather keep H-A-S-B-L-E-D order. Also preserved your good detail that HTN scores differently here (uncontrolled >160 only) than on CHA₂DS₂-VASc (treated-and-controlled still counts) — a common scoring error. Confirm the bleeds/100 patient-years figures and the "~300 falls per year" line.

To do
Canadian CT Head — verify the two tiersClinicalNeeds you

New scores tool (/tools/canadian-ct-head), verified:false, standalone. 7 binaries, any positive → CT; verified the groups split 5 high-risk / 2 medium-risk. DE-ORG: clean (Stiell IG, Lancet 2001 — the source supplied the full citation, unusually). MODELLING NOTE: the two tiers answer DIFFERENT questions (first 5 predict neurosurgical intervention at 100% Sn; last 2 predict clinically important brain injury at 98.4% Sn), so `zones` was considered and rejected — the rule still emits ONE verdict (scan or don't), and zones would imply two independent decisions. Used titled groups instead so the tiers are visible without faking two verdicts. Revisit if you want the "high-risk-criteria only" verdict as a separate card. Added to the low band that the rule does not account for anticoagulation/antiplatelets (the source says this only in a teach block, and it is the most important caveat on a "CT not required" green bar). Confirm the applicability gate (GCS 13–15 + LOC/amnesia/disorientation, age ≥16) and the ≥3ft/≥5 stairs threshold.

To do
NIHSS — verify all 15 items; confirm the "Minor stroke" greenClinicalNeeds you

New scores tool (/tools/nihss), verified:false, standalone, reassess:true — the biggest tool on the site (15 items, 4 groups, max 42). Verified the trend: 7 → 5 renders ▼2 GREEN (correct, lower NIHSS = better; no optimalScore, no higherIsBetter) with per-item trends. DE-ORG + COPYRIGHT: uniquely clean — NIHSS is a US federal (NIH/NINDS) work, so it is public domain and CLAUDE.md explicitly permits naming and reproducing it verbatim. CONFIRM THE COLOUR: I followed your source in typing 1–4 "Minor stroke" as reassuring/GREEN. NIHSS is a severity scale so a low tier reading green is defensible — but a green bar on an isolated disabling aphasia or hemianopia (which score low) is arguable, and NIHSS <4 is often where the tPA "disabling deficit" argument actually happens. I added a caveat line to that band rather than change the colour. Confirm the tPA range (4–25), the LVO ≥6 threshold, and the 16/21 cuts. The right-hemisphere under-scoring point (aphasia max 3 vs neglect max 2 → right MCA scores 10–12 where an equivalent left MCA scores 18–22) is the source's own and I leaned into it hard in the blurb + teachDesc — confirm you want it that prominent.

To do
TOOL GAP LIST — what ID + EM still needs (bounded on purpose)ToolsNeeds you

Built 2026-07-15 to the builder's two questions: (a) as the ID specialists, what do we need? (b) as acute-care specialists, what bundle keeps an ED doc here instead of MDCalc? THE LIST IS DELIBERATELY SHORT — the builder's own observation is that he uses ~20 of MDCalc's ~550, and every tool we DON'T build makes the rest easier to find. Target ~55-60 total, not 200. || ID — SCORES: PEN-FAST (penicillin allergy de-labelling — THE top pick: ~90% of "penicillin allergic" patients are not, it changes antibiotic choice on every page, and it feeds our allergy filter); ALT-70 (pseudocellulitis — ~30% of cellulitis diagnoses are wrong); LRINEC (nec fasc); Bacterial Meningitis Score (peds); Kocher (septic arthritis, peds); CISNE (febrile neutropenia — complements MASCC); SIRS (legacy but still the screening reflex; pairs with qSOFA/SOFA); Westley croup (peds ID). || ID — ALGO: Modified Duke Criteria for endocarditis (ENGINE PROBLEM — see the separate entry; it is combinatorial, not a sum); Febrile infant pathway (Rochester / Step-by-Step / PECARN febrile infant — ID+peds+EM, high value); Procalcitonin-guided antibiotic cessation (very "positions we hold"); C. diff testing + severity (DE-ORG RISK: the severity criteria are an IDSA construct — may not survive the rule, same shape as cap-icu-criteria). || ID — LAB: CSF analysis (already on the builder's list — bacterial vs viral vs traumatic tap; arguably our single highest-value lab tool); ANC (already listed); synovial fluid analysis (septic arthritis); pleural fluid / Light's criteria (empyema); ascitic PMN ≥250 (SBP). || ID — CUSTOM: VANCOMYCIN AUC/MIC DOSING (huge ID value, genuinely wanted, nobody does it well); aminoglycoside dosing; antibiotic allergy cross-reactivity map (legacy allergy-map.js already exists — pairs with PEN-FAST); renal dose adjustment (Cockcroft-Gault feeds it — infrastructure, not a tool). || EM — SCORES: Canadian Syncope Risk Score (the biggest single gap in the EM bundle); COWS (opioid withdrawal — pairs with our CIWA, and ED opioid withdrawal is now routine); PECARN intra-abdominal injury; Ottawa Heart Failure Risk Scale; BRUE (peds). || EM — ALGO: HINTS exam (central vs peripheral vertigo — perfect algo fit and badly served elsewhere). || EM — CUSTOM: Rumack-Matthew nomogram (acetaminophen — a time-vs-level GRAPH, so custom SVG, not a score); QTc. || DELIBERATELY NOT BUILDING, and we should say so out loud: TIMI and GRACE (we hold that HEART is the right tool for undifferentiated ED chest pain — listing all three neutrally is the MDCalc failure mode; BUILDER'S FIELD EVIDENCE, 2026-07-15: "I have worked in 12+ hospital ERs and none of them use TIMI" — that is a publishable line, and it is the kind of claim only a practising ED doc can make, which is precisely why it is defensible for us and unavailable to MDCalc); AIMS65 and Rockall (we hold Blatchford); CATCH/CHALICE (we hold PECARN). Each omission is a POSITION, and is worth a sentence on the relevant tool page rather than silence.

To do
ENGINE GAP — Duke Criteria is combinatorial, not a sumToolsNeeds you

Surfaced while building the tool gap list. Modified Duke Criteria for infective endocarditis resolves as: 2 major, OR 1 major + 3 minor, OR 5 minor = "definite". That is a COMBINATION rule over two counts — not a weighted total, and not expressible in `scores` (bands are thresholds on one number) or in `zones` (each zone resolves independently with no cross-zone rule). Options when we get there: (a) a new `combinations` capability — count majors and minors as separate tallies, then evaluate declared rules against the pair; (b) build it as an `algo` and hand-author the branches (ugly, and the branch count is large); (c) a bespoke custom island. My lean is (a) — it is small, declarative, fails loud, and Duke is not the only rule shaped this way (Jones criteria for rheumatic fever is the same, and that is ID-adjacent too). DO NOT fake it with point-weights the way the legacy Sgarbossa data faked criterion identity into a total — that exact trick is what produced the Sgarbossa verdict-text bug.

To do
DISEASE PAGES are now the bottleneck — 35 tools, most of them orphansContentNeeds you

The Wells PE gap CLOSED (wells-pe shipped) — the PE set is now complete: wells-pe → perc (chains off Wells <2) → geneva-revised (the Wells alternative) → years-pe, then spesi post-diagnosis, plus wells-dvt. But the SECOND gap is now the big one and it is growing with every batch. Cross-links are derived from disease.tools[], so a tool with no disease page has NO backlink and NO "Related tools" — it is unreachable except by search. We have ~35 tools and 5 disease pages (CAP, otitis media, diabetic foot, sexual assault PEP, + drafts). Coherent CLUSTERS now sitting orphaned: PE (6 tools), AF/anticoagulation (cha2ds2-vasc + has-bled — these two explicitly reference each other in prose and cannot link), chest pain (heart-score, sgarbossa), stroke (nihss, abcd2-tia, canadian-c-spine-adjacent), head injury (canadian-ct-head, pecarn), C-spine (nexus, canadian), ankle/knee (ottawa x2), appendicitis (alvarado, pas), sepsis (qsofa, sofa). Every one of these wires itself together FOR FREE the moment a disease page lists them — the derived-crosslink design is working exactly as intended, there is just nothing on the authoring side of it yet. The tools are done; the connective tissue is not. Also still needs the CLAUDE.md per-disease asks (category, synonyms, allergyFilter) for each new page.

To do
PERC — verify criteria + confirm the PERC-positive severityClinicalNeeds you

New scores tool (/tools/perc), verified:false, standalone. 8 binary criteria, ALL must be negative; verified 0 = "PERC negative", any 1 = "PERC positive". DE-ORG: clean (Kline, a study). CONFIRM THE SEVERITY: I typed PERC-positive as serious/RED, following your source (riskLevels min:1 = high) and the NEXUS/Ottawa-Knee house precedent (rule not satisfied → image → red). But clinically a PERC-positive patient is NOT high-concern — it means "you cannot skip testing", and most of them get a D-dimer and go home. A case exists for caution/amber. I added a line to the band saying exactly that so the colour cannot mislead on its own, but the colour is arguably still wrong. Your call, and it applies to the whole rule-out family (NEXUS, Ottawa Knee, PERC). CITATION: source said "Kline et al. (2004)... validated in 8,183" with no journal — believed J Thromb Haemost 2004 (derivation) + 2008 (validation); VERIFY before adding, not shipped from memory. WORDING FIX I MADE: the source's hormone teach said "Testosterone in transgender patients receiving estrogen does NOT count, but estrogen-containing gender-affirming therapy does" — self-contradictory as written. Rewrote to the evident intent: estrogen-containing therapy counts (incl. gender-affirming), testosterone does not. Confirm that is what you meant.

To do
Revised Geneva — verify weights + the low-band 8% framingClinicalNeeds you

New scores tool (/tools/geneva-revised), verified:false, standalone. 1 choice (HR 0/3/5) + 7 binaries. VERIFIED the leg-findings stack the teach makes a point of: unilateral leg pain (3) + deep-palpation-pain-AND-oedema (4) = 7 on its own → intermediate. DE-ORG: clean (Le Gal, a study); the source's vague "most guidelines reference the full version" was dropped rather than left as an appeal to unnamed authority. CITATION: "Le Gal et al. (2006)" with no journal — believed Ann Intern Med 2006; VERIFY. CONFIRM: the ~8%/~29%/~74% prevalences, the 0–3/4–10/≥11 cuts, and the 5-point weight for HR ≥95. NOTE I added an explicit line to the LOW band that ~8% PE prevalence is NOT negligible and still needs a D-dimer — the source implies it but a green "Low probability" bar could otherwise read as an all-clear, and 8% is a lot of PE. Also cleaned an internal contradiction in the source's HR teach ("three tiers" then "the two-tier approach"). Simplified Revised Geneva (all items 1pt, HR≥95 = 2) is a separate tool if you want it.

To do
sPESI — verify, and confirm the high-risk severityClinicalNeeds you

New scores tool (/tools/spesi), verified:false, standalone. 6 binaries; 0 = low (~1.1% 30-day mortality, outpatient candidate) / ≥1 = high (~8.9%, admit). DE-ORG APPLIED AT WRITE TIME: the source cited "The ESC 2019 guidelines" and "per ESC" as the authority for the RV/troponin stratification and the massive-PE definition — rewritten in our voice as standard practice, substance unchanged, no org named. ESC is European and does not bind US billing/protocol, so the operational-mandate exception does NOT apply here (contrast Surviving Sepsis) — but confirm you agree. CITATION: "Jiménez et al. (2010)" no journal — believed Arch Intern Med 2010; VERIFY. EMPHASIS I ADDED (confirm you want it): the source treats sPESI 0 as the discharge decision; I framed it as NECESSARY BUT NOT SUFFICIENT, because the score assesses nothing about bleeding risk, follow-up reliability, or whether the patient can actually obtain anticoagulation — and a green "consider outpatient management" bar is exactly the kind of thing that gets read as permission. Confirm the mortality figures and the ≥110 / <100 / <90 thresholds.

To do
RASS — verify the descriptors + the targeted-trend behaviourClinicalNeeds you

New scores tool (/tools/rass), verified:false, standalone, reassess:true. Drove TWO new engine capabilities (see the Tools entries): `optimalScore: 0` and `defaultIndex`. DE-ORG: the source leaned on "PADIS guidelines" / "per PADIS 2018 guidelines" (SCCM) as the authority for the RASS 0..-2 target — rewritten in our own voice as what is commonly targeted, no org named. Sessler CN, et al. Am J Respir Crit Care Med. 2002 is primary lit and stays. FLAG — OPERATIONAL-MANDATE CALL FOR YOU: PADIS/SCCM is arguably the same case you made for Surviving Sepsis (ICU sedation targets are frequently baked into unit-wide protocol and order sets). I did NOT self-grant the exception per the new rule. If you judge PADIS operationally binding, this tool + NEWS2 should name it as the mandate and flag where we differ. COPYRIGHT: RASS is a standardised instrument reproduced as published (descriptors verbatim — rewording invalidates it), attributed to Sessler; not a licensed scale like MMSE. Confirm the +2 severity (I followed your source in typing +2/+3/+4 all as serious/red and +1 as caution; a case exists for +2 = caution since the teach says look for reversible causes first) and the CAM-ICU ≥-3 validity claim.

To do
Wells DVT — verify criteria + the two-tier vs three-tier framingClinicalNeeds you

New scores tool (/tools/wells-dvt), verified:false, standalone. 10 binary criteria incl. the -2 alternative-diagnosis gestalt override — first tool to exercise NEGATIVE totals end-to-end (verified: alt-dx alone = -2 resolves to the min:-2 low band, not a blank bar). Reports the THREE-tier model (low ≤0 / moderate 1-2 / high ≥3) and explains the two-tier (unlikely ≤2 / likely ≥3) in the teach — confirm which you want as the primary verdict, since the two-tier is what most US EDs actually run. Folded the source's "hint" fields (no schema equivalent) into the labels (6-month cancer window; 10cm-below-tibial-tuberosity measurement). DE-ORG: clean (Wells PS, Lancet 1997 — VERIFY the journal/year; the source said only "Phil Wells in 1997" and I supplied Lancet from memory). Confirm the ~5%/~17%/~53% prevalences and the >99% NPV claim.

To do
ABCD² for TIA — verify, and decide if the tool survives its own critiqueClinicalNeeds you

New scores tool (/tools/abcd2-tia), verified:false, standalone. DE-ORG: the source deferred to "Current AHA/ASA guidelines recommend..." for the ≥4 admission threshold — rewritten as OUR position, no org named. FLAG — OPERATIONAL-MANDATE CALL FOR YOU: AHA/ASA is arguably your Surviving Sepsis case too (their stroke guidance drives stroke-centre certification and hospital stroke protocol). Did not self-grant it. BIGGER FLAG: I wrote the tool with a genuinely critical voice (its ED validation is poor; it is blind to afib, carotid stenosis, and crescendo TIA; posterior-circulation symptoms score 0) — which is defensible as a "position we hold", but it raises the honest question of whether we should ship a disposition tool we are telling people not to trust for disposition. Your call: keep with the caveats, or drop. I did NOT cite the negative validation studies (believed Perry JJ, CMAJ 2011 + a Wardlaw meta-analysis — VERIFY before adding; not shipped from memory). Confirm Johnston SC, Lancet 2007 and the 1.0/4.1/8.1% 2-day risks.

Done
Scores engine: `optimalScore` (targeted / non-monotonic trend) — SHIPPEDTools

Extended the scores schema for scores that have a TARGET rather than a good direction. RASS runs -5..+4 and 0 (alert and calm) is the goal — both -4 (oversedated) and +3 (agitated) are bad, so neither higherIsBetter setting can express it. Without this, a patient sliding 0 → -4 (now unarousable) would have rendered a GREEN "▼4 better", which is the exact silent-wrong-colour class the all-or-nothing rule exists to stop. `optimalScore` makes improvement = movement TOWARD the target from either side; the arrow still reports the raw number direction, only the colour carries the clinical read. Equal distance across the target (RASS -4 → +4) resolves to neutral rather than inventing a direction — VERIFIED all three: 0→-4 red ▼4, -4→0 green ▲4, -4→+4 neutral ▲8. Additive + backward-compatible. Fail-loud guards added + TESTED: optimalScore + higherIsBetter (contradictory — a score has a target or a direction, not both), and optimalScore without reassess (dead config).

Done
Scores engine: `defaultIndex` + isLive fix — SHIPPEDTools

TWO fixes. (1) `defaultIndex` on a choice criterion: the engine assumed option 0 is the "nothing wrong" baseline, which holds for every tool but RASS — RASS is canonically printed +4 (combative) → -5 (unarousable), so its FIRST option is its WORST and the tool loaded claiming the patient was combative. Reordering the scale would alter a standardised instrument, so the engine bends instead. Every read of a choice now routes through one idxOf() helper so the default can never drift from what is scored. Guard: a defaultIndex past the end of the options fails the build. (2) LANDMINE FIX found while building RASS: totalOf() — the reassessment total — did NOT check isLive, so `reassess` + `showWhen` together would have SCORED hidden criteria (ScoreForm checked it; ReassessForm did not). No tool combined them yet, so nothing shipped wrong, but it was one tool away. Both paths now share one contribOf() helper; the trend, the render and Copy all skip non-live criteria.

Done
Scores engine: `showWhen` (conditional criteria) — SHIPPEDTools

Extended the scores schema so a criterion can be live only when another criterion sits on a named option (`showWhen: {id, equals}`, matched against an option's `value`). Driven by Glasgow-Blatchford, where haemoglobin has different thresholds by sex: it ships two Hgb criteria and exactly one is live. Without this, both would render AND both would sum — double-counting haemoglobin. Crucially, visibility gates SCORING as well as display (a hidden criterion contributes 0), applied to the total, the zone totals, the render, and Copy — verified: male + Hgb 10–11.9 = 3, flip to female = 0, not 3. Additive + backward-compatible (omit showWhen and nothing changes). Fail-loud guards added + TESTED: unknown/self reference, depending on a non-choice, and — the important one — a showWhen whose `equals` matches no option on the target, which would leave a criterion permanently invisible and silently unscored. Reusable for any sex/context-conditional score.

Done
Scores engine: `zones` (independent decisions) — SHIPPEDTools

Extended the scores schema so ONE tool can make SEVERAL independent calls, each with its own total and its own bands, and a criterion can feed more than one zone. Driven by the Ottawa Ankle Rule (ankle X-ray and/or foot X-ray; inability to bear weight feeds both). Additive + backward-compatible: omit `zones` and every existing tool behaves exactly as before. Renders one verdict card per zone (2-up, colour-coded per zone); the form still tilts to the WORST zone so the Yes-buttons track the most severe live verdict. Fail-loud guards added + TESTED (a bogus zone ref breaks the build): every criterion on a zoned tool must feed ≥1 real zone, zone ids unique, every zone needs a 0-covering band, and zones + reassess/age/classI are rejected as unsupported rather than silently rendering wrong. Replaces the legacy digit-encoding hack (1s=ankle, 10s=foot, decoded via `totalPoints % 10` in eval'd JS), which silently misread e.g. 20 as "both zones".

To do
Consider a 4th `critical` severity tier for algo outcomesUI

Deferred idea, now with a real driver. Two legacy tools explicitly typed outcomes as `critical` (orbital cellulitis + sepsis pathway), and PSI Class V (27% mortality) was an earlier candidate. Today those all share plain red (`serious`) with much milder outcomes like "give Tdap + TIG". A dedicated `critical` tier (distinct colour/treatment) would separate true emergencies from merely-serious. Schema comment already anticipates it. Design call: what does critical look like without crying wolf?

To do
GCS — verify E/V/M options, bands, ≤8 framingClinicalNeeds you

New scores tool (/tools/gcs), verified:false, standalone. Reassessment/trending tool (like CIWA) — uses the new `higherIsBetter: true` flag so a GCS DROP reads red/worse, not green (verified). 3 components E(1–4)/V(1–5)/M(1–6), total 3–15; bands severe 3–8 / moderate 9–12 / mild 13–15. teachDesc frames ≤8 as the classic-but-not-absolute intubation threshold. Legal: GCS (Teasdale & Jennett 1974, Lancet) is universally reproduced and — unlike MMSE — not actively licensed/enforced; reproduced verbatim + attributed. Confirm comfort + the component wording.

To do
DFI: weight-based IV doses render as static proseClinical

Vancomycin 15–20 mg/kg (+ loading) and daptomycin 4–6 mg/kg are prose, NOT calc-wired (avoided inventing unverified IV configs). Candidates for IV-calc binding once configs are verified. Minor: the "Group A" formula-bar label is opaque — consider a clearer clinical label on red-pen.

To do
DFI: decide display name — "Infection" vs "Wound"ClinicalNeeds you

Page currently titled "Diabetic Foot Infection" (standard for an abx guide, matches the DFI abbr). Your TLDR + legacy title say "wounds." Display name changes freely — decide which reads best; search synonyms already cover both.

Calculators (React islands)

Phase 3. The poKey / ivKey bindings already sit in the otitis data, inert, waiting for these.

Done
PO dosing calculatorTools

Shipped as the first React island (client:idle, per-accordion, configs parsed from the Webflow CSV). Fail-loud build guard; static respects max; azithro day-1/days-2+ split. Otitis calculates fully. Data still needs red-pen (see Clinical).

Done
IV dosing calculatorTools

Shipped as a React island (client:idle). Static = exact/down/up rounded to the mg rounding factor with % away; ranged = exact steps + every whole-rf dose in range; freq toggle; shared weight with the PO calc. Test-wired on ceftriaxone in otitis (radio-1 static, radio-2 fabricated ranged — correct before publish, see Clinical).

Active
Re-check the disease→drug context modelToolsNeeds you

You wanted to think this through before layering calculators on top — the trim/dose-mode work changed how a drug inherits its disease context.

Done
"Show Math" on the IV calculator — SHIPPEDTools

Built 2026-07-15 to the legacy behaviour: click a row → reveals the arithmetic behind THAT row; hover highlights the row so it reads as clickable. One row open at a time (same one-open-per-group rule the regimen accordions follow). Rows are real <button>s (keyboard + aria-expanded), not clickable divs. NOT cosmetic: it is the FDA/CDS posture in CLAUDE.md (a tool that shows its basis INFORMS and is not a regulated device; one whose reasoning is hidden drifts toward regulated CDS), and it is how the red-pen catches OUR arithmetic before a patient does. SCOPE — I OVERBUILT THE FIRST PASS and the builder cut it back (2026-07-15): I had the rounded rows deriving all four displayed figures (rounding step, per-dose divide, mg/kg/day, and the % away). It is now the legacy TWO-LINE shape for every row, using that row's own mg/kg/day: "16.60 kg × 48.2 mg/kg/day = 800.00 mg/day" / "800.00 mg/day ÷ 1 dose(s)/day = 800.00 mg/dose". Verified all three static rows against the builder's screenshots — identical. The rounding and the % are already visible in the table itself; restating them buried the two lines a clinician is actually checking. Lesson worth keeping: "shows its work" is not "shows all of its work". ONE LINE KEPT BEYOND THE SCREENSHOT: when the daily MAX CAP actually bites, a flagged line says so — otherwise the row quietly shows a mg/kg/day the config never specified (e.g. 30.1 where the config says 50) with nothing to explain why. It costs the common case nothing since it only renders when capped. Confirm you want it.

To do
IV calc: FLOAT-DUST ROUNDING BUG — found + fixed, please sanity-checkClinicalNeeds you

Found 2026-07-15 while the builder asked whether our rounding needed improving. It did — though not for the reason under discussion. THE BUG: the static table computed its rounded-down row as `Math.floor(kg*dose/rf)*rf`. When kg*dose is MATHEMATICALLY a whole multiple of the rounding factor but evaluates a hair BELOW it in binary floating point, that floor drops a full rounding factor. Concrete: 2.3 kg x 100 mg/kg/day = 230 mg, already a whole multiple of a 10 mg rf — but JS evaluates 2.3*100 as 229.99999999999997, so the tool offered "−4.35% → 220.00 mg/dose" as a legitimate rounded-down option. A 10 mg underdose invented purely by binary arithmetic, presented with a plausible-looking % and no way for the clinician to tell it apart from a real option. It fires on NEONATAL weights (2.3 kg, 4.1 kg) where a rounding factor is proportionally largest. Brute-forced the realistic space (5 rounding factors x 0.5–150.0 kg x 20 common mg/kg/day doses = 149,600 combinations): 488 cases hit it. THE FIX: compare kg*dose/rf against the nearest whole number with a 1e-9 tolerance; when it IS a whole multiple, snap down/up to it rather than floor/ceil the dust. Re-ran the same 149,600 combinations: 0 invented-error cases remain, 0 legitimate 3-row cases wrongly collapsed, 123,673 unchanged. The tolerance is 1e-9 of a rounding factor (≈5e-8 mg) — nothing real can hide under it. PLEASE SANITY-CHECK: the fix is arithmetic, not medicine, but it changes which doses the tool offers, so it wants your eye. ALSO CHECK THE PO CALC: it does its own rounding (mg → mL, then round to the syringe increment) and may carry the identical defect — I have not audited it.

Done
IV calc: exact-multiple weights collapse to one row — SHIPPEDTools

Builder-approved 2026-07-15. When the exact daily dose already sits on a whole multiple of the rounding factor (e.g. 16 kg x 50 mg/kg/day = 800 mg, rf 50), "round down" and "round up" ARE the exact dose — so the table rendered three identical rows. Not wrong, but it read as broken and implied a choice that does not exist. Now renders the single row. Verified: 16 kg → 1 row; 16.6 kg → still 3 (830 / 800 / 850), unchanged. Builder chose the bare collapse over adding an explanatory line ("800.00 mg is already a whole multiple — no rounding needed"), so the single row stands on its own.

To do
Show Math: the mg/kg/day in the rounded rows is display-roundedToolsNeeds you

Minor, cosmetic-but-worth-knowing, inherited from the legacy format the builder asked us to match. The rounded rows show e.g. "16.60 kg × 48.2 mg/kg/day = 800.00 mg/day", but 48.2 is the DISPLAY-rounded mg/kg/day (the true value is 800 ÷ 16.6 = 48.1927…). Multiply the two figures as printed and you get 800.12, not 800.00 — so a clinician checking the line on a calculator finds it off by 0.12 mg (0.015%). The DOSE is exactly right (800.00 mg is the true rounded value); only the intermediate mg/kg/day is rounded for display. Legacy did the same. Options if it ever bothers you: show more decimals on the mg/kg/day inside the math line only, or leave it. Not fixing unilaterally since matching legacy was the explicit ask.

Done
PO Show-Math "gap" — I WAS WRONG, it already existsTools

CORRECTION 2026-07-15. I logged that PoCalc had no math section. It does, and always did — a "Show math" toggle with a full panel headed "Show math — steps match your phone calculator" (PoCalc.tsx ~line 253). My error: I grepped PoCalc.tsx for /math|Math/ and piped it through `head -8`, which returned eight Math.min/Math.ceil hits and truncated before the real ones at 253/257/293. I concluded from a truncated grep. Nothing to build. WHAT IS STILL WORTH DOING (small, not flagged): the two calcs now show their math in DIFFERENT shapes — PO has a Show-math toggle button revealing one panel for the whole calc; IV reveals per-row math on row click. Both are defensible (PO computes one answer, IV offers a table of options), but if they ever want to converge, IvCalc.tsx's MathRow + Step should be lifted into calcShared.tsx rather than copied.

To do
GENERIC PO + IV calculators on their own searchable pagesTools

Builder, 2026-07-15. The PO and IV calcs currently only exist EMBEDDED in disease pages (bound per-accordion via poKey/ivKey). They need standalone, searchable, dedicated tool pages — a clinician who just wants "amoxicillin PO dose for a 14 kg kid" should be able to find the calculator directly instead of navigating to otitis media first. The engine already exists; this is a wrapper page + making them discoverable in search. NOTE the one-source-of-truth rule: the generic page must render the SAME island off the SAME dosing configs, never a second copy of the calculator.

To do
LAB TOOL ENGINE — the third tool type (not yet built)Tools

Builder's list, 2026-07-15. `algo` and `scores` exist; `lab` does not. The lab type = numeric inputs → computed value(s) → interpretation bands. Queued tools: OSMOLAR GAP (toxic alcohols — pairs with the gas panel), CSF ANALYSIS (bacterial vs viral vs traumatic tap — heavily ID, arguably our single highest-value lab tool), ABSOLUTE NEUTROPHIL COUNT (feeds febrile neutropenia → MASCC/CISNE), CREATININE CLEARANCE / COCKCROFT-GAULT (feeds every renal abx adjustment on every drug page — this one is infrastructure, not just a tool), SODIUM CORRECTION IN HYPERGLYCAEMIA. DESIGN NOTE before building: Cockcroft-Gault and ANC are not really standalone tools, they are INPUTS other tools want. Decide up front whether the lab engine can be composed (one tool feeding another) or whether each page is an island — that choice is expensive to retrofit, same as tier/paired_with were.

To do
CUSTOM TOOLS — one-off islands, each its own buildTools

Builder's list, 2026-07-15. Not expressible in algo/scores/lab; each is bespoke. GAS PANEL ("10ish tools in one" — this is the acid-base tool named in CLAUDE.md's architecture section: ONE island with sub-calculators as React children, explicitly NOT nested islands). BURN PANEL (Parkland + %TBSA/rule-of-nines + peds adjustment). PREGNANCY DATING. BMI + IBW + IBW-adjusted + FLUIDS COMBO (IBW is another shared INPUT — see the lab-engine composition note; adjusted body weight drives aminoglycoside/vancomycin dosing, so this connects to the ID wheelhouse). CONVERSIONS. PEDIATRIC VITAL SIGNS (age-banded normals — an input to PECARN, PAS, croup, and every peds page).

Content port

To do
Port remaining ~65 disease pagesContent

Phase 4. One [disease] template already renders every shape — this is data entry + a mandatory visual confirm per page.

Search

To do
Synonym / alias backfillSearch

Brand + alt names per disease/drug. See /search-terms for coverage gaps.

To do
Failed-query loggingSearch

Capture searches that hit nothing, so the alias map can grow from real misses.

Auth & billing

Blocked
Clerk auth — BLOCKED on Astro 7 (revisit when Clerk supports it)Auth

Parked 2026-07-14. Clerk account created + free tier confirmed (Hobby = 50k monthly-retained users; solo pre-launch is effectively free forever; Pro $25/mo removes branding + adds MFA at launch). BLOCKER: @clerk/astro peers on Astro 4–6 only; this project is on Astro 7.0.6 (released 2026-06-22) — even Clerk's daily canary still caps at 6. @astrojs/cloudflare 14 IS fine on Astro 7. Chose to WAIT rather than --force an unsupported combo under auth. Re-check with: `npm view @clerk/astro peerDependencies` — when it includes ^7, resume. Plan on resume: Milestone A = Cloudflare adapter (hybrid: keep static default) + @clerk/astro + middleware + embedded <SignIn/> on /login + topbar UserButton; Milestone B = gating. Keys go in a gitignored .dev.vars (builder pastes them; secret never touches chat).

To do
GATE the /admin surfaces (roadmap, search-terms, /docs/*)AuthNeeds you

Added 2026-07-15 with the menu's Admin section. These are BUILDER-facing but currently PUBLIC — noindex'd (robots noindex,nofollow) yet linked from the site hamburger, so any visitor can open them. Exposure, in order of concern: (1) /docs/claude + /docs/project-context = the business model ($269/yr, billing strategy), the "we are becoming the organization" positioning, the marketing thesis, and the never-cite-IDSA rule — which out of context could be misread as hiding our evidence; (2) /roadmap = every known clinical defect and verified:false flag, i.e. a public list of what is unverified in a paid clinical product; (3) /search-terms = coverage gaps (benign). Fine pre-launch with ~no traffic, NOT fine at launch. Fix when Clerk lands: gate these routes (prerender=false + auth check), or drop the Admin menu links and keep the URLs bookmark-only. Do not let this ride to launch.

Blocked
Content gating model (DECIDED) — implement with ClerkAuth

Locked with builder 2026-07-14: TOOLS are never gated (public/static/indexable growth wedge). DISEASES + DRUGS are gated BY DEFAULT via a `free: boolean` (default false) — builder flips specific ones to free before launch. Safe-default: forgetting to flag = protected, not leaked. Mechanics: gated pages must be edge-SSR (static leaks HTML); gated-by-default therefore makes most drug/disease pages edge-rendered, returning an indexable TEASER to anon/crawlers + full content to subscribers; free-flagged pages stay static. Gating is page-level (a gated drug page can still appear as a card inside a free disease regimen). Pre-billing testing: gate on userId + a manual `subscribed` flag on the builder's Clerk user; billing later just flips that flag.

To do
Billing provider — Clerk Billing vs MoR (Phase 6 decision)Auth

$269/yr + 3–7 day trial. Independent of auth. Clerk Billing = 0.7% of volume on top of Stripe 2.9% + $0.30 (we own global tax) vs a Merchant-of-Record (Paddle/Lemon Squeezy, they own tax). Leaning MoR since we sell internationally and the solo builder won't run a tax back-office. Decide when auth + gating land.

Cutover

To do
DNS + redirect every legacy Webflow pathInfra

Phase 7. Parity sweep, then kill Webflow.

To do
Parity line met?Infra

Done = all 68 existing pages render on Astro with working tools AND a brand-new disease page publishes end-to-end.

📋 Content status auto

Derived live from the content collections at build time — not hand-maintained. New pages appear here on their own; finished ones drop off.

1Weight-based calc bindings waiting on a tool

These pages already declare poKey/ivKey dose bindings — they light up the moment the PO/IV calculator island ships.

🗓️ Post-MVP

Should happen — just not required to launch.

Polish

To do
Button-unification passUI

Fold the control vocabulary (MRSA-RF / Pseudomonas-RF / Drug-Safety toggles, etc.) into one shared token. You said don't let you forget.

To do
De-mute remaining muted textUI

The "Not yet reviewed" safety lines and any other low-opacity text — hierarchy by size/weight, never opacity.

Content authoring

To do
Keystatic — self-serve editor (backup plan)Infra

Writing lives as an MDX collection; flagship posts are Claude-authored. IF small self-serve edits get annoying, bolt on Keystatic (git-based visual CMS — writes Markdown back to the repo, no DB, no lock-in). Only if the friction actually shows up — don't build preemptively.

To do
Wire the newsletter footer to a list serviceGrowthNeeds you

The footer signup form is UI-only right now (Submit shows "coming soon" — deliberately never fakes success/drops emails). Pick a newsletter service (leaning beehiiv for the referral/influencer angle) and wire the form + set up SPF/DKIM/DMARC. The list is the #1 asset — worth starting to collect pre-launch. Transactional email (receipts/password reset) is separate: Clerk + the billing provider cover most; add Resend only for custom system emails.

Per-user data

To do
Introduce a databaseInfra

Managed Postgres (Supabase or Neon). ONLY for runtime per-user data — saved lists, annotations, history. Clinical content stays static.

Tools

To do
Teach Me mode for algo toolsTools

The algo content record already carries per-question and per-outcome teaching text (teachDesc / teach). Deliberately left OUT of the MVP algo UI to keep it lean and fast. A "Teach Me" toggle is a strong post-MVP add-on. Note: Teach Me may still ship at MVP for OTHER tool types (lab / scores) where the teaching is core to the tool — this deferral is algo-specific.

💡 Ideas / parking lot

No commitment. A place to drop a thought so it stops rattling around — ideas spur other ideas.

To do
PATHWAYS — chain tools into a workflow (builder wants to SEE it first)UX

Builder, 2026-07-15: "I would need to see this in action... good idea here. Log it as a potential and list out the example." || THE IDEA: a PE workup is ONE workflow. MDCalc gives you four disconnected pages and no idea they relate. We already own all the pieces — we are just not saying they connect. || WORKED EXAMPLE — the PE pathway, entirely from tools we have shipped: STEP 1 /tools/wells-pe → score it. If Wells <2 the tool ALREADY says (in prose, in the band) "this is the PERC population" → so the band should offer STEP 2 /tools/perc. PERC negative → STOP. PE excluded, no D-dimer, no CT, done. PERC positive OR Wells 2-4 → D-dimer → negative stops it. Wells >4 → skip the D-dimer, CTPA. STEP 3 the CTPA is positive → the question CHANGES from "does this patient have a PE?" to "what do I do about it?" → /tools/spesi, which is prognostic and meaningless before this point. sPESI 0 → outpatient candidate; ≥1 → admit + RV/troponin. SIDE BRANCHES: /tools/geneva-revised (the objective alternative to Wells at step 1), /tools/years-pe (alternative pathway), /tools/wells-dvt (if the leg is the story). || WHY IT MATTERS: today a user must ALREADY KNOW that PERC follows Wells and that sPESI is post-diagnosis. That knowledge is the exact thing we should be selling. The prose already does this — Wells' low band names PERC, sPESI's footer says "meaningless until the PE is confirmed" — so the content is written, only the WIRING is missing. || DESIGN CONSTRAINTS: (1) MUST be derived, not hand-maintained links, or it rots the moment a slug changes (same rule as tool↔disease cross-links). disease.tools[] is ALREADY ORDERED, so a disease page could render its tools as a numbered pathway instead of a flat list — that is nearly free. The harder version (a band pointing at the next tool) needs a real reference field so a bad target FAILS THE BUILD. (2) A pathway is a POSITION — "we hold that Wells then PERC is the right order" — which is exactly the thing MDCalc structurally cannot say. (3) Blocked on the same thing as everything else: no PE disease page for it to live on.

Done
COMPLAINT INDEX (/ed-tools) — SHIPPEDUX

Built 2026-07-15 to the builder's "ED Tools button → Chest Pain header" idea. NOT a temp workaround, which is the important part: the complaint list IS Product #2 (ACT)'s table of contents, so the day a seizure page exists, "seizure" already has a home. Stopgap and permanent architecture turned out to be the same object. SHIPPED: /ed-tools (front door — all 42 grouped by complaint, jump-nav, the seed of the "curated 20") + /ed-tools/[complaint] (16 indexable pages). Builder chose indexable PAGES over a search-drawer grouping — correct call: tools are the free wedge, "chest pain calculators" is a real search, and a drawer is invisible to Google and unlinkable. SCHEMA: `complaints: z.array(z.enum(COMPLAINTS)).min(1)` — REQUIRED, no default, so a new tool cannot ship undiscoverable. Fixed enum, not free text (free text would silently split "chest pain"/"Chest Pain"/"chest pain/ACS" into three groups with nothing failing). TWO GUARDS, both tested by deliberately breaking them: (1) a typo'd complaint on a tool fails the build; (2) a COMPLAINTS value with zero tools fails the build — so the enum can never drift ahead of reality and an empty dead-end page cannot exist (I tried adding `syncope` before Canadian Syncope exists; build died). DESIGN CALLS FOR RED-PEN: `peds` deliberately NOT a complaint (it is a population, not a complaint — a peds doc arrives at "head injury" like everyone else; if you want a population filter it is a SECOND axis). `anticoagulation` and `sepsis` are clinical contexts rather than true complaints — kept because they are how a clinician actually arrives. ALL 42 CLASSIFICATIONS ARE CLAUDE-AUTHORED per the standing subtitle/search-terms rule → red-pen them; the fastest review is to read /ed-tools top to bottom and see if anything sits under the wrong heading.

To do
DE-ORG got more urgent — /ed-tools puts the violation on the front doorClinical

Consequence of shipping /ed-tools. "IDSA/ATS ICU Criteria for CAP" is now a headline card under "Shortness of Breath" on a browsable, indexable index page — it used to be buried on one tool page that only someone searching for it would reach. The de-org sweep was already queued (see the DE-ORG SWEEP entry, where this tool is the existential case: the org IS its title). It is now the first org name a browsing clinician meets, and the one Google indexes. Bumping the priority, not the plan: still either re-found it on the primary studies behind each criterion + rename neutrally, or drop it.

To do
CURATED FRONT DOOR — "the 20 you actually use"UX

Builder liked this one. An opinionated landing page listing the tools an ED doc genuinely reaches for, in the order they reach for them — as against MDCalc's ~550 alphabetised and unranked. MDCalc structurally CANNOT ship this: ranking their own catalogue means telling users which of their tools not to bother with, and neutrality is their business model. Ours is the opposite — we take positions, so a curated list is native to us. Pairs with the "deliberately not building" list (TIMI, GRACE, AIMS65, Rockall, CATCH/CHALICE): the front door is where we say what we chose AND what we rejected, with the reason. Builder's own field evidence for the TIMI omission: "I have worked in 12+ hospital ERs and none of them use TIMI."

To do
DISCOVERABILITY — the anti-MDCalc thesis (builder's question, 2026-07-15)Strategy

Builder: "MDCalc is a giant site of tools that just get lost. I only use like 20 of them. What do we do differently? I don't want to build tools nobody knows exist — and there are tools people don't know exist that would help them." || THE DIAGNOSIS: MDCalc's only index is the TOOL'S OWN NAME. Search, A-Z, and the specialty filter are all name-based, so you must already know what you are looking for. Tools you know = findable but slow. Tools you do not know exist = invisible forever. That is the whole problem in one sentence, and it is structural, not a UI failure — a dictionary cannot teach you a word you have never heard. || THE FRAME: MDCalc is a dictionary. We should be a textbook with a calculator in it. You do not discover words by reading a dictionary; you discover them by reading prose that uses them. Disease pages and The Petri Dish are the prose. The tools are the words. || WHAT WE ALREADY HAVE THAT THEY STRUCTURALLY CANNOT: (1) DISEASE PAGES as the entry point — the tool is reached through the clinical question, not a search box. MDCalc has no disease content; they are an index. This is the biggest asymmetry and it is ALREADY BUILT (derived cross-links) — it just has nothing to hang on (42 tools, 5 diseases). (2) RELATED TOOLS / siblings — already derived, same blocker. (3) WE TAKE POSITIONS — we can say "use HEART, not TIMI". MDCalc cannot; neutrality is their business model. Curation IS the product. (4) SMALLNESS IS A FEATURE — every tool we do not build makes the others easier to find. The builder's "I only use 20" is not a complaint about MDCalc, it is the product spec. || PROPOSED, IN PRIORITY ORDER: (a) DISEASE PAGES — not a new feature; the #1 discoverability lever is the thing already designed and already blocking. Nothing else beats it and nothing else works without it. (b) PRESENTING-COMPLAINT INDEX — ED docs think in complaints, not tool names ("chest pain", "syncope", "fever + neutropenia"). MDCalc's "Emergency Medicine" filter is 200 tools and therefore useless. A complaint axis is the actual answer to unknown-unknowns: you never search "Canadian Syncope Risk Score", you land on "syncope" and DISCOVER it. Design question to settle first: derive complaints from disease pages (free, but orphan tools get nothing) vs. one authored `complaint` field per tool (a maintenance cost, but it is THE discovery axis and probably worth it). (c) PATHWAYS / CHAINING — Wells → PERC → CTPA → sPESI is ONE workflow; MDCalc gives four disconnected pages. disease.tools[] is already ORDERED, so a disease could render its tools as a pathway rather than a list. We are already doing this in PROSE (Wells' low band says "this is the PERC population"; sPESI's says "assess RV function") — make it structural. Watch the trap: must be derived, not hand-maintained links. (d) THE CURATED FRONT DOOR — "the 20 you actually use", an opinionated landing page. MDCalc literally cannot ship this. (e) FAILED-QUERY LOGGING (already planned, Phase 5) — the data-driven answer to what is missing: it tells us what people searched for and did not find. (f) THE PETRI DISH — a post per tool teaching WHY it exists, tool ? → post (already planned). This is the real answer to "tools people don't know exist": nobody discovers a tool by browsing, they discover it by reading something that changes their practice.

Done
SCOPE — RESOLVED: three layers, ACT is Product #2Strategy

RESOLVED 2026-07-15 by the builder; CLAUDE.md rewritten. The old "Antibiotic guide only; ACT/airway content is out of scope" was wrong and is gone. THE ACTUAL MODEL: the mission is SPEED OF DECISION MAKING, and the site is one platform in three layers. (1) THE WEDGE — free tools, EM-wide, public/static/indexable, never gated; this is the funnel. (2) PRODUCT #1 — ABX, the paid antibiotic guide (diseases + drugs), $269/yr. (3) PRODUCT #2 — ACT = ACUTE CARE TOOLS, acute-care CONTENT (seizures, chest pain, stroke), same disease-page machinery, different specialty, NOT STARTED. What "ACT is out of scope" actually meant all along was "that is the second product, not never". THE LINE TO HOLD: an ACT-flavoured TOOL (a chest-pain score) is in scope today as part of the free wedge; an ACT DISEASE PAGE (a seizure page with management content) is Product #2 and is not being built yet. Consequence for Claude: a non-antibiotic tool is CORRECT, not scope creep — never "correct" one back toward antibiotics.

Active
Color modes (not just dark/light)UI

Turn the theme toggle into a dropdown of palettes: Dark (default), Light, + three curated themes exploring warm/cool. Building a first pass now, just for fun.

To do
Order-ready "drug stack" panel for give-all protocolsUX

On bundle diseases like SA PEP where many drugs are given at once, add a right-hand panel that collects the drugs the user selects into one succinct list — so when they go to enter orders, it's a clean checklist instead of individual drugs buried in prose. Selection → summarized stack.

To do
Floating search button (mobile, bottom-right)UX

Move — or add a second — search affordance as a floating action button pinned bottom-right on mobile, in the thumb zone, for faster one-handed searching vs. reaching for the top bar.