# Letter of medical necessity builder

> Draft a structured letter of medical necessity (LOMN) from a normalized case record and chart excerpts, using the Genentech/Novartis field model: patient identifiers, diagnosis and ICD-10, severity, prior therapies with outcomes, clinical rationale, treatment plan and dosing, supporting guidelines, and enclosure manifest. Enforces completeness, ICD-10 specificity, prior-therapy history structure, and disease-score capture before handing the draft to the clinical-claim-evidence-mapper for citation and export gating.



Tags: Healthcare, Prior Authorization, Denial Appeals, Letter of Medical Necessity, Drafting


## Example Prompts

- Draft a letter of medical necessity for the lumbar spine fusion case I just normalized
- Build a LOMN for infliximab for this Crohn's patient using the chart notes I uploaded
- Validate the prior-therapy history in this LOMN before I send it to the physician for signature
- Check the LOMN draft for ICD-10 specificity and missing disease-score fields

URL: https://rakenne.app/skills/letter-of-medical-necessity-builder/index.md

Try this skill: https://rakenne.app/a/?skill=letter-of-medical-necessity-builder



## Overview

Draft a structured letter of medical necessity (LOMN) from a normalized case record and chart excerpts, using the Genentech/Novartis field model: patient identifiers, diagnosis and ICD-10, severity, prior therapies with outcomes, clinical rationale, treatment plan and dosing, supporting guidelines, and enclosure manifest. Enforces completeness, ICD-10 specificity, prior-therapy history structure, and disease-score capture before handing the draft to the clinical-claim-evidence-mapper for citation and export gating.

The LOMN is the clinical spine of almost every specialty-drug prior authorization, formulary exception, step-therapy override, and medical-necessity appeal. Payer reviewers do not read it as prose — they scan it section by section looking for the field they need to confirm or deny coverage. A missing discontinuation reason, a non-specific ICD-10, an absent severity score, or a rationale that does not tie back to a prior therapy or contraindication is the single most common reason a preventable denial stays denied. This skill drafts the LOMN against a fixed field model, runs four deterministic validators against the draft, and hands the finished document to `clinical-claim-evidence-mapper` so every clinical claim the letter asserts is cited back to a chart excerpt before export.

## What it covers

- **Field-model enforcement.** Provider and payer header, RE line with member identifiers, diagnosis with ICD-10, clinical history, structured prior therapies, contraindications, objective findings (labs, imaging, disease scores), requested therapy with dose/frequency/route/duration and rationale, supporting guidelines, treatment goals, monitoring plan, signature block, and enclosure manifest.
- **ICD-10 specificity.** Format check, rejection of category-only placeholders (`M54`, `K50`, `L40` used alone), and refinement prompts for known non-specific codes (`M54.9`, `M25.50`, `R10.9`, `F32.9`, `J45.909`, `K50.90`, `L40.9`, `G43.909`).
- **Prior-therapy history structure.** Each entry must carry name, class, dose, frequency, duration, outcome (from a controlled vocabulary: `no-response`, `partial-response`, `response-then-loss-of-effect`, `intolerance`, `adverse-event`), and discontinuation reason. Bare lists ("tried gabapentin, tried duloxetine") are rejected.
- **Disease-score capture.** 22 validated instruments across MSK (ODI, NDI, VAS-pain), rheumatology (DAS28, BASDAI, HAQ-DI, RAPID3), dermatology (PASI, DLQI, UAS7), GI (CDAI, HBI, Mayo), oncology (ECOG, KPS), behavioral health (PHQ-9, GAD-7, HAM-D), pulmonary (FEV1% predicted, 6MWT), and cognition (MMSE, MoCA). Range, staleness (>180 days), and specialty-recommended instrument checks.
- **Rationale binding.** `lomn_completeness_check` rejects drafts where the requested-therapy rationale does not reference at least one prior therapy or contraindication — the single most common failure mode in clinician-authored LOMNs.
- **Claim-citation handoff.** The draft is not exported until `clinical-claim-evidence-mapper` returns `export_ready: true` for every clinical claim in the letter.

## Example conversation

