LogicPearl
Prior authorization workbench
← logicpearl.com
CASE
Select a case
{{ g.number }} {{ g.title }} {{ g.lob }}
{{ g.notLoaded }}
{{ policyCode }} {{ policyTitle }}
/ {{ policyMeta }} {{ policyLob }} · plan matches ✓
Disposition {{ disposition }}
Loading policy library...
OCR artifact setup required
{{ loadError }}
{{ storyCounterLabel }}
The work

Prior authorization doesn't start with a decision. It starts with a mess.

{{ p.title }}
Your UM platform

How is your platform handling this today?

UM platform · orchestration
{{ s.name }}
{{ s.fn }}
Credibility proof

A reviewer can see the case and the policy at the same time.

This is why we are confident in the coverage numbers: the result is traceable from request, to packet evidence, to policy criteria, to reviewer route.

{{ f.k }} {{ f.v }}
Submitted documents
{{ d.text }}
What it enables
A reviewer can trust the path from source policy to case outcome.
Why it matters
Weak or missing evidence routes to review instead of becoming a silent decision.
So what?
Your team gets a reviewer-checkable result, not another black-box recommendation.
AI baseline · recorded, not live

Same packet. Same exact policy. The models don't agree, and neither do their reasons.

Best-case setup: full policy text in context, no retrieval failure. {{ modelDeterminations }} determinations across {{ modelGroupCount }} model groups: {{ modelApprovals }} approve, {{ modelDenials }} deny.

On one packet and the exact same policy, the answer swings on which model you happened to ask: denials that should have cleared, approvals that shouldn't have, and an appeal waiting behind each one.
Model choice is not a clinical policy. At scale, that variance is rework, leakage, and audit exposure.
Representative groups: 4 of {{ modelGroupCount }}
{{ g.name }}
{{ g.rationale }}
The reasons don't hold still either
{{ aiDrift.caption }}
{{ aiDrift.model }} · run {{ r.n }} {{ r.verdict }} {{ r.reason }}
The risk is letting a generated rationale stand in for source policy review. LogicPearl extracts the case evidence, applies the source policy criteria, and keeps a replayable policy check before the final coverage decision.
The appeal trap

Deny on the wrong reason, and the appeal becomes a compliance problem.

On appeal, a payer must stand behind the reason it originally gave. Introduce a new rationale or new evidence mid-appeal and federal rules (ACA, ERISA) require disclosing it to the member with a fair chance to respond before any final decision.

You can't defend a denial with a reason you never gave. Move the goalposts mid-appeal and the law makes you start over: new disclosure, new clock, new exposure.
~90%
of appealed denials overturned
When most denials reverse on appeal, every shaky denial is rework you lose twice. The overturn rate feeds CMS Star Ratings, which drive bonus payments and enrollment.
And when the reason itself drifts run-to-run, as it just did, every appeal is a goalpost waiting to move. LogicPearl locks one source-bound rationale to each decision and replays it on demand.

Next Steps

Replay

Reproducible by design.

A reviewer should be able to explain the case today and get the same answer later. Replay proof makes shadow testing concrete before anything changes in production.

{{ r.label }}
{{ r.title }}
{{ r.body }}
June release example
{{ replayChangeCase.member }}
{{ replayChangeCase.policy }}
{{ replayChangeCase.summary }}
Run a bounded case batch in shadow mode beside your current process, compare outcomes with reviewer effort, and keep production behavior unchanged until the evidence is strong enough.
{{ storyCounterLabel }}
{{ ckReviewSummary.action }} {{ ckReviewSummary.reason }}
Next {{ ckReviewSummary.nextAction }}
Submitted packet {{ ckActiveDocKind }} · {{ ckActiveDocMeta }}
All matching locations {{ ckPacketEvidenceSummary }}
No supporting packet evidence found for the selected criterion in this packet.
{{ ckActiveDocTitle }} {{ ckPacketPageNum }} / {{ ckPacketPageTotal }}
{{ ckPacketImageNode }}
{{ ckPacketPdfSource }} submitted packet
{{ ckPacketNodes }}
Source policy {{ ckPolicySrcFile }}
Selected source {{ ckPolicyExcerptRef }} {{ ckPolicyExcerpt }}
{{ ckPolicyNo }} · source PDF {{ ckPolicyPageNum }} / {{ ckPolicyPageTotal }}
{{ ckPolicyPdfSource }}
{{ ckPolicyPdfMatch }}
{{ ckPolicyNo }} {{ ckPolicyPageNum }} / {{ ckPolicyPageTotal }}
{{ ckPolicySection }}
{{ ckPolicyHeading }}
{{ ckPolicyNodes }}
Source document · text fallback BCBSMA
Clinical review worksheet {{ ckExplain.statusLabel }} · {{ ckExplain.effectLabel }} Evidence needs review
{{ ckExplain.label }}
Packet shows {{ ckExplain.packetEvidenceSummary }}
{{ e.pageLabel }} {{ e.evidenceKind }} {{ e.matchBasis }}
{{ e.quote }}
{{ e.qaBasis }}
{{ e.reviewStatusLabel }}
{{ ckExplain.packetQuote }}
Policy requires {{ ckExplain.policyRef }}
{{ ckExplain.policyQuote }}
Policy trace
{{ ckExplain.policyTrace }}
Match basis
{{ ckExplain.matchBasisSummary }}
Policy criteria & review quality

