bib: ingest OIG Compliance Program Guidance and fraud alerts into library #307

Closed
opened 2026-03-27 04:46:57 +00:00 by kert · 1 comment
Owner

OIG publishes compliance guidance, fraud alerts, and advisory bulletins that define what constitutes healthcare fraud.

Key documents:

  • OIG Compliance Program for Individual and Small Group Physician Practices
  • Special Fraud Alerts (biologicals, skin subs, kickbacks)
  • Advisory Opinions relevant to skin substitute distribution
  • Semiannual Reports to Congress (fraud statistics)

Source: https://oig.hhs.gov/compliance/compliance-guidance/

Create Source items tagged with source:oig.

OIG publishes compliance guidance, fraud alerts, and advisory bulletins that define what constitutes healthcare fraud. Key documents: - OIG Compliance Program for Individual and Small Group Physician Practices - Special Fraud Alerts (biologicals, skin subs, kickbacks) - Advisory Opinions relevant to skin substitute distribution - Semiannual Reports to Congress (fraud statistics) Source: https://oig.hhs.gov/compliance/compliance-guidance/ Create Source items tagged with source:oig.
kert added this to the P32: CMS Manual Library — benefits, fraud, and program integrity references milestone 2026-03-27 04:46:57 +00:00
Author
Owner

Closed. OIG Compliance Program Guidance + fraud alerts ingested, attached, and synced to Zotero under Healthcare Data Platform / OIG Guidance.

What ships

  • 15 Compliance Program Guidance docs (Hospital, Nursing Facility, Hospice, Ambulance, Pharmaceutical, Clinical Lab, DME, Home Health, Physician, Medicare Advantage, Supplemental CPGs, Third-Party Medical Billing, etc.)
  • 15 Special Fraud Alerts / Advisory Bulletins / Enforcement Alerts (Speaker Programs, Lab Payments to Referring Physicians, Physician-Owned Entities, DME Telemarketing, Information Blocking enforcement alert, etc.)
  • All 30 PDFs/HTMLs downloaded + attached via Store.attach_file.

Architecture

