Triage. Dispute. Resolve. Re-verify.
When attested data and primary-source data disagree, UPP never silently picks a winner. Every mismatch moves through a transparent lifecycle — and every state transition becomes an immutable audit record.
Severity classification
Every discrepancy is classified at open time and re-checked at triage. Severity controls what the packet receiver sees and whether the credential can be sent.
Examples: Casing, punctuation, formatting drift (e.g. 'MD' vs 'M.D.').
Logged for completeness. Does not affect packet send. Auto-resolves on next attestation sync.
Examples: Date drift > 30 days, address mismatch, PECOS revalidation due < 60 days, MOC lapse.
Surfaced on the packet. Committee sees both values + source citation. Requires reviewer acknowledgement before send.
Examples: License status mismatch (active vs suspended), OIG/SAM exclusion hit, identity mismatch, DEA revoked.
Packet cannot be sent until resolved or formally overridden by an org admin with written justification.
Lifecycle & audit mapping
Six phases, each tied to specific audit_logs records and emitted events. Reviewers, providers, and committees can replay the entire chain from the packet view.
- 01
Detect & open
Monitoring worker or PSV matchA monitoring sweep or a fresh PSV result detects a mismatch. The system classifies severity and opens a discrepancy with both values, source citation, and timestamp.
Audit recordsaudit.discrepancy.openedField, attested value, source value, severity, source id, detected_at.
Events emitteddiscrepancy.opened{ discrepancy_id, provider_id, field, severity, source }
- 02
Triage & assign
Credentialing specialistA specialist reviews the discrepancy, confirms severity (or re-classifies), and assigns an owner. Triage notes are captured as part of the event record.
Audit recordsaudit.discrepancy.triagedfrom_status=open, to_status=triaged, reviewer, reclassification reason.audit.discrepancy.assignedassignee_user_id, assigned_at.
Events emitteddiscrepancy.triaged{ discrepancy_id, severity_changed, note }
- 03
Provider dispute (optional)
ProviderThe provider sees the discrepancy in their wallet and can either update their attestation or dispute the source value. Disputes attach evidence (e.g. updated COI, board letter) without overwriting the source field.
Audit recordsaudit.discrepancy.disputedDispute reason, evidence attachments[], provider statement.audit.discrepancy.evidence_addedEvidence hash, content type, uploader, retrieved_at.
Events emitteddiscrepancy.disputed{ discrepancy_id, evidence_count, reason }
- 04
Re-verify against source
PSV worker (HSM-backed)A targeted PSV job re-queries the primary source. If the source agrees with the attestation, the discrepancy auto-resolves. If the source confirms its original value, the discrepancy stays open with the new evidence attached.
Audit recordsaudit.discrepancy.reverification_requestedPSV job id, source, requested_by.audit.discrepancy.reverifiedSource response hash, agreement bool, signed credential id.
Events emitteddiscrepancy.reverification_requested{ discrepancy_id, job_id }discrepancy.reverified{ discrepancy_id, agreement, credential_id }
- 05
Resolve or dismiss
Reviewer or auto-resolveResolution records who resolved it, the resolution notes, and the new authoritative value. Dismissal (for false-positive monitoring hits) records the rationale and the reviewer who dismissed it.
Audit recordsaudit.discrepancy.resolvedresolved_by, resolved_at, resolution_notes, final_value.audit.discrepancy.dismisseddismissed_by, dismissal_reason.
Events emitteddiscrepancy.resolved{ discrepancy_id, final_value, resolution_notes }discrepancy.dismissed{ discrepancy_id, reason }
- 06
Audit & export
audit_logs (append-only)Every state transition above is mirrored into audit_logs with actor, IP, request id, and a SHA-256 link to the previous entry. The full discrepancy lifecycle is exportable as signed JSON for NCQA file review or legal hold.
Audit recordsaudit.discrepancy.exportedExport id, requestor, scope, signature key id.
Events emittedaudit.exported{ scope:'discrepancy', id, sig }
What UPP guarantees
Never silently reconciled
UPP does not rewrite the attestation to match the source, or the source to match the attestation. Both values stay visible until a human resolves.
Receiver sees the full history
Packets shared with a hospital or payer include the complete discrepancy timeline — not a sanitized snapshot.
Every transition is logged
Open, triage, dispute, re-verify, resolve, dismiss — each becomes an audit_logs entry with actor, IP, and hash-chained integrity.
Override requires justification
Blocking discrepancies can only be overridden by an org admin, and the override itself is a first-class audit record with written rationale.
See discrepancies in your own packet.
Open a passport and watch every mismatch surface with full provenance — and a clear path to resolution.