> **You:** `case.json` is ready for the L4-L5 fusion — case 2026-0412-88174. Draft the letter of medical necessity so I can enclose it with the Anthem appeal.
>
> **Agent:** Reading `case.json`. Branch is `clinical-appeal`, ICD-10s are M51.16 and M48.06, requested service is posterior lumbar fusion at L4-L5 (CPT 22633 + 22840). Reading the uploaded chart notes, MRI report, and PT evaluation with `read_document`. I'll draft the LOMN as an enclosure to the appeal packet.
>
> **Agent:** Running `icd10_validator` on `["M51.16", "M48.06"]`. Both valid format, both specific. `ok: true`. No refinement needed.
>
> **Agent:** Assembling the prior-therapy section from the chart. Running `prior_therapy_history_validator` on four entries: gabapentin, duloxetine, supervised PT, and a right L4-L5 transforaminal ESI. **One error**: the duloxetine entry is missing `class` and the PT entry is missing `discontinuation_reason` — the chart says PT was "completed" rather than discontinued. Returning `isError: true`.
>
> **You:** Duloxetine is an SNRI. PT wasn't stopped for a reason — the patient finished the 14-week course with no change in ODI.
>
> **Agent:** Updated duloxetine to `class: "SNRI"`. For the PT entry I set `outcome: "no-response"` and `discontinuation_reason: "course completed at 14 weeks with no change in ODI (56% pre, 56% post)"`. Re-ran the validator — `ok: true, total: 4`.
>
> **Agent:** Running `disease_score_capture` with `specialty: "msk"` and the ODI and VAS-pain values from the 2026-03-10 PT evaluation. ODI 56% interprets as `severe`, VAS-pain 8/10 interprets as `severe`. Both in range, both dated within 180 days. `ok: true, missing_recommended: []`.
>
> **Agent:** Drafting the requested-therapy block. Name: posterior lumbar fusion with instrumentation at L4-L5; rationale cites the four failed conservative measures by name with durations and outcomes, plus the MRI finding and the NASS 2024 coverage criteria. Running `lomn_completeness_check` on the assembled record. `ok: true`, 0 missing, 1 warning (guidelines list has only NASS — ACR or AAOS would strengthen it, but NASS is the specialty-society guideline payers expect for lumbar fusion, so I'm leaving it as-is).
>
> **Agent:** Handing the draft to `clinical-claim-evidence-mapper`. `clinical_claim_extract_candidates` returned 12 candidate claims (2 diagnoses, 4 prior therapies, 1 imaging, 2 scores, 1 outcome, 1 guideline, 1 coverage-criterion). Citing each one against the uploaded chart notes, MRI report, and PT evaluation.
>
> **Agent:** `clinical_claim_check_draft` returned `export_ready: true`, 12/12 cited, 0 orphans. Rendering the LOMN to `drafts/lomn-2026-0412-88174.md` and appending the claim-to-source index. Audit log entry written. The `appeal-letter-builder` can now enclose this LOMN by reference — the enclosure manifest on the appeal already points at the path.

## Sample output excerpt

The skill produces two artifacts: the normalized LOMN draft record the validators run against, and the rendered LOMN at `./drafts/lomn-{case_id}.md`. Excerpts from the L4-L5 fusion case above.

---

```json
{
  "case_id": "8f3c2a1e-4b9d-4f7c-9e1a-2b6d8c4f1a7b",
  "header": {
    "provider": {
      "name": "Mountain Ridge Orthopedics",
      "npi": "1659321488",
      "phone": "(208) 555-0144",
      "fax": "(208) 555-0145",
      "address": "500 Alpine Way, Boise, ID 83702"
    },
    "payer": { "name": "Anthem Blue Cross Blue Shield", "plan": "Anthem PPO" },
    "date_of_letter": "2026-04-21",
    "re_line": { "member_name": "Jane D.", "member_id": "YRK8827461", "dob": "1968-05-14" }
  },
  "request": {
    "therapy_or_service": "Posterior lumbar fusion with instrumentation at L4-L5 (CPT 22633, 22840)",
    "purpose": "Medical-necessity support for the enclosed Level 1 internal appeal of Anthem's 2026-04-12 adverse benefit determination."
  },
  "diagnosis": [
    { "description": "Intervertebral disc disorder with radiculopathy, lumbar region", "icd10": "M51.16" },
    { "description": "Spondylosis without myelopathy or radiculopathy, lumbar region", "icd10": "M48.06" }
  ],
  "prior_therapies": [
    {
      "name": "gabapentin",
      "class": "gabapentinoid",
      "dose": "900 mg",
      "frequency": "TID",
      "route": "PO",
      "duration": "12 weeks",
      "outcome": "no-response",
      "discontinuation_reason": "no reduction in VAS or ODI; persistent daytime somnolence limiting work"
    },
    {
      "name": "duloxetine",
      "class": "SNRI",
      "dose": "60 mg",
      "frequency": "QD",
      "route": "PO",
      "duration": "8 weeks",
      "outcome": "intolerance",
      "discontinuation_reason": "intolerable nausea"
    },
    {
      "name": "supervised physical therapy",
      "class": "non-pharmacologic",
      "dose": "2x/week",
      "frequency": "twice weekly",
      "duration": "14 weeks",
      "outcome": "no-response",
      "discontinuation_reason": "course completed at 14 weeks with no change in ODI (56% pre, 56% post)"
    },
    {
      "name": "right L4-L5 transforaminal epidural steroid injection",
      "class": "interventional pain",
      "dose": "triamcinolone 40 mg + 0.5% bupivacaine 2 mL",
      "frequency": "single injection",
      "route": "transforaminal",
      "duration": "one dose (2026-01-18)",
      "outcome": "partial-response",
      "discontinuation_reason": "less than two weeks of relief; ESI protocol does not support repeat at this interval"
    }
  ],
  "contraindications": [],
  "objective_findings": {
    "imaging": [
      { "study": "MRI lumbar spine", "date": "2026-02-03", "impression": "L4-L5 disc extrusion with effacement of the right S1 nerve root" }
    ],
    "scores": [
      { "instrument": "ODI", "value": 56, "date": "2026-03-10", "interpretation": "severe", "chart_reference": "inputs/pt-eval-2026-03-10.pdf p.1" },
      { "instrument": "VAS-pain", "value": 8, "date": "2026-03-10", "interpretation": "severe", "chart_reference": "inputs/pt-eval-2026-03-10.pdf p.1" }
    ]
  },
  "requested_therapy": {
    "name": "Posterior lumbar fusion with instrumentation at L4-L5",
    "dose": "n/a (surgical)",
    "frequency": "single procedure",
    "route": "open posterior approach",
    "duration": "inpatient admission, estimated 3 days",
    "rationale": "After failure of gabapentin 900 mg TID x 12 weeks, duloxetine 60 mg QD x 8 weeks (discontinued for intolerable nausea), 14 weeks of supervised PT with no change in ODI, and a right L4-L5 transforaminal ESI with less than two weeks of relief, and with MRI demonstrating L4-L5 disc extrusion with right S1 nerve-root impingement, the patient meets the NASS 2024 Lumbar Fusion Coverage Criteria for surgical intervention."
  },
  "guidelines": [
    { "source": "NASS", "section": "2024 Lumbar Fusion Coverage Criteria", "recommendation": "Fusion indicated for persistent radiculopathy with imaging-confirmed neural compression after documented failure of conservative care." }
  ],
  "treatment_goals": [
    "Resolve right-sided radiculopathy and restore L4-L5 segmental stability",
    "Reduce ODI to < 40% within 6 months of surgery",
    "Return to full-duty work within 12 weeks"
  ],
  "monitoring_plan": [
    "Post-op follow-up at 2, 6, and 12 weeks with ODI and VAS-pain",
    "Neurologic exam at each visit with attention to right S1 distribution",
    "Imaging at 6 months if clinical course deviates from expected"
  ],
  "signature_block": { "physician_name": "Priya N. Shah, MD", "npi": "1487220913" },
  "enclosures": [
    { "label": "Chart note 2026-02-12 (assessment)", "doc_path": "inputs/chart-note-2026-02-12.pdf" },
    { "label": "Chart note 2025-11-03 (gabapentin trial)", "doc_path": "inputs/chart-note-2025-11-03.pdf" },
    { "label": "MRI lumbar spine 2026-02-03", "doc_path": "inputs/mri-2026-02-03.pdf" },
    { "label": "PT evaluation 2026-03-10 (ODI 56%)", "doc_path": "inputs/pt-eval-2026-03-10.pdf" }
  ]
}
```

Rendered LOMN excerpt (`drafts/lomn-2026-0412-88174.md`):

```markdown
Mountain Ridge Orthopedics
500 Alpine Way, Boise, ID 83702
NPI 1659321488 | Phone (208) 555-0144 | Fax (208) 555-0145

2026-04-21

**RE: Letter of medical necessity — posterior lumbar fusion, L4-L5**
Member: Jane D. | Member ID: YRK8827461 | DOB: 1968-05-14

To the Medical Director,

This letter documents the medical necessity of posterior lumbar fusion with
instrumentation at L4-L5 (CPT 22633, 22840) for the above-named patient and is
enclosed in support of the Level 1 internal appeal of Anthem's 2026-04-12
determination.

**Diagnosis.** Intervertebral disc disorder with radiculopathy, lumbar region
(ICD-10 M51.16); lumbar spondylosis without myelopathy (ICD-10 M48.06).

**Clinical course and conservative care.** The patient completed and failed, in
sequence: gabapentin 900 mg TID over 12 weeks (no reduction in VAS or ODI,
persistent daytime somnolence limiting work); duloxetine 60 mg QD over 8 weeks
(discontinued for intolerable nausea); supervised physical therapy twice weekly
over 14 weeks (ODI unchanged at 56% pre and post); and a right L4-L5
transforaminal epidural steroid injection on 2026-01-18 with less than two
weeks of relief.

**Objective findings.** MRI of the lumbar spine on 2026-02-03 demonstrates
L4-L5 disc extrusion with effacement of the right S1 nerve root. ODI on
2026-03-10 was 56% (severe). VAS-pain was 8/10 (severe).

**Rationale for the requested procedure.** These facts satisfy the NASS 2024
Lumbar Fusion Coverage Criteria: imaging-confirmed neural compression at a
single lumbar level, concordant radicular symptoms, and documented failure of
four conservative measures over more than six months.

**Treatment plan.** Posterior lumbar fusion with instrumentation at L4-L5 under
open posterior approach, inpatient admission estimated at three days.

**Treatment goals.** Resolve right-sided radiculopathy; reduce ODI to < 40%
within 6 months; return to full-duty work within 12 weeks.

**Monitoring plan.** Post-op follow-up at 2, 6, and 12 weeks with ODI and
VAS-pain; neurologic exam at each visit; imaging at 6 months if clinical course
deviates.

Sincerely,

[Signature]
Priya N. Shah, MD
NPI 1487220913
```

<!-- /excerpt -->

## Extension tools and validations

The skill registers four deterministic validators. None of them draft prose — the LLM renders the sentences and the validators gate export.

| Tool | Purpose |
|---|---|
| `icd10_validator` | Validate ICD-10-CM codes against the `[A-TV-Z][0-9][0-9A-Z](\.[0-9A-Z]{1,4})?` format, reject category-only placeholders (`M54`, `K50`, `L40`, `C50`, `F32`, etc.) that require a 4th–7th character to bill, and flag known non-specific codes (`M54.9`, `M25.50`, `R10.9`, `F32.9`, `F33.9`, `J45.909`, `K50.90`, `K51.90`, `L40.9`, `G43.909`) with a suggestion hint to refine against the chart. Returns per-code findings and `isError: true` when any code is invalid or imprecise. |
| `prior_therapy_history_validator` | Verify every `prior_therapies[]` entry carries `name`, `class`, `dose`, `frequency`, `duration`, `outcome` (one of `no-response`, `partial-response`, `response-then-loss-of-effect`, `intolerance`, `adverse-event`), and `discontinuation_reason`. Flags entries where `duration` is absent but `start_date` and `stop_date` are present, and where `discontinuation_reason` is the literal string "unknown". Returns per-entry issues and `isError: true` when any required field is missing or the outcome is outside the controlled vocabulary. |
| `disease_score_capture` | Validate captured severity/functional scores against 22 known instruments (UAS7, PASI, DLQI, DAS28, BASDAI, HAQ-DI, CDAI, HBI, Mayo, ODI, NDI, VAS-pain, ECOG, KPS, PHQ-9, GAD-7, HAM-D, MMSE, MoCA, FEV1-pct-predicted, 6MWT, RAPID3). Checks value range, date presence, staleness (>180 days triggers a warning), and fills a standard interpretation bucket. When `specialty` is supplied (`msk`, `msk-cervical`, `rheumatology`, `dermatology-psoriasis`, `dermatology-urticaria`, `gi-crohns`, `gi-uc`, `oncology`, `behavioral-health-depression`, `behavioral-health-anxiety`, `pulmonary`, `neurology-cognition`), reports `missing_recommended[]`. Returns `isError: true` when any captured score is invalid. |
| `lomn_completeness_check` | Enforce the Genentech/Novartis field model: header (provider name + NPI, provider phone or fax, payer name, date of letter, RE-line member name + ID), request statement (therapy and purpose), at least one diagnosis with ICD-10, at least one structured prior therapy, requested therapy with name + dose + frequency + duration + rationale, treatment goals, monitoring plan, signature block (physician name + NPI), and a non-empty enclosure manifest. Rejects drafts where the requested-therapy rationale does not reference at least one prior therapy or contraindication (keyword heuristic: `prior`, `failed`, `trial`, `discontinue`, `intoleran`, `refractory`, `inadequate`, `contraindic`, `allergy`, `adverse`, `hypersensitivity`, `angioedema`). Returns `{ ok, missing[], warnings[] }` and `isError: true` while any required block is missing. |

### Validation invariants

- **The LOMN is unsigned on export.** This skill produces a draft for physician review. The physician signs outside the workflow.
- **No invented clinical content.** Every diagnosis, dose, date, failed therapy, score, and guideline must be traceable to a chart excerpt. `clinical-claim-evidence-mapper` is the enforcement point.
- **ICD-10 specificity is required.** Non-specific codes that have a more specific alternative are rejected — the payer would reject them anyway.
- **Prior-therapy entries are structured.** No bare lists. Each entry carries name, class, dose, frequency, duration, outcome, and discontinuation reason.
- **Rationale must bind to evidence.** The requested-therapy rationale must name at least one prior therapy failure or contraindication. A generic "medically necessary under the plan" rationale trips `lomn_completeness_check`.
- **Empty enclosure manifests are rejected.** A LOMN without supporting records does not survive reviewer scrutiny. A single-item manifest is allowed with a warning.
- **Specialty overlays extend, not replace.** Overlays like `lomn-msk`, `lomn-oncology`, `lomn-gi-biologics`, and `lomn-dermatology` add stricter disease-score requirements and specialty-specific guideline tokens; they never relax the core validators.

## Getting started

1. Run `denial-intake-normalizer` first (for appeal-attached LOMNs) or start from an equivalent structured case record for a prior-authorization request. The LOMN builder reads `case.json` at the project root and uses its `case_id`, diagnosis codes, service details, and provider/payer identifiers as the spine of the draft. For appeal enclosures, the branch must be `clinical-appeal` or `pa-request`.
2. Upload the chart excerpts that ground the clinical claims — chart notes documenting the diagnosis and prior therapies, imaging reports, PT evaluations, lab tables, medication lists, and any specialty-society guideline excerpts you intend to cite.
3. Tell the skill to draft the LOMN — "draft a letter of medical necessity for the case I just normalized," "build the LOMN for this Crohn's infliximab request," or "validate the prior-therapy history before I send it to the physician."
4. Resolve every issue surfaced by `icd10_validator`, `prior_therapy_history_validator`, `disease_score_capture`, and `lomn_completeness_check`. Missing discontinuation reasons and non-specific ICD-10 codes are the two most common blockers at this stage.
5. Hand the draft to `clinical-claim-evidence-mapper`: run `clinical_claim_extract_candidates`, cite every real claim with `clinical_claim_cite`, and require `clinical_claim_check_draft` to return `export_ready: true` before rendering.
6. On success the skill writes the rendered LOMN to `./drafts/lomn-{case_id}.md`, appends the claim-to-source index, and writes an audit-log entry via `audit_log_writer`. The letter is unsigned — the physician signs outside this workflow.

### Where this skill fits

- **Upstream:** `denial-intake-normalizer` produces the `case.json` this skill reads. For prior-auth-first workflows (no denial yet), the case record is constructed directly.
- **Downstream — citation gate:** `clinical-claim-evidence-mapper` is mandatory before export. Drafts do not leave the workspace without `export_ready: true`.
- **Downstream — packet assembly:** `appeal-letter-builder` encloses the finished LOMN by reference when the appeal is a medical-necessity appeal; `packet-checklist-and-index-generator` and `submission-companion-sheet` assemble the outbound packet.
- **Specialty overlays:** install `lomn-msk`, `lomn-oncology`, `lomn-gi-biologics`, `lomn-dermatology`, `lomn-rheumatology`, `lomn-behavioral-health`, or `lomn-dmepos` on top of this skill when the pilot case load is concentrated in one specialty. Overlays add required disease scores and specialty-society guideline tokens; they do not replace the core validators.



---

Back to [Skill Library](https://rakenne.app/skills/index.md)
