Trigger or review auto-corrections
Outcome
You know which denials the platform fixes automatically, you can confirm an attempt's outcome, and you can manually trigger or override the engine when the default behavior doesn't fit a specific case.
Prerequisites
| Scope | What it lets you do |
|---|---|
billing.denial.read | View Auto-correction tab |
billing.auto-correction.run | Trigger the engine; force-retry a SUCCESS |
Familiarity with denials triage (2.2) and CARC/RARC codes (8.3).
Built-in handlers
| CARC | Handler | What it does |
|---|---|---|
CO-4 | CO4ModifierHandler | Adds the missing modifier per modifier injection rules; rebills. |
CO-16 | CO16MissingInfoHandler | Reads the RARC for the missing item; attaches the relevant auth or hint; rebills. |
CO-18 | CO18DuplicateHandler | Confirms the duplicate via claim_relationship; closes the duplicate denial. |
CO-29 | CO29TimelyFilingHandler | Files a late-filing appeal where contractual rules permit; otherwise marks for manual write-off. |
CO-97 | CO97BundleHandler | Re-codes the bundled line per CCI; rebills. |
CO-197 | CO16MissingInfoHandler | Re-runs with auth attached. |
PR-1 / PR-2 / PR-3 | (posted automatically by ERA) | Routed to patient AR; not denial-engine cases. |
The handler registry is configured at createDenialModule boot time; the
list above is what ships in the platform.
Where to see attempts
/denials/:id → Auto-correction tab. Each attempt is one row:
| Column | Meaning |
|---|---|
| When | Timestamp of the attempt. |
| Handler | Which handler ran. |
| Status | SUCCESS, FAILED, SKIPPED. |
| Replacement claim | Link to the rebilled claim, if a rebill was generated. |
| Notes | Engine output — why it skipped, or which fix was applied. |
A denial can have multiple rows if the engine has retried, but only one
non-FAILED attempt per (denial, handler) — the partial-unique index
prevents a duplicate SUCCESS.
Steps to manually trigger
Open the denial at
/denials/:id.Open the Auto-correction tab. If the engine hasn't run, click
Run handlers. If aFAILEDattempt is visible, clickRetry.Force-retry past a SUCCESS with the
Force retrybutton. This overrides the partial-unique index and runs the handler again — useful if a payer reversed their decision and you want to retry the chain. Audit logged with the force flag.Override the suggested handler with the dropdown next to
Run. Pick a specific handler from the list. The engine runs only that handler against the denial; if its preconditions are not met, it returnsSKIPPED.
Steps to override or disable
If a handler is producing bad rebills for a specific payer:
Open
Configuration → Rulesand pickPOST_REMITTANCEfor the kind.Find the rule set scoped to that payer. Add or edit a
denial_classifierrule that returnsSKIPfor the CARC + handler combo you want to suppress.Submit / approve / publish. Future denials matching the scope skip the offending handler; existing attempts are not retroactively undone.
Auto-correction success rate
The dashboard panel Auto-correction success rate (Reporting category)
aggregates mv_auto_correction_success_rate and shows the percentage of
denials resolved without manual intervention, broken out by handler.
A handler dropping below 70% is a signal that something has changed at the payer — usually a companion guide update — and the handler logic needs review.
Validation
| Check | Expected |
|---|---|
| Triggered attempt completes within 30s | Yes — handlers are synchronous. |
SUCCESS produces a child claim | Yes; visible in the Replacement claim column and on the denial's Original claim → Relationships tab. |
FAILED attempt records reason in Notes | Yes. |
| Force retry past SUCCESS audited | Yes — the audit row carries force=true. |
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
Run handlers returns "no handler matched" | The CARC has no registered handler | This denial requires manual handling — appeal or write-off. |
Handler returns SKIPPED with "missing precondition" | The denial lacks data the handler needs (auth, alternate modifier, patient liability split) | Manually supply the missing data on the original claim, then retry. |
| Same denial keeps being retried | A scheduled retry job is firing | Open the Auto-correction tab; click Cancel retries to stop the loop. |
| Replacement claim links back to a different parent | The chain has multiple corrections | Use Original claim → Relationships tab to walk the full lineage. |