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 2Direction: 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 LayerDirection: 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 LayerDirection: 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).