Canonical source: docs/claude/labs-missing-ranges.md. This page is generated by docs/scripts/sync-handbook.mjs. Edit the source file in the repo; changes appear here on the next build.
Lab reference-range coverage (#392, one-source epic #377)
Status 2026-07-17: default-fill COMPLETE. Every analyte that can carry a numeric reference range now has one. Coverage vs a full functional/longevity panel: 89% before the audit → gaps closed.
Where ranges live (one source)
basis-functions/functions/generated/ — three range authorities, merged by
tools/build_lab_registry.py into lab_registry.json (the single source every surface +
lab_verdict.py reads). Precedence, highest wins:
lab_reference_ranges_core.json— 46 curated core-panel ranges (rangeSource: core)- vendor
ref_rangesinsidelab_analytes.json(rangeSource: registry) lab_reference_ranges_generated.json— 341 agent-generated default ranges (rangeSource: generated-default) — the fill built here
Every core + generated entry is reviewStatus: needs-clinical-signoff — informational
until a clinician approves. Generated entries also carry rangeConfidence
(high / medium / low) so surfaces can badge low-confidence defaults.
Coverage now
- 845 analytes in the registry (14 net-new added from the coverage audit, below).
- 718 carry a range (was 363 before this work).
- 127 remain rangeless — correctly so. These have no numeric population reference range by nature: genotypes (ApoE, 9p21, MTHFR), ANA titers/patterns, urine dipstick qualitative fields, percentile outputs, proprietary vendor scores (epiScore_*, NutrEval functional scores), age-clock outputs (compare to chronological age), and reactive/non-reactive serologies. Fabricating numbers for these would be wrong.
How the fill was built
12 domain-batched clinical LLM agents generated standard adult reference intervals, expressed in each analyte's canonical unit, sex-specific where clinical (hormones, iron studies, hematology, creatinine), one-sided where appropriate (HDL min-only; ApoB/Lp(a)/ tumor markers/heavy metals max-only). Confidence: 88 high / 143 medium / 116 low. Low-confidence = esoteric/functional/method-dependent markers (organic acids, microbiome phyla, functional-medicine urine markers) — flagged honestly, not false-precise.
Coverage audit — 14 gaps found + ADDED (2026-07-17)
A functional/longevity panel of 132 canonical tests was diffed against the registry: 118
already present (incl. full CMP, advanced lipids w/ ApoB/Lp(a)/LDL-P/oxLDL/Lp-PLA2/TMAO,
full thyroid w/ rT3+antibodies, complete sex/adrenal hormones, full micronutrient suite,
heavy metals, cardiac NT-proBNP/troponin). The 14 missing were added to lab_analytes.json
- given generated-default ranges:
| Priority | Analyte (key) | Why a longevity doc orders it |
|---|---|---|
| core | Parathyroid Hormone (labPTH) | interprets calcium + 25-OH vit D; bone/mineral metabolism |
| core | Ceruloplasmin (labCeruloplasmin) | pairs w/ copper/zinc for bioavailable copper — FM staple |
| advanced | GlycA (labGlycA) | NMR composite inflammation beyond hs-CRP |
| advanced | IGFBP-3 (labIGFBP3) | pairs w/ IGF-1 for GH-axis / somatopause |
| advanced | Estrone E1 (labEstrone) | dominant post-menopausal estrogen; full estrogen panel |
| advanced | Bioavailable Testosterone (labTestosteroneBioavailable) | fraction many clinicians act on (had total+free only) |
| advanced | Reticulocyte (labReticulocyte) | production vs loss in anemia |
| advanced | Aldosterone (labAldosterone) | adrenal/mineralocorticoid + BP (with renin) |
| niche | Plasma Renin Activity (labReninActivity) | aldosterone:renin ratio |
| niche | Estriol E3 (labEstriol) | comprehensive estrogen-metabolism panels |
| niche | 1,25-diOH Vit D / calcitriol (labCalcitriol) | active vit D w/ PTH/calcium |
| niche | Haptoglobin (labHaptoglobin) | hemolysis marker in anemia differential |
| niche | GDF-15 (labGDF15) | emerging biological-aging / mitochondrial-stress marker |
| niche | HDL Particle Number (labHDLParticleNumber) | had LDL-P + HDL subfractions, not HDL-P |
Naming notes (no gap): NMR LipoProfile is covered by discrete particle keys not one panel key; CRP and hs-CRP are both present as separate keys; troponin I/T cover hs-troponin semantically but aren't labeled "high-sensitivity."
Before any patient-facing use
The generated + core ranges are needs-clinical-signoff. A clinician should review
(especially the 116 low-confidence generated entries) before these drive patient-facing
in-range/out-of-range verdicts. The verdict engine already guards unit mismatches
(returns unknown, never a wrong flag).