Files
stack/dev/scripts/collect_grey_lit_skin_subs.py
kert 16f3b43974
Some checks failed
CI / skinny-install (aco) (push) Successful in 1m12s
CI / skinny-install (api) (push) Successful in 30s
CI / skinny-install (bcda) (push) Successful in 36s
CI / skinny-install (bib) (push) Successful in 35s
CI / skinny-install (bls) (push) Successful in 27s
CI / skinny-install (ccw) (push) Successful in 32s
CI / skinny-install (cli) (push) Successful in 41s
CI / skinny-install (cms) (push) Successful in 37s
CI / skinny-install (conf) (push) Successful in 38s
CI / skinny-install (opps) (push) Successful in 33s
CI / skinny-install (perf) (push) Successful in 38s
CI / skinny-install (pfs) (push) Successful in 38s
CI / skinny-install (rex) (push) Successful in 34s
Deploy / build-scan-report (push) Failing after 46s
Infra CI / notebooks (push) Failing after 25s
Infra CI / zotero (push) Successful in 12s
Infra CI / docs (push) Failing after 16s
CI / lint-test (push) Failing after 11m2s
Infra CI / mc (push) Successful in 21s
Infra CI / api (push) Successful in 29s
Package Supply Chain / pkg-supply-chain (push) Failing after 41s
feat: full session — mail servers, comment pipeline, PRISMA fetch, email ingest
Mail: Maddy on DO (corwins.media+Resend, fhirworx.io+Postmark),
touchless/stateless/idempotent. Gitea SMTP via env_file. CMS inbox
at cmsupdates@mail.fhirworx.io with IMAP→bib poller.

Bib: regulations.gov v4 client, Federal Register discovery, 164K
comment backfill (running), IMAP email ingest, Zotero sync routing.

