Skip to main content
Synced from the repo — do not edit here

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:

  1. lab_reference_ranges_core.json — 46 curated core-panel ranges (rangeSource: core)
  2. vendor ref_ranges inside lab_analytes.json (rangeSource: registry)
  3. lab_reference_ranges_generated.json341 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:
PriorityAnalyte (key)Why a longevity doc orders it
coreParathyroid Hormone (labPTH)interprets calcium + 25-OH vit D; bone/mineral metabolism
coreCeruloplasmin (labCeruloplasmin)pairs w/ copper/zinc for bioavailable copper — FM staple
advancedGlycA (labGlycA)NMR composite inflammation beyond hs-CRP
advancedIGFBP-3 (labIGFBP3)pairs w/ IGF-1 for GH-axis / somatopause
advancedEstrone E1 (labEstrone)dominant post-menopausal estrogen; full estrogen panel
advancedBioavailable Testosterone (labTestosteroneBioavailable)fraction many clinicians act on (had total+free only)
advancedReticulocyte (labReticulocyte)production vs loss in anemia
advancedAldosterone (labAldosterone)adrenal/mineralocorticoid + BP (with renin)
nichePlasma Renin Activity (labReninActivity)aldosterone:renin ratio
nicheEstriol E3 (labEstriol)comprehensive estrogen-metabolism panels
niche1,25-diOH Vit D / calcitriol (labCalcitriol)active vit D w/ PTH/calcium
nicheHaptoglobin (labHaptoglobin)hemolysis marker in anemia differential
nicheGDF-15 (labGDF15)emerging biological-aging / mitochondrial-stress marker
nicheHDL 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).