Skip to main content
Spec: PM-29
Status: 📝 Planned
Last Updated: 2026-03-02
Owner: PM Core

Overview

PM-29 introduces the denial management and appeals workflow. It integrates with multiple PM specs (claim status, ERA, prior auth, analytics, scrubbing), PF-29 (tasks), and PF-70 (code library). All integrations are within the PM core or via the Platform Integration Layer; no direct cross-core imports.

Integration Points

PM-08 — Claims Management & Submission

Pattern: Data (same core)
Direction: PM-29 → PM-08 (reads claim data; triggers resubmission)
Contract: Internal same-core data access. No event contract needed.

PM-09 — Payment Posting & ERA Processing

Pattern: Data (same core)
Direction: PM-09 → PM-29 (denial intake from ERA)
Contract: Internal same-core function call. pm_claim_denials insert triggered by PM-09 ERA posting logic.

PM-10 — Prior Authorization Management

Pattern: Data (same core)
Direction: PM-29 reads PM-10 data for auth-denial linking
Contract: Internal same-core FK read. No event contract needed.

PM-11 — Revenue Cycle Dashboard & Analytics

Pattern: Data / Platform Layer (same core)
Direction: PM-29 → PM-11 (denial metrics feed)
Contract: Internal same-core data reads. Queries defined in PM-29 analytics hooks; consumed by PM-11 dashboard.

PM-18 — Configurable Claim Scrubbing (Phase 2)

Pattern: Data (same core) — Deferred to Phase 2
Direction: PM-29 → PM-18 (denial pattern → scrub rule suggestions)
Status: Deferred to Phase 2. No contract defined at PM-29 MVP. See specs/DEFERRED_DASHBOARD.md for tracking.

PF-29 — Tasks

Pattern: Platform Layer
Direction: PM-29 → PF-29 (auto-creates follow-up task on appeal submission)
Status: ✅ Contract resolved — PF-29 is Complete; @/platform/tasks TaskInsert type is canonical.
Payload (auto-task on appeal submit):
source_type registration: Add 'pm_appeal' to the TaskSourceType union in src/platform/tasks/types.ts. This extends the existing string open union; add it as a named literal for type safety and filtering. due_date conversion note: payer_appeal_deadline is stored as TIMESTAMPTZ. Convert to DATE string (YYYY-MM-DD in org timezone) before passing to due_date: DATE on pf_tasks. Use formatInUserTimeZone(deadline, 'yyyy-MM-dd') from @/platform/forms.

PF-70 — Medical Terminology Code Libraries

Pattern: Platform Layer
Direction: PM-29 reads PF-70 for CARC/RARC code descriptions
Contract: Read-only platform layer query. See PF-70 Integration.

Platform Layer Usage


Events

PM-29 does not publish events at MVP. Potential future events (Phase 2+):

Security & Tenancy

  • All tables RLS-protected with pm_has_org_access(organization_id, auth.uid()).
  • No PHI in logs or event payloads.
  • Permission keys: pm.denials.view, pm.denials.manage, pm.appeals.submit.
  • Template letter HTML: merge fields HTML-escaped before insertion (XSS prevention).

Pending Contracts