healthcare: verify CMS-10114 update path, correct NPI Enumerator address, build CMS-10114 filler

Verified firsthand against the live CMS-10114 (Rev. 02/25, OMB 0938-0931):
- Section 1A confirms paper is valid for Change of Information (#2) AND
  Reactivation (#4), not just initial enumeration. Resolves the UNCERTAIN flag.
- Current mailing address is CMS NPI Enumerator Services, Mail Stop DO-01-51,
  7500 Security Blvd, Baltimore MD 21244. The old Fargo PO Box 6059 is retired;
  corrected in mac_routing.NPI_ENUMERATOR + all docs.
- No electronic no-login equivalent exists for CMS (NPI Registry API is
  read-only; PECOS/NPPES-IA require login), unlike FMCSA's ask.fmcsa ticket form.
  So tiers stay: Standard=paper CMS-10114 (no login), Expedited=NPPES surrogate.

New: cms10114_pdf_filler.py fills the flat official form via text overlay
(reason checkbox + NPI + Section 2A identity + Section 4A cert name + signature
anchor); wired into npi_provider._generate_10114_for_signing for nppes-update.
Signed forms route to the NPI Enumerator via the existing daily batch.

Tests: test_cms10114.py 27/27, test_paper_batch.py 15/15, Astro build 58 pages.
This commit is contained in:
justin 2026-06-07 02:04:41 -05:00
parent f9c294e962
commit e6a630ada1
10 changed files with 540 additions and 48 deletions

BIN
docs/CMS-10114 Form.pdf Normal file

Binary file not shown.

View file

@ -49,22 +49,42 @@ Internal capability map. Confirms how each healthcare service is fulfilled with
- Paper-to-MAC, original signatures, routed by state. "Sign and date section 8
using ink."
### NPPES data update / NPI reactivation (CMS-10114 paper path) [PARTIAL]
- 855I confirms NPI is obtained/changed via NPPES and "you may apply **online** at
NPPES.cms.hhs.gov" — implies the online path; the paper CMS-10114 to the NPI
Enumerator (PO Box 6059, Fargo ND 58108-6059) is the documented paper
alternative per the existing `healthcare-no-login-value-add.md` (NPI Enumerator
800-465-3203).
- **UNCERTAIN (verify before relying on it as the sole standard path):** whether
CMS still accepts paper CMS-10114 for *updates/reactivation* (vs initial
enumeration only) today. Could not reach the live CMS-10114 instruction from
this host (search engines blocked, direct URLs 404).
- **Decision:** for NPPES-only services, offer Expedited (surrogate → file in
NPPES online) as the primary fast path, and the CMS-10114 paper path as the
Standard fallback. Confirm the CMS-10114-for-changes acceptance + obtain the
current form PDF before building `cms10114_pdf_filler.py`. Until confirmed, the
honest Standard fallback for a declined-surrogate NPPES update may be "we
prepare it and guide the one-step online submission" — TBD on verification.
### NPPES data update / NPI reactivation (CMS-10114 paper path) [CONFIRMED]
- **VERIFIED firsthand** against the live CMS-10114 PDF (Rev. 02/25, OMB
0938-0931, exp. 03/2028) downloaded from
`cms.gov/Medicare/CMS-Forms/CMS-Forms/downloads/CMS10114.pdf`, and the CMS
"How to Apply" page which titles it the **"NPI Application/Update Form"**.
- The form's Section 1A "Reason for Submittal" has four checkboxes:
**#1 Initial Application, #2 Change of Information, #3 Deactivation,
#4 Reactivation** — all completed on the SAME paper form, each requiring a
signed + dated certification (Section 4A individual / 4B organization).
Verbatim: *"If changing information, check box #2... then sign and date the
certification... All changes must be reported to the NPI Enumerator within 30
days."* and *"If you are reactivating the NPI, check box #4... Sign and date
the certification."*
- So paper CMS-10114 is a valid no-login path for **changes AND reactivation**,
not just initial enumeration. UNCERTAIN flag resolved.
- **Mailing address (current, printed on the form page 5):**
```
CMS NPI Enumerator Services
Mail Stop DO-01-51
7500 Security Blvd.
Baltimore, MD 21244
```
The previously-documented **Fargo, ND PO Box 6059 address is RETIRED** — code
(`mac_routing.NPI_ENUMERATOR`) and docs updated to the Baltimore address.
Enumerator phone for questions: 1-800-465-3203.
- **No electronic no-login equivalent exists for CMS.** Unlike FMCSA (whose
`ask.fmcsa.dot.gov/app/ticket` accepts an MCS-150 update + attachments with no
account), CMS has no public web form to submit an NPPES change without a login.
Probed live: the NPI Registry API (`npiregistry.cms.hhs.gov/api`) is
**read-only lookup**; PECOS and NPPES I&A both require login. Therefore for
NPPES changes the two genuine tiers are: **Standard = paper CMS-10114 to
Baltimore (no login)**, **Expedited = surrogate files in NPPES online**.
- **Decision (updated):** offer Expedited (surrogate → NPPES online) as the fast
path and the CMS-10114 paper-to-Baltimore path as the Standard default. Build
`cms10114_pdf_filler.py` to produce the signable form (Reason checkbox driven
by service: change vs reactivation vs deactivation).
## CMS I&A Surrogate (Expedited path)
- Provider adds Performance West as a **Surrogate** in CMS I&A; we then file in
@ -78,14 +98,14 @@ Internal capability map. Confirms how each healthcare service is fulfilled with
| Medicare revalidation | 855I/B → MAC, client signs | file in PECOS | 855B yes |
| Medicare enrollment | 855I/B/O → MAC, client signs | file in PECOS | 855B yes |
| NPI reactivation | 855I → MAC (reactivation reason) | PECOS/NPPES | no |
| NPPES data update | CMS-10114 → Fargo *(verify)* | NPPES online | no |
| NPPES data update | CMS-10114 → NPI Enumerator (Baltimore), client signs | NPPES online | no |
| OIG/SAM screening | public DBs, **zero client action** | n/a (no portal) | no |
| Provider compliance bundle | spawns reval + screening + NPPES | mixed | per-piece |
## Daily batch (Standard-path mailing)
Each **postal working day morning** (skip weekends + USPS/federal holidays — use
`scripts/workers/business_days.py` calendar): gather all signed+pending paper
filings, **group by destination agency** (each MAC; NPI Enumerator Fargo; each
filings, **group by destination agency** (each MAC; NPI Enumerator Baltimore; each
state agency), merge each group into ONE print job + a cover sheet (PW sender,
destination, date, enclosed count, per-item order#/provider/NPI/form), one
**Priority Mail** envelope per agency. Mark each order mailed with batch date +
@ -100,9 +120,17 @@ Certification. Need a **state → MAC → mailing-address** table to address env
## Implementation status (built + validated)
- **mac_routing.py** — state→MAC (56 jurisdictions, 12 destinations) +
NPI_ENUMERATOR (Fargo). Addresses marked VERIFY before first live mail.
NPI_ENUMERATOR (NPI Enumerator Services, Baltimore MD — VERIFIED from CMS-10114
Rev. 02/25). MAC addresses still marked VERIFY before first live mail.
- **npi_provider.py** — two-tier `access` strings; NPPES update/reactivation no
longer "online-only"; surrogate answer surfaced in the admin todo.
longer "online-only"; surrogate answer surfaced in the admin todo. nppes-update
now generates the CMS-10114 for e-signature (Standard path) via
`_generate_10114_for_signing`.
- **cms10114_pdf_filler.py** — fills the official CMS-10114 (flat PDF, text
overlay): reason checkbox (change/reactivation/deactivation) + NPI + Section 2A
identity + Section 4A certification name, with a signature anchor on the cert
line. The signed form joins the daily batch to the NPI Enumerator (Baltimore).
`test_cms10114.py` 27/27 pass.
- **checkout.ts + service pages + intake** — client-facing copy stripped of
mechanics; surrogate is the only optional, positively-framed ask (faster,
never required, never share password, never mentions paper). Astro build green.
@ -118,9 +146,12 @@ Certification. Need a **state → MAC → mailing-address** table to address env
## TODO before first live mail (manual / verify)
1. Fill the real MAC provider-enrollment PO Box addresses in `mac_routing.py`
(marked VERIFY) from each MAC's current enrollment page.
2. Confirm CMS-10114 paper-for-changes acceptance + obtain the form PDF, then
build `cms10114_pdf_filler.py` for the NPPES Standard path (until then
nppes-update falls to surrogate/manual).
2. ~~Confirm CMS-10114 paper-for-changes acceptance + obtain the form PDF~~
~~build `cms10114_pdf_filler.py`~~ **DONE** — verified against CMS-10114
Rev. 02/25 (address = NPI Enumerator Services, Baltimore MD); filler built +
wired into `npi_provider._generate_10114_for_signing`; `test_cms10114.py`
27/27 pass. Remaining nicety: org (Entity Type 2 / Section 4B) overlay path
(currently flagged for manual completion when NPI-2 detected).
3. Run migration 089 on the DB; confirm the worker picks up a signed test filing
and produces the per-agency cover + merged PDF in MinIO.
4. Phase 2: wire a print-mail API (Lob/Click2Mail) to auto-mail the merged PDF

View file

@ -12,7 +12,7 @@ single paper form (or e-sign), and we file it by mail or as the preparer.
| Service | Paper/no-login path | Provider's only job | Verified source |
|---|---|---|---|
| **Medicare PECOS Revalidation** | CMS-855I/855B/855A **paper** application mailed to the provider's **MAC** (revalidation is a checkbox reason in Section 1A). | **Sign** the form (wet/original signature). We prepare 100% of it. | CMS-855I: "submit your application with **original signatures**… to your designated MAC… by mail." |
| **NPPES / NPI data update** (address, taxonomy, contact) | **CMS-10114** paper NPI Application/Update mailed to the **NPI Enumerator, PO Box 6059, Fargo, ND 58108-6059**; Enumerator staff key it into NPPES. | Sign the paper form. **No NPPES/I&A login at all.** | NPI Enumerator paper process (PO Box 6059, Fargo ND; 800-465-3203). |
| **NPPES / NPI data update** (address, taxonomy, contact) | **CMS-10114** paper NPI Application/Update mailed to the **NPI Enumerator (CMS NPI Enumerator Services, 7500 Security Blvd, Baltimore, MD 21244)**; Enumerator staff key it into NPPES. | Sign the paper form. **No NPPES/I&A login at all.** | NPI Enumerator paper process (Baltimore, MD; 800-465-3203; CMS-10114 Rev. 02/25). |
| **NPI Reactivation / enrollment reactivation** | Same paper-855 path to the MAC (reactivation is a Section 1A reason). | Sign. | CMS-855 instructions. |
| **Medicare Enrollment (new)** | Paper CMS-855I/855B to the MAC with original signature. | Sign + provide info. | CMS-855I. |
| **OIG / SAM Exclusion Screening** | We screen against the **public** OIG LEIE + SAM.gov databases by name/NPI. | **Nothing — zero provider involvement.** No login, no signature. | OIG LEIE + SAM.gov are public federal databases. |
@ -39,7 +39,7 @@ time of navigating CMS portals. Our differentiator:
> website. (For exclusion screening you don't even sign — we just do it.)
## Mailing destinations (for credibility in copy)
- NPI/NPPES paper: **NPI Enumerator, PO Box 6059, Fargo, ND 58108-6059**
- NPI/NPPES paper: **CMS NPI Enumerator Services, Mail Stop DO-01-51, 7500 Security Blvd, Baltimore, MD 21244**
- 855 enrollment/revalidation: the provider's **MAC** (varies by state/jurisdiction;
we determine and route it).

View file

@ -5,7 +5,7 @@ the "paper" alternative is NEVER surfaced to the client):
- **Standard service (default):** we handle the filing end-to-end. Client signs
ONE certification and we submit + track to confirmation. (Internally this is the
paper path — 855 to the MAC, CMS-10114 to the NPI Enumerator in Fargo — but we
paper path — 855 to the MAC, CMS-10114 to the NPI Enumerator (Baltimore MD) — but we
never say "paper" to the client; it's just "we file it for you.")
- **Expedited (faster, framed positively at intake):** we ask if they can
**electronically grant us CMS I&A Surrogate access**. We position this as
@ -28,11 +28,11 @@ surrogate as *required* when a paper path exists; paper is always the default.
- `api/src/routes/checkout.ts` (~L2155-2207) — already has the two-tier copy, BUT
treats NPPES update/reactivation as **"online-only, surrogate required"** with
NO standard fallback (`NPPES_ONLY_SLUGS`, `hasNppesOnly`). The directive says:
give those a Standard paper path too (CMS-10114 to Fargo) and make surrogate the
give those a Standard paper path too (CMS-10114 to NPI Enumerator (Baltimore MD)) and make surrogate the
*expedited* option, not the only option.
- `scripts/workers/services/npi_provider.py``access` strings call NPPES
update/reactivation "NPPES via CMS I&A surrogate access (online-only)". Must
become "Standard: CMS-10114 paper to NPI Enumerator (Fargo), client signs;
become "Standard: CMS-10114 paper to NPI Enumerator (Baltimore MD), client signs;
Expedited: NPPES via I&A surrogate." Also `_STANDARD_FILING_SLUGS` currently
excludes `nppes-update` (it has no 855) — needs a CMS-10114 paper path instead.
- `scripts/document_gen/templates/cms855_pdf_filler.py` — working 855 paper path
@ -58,7 +58,7 @@ pricing changes.
## Approach (concrete ordered steps)
1. **Confirm the CMS-10114 paper path** for NPPES data updates AND NPI
reactivation (not just initial enumeration): paper CMS-10114 mailed to NPI
Enumerator (PO Box 6059, Fargo ND), client signature only, no I&A login.
Enumerator (Baltimore MD), client signature only, no I&A login.
Cite the official source. This is what makes NPPES services "Standard, no
login" instead of surrogate-required. (We currently have no CMS-10114 PDF.)
2. **Lock the two-tier matrix for the 6 federal services.** For each slug record:
@ -81,13 +81,13 @@ pricing changes.
paper + e-sign, and the admin todo reflects Standard-default / Expedited-if-
surrogate-granted. Mirror the existing 855 generate→upload→esign flow.
5. **MAC + Fargo routing rule.** Document which Standard filings go where
(855 → provider's MAC by state/jurisdiction; CMS-10114 → Fargo). Confirm
(855 → provider's MAC by state/jurisdiction; CMS-10114 → NPI Enumerator (Baltimore MD)). Confirm
`practice_state` intake field drives MAC envelope addressing.
7. **Daily batched-mail fulfillment (Standard path).** Design the operational
flow for paper filings that are signed + pending submission:
- On each **postal working day morning** (skip weekends + federal/USPS
holidays), gather ALL signed-and-pending paper filings, **group by
destination agency/address** (each MAC, the NPI Enumerator in Fargo, each
destination agency/address** (each MAC, the NPI Enumerator (Baltimore MD), each
state Medicaid/CLIA agency).
- For each destination, **merge all that day's documents into one print job**
plus a **cover sheet** (Performance West sender, destination agency, date,
@ -129,7 +129,7 @@ pricing changes.
and Standard is the default on every surface.
- **Standard path mechanism check:** `cms855_pdf_filler.fill_cms855("855i",...)`
still yields filled PDF + cert anchor (read-only smoke render). If CMS-10114
filler is built, same smoke render proves a signable Fargo-bound PDF.
filler is built, same smoke render proves a signable Baltimore-bound PDF.
- **Expedited path check:** confirm the surrogate-grant CTA + `ia_surrogacy`
success action + admin todo together let a human file in PECOS/NPPES same-day;
surrogate scope wording matches what CMS I&A actually grants (PECOS vs NPPES).
@ -138,11 +138,11 @@ pricing changes.
no "unknown" and no service that's portal-only-but-marketed-as-no-login.
## Open questions / decisions
1. **NPPES update/reactivation Standard path:** is CMS-10114 paper-to-Fargo
accepted for *changes/reactivation* today (RESOLVE in step 1)? If yes, both
become Standard-default + surrogate-expedited. If CMS has gone online-only,
they stay surrogate-required and we say so honestly. (Directive assumes paper
works as Standard; step 1 verifies.)
1. **NPPES update/reactivation Standard path:** ✅ RESOLVED — CMS-10114 paper IS
accepted for *changes AND reactivation* (verified against CMS-10114 Rev. 02/25,
Section 1A boxes #2 Change / #4 Reactivation). Mailing address is the NPI
Enumerator in **Baltimore MD** (the old Fargo PO Box 6059 is retired). Both
nppes-update and npi-reactivation are Standard-default + surrogate-expedited.
2. **Build `cms10114_pdf_filler.py` this pass?** Needed for a real NPPES Standard
path. Recommend: yes if step 1 confirms paper, mirroring the 855 filler;
otherwise defer.