Follows the same shape as the IOM pipeline (#304/#305/#306) so the two share scraping conventions, SHA-256 idempotency, and the Zotero-sync plumbing.

Module: src/bib/oig.py

  • fetch_cpgs(client) — scrapes oig.hhs.gov/compliance/compliance-guidance/ via _DOC_LINK regex (anchors to /documents/…pdf|html). _SKIP_HINTS filters navigation noise.
  • fetch_alerts(client) — scrapes oig.hhs.gov/compliance/alerts/.
  • _classify_type(title, href) — maps each doc to cpg | sfa | sab | ea | open_letter | other via title regex first, URL substring second.
  • _classify_sector(title) — keyword-table lookup (hospital → hospitals, dme → dme, nursing → nursing, …) for routing.
  • ingest_all(store, client, *, kinds=None) — upserts each OIGDoc as a bib.item.Source with doc_type=<human-readable>, institution=OIG, and tags agency:oig, guidance:<kind>, sector:<X> when classified.
  • download_attachments(store, client, *, force=False) — same SHA-256 idempotency as IOM's.

Routing

_zotero_collection_path() in bib/sync.py recognises OIG items by the agency:oig tag and sends them to Healthcare Data Platform / OIG Guidance / <sector> (when tagged) or …/OIG Guidance / <guidance_type> otherwise. Sub-collections are created on the fly via Db.ensure_collection.

CLI

  • stack bib ingest-oig [--kind cpg] [--kind alerts]
  • stack bib attach-oig [--force]
  • stack bib refresh-oig — one-shot: ingest → attach → Zotero sync (with the usual docker stop/start zotero bracket).

Verified state

  • 30 items in bib.sqlite tagged agency:oig, all with attachments
  • 30 Zotero items typed document, 30 attachment children typed attachment (linkMode=1)
  • Collections populated: Hospitals (2), Nursing (4), DME (4), Physicians (4), Home Health (2), Medicare Advantage (2), Hospice (1), Ambulance (1), Labs (1), Pharmaceutical (1), Billing (1), plus catch-all buckets CPG (2), SFA (4), EA (1)
  • DB integrity + FK checks = ok

Known cosmetic issue

Sector labels are title-cased via Python's .title(), so the collection reads "Dme" instead of "DME" and "Pharmaceutical" instead of "Pharmaceuticals". Trivial fix in _zotero_collection_path; deferred as not-blocking.

**Closed.** OIG Compliance Program Guidance + fraud alerts ingested, attached, and synced to Zotero under `Healthcare Data Platform / OIG Guidance`. ## What ships - **15 Compliance Program Guidance docs** (Hospital, Nursing Facility, Hospice, Ambulance, Pharmaceutical, Clinical Lab, DME, Home Health, Physician, Medicare Advantage, Supplemental CPGs, Third-Party Medical Billing, etc.) - **15 Special Fraud Alerts / Advisory Bulletins / Enforcement Alerts** (Speaker Programs, Lab Payments to Referring Physicians, Physician-Owned Entities, DME Telemarketing, Information Blocking enforcement alert, etc.) - All 30 PDFs/HTMLs downloaded + attached via `Store.attach_file`. ## Architecture Follows the same shape as the IOM pipeline (#304/#305/#306) so the two share scraping conventions, SHA-256 idempotency, and the Zotero-sync plumbing. ### Module: `src/bib/oig.py` - `fetch_cpgs(client)` — scrapes `oig.hhs.gov/compliance/compliance-guidance/` via `_DOC_LINK` regex (anchors to `/documents/…pdf|html`). `_SKIP_HINTS` filters navigation noise. - `fetch_alerts(client)` — scrapes `oig.hhs.gov/compliance/alerts/`. - `_classify_type(title, href)` — maps each doc to `cpg | sfa | sab | ea | open_letter | other` via title regex first, URL substring second. - `_classify_sector(title)` — keyword-table lookup (`hospital → hospitals`, `dme → dme`, `nursing → nursing`, …) for routing. - `ingest_all(store, client, *, kinds=None)` — upserts each `OIGDoc` as a `bib.item.Source` with `doc_type=<human-readable>`, `institution=OIG`, and tags `agency:oig`, `guidance:<kind>`, `sector:<X>` when classified. - `download_attachments(store, client, *, force=False)` — same SHA-256 idempotency as IOM's. ### Routing `_zotero_collection_path()` in `bib/sync.py` recognises OIG items by the `agency:oig` tag and sends them to `Healthcare Data Platform / OIG Guidance / <sector>` (when tagged) or `…/OIG Guidance / <guidance_type>` otherwise. Sub-collections are created on the fly via `Db.ensure_collection`. ### CLI - `stack bib ingest-oig [--kind cpg] [--kind alerts]` - `stack bib attach-oig [--force]` - `stack bib refresh-oig` — one-shot: ingest → attach → Zotero sync (with the usual `docker stop/start zotero` bracket). ## Verified state - 30 items in bib.sqlite tagged `agency:oig`, all with attachments - 30 Zotero items typed `document`, 30 attachment children typed `attachment` (linkMode=1) - Collections populated: Hospitals (2), Nursing (4), DME (4), Physicians (4), Home Health (2), Medicare Advantage (2), Hospice (1), Ambulance (1), Labs (1), Pharmaceutical (1), Billing (1), plus catch-all buckets CPG (2), SFA (4), EA (1) - DB integrity + FK checks = ok ## Known cosmetic issue Sector labels are title-cased via Python's `.title()`, so the collection reads "Dme" instead of "DME" and "Pharmaceutical" instead of "Pharmaceuticals". Trivial fix in `_zotero_collection_path`; deferred as not-blocking.
kert closed this issue 2026-04-15 04:24:20 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: homelab/stack#307