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