fix(qpp): correct risk-standard sourcing + FR citations (refs #593)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
Reference in New Issue
Block a user