Overview
Specialty clinics and revenue-cycle teams lose money to denials that were never properly triaged at intake. Auth numbers get transcribed wrong, the appeal deadline is measured from the date of service instead of the denial letter, a NOMNC gets treated like a standard denial, or a pure cost-share EOB gets worked for days before someone realizes there was never a denial to appeal.
The denial intake normalizer is the first step in the denial-appeal and prior-auth workflow. It turns payer correspondence — denial letters, EOBs, Medicare Advantage Integrated Denial Notices, NOMNC/DENC service-termination notices, Anthem clinical appeal forms, UHC reconsideration forms — into a single structured case.json that every downstream skill (letter of medical necessity, appeal letter, packet index, submission sheet) consumes.
What it covers
- Document recognition. CMS IDN, NOMNC/DENC, Anthem Form 102082, UHC single-paper claim reconsideration, generic payer denial letters, and EOBs.
- Appeal-type routing. Clinical UM appeal vs. post-service claim reconsideration vs. NOMNC/BFCC-QIO expedited determination vs. prior-auth request vs. grievance (out of scope, stops the workflow).
- Denial classification. 13 real-world denial categories including medical necessity, experimental/investigational, step therapy, off-formulary, DRG/level-of-care downgrade, NCCI/MUE coding edits, and coordination-of-benefits.
- Deadline math. Separates the member filing window (60 days MA reconsideration, 180 days ERISA) from the payer response window (30 days standard, 72 hours expedited). Anchors on the denial-letter date, or the service-termination date for NOMNC.
- Evidence citations. Every extracted field is traced back to
{ document, page, span }so the downstream evidence map can prove the appeal is grounded in the source record.
Example conversation
You: I just uploaded an Anthem denial letter for a spinal fusion on one of our patients. Can you start the appeal intake?
Agent: Reading
denials/anthem_20260412.pdfwithread_document. This is an Anthem Provider Clinical Appeal context — UM denial for CPT 22633 (spinal fusion). Classifying the denial reason now.Agent:
denial_classifiermatched two categories:not-medically-necessary(evidence: “does not meet InterQual criteria”) andlack-of-prior-auth(evidence: “prior authorization was not obtained”). Routing asclinical-appealwithappeal_level_hint: 1st-internal.Agent: Computed deadline with
deadline_calculator: plan_type = commercial, member filing window = 180 days, payer response window = 30 days standard / 72 hours expedited. Member filing deadline: 2026-10-09. Not flagging expedited — the service is not a continuation-of-care situation.You: The auth number isn’t in the letter. The denied service is definitely inpatient, admitted 03-28, discharged 03-31.
Agent: Recorded
date_of_service_from: 2026-03-28,date_of_service_to: 2026-03-31,inpatient_vs_outpatient: inpatient,pos_code: 21. Addedcase_reference.authorization_numbertomissing[]so downstream skills will flag it before drafting. Writingcase.jsonand appending an audit-log entry.You: Wait — the letter actually says “criteria for inpatient level of care not met; observation would have been appropriate.” Does that change anything?
Agent: Yes — that’s a DRG/level-of-care denial, not a standard medical-necessity denial. Re-running
denial_classifier; now returning["drg-level-of-care", "not-medically-necessary"]. This will route the appeal to use InterQual LSIP criteria rather than a generic medical-necessity argument. Noted incase.notes. Downstream skills will pick the level-of-care appeal template.
Sample output excerpt
The skill produces a single case.json at the project root that downstream skills read without mutation. Excerpt from a real-world Anthem inpatient denial after the conversation above:
{
"case_id": "8f3c2a1e-4b9d-4f7c-9e1a-2b6d8c4f1a7b",
"branch": "clinical-appeal",
"created_at": "2026-04-20T14:32:11Z",
"source_documents": [
{ "path": "denials/anthem_20260412.pdf", "type": "denial-letter", "pages": 3 }
],
"payer": {
"name": "Anthem Blue Cross Blue Shield",
"plan": "Anthem PPO",
"plan_type": "commercial",
"group_number": "ABC-442019",
"coordination_of_benefits": {
"secondary_payer_name": null,
"secondary_payer_member_id": null,
"cob_denial_basis": null
}
},
"member": { "member_id": "YRK8827461", "name": "Jane D.", "dob": "1968-05-14" },
"provider": {
"billing_npi": "1659321488",
"rendering_npi": "1487220913",
"tin": "XX-XXXXXXX",
"name": "Mountain Ridge Orthopedics",
"facility": "St. Luke's Regional Medical Center",
"taxonomy_code": "207XS0117X",
"pos_code": "21"
},
"case_reference": {
"case_or_appeal_number": "CA-2026-0412-88174",
"authorization_number": null,
"claim_number": "C-9918274461",
"group_number": "ABC-442019"
},
"service": {
"service_or_item_denied": "Posterior lumbar fusion, L4-L5",
"hcpcs_cpt": ["22633", "22840"],
"ndc": [],
"icd10": ["M51.16", "M48.06"],
"date_of_service_from": "2026-03-28",
"date_of_service_to": "2026-03-31",
"inpatient_vs_outpatient": "inpatient"
},
"denial": {
"denial_date": "2026-04-12",
"service_termination_date": null,
"denial_reason_text": "Coverage denied. Criteria for inpatient level of care not met; observation would have been appropriate. Additionally, prior authorization was not obtained for the procedure as required under the member's plan. Review performed against InterQual LSIP 2026.1.",
"classified_categories": ["drg-level-of-care", "not-medically-necessary", "lack-of-prior-auth"],
"prior_level_decisions": []
},
"appeal": {
"appeal_level": "1st-internal",
"appeal_deadline": "2026-10-09",
"member_filing_window_days": 180,
"payer_response_window_days": 30,
"appeal_window_days_expedited": 3,
"expedited_flag": false,
"expedited_rationale": null,
"service_termination_flag": false
},
"member_representation": {
"filed_on_behalf_of_member": true,
"representative_type": "provider",
"representative_name": "Mountain Ridge Orthopedics",
"authorization_type": "dor",
"authorization_date": "2026-04-15"
},
"peer_to_peer_history": [],
"prior_auth_history": [],
"routing": {
"submission_channel": "fax",
"fax_number": "(877) 278-2163",
"portal_url": null,
"mailing_address": "PO BOX 5063, Middletown, NY 10940"
},
"citations": {
"denial.denial_date": { "document": "denials/anthem_20260412.pdf", "page": 1, "span": "Date of this notice: April 12, 2026" },
"denial.denial_reason_text": { "document": "denials/anthem_20260412.pdf", "page": 2, "span": "Criteria for inpatient level of care not met…" },
"service.hcpcs_cpt": { "document": "denials/anthem_20260412.pdf", "page": 1, "span": "Procedure code: 22633 (with 22840)" }
},
"missing": ["case_reference.authorization_number"],
"notes": [
"Level-of-care denial — route to InterQual LSIP appeal template, not generic medical-necessity template.",
"Auth number not present in denial letter; clinic to look up in practice-management system."
]
}
Extension tools and validations
The skill uses two tools that ship with every Rakenne project for document ingestion, and four skill-specific tools that implement the domain-aware classification, routing, deadline math, and audit logging that pilot-facing workflows need to be deterministic and auditable.
Document ingestion (global Rakenne tools, reused)
read_document— Reads PDF, DOCX, image, and text sources into markdown in reading order via server-side docling. Used on every source document before classification.extract_tables— Extracts tabular line items from EOBs and payer forms (CPT, allowed/paid/denied amounts, CARC/RARC codes) so the skill can evaluate EOB appealability line by line instead of stopping on the first cost-share row.
Skill-specific extension tools
denial_classifier— Matches denial-reason text against 13 categories:not-medically-necessary,experimental-investigational,out-of-network,lack-of-prior-auth,not-covered,step-therapy,off-formulary,timely-filing,post-service-reimbursement,drg-level-of-care,coding-edit,coordination-of-benefits,service-termination. Returns all matching categories and the exact phrase that triggered each match, so a single denial containing both a level-of-care argument and a medical-necessity argument surfaces both — downstream skills pick the correct appeal template.appeal_type_router— Routes the case toclinical-appeal,claim-reconsideration,nomnc-expedited-determination,pa-request,grievance-not-appeal, orambiguous. Grievance detection runs first so service-quality complaints are filtered out before the appeal workflow engages. NOMNC/DENC sources always route to BFCC-QIO expedited determination. Coding or payment-dispute language routes toclaim-reconsiderationonly when concurrent clinical language is absent — a safeguard against misrouting retrospective inpatient denials that contain both. Returns anappeal_level_hint(e.g.,1st-internal,bfcc-qio,state-fair-hearing) to pre-populatecase.appeal.appeal_level.deadline_calculator— Separates member filing window (e.g., 60 days for MA Level 1 reconsideration, 180 days for ERISA internal appeal) from payer response window (30 days standard, 72 hours expedited). Returns bothmember_filing_deadline_isoandpayer_response_deadline_isoso RCM teams see the right clock for the right actor. Anchors on the denial-letter date; for NOMNC cases, anchors on the service-termination date instead. Flags that ERISA windows run from receipt of the adverse benefit determination, not print date.audit_log_writer— Appends an append-only JSONL record of every human-approved intake, update, and submission toaudit/audit-log.jsonl. Required for HIPAA-sensitive buyers who need to show, per case, exactly what the agent did and when a human approved it. Path-traversal guard prevents writes outside the workspace root.
Validation rules enforced at intake
- Nothing is invented. IDs, dates, and authorization numbers absent from the source stay
nulland are added tocase.missing[]. Downstream skills refuse to draft while required fields are missing. - One case per denial. Multiple distinct denials cannot be merged into a single
case.json— one record per(member, service, denial-date)tuple. - Immutability post-approval. Once approved,
case.jsonis immutable. Downstream skills append to the audit log but leave the case record untouched. - EOB triage is CARC-code aware. Cost-share EOBs do not automatically stop the workflow — any line with a denial CARC (4, 5, 50, 97, 119, 197, 200, 226) or coverage-issue RARC triggers the appealable path.
- Grievances stop the workflow. When grievance language is detected, the router returns
grievance-not-appealwith a pointer to the correct process (42 CFR §422.564 for MA, 42 CFR §438.402 for Medicaid) — and the skill refuses to proceed.
Getting started
- Upload the payer correspondence — the denial letter, EOB, NOMNC/DENC, CMS IDN, or payer appeal form (Anthem 102082, UHC single-paper reconsideration). PDF, DOCX, or images are all supported.
- Tell the skill which workflow you are starting — “start the appeal intake,” “classify this denial and tell me the deadline,” or “normalize this NOMNC for a QIO review.”
- The skill reads the documents, routes the appeal type, classifies the denial reason, computes the deadline, and presents the normalized record for your approval.
- Confirm anything the skill flagged in
missing[]— typically authorization numbers not printed on the denial letter, or provider NPIs not captured by the source. - On approval, the skill writes
case.jsonto the project root and logs the intake. The letter-of-medical-necessity builder and appeal-letter builder will read this record without modification.
The skill does not draft letters or submit appeals. It is the intake step that makes every downstream draft traceable to a verified source.