healthcare: two-tier (standard paper / expedited surrogate) filing model

- Verified Standard(no-login)/Expedited(surrogate) matrix from official CMS-855
  PDFs (docs/healthcare-filing-tiers-verified.md): reactivation+revalidation are
  855I paper-to-MAC reasons, original-signature, routed by state; sig may not be
  delegated; 855B needs PECOS app fee.
- Add scripts/workers/mac_routing.py: state->MAC routing (all 56 jurisdictions,
  12 destinations) for envelope addressing + daily batch grouping. Addresses
  marked VERIFY before live mail.
- npi_provider.py: fix access strings to two-tier framing; NPPES update/reactivation
  no longer 'online-only'; note 855B fee.
- checkout.ts + service pages: strip client-facing mechanics & the paper-vs-tier
  choice; surrogate is the only optional, positively-framed ask (faster, never
  required, never share password).
This commit is contained in:
justin 2026-06-07 00:24:56 -05:00
parent 74c1259c9a
commit 258d23bdc6
7 changed files with 417 additions and 289 deletions

View file

@ -1,252 +1,164 @@
# Plan
## Status: COMPLETE (all phases implemented + validated 2026-06-02)
Offer healthcare regulatory filings as a **two-tier model** (internal mechanics;
the "paper" alternative is NEVER surfaced to the client):
| Phase | What | Status |
|-------|------|--------|
| 1 | Hazmat/PHMSA handler + product (`hazmat-phmsa`, $149) | ✅ |
| 1.5 | Order-form bundle/mutual-exclusion enforcement (server-side) | ✅ |
| 2 | State-trucking intake form (slug-gated) + REQUIRED_FIELDS + admin-todo fields | ✅ |
| 2.5 | BOC-3 authority-aware (active/pending/revoked/none) + upsell-approve follow-ups | ✅ |
| 2.6 | Pipeline activation gating (`require_active` edges, FMCSA poll, waiting_on_activation) | ✅ |
| 3 | State emissions (non-CA) product `state-emissions` ($199) | ✅ |
| 4 | Order landing pages for all state/hazmat/emissions slugs (48 pages build) | ✅ |
| Adv | Prerequisite-aware DOT lookup + state recommendations | ✅ |
| 5 | Campaign builder deficiency segments + LP routing + --list-segments | ✅ |
| Val | Consistency checker (24/24) + campaign segment test (synthetic) | ✅ |
- **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
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
*reducing the number of steps on our end so we can bulk-file faster* — never as
"the alternative is paper." If yes, we file online same-day. If no, we silently
fall back to Standard. Same price either way; surrogacy is a delegation, not
password sharing.
**Remaining ops (not code):** create the 6 Listmonk source-campaign templates and
set their `CAMPAIGN_*_ID` envs (`CAMPAIGN_FOR_HIRE_ID`, `CAMPAIGN_IRP_IFTA_ID`,
`CAMPAIGN_INTRASTATE_ID`, `CAMPAIGN_WEIGHT_TAX_ID`, `CAMPAIGN_EMISSIONS_ID`,
`CAMPAIGN_HAZMAT_ID`). Until set, those segments are reported by
`--list-segments` but skipped by the scheduled run. Optional follow-up: a
client-side incompatibility UX hint in the order form (server already enforces).
This pass verifies the no-login paper path per service, reconciles the doc/code
contradiction, and makes "standard = paper / expedited = surrogate" consistent
everywhere it's surfaced.
## Goal
Make every trucker deficiency type we flag actually *fulfillable*: each flagged
deficiency must have (1) a service handler that can complete the work, (2) a
checkout/order path, and (3) an intake form that collects **all** information
that handler needs before the job runs. Only after fulfillment is complete and
verified do we extend the campaign builder to email those deficiency segments.
Every healthcare service (federal sold + state/adjacent to add) has a verified
**Standard (paper, no-login)** path and, where a CMS/portal exists, an
**Expedited (surrogate/delegated)** upsell. No surface should ever present
surrogate as *required* when a paper path exists; paper is always the default.
## Scope / affected areas
- `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
*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;
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
(fills 855I/B/O/A + cert-page signature anchor). **Gap:** no CMS-10114 filler
for the NPPES standard path → likely a small new `cms10114_pdf_filler.py`.
- `docs/healthcare-no-login-value-add.md` — already documents the CMS-10114 paper
path; promote it to the canonical "Standard vs Expedited" matrix.
- `site/src/pages/services/healthcare/{npi-revalidation,medicare-enrollment}.astro`
— already describe expedited/surrogate; npi-reactivation/nppes-update order
pages need the same two-tier framing.
- `site/src/components/intake/steps/NpiIntakeStep.astro` + intake manifest — add
the surrogate-access question framed positively: "Can you electronically grant
us CMS I&A Surrogate access? It lets us bulk-file faster and cuts steps on our
end." Optional; declining is fine and never mentions paper. The captured answer
routes fulfillment internally (surrogate vs our Standard path).
- `docs/state-healthcare-compliance-opportunities.md` + `new-sector-compliance-
targets.md` — extend the two-tier classification to state/adjacent services.
Deficiency flags in play (live counts):
for_hire (19,811), interstate_irp_ifta (19,761), intrastate_authority (14,081),
state_emissions (12,424), state_weight_tax (6,289), state_permit (3,418),
mcs150_overdue (4,539), hazmat (514), zero_fleet (134).
Files / systems:
- `scripts/workers/services/__init__.py` — handler registry
- `scripts/workers/services/state_trucking.py` — IRP/IFTA/weight-tax/permit/intrastate handler (admin-todo only today)
- `scripts/workers/services/mcs150_update.py` — MCS-150 + reactivation (real FMCSA filing)
- `scripts/workers/services/boc3_filing.py` — BOC-3 (Playwright)
- **NEW** `scripts/workers/services/hazmat_phmsa.py` — only fully-missing fulfillment path
- `site/src/lib/intake_manifest.ts` — per-service intake steps + pricing/meta
- `site/src/components/intake/steps/DOTIntakeStep.astro` — unified DOT intake (no state-trucking sections today)
- **NEW** `site/src/components/intake/steps/StateTruckingIntakeStep.astro` — state filing fields
- `api/src/routes/compliance-orders.ts``COMPLIANCE_SERVICES` (products) + `REQUIRED_FIELDS` (validation; **none defined for any DOT/state-trucking slug today**)
- `api/src/routes/checkout.ts` — slug allowlist
- `api/src/routes/dot-lookup.ts` — recommended-services mapping
- **NEW** `site/src/pages/order/*.astro` — landing pages for state-trucking + hazmat (none exist)
- `scripts/build_trucking_campaigns.py` — campaign builder (extend last)
## Key findings (grounding)
1. **Fulfillment handlers already exist** for ~98% of flags. The single fully
missing path is **hazmat / PHMSA registration** (no handler, product, page).
2. **State-trucking intake collects nothing.** All 13 state slugs map to
`["review"]` in `intake_manifest.ts` with a comment "info collected at
checkout" — but checkout collects no per-filing fields. So IRP has no
vehicle/weight/jurisdiction data, IFTA has no fleet/base-state, NY HUT has no
vehicle list, intrastate-authority has no insurance/authority-type, etc. The
handler's admin todo is therefore incomplete and an admin must chase the
customer for data.
3. **`REQUIRED_FIELDS` has zero entries** for any DOT or state-trucking slug, so
the API performs no intake validation for these orders.
4. **No dedicated order landing pages** for IRP/IFTA/state-tax/permit/intrastate
or hazmat. Checkout works by slug, but campaign emails have no clean LP to
drive conversions.
5. **State emissions** flags (NY/CO/MD/NJ/MA/etc., 12,424) only map to a product
for CA (CARB via `ca-mcp-carb`). Non-CA emissions have no product — decide
whether to build or fold into existing state DOT/permit service.
Out of scope this pass: building the actual surrogate Playwright automation
(expedited fulfillment can stay human-in-PECOS for now), email-stream machinery,
pricing changes.
## Approach (concrete ordered steps)
### Phase 1 — Close the hazmat fulfillment gap (only fully-missing path)
1. Add `HazmatPHMSAHandler` in `scripts/workers/services/hazmat_phmsa.py`
(admin-assisted, mirrors `state_trucking.py`: creates admin_todo with PHMSA
registration steps, sends status email). Slug `hazmat-phmsa`.
2. Register `"hazmat-phmsa": HazmatPHMSAHandler` in `services/__init__.py`.
3. Add product to `COMPLIANCE_SERVICES`, meta to `intake_manifest.ts`, slug to
checkout allowlist.
### Phase 1.5 — Order-form incompatibility enforcement (bundles vs components, dupes)
Today the batch endpoint (`compliance-orders.ts` POST `/batch`) only dedupes and
hard-codes one case (drop standalone `fcc-499a` when `fcc-499a-499q` present).
There is no general rule preventing a customer from selecting a **bundle plus its
own components** (e.g. `dot-full-compliance` + `mcs150-update` + `boc3-filing`, or
`state-trucking-bundle` + `irp-registration`), or other incompatible combos. This
double-charges and creates duplicate filings.
Build a single source of truth for service relationships and enforce it:
- Add `BUNDLE_COMPONENTS` map (bundle slug -> component slugs) covering
`dot-full-compliance`, `state-trucking-bundle`, `new-carrier-bundle`,
`fcc-full-compliance`, plus the DB `service_bundles` rows.
- Add `INCOMPATIBLE_PAIRS` / mutually-exclusive groups (e.g. `usdot-reactivation`
vs `carrier-closeout`; `fcc-499a` vs `fcc-499a-499q`; emergency-temp-authority
vs mc-authority where applicable).
- Server-side (authoritative) in `/batch`: when a bundle is present, **drop any of
its components** from the cart (keep the bundle), reject hard-incompatible pairs
with a clear error, and keep dedup. Generalize the existing 499a special-case
into this map.
- Client-side (order form / cart UI): disable/grey out a component when its parent
bundle is selected (and vice-versa: selecting all components suggests the bundle),
and prevent selecting mutually-exclusive options, with an inline explanation.
Mirror the server map so UX matches enforcement.
### Phase 2 — Make state-trucking intake actually collect required data
4. Build `StateTruckingIntakeStep.astro` (one shared step, sections shown by
slug, mirroring `DOTIntakeStep.astro`'s section-gating pattern):
- Carrier identity: legal name, DOT#, MC#, base state, contact (prefill from DOT lookup).
- IRP/IFTA: power units w/ VIN+plate+gross-weight rows, operating jurisdictions, fuel type.
- Weight-distance (OR/NY/KY/NM/CT): vehicle list + gross weights + (OR) declared combined weight.
- CA MCP+CARB: fleet engine model-years for CARB Clean Truck Check, CA# if any.
- Intrastate authority: authority type, insurance carrier + policy#, cargo, BOC-3 on file?
- State DOT / OSOW: as needed.
5. Update `intake_manifest.ts`: replace `["review"]` with
`["state-trucking", "review"]` for the 13 slugs; wire the step into the Wizard.
6. Add `REQUIRED_FIELDS` entries in `compliance-orders.ts` for each state-trucking
slug + the DOT slugs (mcs150, ucr, boc3, dot-registration, mc-authority, etc.)
so intake is validated server-side. Mirror handler "Intake data needed" docstrings.
7. Update `state_trucking.py` handler to read + surface the new intake fields in
the admin todo (so admins get vehicle lists, jurisdictions, insurance, etc.).
### Phase 2.5 — Make BOC-3 authority-aware (preexisting authority handling)
The BOC-3 attaches to a carrier's operating authority (MC/FF/MX docket). Today
`boc3_filing.py` only reads `commonAuthorityStatus`/`contractAuthorityStatus`/
`brokerAuthorityStatus` to print a status string and otherwise always files a
fresh BOC-3. That can be wrong/wasteful depending on the preexisting authority.
Add branching off the live FMCSA authority state:
- **Active authority:** file/refresh BOC-3 only. (current behavior)
- **Pending authority:** file BOC-3 + flag that active insurance must be on file
for the authority to activate; create follow-up todo.
- **Revoked/inactive authority:** file BOC-3 **and** flag/upsell reinstatement
(OP-1 reinstatement + $80 gov fee, route via `usdot-reactivation`/`mc-authority`
reinstatement branch). BOC-3 alone does not reinstate.
- **No authority (USDOT only):** BOC-3 has nothing to attach to — flag that MC
authority (`mc-authority`) is likely needed first; do not silently file.
Implementation: have `process()/handle()` read full authority status (reuse
`_check_boc3_status`, expanded to return structured fields), select the branch,
adjust the admin-todo + customer email, and emit a `recommended_followups` list
the order timeline / upsell can surface. No automatic charge for the follow-up —
surface it for the customer/admin to approve.
### Phase 2.6 — Prerequisite/activation gating (wait for FMCSA "active", not just "submitted")
There are real FMCSA dependency chains where a downstream filing must wait for an
upstream item to be **active at the agency**, not merely submitted by us. The
existing `pipeline_orchestrator.py` models ordering via `wait_for`, but a step is
treated as satisfied when `pipeline_step_status == "completed"` (= our handler
finished), which is NOT the same as FMCSA showing it active.
True prerequisites to enforce:
- **MC Authority (OP-1)** requires an **active USDOT**.
- **Authority activation** requires **BOC-3 on file + insurance (BMC-91) on file**,
then a **mandatory ~21-day vetting/protest period** before it goes active.
BOC-3 + insurance CAN be filed while authority is pending (parallel OK).
- **IRP / IFTA / intrastate-authority / UCR** that depend on *active* authority
(or active USDOT) must wait for that activation, not just for the prior order to
be submitted.
Implementation:
- Add an "activation gate" to the orchestrator: for dependency edges flagged
`require_active: true`, poll FMCSA (mobile QC API for USDOT status; L&I for
authority/BOC-3/insurance) and only mark the dependency satisfied when the
agency reports active. Until then, hold the downstream step in a
`waiting_on_activation` state with a next-poll timestamp.
- Encode the 21-day authority vetting window as an expected-activation estimate so
the timeline/customer comms set correct expectations.
- Expand `PIPELINES` edges with `require_active` flags (USDOT→MC, USDOT→IRP/IFTA/
UCR/intrastate, authority-active→IRP-for-hire/intrastate).
- Standalone (non-bundle) orders: when a single service is ordered whose
prerequisite isn't active yet, surface a clear "blocked until X is active"
status + recommended prerequisite order rather than filing prematurely.
### Phase 3 — Decide + handle state emissions (non-CA)
8. Either: (a) add a generic `state-emissions` service handler+product covering
NY/CO/MD/NJ/MA clean-truck/ACT programs, or (b) map those flags to
`state-dot-registration` / advisory-only. (Open question — see below.)
### Phase 4 — Order landing pages
9. Create `site/src/pages/order/*.astro` for: irp-ifta (combined), state weight
taxes (one templated page per state or a single state-aware page),
ca-mcp-carb, intrastate-authority, hazmat-phmsa. Reuse existing order-page
layout (e.g. `boc3-filing.astro`, `ucr-registration.astro` as templates).
### Phase 5 — Extend campaign builder (only after 1-4 verified)
10. Add new campaign segments to `build_trucking_campaigns.py` keyed off
`deficiency_flags`: for-hire/BOC-3+UCR, IRP/IFTA, intrastate-authority,
state weight-tax (per-state), CA MCP/CARB, hazmat. Each links to its LP.
11. Create the corresponding Listmonk source campaigns (templates) and wire IDs.
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.
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:
Standard path (form, mail destination, client's only action = sign / nothing),
Expedited path (surrogate scope: PECOS and/or NPPES; what client grants),
and whether expedited is even applicable (screening = public, no portal, so
no expedited tier). Confirm the 855 wet-signature-cannot-be-delegated caveat
applies to Standard; surrogate covers Expedited.
3. **Reconcile checkout.ts.** Plan the edit so:
- NPPES update/reactivation no longer present surrogate as *required* — remove
the "online-only / required for those" language.
- The surrogate ask is framed as the **faster, fewer-steps** option, never
against a "paper" alternative. Audit/strip the existing copy that leaks
mechanics to the client (e.g. "we'll send your CMS-855 to sign", "submit it
to your MAC") — replace with neutral "we file it and track it for you."
- Declining surrogate silently routes to our Standard path; no client-facing
mention of paper/MAC/Fargo/form numbers.
4. **Reconcile npi_provider.py.** Update `access` strings + `_STANDARD_FILING_SLUGS`
so nppes-update/reactivation generate the CMS-10114 (or 855 reactivation)
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
`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
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,
enclosed-count, per-item list of order# / provider / NPI / form). One
**Priority Mail envelope per agency** → saves postage + handling.
- Mark each included order as "mailed" with the batch date + tracking #.
- Build this as a worker (a `daily_paper_batch` job + a cover-sheet generator
in document_gen), mirroring existing worker/cron patterns
(`infra/cron/*`, `business_days.py` for the working-day calendar). Decide:
fully-automated print-to-PDF batch that a human prints + drops, vs.
print-API (Lob/Click2Mail) auto-mail. **Recommend phase 1 = generate the
per-agency batched PDF + cover sheet + manifest for a human to print & mail;
phase 2 = wire a print-mail API.**
8. **Extend two-tier to state/adjacent services.** For each (State Medicaid
enroll/reval, CAQH re-attest, payer credentialing, DEA renewal, state CSR,
PDMP, CLIA, license renewal+CME) classify:
- **Standard (no-login):** paper/mail-in form + one client signature?
(e.g. CLIA = CMS-116 paper to state; Medicaid varies — some paper.) These
feed the same daily batched-mail flow, grouped by their state agency.
- **Expedited (delegated):** the lightest legitimate delegation that avoids a
client *login* — e.g. CAQH "authorized administrator/org" grant, Medicaid
"delegated official" on the app, payer EDI/CAQH attestation rights, an LOA.
Distinguish "client signs one authorization once" (acceptable, still
no-login) from "client must log in / share credentials" (never).
- Flag services that are genuinely portal-only with NO paper standard so
marketing never claims "no logins" for them.
9. **Sequence the rollout** by (Standard-feasibility first) × revenue, and write
the two doc updates + the small code edits (checkout.ts, npi_provider.py,
optional cms10114_pdf_filler.py, and the daily batch worker + cover sheet).
All gated on approval.
## Validation (how each part is verified)
- **Handlers:** unit-invoke each handler with a synthetic `order_data` dict in a
throwaway script; assert an `admin_todos` row is created with the expected
fields and (dev mode) no live filing fires. Confirm `SERVICE_HANDLERS` resolves
every new slug.
- **Intake completeness (the core ask):** write a check that, for every slug,
cross-references `REQUIRED_FIELDS[slug]` against the fields the intake step
emits and against the keys the handler reads — fail if a handler-needed field
is never collected. This is the verifiable "we collect all needed info" metric.
- **Checkout/products:** assert every flagged slug exists in `COMPLIANCE_SERVICES`,
`SERVICE_META`, checkout allowlist, and `SERVICE_HANDLERS` (one consistency test).
- **Order pages:** build site (`astro build` / existing build script) and confirm
each new `/order/<slug>` route renders; smoke-load locally.
- **Campaign builder:** run `build_trucking_campaigns.py --dry-run` and assert
each new segment selects a nonzero, deduped audience pointing at a valid LP.
- **End-to-end:** place a test order per new slug through checkout in dev, verify
intake validation blocks missing fields, and the handler produces a complete
admin todo.
- **Source-grounded:** every Standard (paper) and Expedited (delegation) claim
cites the official instruction (CMS-855 instr, CMS-10114 instr, CMS-116 for
CLIA, state Medicaid enrollment page, CAQH/payer docs). No unsourced claim.
- **Consistency sweep:** after edits, `grep` for "online-only" / "required" /
"surrogate" / "no login" across checkout.ts, npi_provider.py, and the service
pages — confirm none present surrogate as *required* where a paper path exists,
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.
- **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).
- **Matrix completeness:** every service (federal + state) has Standard + (where
applicable) Expedited rows with a definite client-action column and source;
no "unknown" and no service that's portal-only-but-marketed-as-no-login.
## Open questions / decisions
**RESOLVED (per user 2026-06-02):**
1. **BOC-3 follow-ups + prerequisite blockers → upsell-approve, advise pre-order
where possible.** Two layers:
- *Pre-order advisory (preferred):* extend the existing DOT Compliance Check
tool (`site/public/tools/dot-compliance-check/`) + `dot-lookup` recommended
services to be **prerequisite-aware**. When a recommended service needs an
active prerequisite (e.g. IRP needs active authority), show the dependency,
pre-select the prerequisite, order the cart correctly, and state the ~21-day
authority activation expectation — all before payment.
- *Post-order upsell-approve:* when a handler discovers a blocker mid-fulfillment
(e.g. BOC-3 ordered but authority revoked → needs reinstatement), write a
`recommended_followups` entry on the order and render a one-click, pre-filled
"Add this service" card on the order timeline/portal. Customer confirms + pays
via the existing checkout. **No auto-charge.**
- *Standalone checkout guard:* if a service is bought directly and its prereq
isn't active at FMCSA, warn + offer to add the prereq rather than filing
something unfulfillable.
2. **State emissions (non-CA): build a real product.** Add a `state-emissions`
service (handler + product + intake + page) covering NY/CO/MD/NJ/MA clean-truck
/ Advanced Clean Trucks programs (CA stays on `ca-mcp-carb`).
3. **Pre-order advisory: yes.** Covered by 1 above — reuse the compliance-check
tool as the advisory surface.
**STILL OPEN:**
4. Pricing for `hazmat-phmsa` and `state-emissions`.
**DEFAULT:** `hazmat-phmsa` = $149 (admin-assisted PHMSA registration; gov fee
$25 placardable-hazmat reg billed at cost). `state-emissions` = $199
(NY/CO/MD/NJ/MA clean-truck / ACT advisory + registration assist).
5. Vehicle-list intake fidelity.
**DEFAULT:** lightweight up front — collect fleet count + base/operating states
+ fuel type + gross-weight bracket at intake; collect full per-vehicle
VIN/plate/weight rows via a post-order follow-up form only when the specific
filing requires it (IRP, weight-distance taxes). Keeps conversion high.
6. Standalone-order prereq guard.
**DEFAULT:** warn + offer to add the prerequisite (pre-selected), allow override
("file anyway"). Never a hard block.
7. Long-term home for the reviewable plan (`docs/plans/` used here; no
`side_panel` tool in this harness).
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.)
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.
3. **State Medicaid scope:** classify the mechanism generically + verify top ~5
states by our lead density now; template the rest. (50-state research is a
separate effort.)
4. **CAQH / payer credentialing tier:** almost certainly Expedited = "client
signs one authorization, no login" (category C). Confirm we market that as
"no logins for you" with precise wording.
5. **Expedited pricing/positioning:** RESOLVED — expedited is **not** a paid
tier and we never expose "paper" as the alternative. It's an intake question
framed positively ("electronically granting surrogate access lets us bulk-file
faster / fewer steps on our end"). If yes → online; if no → silent Standard
fallback. Same price. No price delta, no separate product, no mention of paper.
6. **Client-facing messaging rule:** never surface mechanics to the client —
no "paper", "CMS-855", "CMS-10114", "MAC", or "Fargo" in any client copy
(cold email, order page, checkout, intake). The only client-visible choice is
the positive surrogate question; everything else is "we file it for you." This
applies to the checkout copy audit in step 3.