From policy text to reviewable, source-bound criteria.

{{ fxStatus }}
{{ m.v }}
{{ m.l }}

Policy conversion

{{ fxConversion.criterionLabel }}

How one policy clause becomes a verified policy check. Select any criterion below to change this view.

1 · Source policy
Policy {{ fxPolicyNumber }} {{ fxConversion.clausePage }}
{{ fxConversion.clauseRef }}
{{ fxConversion.clauseQuote }}
2 · Clinical requirement
{{ fxConversion.requirement }}
Accepted
✓ {{ a }}
Does not count
✕ {{ e }}
3 · Policy check
{{ fxConversion.ruleSummary }}
{{ fxConversion.ruleDetail }}
{{ p.label }} {{ p.value }}

Reviewable criteria

{{ fxRuleHeader.phase }} · {{ fxRuleHeader.determination }}
{{ b.label }}
{{ p.label }} {{ p.value }}
Policy clause · {{ r.clauseRef }}
{{ r.clauseQuote }}
What counts
{{ a }}
Does not count
{{ e }}
Reviewer check · {{ r.reviewerCheck }}
{{ t.statusLabel }}

Why source-policy checks go beyond an AI checklist

Not a critique of AI. A comparison of free-text review against source-policy criteria.

AI-drafted logic LogicPearl check
{{ cmp.axis }} {{ cmp.ai }} {{ cmp.lp }}

Coverage & gap accounting

{{ fxCoverage.corpus }}%
measured policy-library clause coverage
{{ fxCoverage.uncovered }}
uncovered clauses
{{ fxCoverage.blockers }}
open review items
Misses and open items become reviewer work queues, never silent omissions.
Interactive scenarios

Library snapshot

Current extractor readiness across the BCBSMA policy library.

refreshed corpus
{{ m.v }}
{{ m.l }}
{{ m.note }}

Packet wording and policy wording rarely match. Each mapping carries explicit provenance, and the assurance boundary is visible, not hidden.

{{ tp.packet }}
{{ tp.policy }}
via {{ tp.via }} · {{ tp.note }}
{{ tp.tierLabel }}
{{ ta.v }}
{{ ta.l }}

Policy-library readiness by family. Scale and unfinished work are both visible because hiding gaps would weaken trust.

{{ hm.family }} {{ hm.statusLabel }}
{{ hm.coverage }}
{{ hm.policies }} policies {{ hm.openItemLabel }}

The work only humans should resolve: routed, not guessed. Each item links to its policy source, affected criterion, and proposed next step.

{{ q.sevLabel }} {{ q.type }} {{ q.ref }}
{{ q.label }}
{{ q.detail }}
{{ q.action }}

Line of business scope

A packet is evaluated only against the source policy set matching its plan's line of business. Medicare and Medicaid are governed by separate policy packs and rules.

{{ fxPolicyLob }} loaded
This policy pack. Member plan {{ fxMemberPlan }} matches, so the packet is reviewed against this source policy set.
{{ l.lob }} separate pack
{{ l.note }}
Production-readiness boundaries
{{ b }}
{{ ovTitle }}
Generated UAT case
{{ ovPlethCase.member }}
{{ ovPlethCase.service }}
{{ ovPlethCase.packet }}
Why it should pass now
{{ ovPlethCase.indication }}
{{ ovPlethCase.policyLine }}
{{ v.label }}
{{ v.date }}
{{ v.outcome }}
{{ v.reason }}
Flip Route to review -> Meets Policy 239
The same packet flips only because the source set now contains Policy 239. The case facts did not change.
{{ r.k }} {{ r.v }}
{{ ovVarTotals.determinations }}
determinations
{{ ovVarTotals.approvals }}
approve
{{ ovVarTotals.denials }}
deny
{{ ovVarNote }} · {{ ovVarCost }}
{{ g.name }} {{ run.label }}
{{ g.rationale }}
{{ ovDiffFrom }} {{ ovDiffTo }}
{{ ovDiffLabel }}
{{ ch.kindLabel }} {{ ch.label }} {{ ch.rule }}
{{ ch.before }} {{ ch.after }}
{{ ch.impact }}
Shadow-case flips
{{ f.caseId }} {{ f.chipLabel }} {{ f.note }}
{{ ovFlipData.changedLabel }}
{{ ovFlipData.policyRef }}
{{ ovFlipData.left.caseLabel }}
{{ ovFlipData.left.value }}
{{ ovFlipData.left.statusLabel }}
"{{ ovFlipData.left.quote }}"
{{ ovFlipData.left.disposition }}
{{ ovFlipData.right.caseLabel }}
{{ ovFlipData.right.value }}
{{ ovFlipData.right.statusLabel }}
"{{ ovFlipData.right.quote }}"
{{ ovFlipData.right.disposition }}
{{ ovFlipData.note }}
Missing criterion · {{ ovReq.criterionLabel }}
{{ ovReq.requirement }}
Packet gap
{{ ovReq.packetGap }}
Generated request draft
{{ ovReqDraft }}
Draft only, not a regulated notice. Sending requires an approved template and signoff.