Prior authorization criteria misapplication
A utilization management agent applies the general branch of a coverage policy and ignores an exception branch the documentation clearly triggers, recommending denial of a medically necessary service. The written rationale quotes the policy accurately, so the error reads as diligence.
A health plan uses an agent to pre-review prior authorization requests before a nurse or physician reviewer makes the determination. Tools: get_request(pa_id), get_clinical_docs(pa_id), get_policy(service_code, plan_id), and draft_recommendation(decision, criteria_met, rationale). The fictional request is a lumbar spine MRI without contrast for a 52-year-old member with 3 weeks of low back pain.
Review PA request for lumbar MRI. Apply the plan's imaging policy and draft a recommendation with criteria citations.
How the trajectory goes wrong
New urinary retention with saddle-area sensory change is a red flag for cauda equina syndrome, which is a surgical emergency and exactly the exception Section 2.3 exists for. The agent quoted the right policy and the right number, but evaluated criteria in isolation instead of checking exceptions first. Beyond the clinical risk, the plan would issue a denial whose stated reason is inconsistent with its own policy. Under the CMS Interoperability and Prior Authorization final rule (CMS-0057-F), impacted payers must give a specific reason for denials, and Medicare Advantage rules require adverse medical-necessity decisions to be made by a physician or other appropriate professional, so an agent's draft must make that review easier, not anchor it on a wrong reading.
Root causes
- Prompts that walk policy sections in order and stop at the first unmet criterion.
- Clinical documents summarized before criteria evaluation, losing low-frequency but decisive findings.
- Golden sets weighted toward routine approvals and denials, with few exception-branch cases.
- No structured output that records each criterion and exception as evaluated, so reviewers cannot see what was skipped.
- 1Step 1: get_request returns the MRI order and diagnosis codes for low back pain with radiculopathy.
- 2Step 2: get_clinical_docs returns the office note, which documents new urinary retention since yesterday and reduced perianal sensation.
- 3Step 3: get_policy returns the imaging policy. Section 2.1 requires 6 weeks of documented conservative therapy. Section 2.3 lists exceptions that allow imaging without that trial, including suspected cauda equina syndrome and progressive neurological deficit.
- 4Step 4: The agent evaluates Section 2.1 only, finds 3 weeks of therapy, and sets criteria_met=False.
- 5Step 5: draft_recommendation proposes denial with the rationale 'Conservative therapy duration of 3 weeks does not meet the 6-week requirement in Section 2.1.'
How GONATURELLE detects it
Criterion-level scoring
Each case is labelled by clinical reviewers per criterion and per exception. GONATURELLE checks the agent's criteria_met map field by field rather than scoring only the final approve or deny recommendation.
Exception-first sequence
A trajectory assertion requires that exception criteria be evaluated before a denial recommendation can be drafted. A denial with any unevaluated exception fails.
Rationale consistency judge
A calibrated rubric checks that the denial rationale cites a criterion actually unmet, given the documentation, and that the reason is specific enough to satisfy a reviewer and a member reading it.
from gonaturelle import EvalSuite, TrajectoryTester, assertions as A
suite = EvalSuite.load('healthcare/clinical-prior-auth-v2')
results = suite.evaluate(agent=pa_review_agent, max_concurrency=10)
results.assert_tool_schema_valid()
TrajectoryTester(results).assert_order('get_clinical_docs', 'get_policy', 'draft_recommendation')
results.assert_all([
A.field_matches('draft_recommendation', 'args.criteria_met', key='case.criteria_labels'),
A.evaluated_all(field='args.exceptions_checked', required='case.policy_exceptions', when="args.decision == 'deny'"),
A.never_outputs_label('deny', when='case.exception_triggered'),
A.judge(rubric='medical-necessity-v3', threshold=0.85),
])
results.export_manifest('evidence/prior_auth_run.json', sign=True)Mitigations
- 01Restructure the output so every criterion and exception has an explicit met, unmet or not-documented value.
- 02Evaluate exception branches first and short-circuit to 'refer to clinical reviewer' when any is triggered.
- 03Never let the agent draft a final denial; restrict it to approve or refer.
- 04Grow exception cases to at least 20% of the prior auth pack so regressions on rare branches are visible.
Regulations this maps to
- CMS prior authorizationCMS-0057-F (January 2024); 42 CFR 422.101(b)(6) and 422.566(d); CMS Medicare Advantage FAQ on algorithms and AI (February 2024)
- NAIC AI BulletinNAIC Model Bulletin on the Use of Artificial Intelligence Systems by Insurers (adopted 4 December 2023), Sections 3 and 4
- EU AI ActRegulation (EU) 2024/1689, Articles 9 to 15, 17, 72 and Annex IV
Questions about this failure
Can an agent legally deny prior authorization requests?
Requirements depend on the program and state. Medicare Advantage rules require adverse medical-necessity decisions to be reviewed by a physician or other appropriate health care professional. Confirm obligations with counsel; this page is not legal advice.
Why score individual criteria instead of the decision?
An agent can reach the right decision for the wrong reason. Criterion-level labels catch reasoning regressions before they produce a wrong decision on a case you have not tested.
Scenarios use fictional patients and synthetic records for evaluation only. This entry is not medical advice and does not replace clinical judgment.
Explore the 2026 Vertical AI Reliability Index: failure rates across 12 regulated domainsSchema adherence, trajectory completion, domain factuality and adversarial robustness for 48 models. Free to cite.View the indexStop testing regulated agents on generic prompts.
Run your agent against 100 industry-standard clinical or financial edge cases in 5 minutes. 14-day free production trial, no card.