fix(qpp): correct risk-standard sourcing + FR citations (refs #593)

This commit is contained in:
kert
2026-08-13 13:42:22 -04:00
parent e85147e33f
commit ab0c23290b
2 changed files with 75 additions and 35 deletions

View File

@@ -69,21 +69,35 @@ Nominal amount standard sourcing caveat
Neither the CY2026 NPRM nor the CY2026 Final Rule (``2025-19787.txt``) Neither the CY2026 NPRM nor the CY2026 Final Rule (``2025-19787.txt``)
restates the *numeric* generally applicable nominal amount standard restates the *numeric* generally applicable nominal amount standard
(42 CFR 414.1415(c)(3)(i)(A)/(B)) — both only cross-reference the (42 CFR 414.1415(c)(3)(i)(A)/(B)) — both only cross-reference the
regulation by section number, which is itself evidence CMS proposed regulation by section number (e.g. NPRM line 26819-26821, Final Rule
no change to it. The revenue-based standard (8%) is transcribed from line 50693-50696), which is itself evidence CMS proposed no change to
the CY2019 PFS Final Rule (``data/fr_downloads/2018-24170.txt``, 83 FR it. The revenue-based standard, 42 CFR 414.1415(c)(3)(i)(A) (8%), is
59939) via the CY2020 PFS Proposed Rule's restatement transcribed from the CY2019 PFS Final Rule
(``data/fr_downloads/2019-16041.txt``, 84 FR 40825), both already (``data/fr_downloads/2018-24170.txt:47248-47252``, 83 FR 59923 —
present in this repository's ``fr_downloads`` corpus, which state it "we are finalizing our proposal to revise Sec. 414.1415(c)(3)(i)(A) to
applies "for QP Performance Periods 2021 through 2024" — commenters maintain the generally applicable revenue-based nominal amount
asked CMS to raise it for 2025+ and CMS did not finalize an increase. standard at 8 percent ... for QP Performance Periods 2021 through
The benchmark-based standard (3%) could **not** be found stated as a 2024"), already present in this repository's ``fr_downloads`` corpus —
bare number tied to section 414.1415(c)(3)(i)(B) anywhere in this commenters asked CMS to raise it for 2025+ and CMS did not finalize an
repository's FR corpus; the value used here is carried over from the increase, so it is carried forward unchanged. This document also
structurally parallel Other Payer Advanced APM standard at 42 CFR separately restates an **8 percent** standard for the *Other Payer*
414.1420(d)(3)(i) (same 2018-24170.txt document, 83 FR 59939), which Advanced APM criterion (42 CFR 414.1420(d)(3)(i), same file, line
CMS designed to align with the Medicare-option standard. See 48189-48192) — a different provision that happens to share the same
``RiskStandards.notes`` on each entry. number; do not conflate the two when re-verifying this citation.
The benchmark-based standard, 42 CFR 414.1415(c)(3)(i)(B), could
**not** be found stated as a bare percentage anywhere in this
repository's FR corpus (``2025-13271.txt``, ``2025-19787.txt``,
``2018-24170.txt``, and ``2019-16041.txt`` were all searched). The
only nearby quoted figure — "at least 3 percent of the expected
expenditures" — belongs to the textually distinct Other Payer Advanced
APM standard at 42 CFR 414.1420(d)(3)(i)
(``2018-24170.txt:48825-48827``, 83 FR 59939), which CMS designed to
*align with* the Medicare-option standard but which is not itself a
statement of the Medicare-option figure. Rather than reuse that
number under a different provision's field, ``benchmark_nominal_pct``
is left ``None`` on every entry, with the gap documented in
``RiskStandards.notes``.
""" """
from __future__ import annotations from __future__ import annotations
@@ -116,15 +130,21 @@ class RiskStandards(BaseModel):
and suppliers in participating APM Entities that must be at risk. and suppliers in participating APM Entities that must be at risk.
42 CFR 414.1415(c)(3)(i)(A).""" 42 CFR 414.1415(c)(3)(i)(A)."""
benchmark_nominal_pct: float benchmark_nominal_pct: float | None = None
"""Expenditure/benchmark-based nominal amount standard — minimum % """Expenditure/benchmark-based nominal amount standard — minimum %
of expected expenditures the APM Entity must be liable for. of expected expenditures the APM Entity must be liable for.
42 CFR 414.1415(c)(3)(i)(B).""" 42 CFR 414.1415(c)(3)(i)(B). ``None`` when this repository's FR
corpus does not state the figure for this specific provision — see
module docstring "Nominal amount standard sourcing caveat" and
``notes``; do **not** assume it equals the numerically similar but
textually distinct Other Payer Advanced APM standard at 42 CFR
414.1420(d)(3)(i)."""
notes: str = "" notes: str = ""
"""Sourcing caveats — see module docstring "Nominal amount """Sourcing caveats — see module docstring "Nominal amount
standard sourcing caveat" for why these values are not directly standard sourcing caveat" for why ``revenue_nominal_pct`` is not
restated as bare numbers in the CY2026 NPRM/Final Rule.""" directly restated as a bare number in the CY2026 NPRM/Final Rule,
and why ``benchmark_nominal_pct`` is ``None``."""
class QppProposed(BaseModel): class QppProposed(BaseModel):
@@ -256,33 +276,44 @@ class QppYear(BaseModel):
# digit) — see module docstring caveat. # digit) — see module docstring caveat.
# #
# Risk standards: see module docstring "Nominal amount standard # Risk standards: see module docstring "Nominal amount standard
# sourcing caveat" — 8% revenue-based / 3% benchmark-based, unchanged # sourcing caveat" — 8% revenue-based (42 CFR 414.1415(c)(3)(i)(A)),
# across 2023-2026 (no proposed or finalized change found in either # unchanged across 2023-2026 (no proposed or finalized change found in
# CY2026 document). # either CY2026 document). Benchmark-based standard (42 CFR
# 414.1415(c)(3)(i)(B)) left None — not stated as a bare number
# anywhere in this repository's FR corpus.
# #
# APM incentive %% and qp_cf_applies: transcribed from NPRM 90 FR # APM incentive %% and qp_cf_applies: transcribed from NPRM 90 FR
# 32818 / Final Rule 90 FR 49926-49927 ("b. APM Incentive Payments to # 32818 / Final Rule 90 FR 49979-49980 ("b. APM Incentive Payments to
# QPs in Advanced APMs and Other Payer Advanced APMs"), and the # QPs in Advanced APMs and Other Payer Advanced APMs"), and the
# sunset statement at NPRM 90 FR 32696 / Final Rule 90 FR 49838 # sunset statement at NPRM 90 FR 32696 / Final Rule 90 FR 49838
# ("Under current law, payment year 2026 is the last year for these # ("Under current law, payment year 2026 is the last year for these
# payments."). # payments.").
_RISK_NOTES = ( _RISK_NOTES = (
"Revenue-based 8% per CY2019 PFS Final Rule (83 FR 59939, " "Revenue-based 8% per CY2019 PFS Final Rule (83 FR 59923, "
"data/fr_downloads/2018-24170.txt) 'for QP Performance Periods " "data/fr_downloads/2018-24170.txt:47248-47252) 'to maintain the "
"2021 through 2024'; not extended or amended in either CY2026 " "generally applicable revenue-based nominal amount standard at 8 "
"percent ... for QP Performance Periods 2021 through 2024' (Sec. "
"414.1415(c)(3)(i)(A)); not extended or amended in either CY2026 "
"document (no proposed/final change found) — carried forward. " "document (no proposed/final change found) — carried forward. "
"Benchmark-based 3% not stated as a bare number for 42 CFR " "(This document separately restates 8% for the *different* Other "
"414.1415(c)(3)(i)(B) in this repository's FR corpus; carried " "Payer Advanced APM standard, Sec. 414.1420(d)(3)(i), at line "
"over from the parallel Other Payer Advanced APM standard at 42 " "48189-48192 — do not conflate the two.) "
"CFR 414.1420(d)(3)(i) (same 83 FR 59939 document)." "Benchmark-based standard (Sec. 414.1415(c)(3)(i)(B)) is left "
"None: not stated as a bare percentage anywhere in this "
"repository's FR corpus (2025-13271.txt, 2025-19787.txt, "
"2018-24170.txt, 2019-16041.txt all searched). The only nearby "
"quoted figure, 'at least 3 percent of the expected expenditures' "
"(2018-24170.txt:48825-48827, 83 FR 59939), is for the textually "
"distinct Other Payer Advanced APM standard at Sec. "
"414.1420(d)(3)(i), not this provision."
) )
def _risk_standards() -> RiskStandards: def _risk_standards() -> RiskStandards:
return RiskStandards( return RiskStandards(
revenue_nominal_pct=8.0, revenue_nominal_pct=8.0,
benchmark_nominal_pct=3.0, benchmark_nominal_pct=None,
notes=_RISK_NOTES, notes=_RISK_NOTES,
) )
@@ -304,14 +335,14 @@ QPP: dict[int, QppYear] = {
risk_standards=_risk_standards(), risk_standards=_risk_standards(),
apm_incentive_pct=3.5, apm_incentive_pct=3.5,
qp_cf_applies=False, qp_cf_applies=False,
citation="90 FR 49926-49927", citation="90 FR 49979-49980",
), ),
2024: QppYear( 2024: QppYear(
# Payment year 2026 is the first year with a differential # Payment year 2026 is the first year with a differential
# QP/non-QP conversion factor (section 1848(d)(20) of the # QP/non-QP conversion factor (section 1848(d)(20) of the
# Act) AND still receives the (final year of) lump-sum APM # Act) AND still receives the (final year of) lump-sum APM
# Incentive Payment — see NPRM 90 FR 32818, Final Rule 90 FR # Incentive Payment — see NPRM 90 FR 32818, Final Rule 90 FR
# 49926-49927. # 49979-49980.
performance_year=2024, performance_year=2024,
payment_year=2026, payment_year=2026,
qp_thresholds=_qp_thresholds(), qp_thresholds=_qp_thresholds(),
@@ -319,7 +350,7 @@ QPP: dict[int, QppYear] = {
risk_standards=_risk_standards(), risk_standards=_risk_standards(),
apm_incentive_pct=1.88, apm_incentive_pct=1.88,
qp_cf_applies=True, qp_cf_applies=True,
citation="90 FR 49926-49927", citation="90 FR 49979-49980",
), ),
2025: QppYear( 2025: QppYear(
# Under current law, payment year 2026 (performance year # Under current law, payment year 2026 (performance year

View File

@@ -40,6 +40,10 @@ class TestRiskStandards:
r = RiskStandards(revenue_nominal_pct=8.0, benchmark_nominal_pct=3.0) r = RiskStandards(revenue_nominal_pct=8.0, benchmark_nominal_pct=3.0)
assert r.notes == "" assert r.notes == ""
def test_default_benchmark_nominal_pct(self):
r = RiskStandards(revenue_nominal_pct=8.0)
assert r.benchmark_nominal_pct is None
# ── QppProposed model ──────────────────────────────────────────── # ── QppProposed model ────────────────────────────────────────────
@@ -202,8 +206,13 @@ class TestSpecificValues:
@pytest.mark.parametrize("year", [2023, 2024, 2025, 2026]) @pytest.mark.parametrize("year", [2023, 2024, 2025, 2026])
def test_risk_standards(self, year): def test_risk_standards(self, year):
# Revenue-based standard (42 CFR 414.1415(c)(3)(i)(A)) is
# transcribed (8%); the benchmark-based standard (42 CFR
# 414.1415(c)(3)(i)(B)) is not stated as a bare number in this
# repository's FR corpus and is left None — see
# RiskStandards.notes / module docstring.
assert QPP[year].risk_standards.revenue_nominal_pct == 8.0 assert QPP[year].risk_standards.revenue_nominal_pct == 8.0
assert QPP[year].risk_standards.benchmark_nominal_pct == 3.0 assert QPP[year].risk_standards.benchmark_nominal_pct is None
@pytest.mark.parametrize("year", [2023, 2024, 2025, 2026]) @pytest.mark.parametrize("year", [2023, 2024, 2025, 2026])
def test_cehrt_required(self, year): def test_cehrt_required(self, year):