PRISMA: altcha PoW solver, CrossRef DOI resolution, 83/129 PDFs.
Zotero: schema parity, ops module, CLI, fail-fast guard.
CI: docs.Dockerfile COPY glob fix (tracks #341).
Infra: Gitea+marimo fhirworx themes, IOM/OIG modules.
2026-04-16 09:04:38 -04:00

666 lines
26 KiB
Python

"""Collect grey literature for skin substitutes research.
Captures non-journal evidence: OIG reports, CMS rules, GAO/MedPAC reports,
DOJ press releases, court filings, MAC LCDs, and industry position statements.
Each document is stored in bib.sqlite with tags:
module:skin-subs, source:{oig|cms|gao|medpac|doj|court|mac-lcd|industry}
Documents are curated — each entry below is a known, authoritative source
identified during the skin substitutes research design phase.
Usage:
uv run python dev/scripts/collect_grey_lit_skin_subs.py
uv run python dev/scripts/collect_grey_lit_skin_subs.py --dry-run
"""
from __future__ import annotations
import argparse
from dataclasses import dataclass, field
from datetime import datetime
from bib.item import Source
from bib.store import Store
# ---------------------------------------------------------------------------
# Grey literature catalogue
# ---------------------------------------------------------------------------
@dataclass
class GreyLitEntry:
"""A single grey literature document to capture."""
title: str
url: str
source_tag: str # oig, cms, gao, medpac, doj, court, mac-lcd, industry
type_tag: str # report, rule, press-release, filing, lcd, position
date_published: str # YYYY or YYYY-MM-DD
institution: str
abstract: str = ""
extra: str = ""
extra_tags: list[str] = field(default_factory=list)
# --- OIG Reports ---
OIG_REPORTS = [
GreyLitEntry(
title=(
"Medicare Part B Payment Trends for Skin Substitutes "
"Raise Major Concerns About Fraud, Waste, and Abuse"
),
url="https://oig.hhs.gov/oei/reports/OEI-02-22-00340.asp",
source_tag="oig",
type_tag="report",
date_published="2025-09",
institution="HHS Office of Inspector General",
abstract=(
"Medicare spending on skin substitutes (CTPs) grew from $256M in 2019 "
"to over $10B by 2024. The report identifies troubling patterns: "
"concentration of billing among small number of providers, extremely "
"high per-beneficiary spending, and products with limited evidence of "
"clinical efficacy commanding the highest prices."
),
extra_tags=["entity:oig"],
),
GreyLitEntry(
title="Concerns About Skin Substitutes in the Medicare Program",
url="https://oig.hhs.gov/documents/special-advisory-bulletins/1078/SAB-Skin-Substitutes.pdf",
source_tag="oig",
type_tag="report",
date_published="2024",
institution="HHS Office of Inspector General",
abstract=(
"OIG Special Advisory Bulletin on fraud and abuse risks in the skin "
"substitute market, including kickback arrangements, medically "
"unnecessary applications, and documentation deficiencies."
),
),
GreyLitEntry(
title=(
"OIG Semiannual Report to Congress, Fall 2025 — "
"Skin Substitute Enforcement Summary"
),
url="https://oig.hhs.gov/reports-and-publications/semiannual/",
source_tag="oig",
type_tag="report",
date_published="2025-10",
institution="HHS Office of Inspector General",
abstract=(
"Semiannual enforcement report summarizing OIG investigations, "
"audits, and enforcement actions related to skin substitutes "
"and wound care fraud during the reporting period."
),
extra_tags=["entity:oig"],
),
GreyLitEntry(
title=(
"Medicare Improperly Paid Millions of Dollars for Skin "
"Substitute Products and Related Services"
),
url="https://oig.hhs.gov/oas/reports/region5/51700028.asp",
source_tag="oig",
type_tag="report",
date_published="2019",
institution="HHS Office of Inspector General",
abstract=(
"OIG audit finding improper payments for skin substitute products "
"due to inadequate documentation, lack of medical necessity, and "
"billing errors."
),
),
]
# --- CMS Rules ---
CMS_RULES = [
GreyLitEntry(
title=(
"CY 2026 OPPS/ASC Final Rule (CMS-1834-FC) — Reclassification of "
"Skin Substitutes from Drugs/Biologicals to Incident-To Supplies"
),
url="https://www.federalregister.gov/documents/2025/11/20/2025-23371/medicare-program-changes-to-the-hospital-outpatient-prospective-payment-and-ambulatory-surgical-center",
source_tag="cms",
type_tag="rule",
date_published="2025-11-20",
institution="Centers for Medicare & Medicaid Services",
abstract=(
"CMS reclassifies skin substitutes/CTPs from drugs and biologicals "
"(ASP+6% payment) to incident-to supplies (flat rate $127.28/cm²). "
"Creates new HCPCS C5271-C5278 codes replacing Q4xxx series. "
"Estimated $9.4B savings over 10 years."
),
extra=(
"FR Vol 90, Doc 2025-23371\n"
"CMS-1834-FC\n"
"Effective: 2026-01-01\n"
"Flat rate: $127.28/cm² (replaces ASP+6%)\n"
"New codes: C5271-C5278"
),
extra_tags=["rule:cy2026-opps"],
),
GreyLitEntry(
title=(
"CY 2025 OPPS/ASC Final Rule (CMS-1809-FC) — Skin Substitute "
"Payment Under OPPS"
),
url="https://www.federalregister.gov/documents/2024/11/18/2024-25518/medicare-program-changes-to-the-hospital-outpatient-prospective-payment-and-ambulatory-surgical-center",
source_tag="cms",
type_tag="rule",
date_published="2024-11-18",
institution="Centers for Medicare & Medicaid Services",
abstract=(
"Discusses skin substitute payment methodology under OPPS, "
"creates high/low cost categories, and signals forthcoming "
"reclassification from biological to supply."
),
extra_tags=["rule:cy2025-opps"],
),
GreyLitEntry(
title=(
"CY 2024 PFS Final Rule (CMS-1784-F) — Skin Substitute Payment Under Part B"
),
url="https://www.federalregister.gov/documents/2023/11/16/2023-24184/medicare-and-medicaid-programs-cy-2024-payment-policies-under-the-physician-fee-schedule",
source_tag="cms",
type_tag="rule",
date_published="2023-11-16",
institution="Centers for Medicare & Medicaid Services",
abstract=(
"Discusses skin substitute billing requirements and medical "
"necessity documentation under Part B physician fee schedule."
),
extra_tags=["rule:cy2024-pfs"],
),
GreyLitEntry(
title=(
"CY 2023 OPPS Final Rule (CMS-1772-FC) — First Codification of "
"High/Low Cost Skin Substitute Categories"
),
url="https://www.federalregister.gov/documents/2022/11/23/2022-23918/medicare-program-changes-to-the-hospital-outpatient-prospective-payment-and-ambulatory-surgical-center",
source_tag="cms",
type_tag="rule",
date_published="2022-11-23",
institution="Centers for Medicare & Medicaid Services",
abstract=(
"First rule to formally codify high-cost and low-cost skin "
"substitute categories under OPPS, establishing the two-tier "
"payment framework that persisted through CY 2025."
),
extra_tags=["rule:cy2023-opps"],
),
GreyLitEntry(
title=(
"CY 2022 OPPS Final Rule (CMS-1753-FC) — Skin Substitute "
"Pass-Through Payment Discussion"
),
url="https://www.federalregister.gov/documents/2021/11/16/2021-24011/medicare-program-changes-to-the-hospital-outpatient-prospective-payment-and-ambulatory-surgical-center",
source_tag="cms",
type_tag="rule",
date_published="2021-11-16",
institution="Centers for Medicare & Medicaid Services",
abstract=(
"Discusses pass-through payment status for skin substitute "
"products under OPPS, including criteria for transitional "
"pass-through eligibility and cost reporting requirements."
),
extra_tags=["rule:cy2022-opps"],
),
GreyLitEntry(
title=(
"CY 2021 PFS Final Rule (CMS-1734-F) — Skin Substitute "
"Billing Under Physician Fee Schedule"
),
url="https://www.federalregister.gov/documents/2020/12/28/2020-26815/medicare-program-cy-2021-payment-policies-under-the-physician-fee-schedule",
source_tag="cms",
type_tag="rule",
date_published="2020-12-28",
institution="Centers for Medicare & Medicaid Services",
abstract=(
"Establishes skin substitute billing requirements and payment "
"rates under the Part B physician fee schedule, including "
"application code valuation and medical necessity criteria."
),
extra_tags=["rule:cy2021-pfs"],
),
GreyLitEntry(
title=(
"CY 2014 OPPS Final Rule (CMS-1601-FC) — First Major Skin "
"Substitute Payment Restructuring"
),
url="https://www.federalregister.gov/documents/2013/12/10/2013-28737/medicare-program-changes-to-the-hospital-outpatient-prospective-payment-and-ambulatory-surgical-center",
source_tag="cms",
type_tag="rule",
date_published="2013-12-10",
institution="Centers for Medicare & Medicaid Services",
abstract=(
"First major restructuring of skin substitute payment under "
"OPPS, moving from individual product-level pass-through to "
"grouped payment categories based on cost and clinical use."
),
extra_tags=["rule:cy2014-opps"],
),
GreyLitEntry(
title="Medicare Benefit Policy Manual, Ch.15 §270 — Biological Products",
url="https://www.cms.gov/regulations-and-guidance/guidance/manuals/downloads/bp102c15.pdf",
source_tag="cms",
type_tag="manual",
date_published="2024",
institution="Centers for Medicare & Medicaid Services",
abstract=(
"Coverage and payment policy for biological products (skin "
"substitutes) under Medicare Part B, including medical necessity "
"criteria, documentation requirements, and incident-to billing."
),
),
]
# --- DOJ Enforcement ---
DOJ_ENFORCEMENT = [
GreyLitEntry(
title=(
"DOJ National Health Care Fraud Enforcement Action: 193 Defendants "
"Charged for $2.75 Billion in Fraud"
),
url="https://www.justice.gov/opa/pr/justice-department-leads-efforts-seize-over-26-million-proceeds-connected-alleged-health-care",
source_tag="doj",
type_tag="press-release",
date_published="2025-06",
institution="U.S. Department of Justice",
abstract=(
"Largest-ever health care fraud takedown. Skin substitutes and "
"wound care fraud was a primary target area, with multiple "
"cases involving medically unnecessary applications, kickbacks, "
"and predatory billing patterns."
),
extra_tags=["entity:doj"],
),
GreyLitEntry(
title=(
"USA v. Patrick Jenson et al. (S.D. Tex. 4:25-cr-00271) — "
"$90M Skin Substitute Fraud"
),
url="https://www.justice.gov/usao-sdtx/pr/podiatrist-and-three-others-charged-90-million-health-care-fraud-scheme",
source_tag="court",
type_tag="filing",
date_published="2025",
institution="U.S. District Court, S.D. Texas",
abstract=(
"Podiatry clinic billed $90M, received $45M in payments for "
"skin substitute products. Allegations include medically "
"unnecessary applications, forged documentation, and kickback "
"arrangements with product distributors."
),
extra="Case: 4:25-cr-00271\nDistrict: S.D. Tex.",
extra_tags=["case:jenson", "entity:sdtx"],
),
GreyLitEntry(
title=(
"USA v. Gehrke & King (D. Ariz.) — $1.2B Mobile Wound Care Fraud Scheme"
),
url="https://www.justice.gov/usao-az/pr/two-individuals-charged-12-billion-health-care-fraud-scheme-involving-mobile-wound-care",
source_tag="court",
type_tag="filing",
date_published="2025",
institution="U.S. District Court, D. Arizona",
abstract=(
"Mobile wound care company billed $1.2B for skin substitute "
"products. Defendants allegedly recruited patients from nursing "
"facilities, applied products without medical necessity, and "
"operated a nationwide kickback network."
),
extra="District: D. Ariz.",
extra_tags=["case:gehrke-king", "entity:daz"],
),
GreyLitEntry(
title=("USA v. Azar Nasser (E.D. Mich.) — $60M Skin Substitute Fraud Ring"),
url="https://www.justice.gov/usao-edmi/pr/metro-detroit-physician-charged-60-million-health-care-fraud-scheme",
source_tag="court",
type_tag="filing",
date_published="2025",
institution="U.S. District Court, E.D. Michigan",
abstract=(
"Metro Detroit physician charged in $60M skin substitute fraud "
"scheme involving medically unnecessary applications and "
"kickback payments to referring providers."
),
extra_tags=["case:nasser", "entity:edmi"],
),
GreyLitEntry(
title=(
"USA v. Patel et al. (M.D. Fla.) — $250M Skin Substitute "
"and Genetic Testing Fraud"
),
url="https://www.justice.gov/usao-mdfl/pr/florida-pain-management-doctor-and-others-charged-250-million-health-care-fraud",
source_tag="court",
type_tag="filing",
date_published="2025",
institution="U.S. District Court, M.D. Florida",
abstract=(
"Florida pain management doctor and co-conspirators charged in "
"$250M fraud scheme combining skin substitute and genetic testing "
"billing with kickbacks and patient recruitment."
),
extra_tags=["case:patel", "entity:mdfl"],
),
GreyLitEntry(
title="Vohra Wound Physicians (S.D. Fla.) — $45M FCA Settlement",
url="https://www.justice.gov/opa/pr/wound-care-company-and-physician-pay-455-million-resolve-false-claims-act-allegations",
source_tag="court",
type_tag="filing",
date_published="2024",
institution="U.S. District Court, S.D. Florida",
abstract=(
"Vohra Wound Physicians settled for $45M over allegations of "
"EMR-driven auto-upcoding of wound care services, including "
"skin substitute applications coded at higher complexity than "
"performed."
),
extra="District: S.D. Fla.\nSettlement: $45.5M",
extra_tags=["case:vohra", "entity:sdfl"],
),
]
# --- GAO / MedPAC ---
GAO_MEDPAC = [
GreyLitEntry(
title=(
"GAO-23-105537: Medicare Part B — CMS Should Take Steps to "
"Better Manage Spending on New Biologicals"
),
url="https://www.gao.gov/products/gao-23-105537",
source_tag="gao",
type_tag="report",
date_published="2023-04",
institution="U.S. Government Accountability Office",
abstract=(
"GAO report on Part B spending growth for biologicals including "
"skin substitutes. Recommends CMS strengthen payment controls "
"and evidence requirements for high-cost biological products."
),
extra_tags=["entity:gao"],
),
GreyLitEntry(
title=(
"MedPAC June 2024 Report to Congress, Ch.3: Medicare Part B "
"Drug and Biological Spending"
),
url="https://www.medpac.gov/document/june-2024-report-to-the-congress/",
source_tag="medpac",
type_tag="report",
date_published="2024-06",
institution="Medicare Payment Advisory Commission",
abstract=(
"MedPAC analysis of Part B drug and biological spending trends, "
"including discussion of skin substitute market dynamics, "
"ASP+6% payment incentives, and recommendations for payment reform."
),
extra_tags=["entity:medpac"],
),
GreyLitEntry(
title=(
"MedPAC March 2025 Report to Congress — Payment for Wound Care Products"
),
url="https://www.medpac.gov/document/march-2025-report-to-the-congress/",
source_tag="medpac",
type_tag="report",
date_published="2025-03",
institution="Medicare Payment Advisory Commission",
abstract=(
"MedPAC analysis of the CMS reclassification of skin substitutes "
"and wound care products, including market impact assessment "
"and alternative payment recommendations."
),
extra_tags=["entity:medpac"],
),
]
# --- MAC LCDs ---
MAC_LCDS = [
GreyLitEntry(
title="Noridian LCD L39831 — Skin Substitutes and Wound Care",
url="https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=39831",
source_tag="mac-lcd",
type_tag="lcd",
date_published="2024",
institution="Noridian Healthcare Solutions (MAC JE/JF)",
abstract=(
"Local Coverage Determination for skin substitute products "
"including coverage criteria, documentation requirements, "
"and coding guidance for Medicare claims."
),
extra_tags=["entity:noridian"],
),
GreyLitEntry(
title="CGS LCD L38916 — Application of Skin Substitute Grafts",
url="https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=38916",
source_tag="mac-lcd",
type_tag="lcd",
date_published="2024",
institution="CGS Administrators (MAC J15)",
abstract=(
"Coverage determination for skin substitute graft application "
"codes (15271-15278), including medical necessity criteria "
"and frequency limitations."
),
extra_tags=["entity:cgs"],
),
GreyLitEntry(
title="First Coast LCD L36498 — Wound Care (Skin Substitutes)",
url="https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=36498",
source_tag="mac-lcd",
type_tag="lcd",
date_published="2023",
institution="First Coast Service Options (MAC JN)",
abstract=(
"LCD covering wound care services including skin substitute "
"application, debridement, and negative pressure wound therapy. "
"Defines covered diagnoses and documentation requirements."
),
extra_tags=["entity:first-coast"],
),
GreyLitEntry(
title="Palmetto LCD L35041 — Wound Care",
url="https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=35041",
source_tag="mac-lcd",
type_tag="lcd",
date_published="2023",
institution="Palmetto GBA (MAC JJ/JM)",
abstract=(
"Coverage criteria for wound care including skin substitute "
"products, with specific documentation and medical necessity "
"requirements for the southern US jurisdictions."
),
extra_tags=["entity:palmetto"],
),
GreyLitEntry(
title="WPS LCD L38890 — Wound Care and Skin Substitutes",
url="https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=38890",
source_tag="mac-lcd",
type_tag="lcd",
date_published="2024",
institution="Wisconsin Physicians Service (MAC J5/J8)",
abstract=(
"Coverage determination for wound care and skin substitute "
"products in JC/J8 jurisdictions (Iowa, Kansas, Missouri, "
"Nebraska), including medical necessity and frequency limits."
),
extra_tags=["entity:wps"],
),
GreyLitEntry(
title="Novitas LCD L37300 — Application of Skin Substitute Grafts",
url="https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=37300",
source_tag="mac-lcd",
type_tag="lcd",
date_published="2023",
institution="Novitas Solutions (MAC JH/JL)",
abstract=(
"LCD for skin substitute graft application in JH/JL "
"jurisdictions (AR, CO, NM, OK, TX, LA, MS), defining "
"coverage criteria and documentation requirements."
),
extra_tags=["entity:novitas"],
),
GreyLitEntry(
title="NGS LCD L36031 — Wound Care",
url="https://www.cms.gov/medicare-coverage-database/view/lcd.aspx?lcdid=36031",
source_tag="mac-lcd",
type_tag="lcd",
date_published="2023",
institution="National Government Services (MAC J6/JK)",
abstract=(
"Wound care LCD covering J6/JK jurisdictions (CT, IL, ME, "
"MA, MN, NH, NY, RI, VT, WI), including skin substitute "
"coverage criteria and coding guidance."
),
extra_tags=["entity:ngs"],
),
]
# --- Industry / Professional Societies ---
INDUSTRY = [
GreyLitEntry(
title=(
"Alliance of Wound Care Stakeholders — Position Statement on "
"CMS Reclassification of Skin Substitutes"
),
url="https://www.woundcarestakeholders.org/value-of-wound-care/skin-substitutes-ctps",
source_tag="industry",
type_tag="position",
date_published="2025",
institution="Alliance of Wound Care Stakeholders",
abstract=(
"Industry coalition position opposing CMS reclassification "
"from drugs/biologicals to supplies, arguing it will reduce "
"patient access and stifle innovation."
),
),
GreyLitEntry(
title=(
"Wound Healing Society — Guidelines for the Treatment of "
"Chronic Wounds with Cellular and Tissue-Based Products"
),
url="https://onlinelibrary.wiley.com/doi/10.1111/wrr.13150",
source_tag="industry",
type_tag="position",
date_published="2024",
institution="Wound Healing Society",
abstract=(
"Clinical practice guidelines for use of CTPs (skin substitutes) "
"in chronic wound management, including evidence grading "
"and recommendations for specific product categories."
),
),
]
ALL_ENTRIES = (
OIG_REPORTS + CMS_RULES + DOJ_ENFORCEMENT + GAO_MEDPAC + MAC_LCDS + INDUSTRY
)
# ---------------------------------------------------------------------------
# Store integration
# ---------------------------------------------------------------------------
def entry_to_item(entry: GreyLitEntry) -> Source:
"""Convert a GreyLitEntry to a bib Source item."""
tags = [
"module:skin-subs",
f"source:{entry.source_tag}",
f"type:{entry.type_tag}",
]
if entry.date_published:
year = entry.date_published[:4]
tags.append(f"year:{year}")
tags.extend(entry.extra_tags)
return Source(
title=entry.title,
url=entry.url,
date_published=entry.date_published,
institution=entry.institution,
abstract=entry.abstract,
doc_type=entry.type_tag,
tags=tags,
extra=entry.extra,
)
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
def main() -> None:
parser = argparse.ArgumentParser(description="Grey literature collection")
parser.add_argument(
"--dry-run",
action="store_true",
help="Print catalogue only, don't write to bib.sqlite",
)
args = parser.parse_args()
print("=" * 70)
print("Grey Literature Collection: Skin Substitutes")
print(f"Date: {datetime.now().strftime('%Y-%m-%d %H:%M')}")
print("=" * 70)
# Catalogue summary
by_source: dict[str, int] = {}
for entry in ALL_ENTRIES:
by_source[entry.source_tag] = by_source.get(entry.source_tag, 0) + 1
print(f"\nTotal documents: {len(ALL_ENTRIES)}")
print("By source:")
for src, count in sorted(by_source.items()):
print(f" {src:15s}: {count:>3}")
print("\nDocuments:")
for i, entry in enumerate(ALL_ENTRIES, 1):
print(f" {i:2d}. [{entry.source_tag}] {entry.title[:70]}")
if args.dry_run:
print("\n[DRY RUN] Skipping bib.sqlite write")
return
# Store in bib.sqlite
print(f"\nStoring {len(ALL_ENTRIES)} documents in bib.sqlite ...")
store = Store()
created = 0
updated = 0
for entry in ALL_ENTRIES:
item = entry_to_item(entry)
con = store._con()
existing = con.execute(
"SELECT key FROM items WHERE url = ?", (item.url,)
).fetchone()
if existing:
updated += 1
else:
created += 1
store.upsert(item)
print(f" Created: {created}")
print(f" Updated: {updated}")
# Verify total skin-subs grey lit
con = store._con()
total = con.execute(
"""SELECT count(DISTINCT i.id) FROM items i
JOIN item_tags it ON i.id = it.item_id
JOIN tags t ON it.tag_id = t.id
WHERE t.name = 'module:skin-subs'
AND i.item_type = 'source'
AND i.url NOT LIKE '%pubmed%'"""
).fetchone()[0]
print(f" Total skin-subs grey lit in bib.sqlite: {total}")
store.close()
print("\nDone.")
if __name__ == "__main__":
main()