Program Integrity · Fraud Waste & Abuse

Detect → Adjudicate → Synthesize

A claims corpus is screened by 22 deterministic detectors against 32 public CMS reference tables. Every dollar allegation is gate-recomputed. LLM reasoning is layered on top — to weigh judgment-required findings, write the investigator narrative, and hunt for novel patterns — but it never introduces a number the deterministic floor didn't produce.

22 detectors 32 reference tables · 37M rows 3 stage snapshots 4 LLM touchpoints

Reference layer reference.duckdb · zero model

32 named tables ingested from cms.gov / oig.hhs.gov / data.cms.gov. Raw files kept on disk for audit and discovery; provenance (sourceUrl, release, rows) recorded per table.

Detect scripts/d01–d22 · zero model · gate-recomputed

Each detector is a pure JS module that emits Findings — every one carries {claimIds, citation:{rule, computed, threshold}, exposureUsd, evidence.sourceRow}. The gate independently re-derives every cited number; non-reproducing findings drop. Output: referrals.detect.json.

tier-1 rule (recoverable $) tier-2 statistical (estimate $) Medicaid-specific LLM-adjudicated

Adjudicate LLM per-finding · D2/D4/D7/D13 only

One agent per judgment-required finding weighs whether the indicator stands or a benign explanation in the claim data dismisses it. Mechanical detectors auto-confirm. May subtract, never add. Output: referrals.adjudicated.json with {status, adjudication:{reason, by, confidence}} on every finding.

D2 unbundling

Was the column-2 service clinically distinct? Would modifier 59 be defensible with documentation?

in: PTP edit row · out: confirmed/downgraded + cited codes

D4 medical-necessity

Is the diagnosis truly non-covered, or does a covered comorbidity on the claim rebut it?

in: coverage article + claim dx · out: confirmed + article ID

D7 outlier

Is the z-score actually anomalous, or explainable practice pattern? Frame as estimate, never recoverable.

in: cohort stats · out: confirmed/downgraded

D13 global-period

Was the E/M unrelated to the surgery (modifier 24 defensible)?

in: PFS GLOB_DAYS row · out: confirmed + modifier analysis

Synthesize LLM per-provider narrative + novel-lead discovery

One agent per provider writes the investigator-facing case from the adjudicated findings — every $ figure audited against the floor. A separate discovery agent hunts cross-provider patterns the detectors don't encode, then a 3-vote adversarial panel tries to refute each lead. Output: referrals.final.json.

Per-provider narrative

Restates each confirmed finding's rule + computed-vs-threshold in "indicators consistent with [scheme]" language; sets priority; pulls verbatim source excerpts.

11 agents · $-audit enforced

Novel-lead discovery

Reads the corpus + detect output, proposes ≤3 patterns NOT covered by D1–D22 (rings, beneficiary-sharing, temporal clustering).

1 agent · no $ allowed

Adversarial verify

3 independent skeptics per lead, each prompted to refute. Survives only on majority confirmation.

3× agents per lead

Render zero model

Self-contained artifacts from referrals.final.json only. Every finding card shows the literal triggering reference-table row inline + a one-row CSV download + the upstream CMS dataset link.

index.html provider-packet-<npi>.html ×N referrals.xlsx cohort-<specialty>.csv srcrow-<table>-<key>.csv

Close the loop HUMAN inline end-of-run prompt → <run-dir>/feedback.jsonl

After the table is rendered, the same skill asks one question: was there anything we missed — a claim that should have fired, a rule we don't have, a pattern you're seeing? The answer is free-form; a small router agent classifies it into one of the channels below and appends a typed record. No separate command, no context switch — the run isn't done until the reviewer has had a chance to teach it.

Confirm / dismiss

Per-finding verdict + free-text reason on any packet card.

→ eval golden set · adjudicator few-shot exemplars

Missed claim

"This claim should have fired" — claim ID + the rule the user believes applies.

→ detector backlog (Dxx candidate) · novel-lead seed

New rule / document

Coverage article, state Medicaid bulletin, payer policy PDF the reference layer lacks.

→ reference.duckdb ingest queue

Novel scheme

A pattern description from the field — "we're seeing X across these NPIs."

→ synthesize discovery prompt · adversarial-verify
FEEDS NEXT RUN — reference layer · detectors · adjudicator · evals
The model adjudicates, narrates, and discovers — but any dollar or rule allegation must trace to a deterministic detect-stage recompute. Adjudicate may dismiss or downgrade a finding (with an auditable reason); it never adds one or changes its dollars. Novel leads carry no exposure $.
The provider packet becomes a living negotiation record. Today it's a one-way report; the natural next step is to make it a shared, iterated document — the same model as a redlined contract or a tracked audit response (engineers will recognize it as a pull request). The payer sends the packet as a structured list of alleged overpayments; against each finding the provider can concede, dispute with evidence (an op note, a modifier justification, a coverage letter), or counter. The payer reviews the responses in the same document. Closing it is the resolution: conceded findings become recoveries, successfully disputed findings become adjudicator exemplars ("benign — documentation supports modifier 59"), and any rule either side surfaces that the detectors don't yet encode gets promoted — deterministically if it can be expressed as a reference-table check, otherwise as an LLM-adjudicated detector. Same channel in, same channel out; the packet is the negotiation, and every closed packet makes the next sweep sharper.
payer → sends packet (8 findings, $42,310) provider → concedes D1·D12 · disputes D2 (attaches op note) · counters D4 ("see LCD L38945") payer → accepts D2 dispute · D4 stands · packet closed system → $31,180 recovered · D2 exemplar saved · L38945 queued for ingest