From 698189589b4e10848bc87f07d1c4a1d7ab990ae1 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 12 Oct 2026 14:36:46 -0400 Subject: [PATCH 1/5] Add Virginia state supplementation for 2026 --- changelog.d/va-ssp-2026.added.md | 1 + .../household/household_state_benefits.yaml | 4 + .../hud/annual_income/sources/unearned.yaml | 1 + .../gov/states/va/dars/ag/minimum_age.yaml | 9 + .../dars/ag/northern_virginia_localities.yaml | 22 ++ .../va/dars/ag/personal_needs_allowance.yaml | 12 + .../gov/states/va/dars/ag/proration_days.yaml | 10 + .../va/dars/ag/rate/northern_virginia.yaml | 12 + .../gov/states/va/dars/ag/rate/standard.yaml | 12 + .../usda/snap/income/sources/unearned.yaml | 7 +- policyengine_us/programs.yaml | 12 + .../gov/states/va/dars/ag/integration.yaml | 144 ++++++++++++ .../baseline/gov/states/va/dars/ag/va_ag.yaml | 208 ++++++++++++++++++ .../variables/gov/states/va/dars/ag/va_ag.py | 29 +++ .../ag/va_ag_allowable_income_exclusions.py | 18 ++ .../gov/states/va/dars/ag/va_ag_care_rate.py | 19 ++ .../gov/states/va/dars/ag/va_ag_certified.py | 11 + .../va/dars/ag/va_ag_countable_income.py | 41 ++++ .../states/va/dars/ag/va_ag_days_eligible.py | 16 ++ .../gov/states/va/dars/ag/va_ag_eligible.py | 34 +++ .../dars/ag/va_ag_is_joint_initial_month.py | 11 + .../income/spm_unit/spm_unit_benefits.py | 1 + 22 files changed, 630 insertions(+), 4 deletions(-) create mode 100644 changelog.d/va-ssp-2026.added.md create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py diff --git a/changelog.d/va-ssp-2026.added.md b/changelog.d/va-ssp-2026.added.md new file mode 100644 index 00000000000..714b781c8f5 --- /dev/null +++ b/changelog.d/va-ssp-2026.added.md @@ -0,0 +1 @@ +Add Virginia Auxiliary Grant for 2026. diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index d2cbd6ba2d4..41e154ead96 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -78,6 +78,7 @@ values: # DC benefits - dc_ossp # Kansas benefits + - va_ag - ks_sspp # Hawaii benefits - hi_oss @@ -176,6 +177,7 @@ values: # DC benefits - dc_ossp # Kansas benefits + - va_ag - ks_sspp # Hawaii benefits - hi_oss @@ -279,6 +281,7 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits + - va_ag - ks_sspp # Hawaii benefits - hi_oss @@ -382,6 +385,7 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits + - va_ag - ks_sspp # Hawaii benefits - hi_oss diff --git a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml index d2b2bbd8675..d0cadaf9343 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -19,6 +19,7 @@ values: - strike_benefits - social_security - ssi + - va_ag - general_assistance - unemployment_compensation - child_support_received diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml new file mode 100644 index 00000000000..fc3bb93307c --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml @@ -0,0 +1,9 @@ +description: Virginia requires this minimum age for placement in adult Auxiliary Grant care. +values: + '2026-01-01': 18 +metadata: + unit: year + label: Virginia Auxiliary Grant minimum age + reference: + - title: 22VAC30-80-10, Adult foster care and assisted living facility definitions + href: https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section10/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml new file mode 100644 index 00000000000..935103f8b8d --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml @@ -0,0 +1,22 @@ +description: Virginia applies the Planning District 8 care rate in these localities. +values: + '2026-01-01': + - ARLINGTON_COUNTY_VA + - FAIRFAX_COUNTY_VA + - LOUDOUN_COUNTY_VA + - PRINCE_WILLIAM_COUNTY_VA + - ALEXANDRIA_CITY_VA + - FAIRFAX_CITY_VA + - FALLS_CHURCH_CITY_VA + - MANASSAS_CITY_VA + - MANASSAS_PARK_CITY_VA +metadata: + unit: list + label: Virginia Auxiliary Grant Northern Virginia localities + reference: + - title: Northern Virginia Regional Commission member jurisdictions + href: https://www.novaregion.org/61/Commissioners + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml new file mode 100644 index 00000000000..0f5052f2293 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml @@ -0,0 +1,12 @@ +description: Virginia provides this monthly personal needs allowance under the Auxiliary Grant program. +values: + '2024-01-01': 87 +metadata: + unit: currency-USD + label: Virginia Auxiliary Grant personal needs allowance + reference: + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ + period: month diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml new file mode 100644 index 00000000000..fef5c1da9fa --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml @@ -0,0 +1,10 @@ +description: Virginia divides the monthly care rate by this number of days when prorating an initial partial + month. +values: + '2017-07-01': 30 +metadata: + unit: day + label: Virginia Auxiliary Grant proration days + reference: + - title: Virginia Auxiliary Grant Manual, Chapter J section 3.3 + href: https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml new file mode 100644 index 00000000000..20739c90013 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml @@ -0,0 +1,12 @@ +description: Virginia provides this monthly approved Auxiliary Grant care rate in this locality group. +values: + '2026-01-01': 2450 +metadata: + unit: currency-USD + label: Virginia Auxiliary Grant northern virginia care rate + reference: + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ + period: month diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml new file mode 100644 index 00000000000..d99b2d03d29 --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml @@ -0,0 +1,12 @@ +description: Virginia provides this monthly approved Auxiliary Grant care rate in this locality group. +values: + '2026-01-01': 2130 +metadata: + unit: currency-USD + label: Virginia Auxiliary Grant standard care rate + reference: + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ + period: month diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml index 6f94d3d09b2..0930d78e715 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -36,6 +36,7 @@ values: - hi_oss - id_aabd - in_ssp + - va_ag - ks_sspp - ky_ssp - la_oss @@ -95,9 +96,7 @@ values: metadata: reference: - - title: 7 CFR 273.9(b)(2) - href: https://www.law.cornell.edu/cfr/text/7/273.9#b_2 - - title: 7 CFR 273.9(c)(1) - href: https://www.law.cornell.edu/cfr/text/7/273.9#c_1 + - title: 7 CFR 273.9(b)(2) and (c)(1), (5) + href: https://www.law.cornell.edu/cfr/text/7/273.9 - title: POMS SI 01401.001 General Information about State Supplementation href: https://secure.ssa.gov/poms.nsf/lnx/0501401001 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 05cb1d13747..f7c006e7fa4 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1090,6 +1090,18 @@ programs: tracks. Unmodeled paths: grandfathered medically-needy-in-medical- institution recipients per WAC 388-478-0055(2)(b); DDA-determined / PVL track per (2)(f); and foster child in BRS per (2)(g). + - state: VA + status: partial + name: Virginia Auxiliary Grant + full_name: Virginia Auxiliary Grant + variable: va_ag + parameter_prefix: gov.states.va.dars.ag + verified_years: '2026' + notes: Models 2026 locality rates, approved adult care placements, SSI and non-SSI income + budgets, resources, entry-month proration and whole-dollar payments. Placement certification + and allowable state income exclusions require explicit inputs; institutional SSI claims + must reflect separate cases after entry. Conditional resource benefits and historical + grandfathering are not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml new file mode 100644 index 00000000000..f7aa7150cb4 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml @@ -0,0 +1,144 @@ +- name: Case 1, separate institutional SSI claims. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + va_ag_certified: true + ssi_claim_is_joint: false + second: + age: 65 + ssi_claim_is_joint: false + va_ag_certified: true + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: VA + output: + va_ag: + - 1223 + - 1223 +- name: Case 2, initial couple computation. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + va_ag_certified: true + va_ag_is_joint_initial_month: true + second: + age: 65 + va_ag_certified: true + va_ag_is_joint_initial_month: true + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: VA + output: + va_ag: + - 1472 + - 1472 +- name: Case 3, non SSI spouse income is not deemed in ongoing care. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + va_ag_certified: true + second: + age: 40 + social_security_retirement: 60000 + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: VA + output: + va_ag: + - 2217 + - 0 +- name: Case 4, initial couple resource limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + first: + age: 65 + va_ag_certified: true + va_ag_is_joint_initial_month: true + ssi_countable_resources: 1500 + second: + age: 65 + va_ag_certified: true + va_ag_is_joint_initial_month: true + ssi_countable_resources: 1501 + marital_units: + couple: + members: + - first + - second + tax_units: + unit: + members: + - first + - second + households: + household: + members: + - first + - second + state_code: VA + output: + va_ag: + - 0 + - 0 +- name: Case 5, annual grant and SNAP income. + period: '2026' + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + output: + va_ag: 14676 + household_state_benefits: 14676 + snap_unearned_income: 26604 + hud_unearned_income: 26604 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml new file mode 100644 index 00000000000..954895741ec --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml @@ -0,0 +1,208 @@ +- name: Case 1, full SSI with standard care rate. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + output: + va_ag: 1223 +- name: Case 2, Northern Virginia facility. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + county: FAIRFAX_COUNTY_VA + output: + va_ag: 1543 +- name: Case 3, Northern Virginia independent city. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + county: MANASSAS_PARK_CITY_VA + output: + va_ag: 1543 +- name: Case 4, state only grant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + social_security_retirement: 24000 + output: + va_ag: 237 +- name: Case 5, earned income while receiving SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + employment_income: 7200 + output: + va_ag: 1223 +- name: Case 6, benefit rounds a half dollar up. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_countable_income: 2216.5 + output: + va_ag: 1 +- name: Case 7, deficiency below fifty cents does not pay. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_countable_income: 2216.51 + output: + va_ag: 0 +- name: Case 8, income at need standard. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_countable_income: 2217 + output: + va_ag: 0 +- name: Case 9, resources at limit. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + ssi_countable_resources: 2000 + output: + va_ag: 1223 +- name: Case 10, excess resources. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + ssi_countable_resources: 2001 + output: + va_ag: 0 +- name: Case 11, no approved care. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: false + output: + va_ag: 0 +- name: Case 12, nonresident. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: NC + age: 65 + va_ag_certified: true + output: + va_ag: 0 +- name: Case 13, not aged blind or disabled. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 40 + va_ag_certified: true + output: + va_ag: 0 +- name: Case 14, certified disabled adult. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 18 + va_ag_certified: true + meets_ssi_disability_criteria: true + output: + va_ag: 1223 +- name: Case 15, child does not qualify for adult care. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 17 + va_ag_certified: true + is_blind: true + output: + va_ag: 0 +- name: Case 16, first month fifteen days of care. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_days_eligible: 15 + output: + va_ag: 158 +- name: Case 17, zero eligible days. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_days_eligible: 0 + output: + va_ag: 0 +- name: Case 18, first month community expenses. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_days_eligible: 15 + va_ag_allowable_income_exclusions: 400 + output: + va_ag: 558 +- name: Case 19, guardianship fee increases grant. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_allowable_income_exclusions: 10 + output: + va_ag: 1233 +- name: Case 20, actual approved rate below maximum. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_care_rate: 1500 + output: + va_ag: 593 +- name: Case 21, non SSI interest is countable under the AG manual. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + social_security_retirement: 24000 + interest_income: 1200 + output: + va_ag: 137 diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py new file mode 100644 index 00000000000..dfa92e58830 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class va_ag(Variable): + value_type = float + entity = Person + label = "Virginia Auxiliary Grant" + definition_period = MONTH + unit = USD + defined_for = "va_ag_eligible" + reference = ( + "https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section50/", + "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.va.dars.ag + rate = max_(person("va_ag_care_rate", period), 0) + northern = np.isin( + person.household("county_str", period.this_year), + p.northern_virginia_localities, + ) + maximum = where(northern, p.rate.northern_virginia, p.rate.standard) + rate = min_(rate, maximum) + days = clip(person("va_ag_days_eligible", period), 0, period.days) + rate = where(days == period.days, rate, rate / p.proration_days * days) + need = rate + p.personal_needs_allowance + deficiency = max_(need - person("va_ag_countable_income", period), 0) + return (days > 0) * np.floor(deficiency + 0.5) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py new file mode 100644 index 00000000000..3e7f69e5cee --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class va_ag_allowable_income_exclusions(Variable): + value_type = float + entity = Person + label = "Virginia Auxiliary Grant allowable state income exclusions" + definition_period = MONTH + unit = USD + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + documentation = """ + Total verified Virginia exclusions after applying Chapter D section 6 or + Chapter H: entry-month community expenses, the applicable spouse/child + allocation, and court-authorized guardianship fees. Enter only the allowed + amount, not total expenses. These adjustments are additional to federal + SSI exclusions. A percentage guardianship fee that includes the grant is + calculated using the grant before that fee, as in Chapter D section 6.4.1.2.2. + """ diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py new file mode 100644 index 00000000000..99937d72f51 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class va_ag_care_rate(Variable): + value_type = float + entity = Person + label = "Virginia Auxiliary Grant approved monthly care rate" + definition_period = MONTH + unit = USD + reference = "https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf" + documentation = "Use the approved provider rate when it is below the published locality maximum." + + def formula(person, period, parameters): + p = parameters(period).gov.states.va.dars.ag + northern = np.isin( + person.household("county_str", period.this_year), + p.northern_virginia_localities, + ) + return where(northern, p.rate.northern_virginia, p.rate.standard) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py new file mode 100644 index 00000000000..98ea2bbfa63 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class va_ag_certified(Variable): + value_type = bool + entity = Person + label = "Certified for Virginia Auxiliary Grant care" + definition_period = MONTH + default_value = False + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + documentation = """An approved assisted living, adult foster care or supportive housing placement with the required needs assessment. Includes the Virginia residency period or exception, pursuit of other benefits, and satisfaction of applicable transfer, public-institution and nonfinancial conditions.""" diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py new file mode 100644 index 00000000000..5b0da329ef5 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py @@ -0,0 +1,41 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.ssa.ssi.eligibility.income._apply_ssi_exclusions import ( + _apply_ssi_exclusions, +) + + +class va_ag_countable_income(Variable): + value_type = float + entity = Person + label = "Virginia Auxiliary Grant countable income" + definition_period = MONTH + unit = USD + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + + def formula(person, period, parameters): + joint = ( + person.marital_unit.sum(person("va_ag_is_joint_initial_month", period)) == 2 + ) + earned = max_( + person("ssi_earned_income", period) + - person("ssi_blind_or_disabled_working_student_exclusion", period), + 0, + ) + unearned = max_(person("ssi_unearned_income", period), 0) + earned = where(joint, person.marital_unit.sum(earned), earned) + unearned = where(joint, person.marital_unit.sum(unearned), unearned) + non_ssi_countable = ( + _apply_ssi_exclusions( + earned * MONTHS_IN_YEAR, unearned * MONTHS_IN_YEAR, parameters, period + ) + / MONTHS_IN_YEAR + ) + non_ssi_countable = where(joint, non_ssi_countable / 2, non_ssi_countable) + ssi = person("ssi", period) + # Chapter D uses SSA's verified net income for current SSI recipients; + # non-SSI institutional recipients have individual income budgets. + countable = where( + ssi > 0, person("ssi_countable_income", period) + ssi, non_ssi_countable + ) + exclusions = max_(person("va_ag_allowable_income_exclusions", period), 0) + return max_(countable - exclusions, 0) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py new file mode 100644 index 00000000000..d9934458900 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class va_ag_days_eligible(Variable): + value_type = int + entity = Person + label = "Days of Virginia Auxiliary Grant care in the initial month" + definition_period = MONTH + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + documentation = """ + Use actual days in an initial partial month, including entry and excluding + discharge. Later discharge months retain the full monthly care rate. + """ + + def formula(person, period, parameters): + return period.days diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py new file mode 100644 index 00000000000..5dad1e49a69 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class va_ag_eligible(Variable): + value_type = bool + entity = Person + label = "Virginia Auxiliary Grant non-income eligibility" + definition_period = MONTH + defined_for = StateCode.VA + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + + def formula(person, period, parameters): + p = parameters(period).gov.states.va.dars.ag + age = person("age", period.this_year) + immigration = person("immigration_status", period.this_year) + citizen = immigration == immigration.possible_values.CITIZEN + immigrant = person("is_ssi_qualified_noncitizen", period.this_year) + joint = ( + person.marital_unit.sum(person("va_ag_is_joint_initial_month", period)) == 2 + ) + resources = person("ssi_countable_resources", period.this_year) + resources = where(joint, person.marital_unit.sum(resources), resources) + limits = parameters(period).gov.ssa.ssi.eligibility.resources.limit + resource_eligible = (person("ssi", period) > 0) | ( + resources <= where(joint, limits.couple, limits.individual) + ) + return ( + person("va_ag_certified", period) + & (age >= p.minimum_age) + & person("is_ssi_aged_blind_disabled", period.this_year) + & (citizen | immigrant) + & resource_eligible + & ~person("is_incarcerated", period) + ) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py new file mode 100644 index 00000000000..8d76c405329 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class va_ag_is_joint_initial_month(Variable): + value_type = bool + entity = Person + label = "Virginia Auxiliary Grant couple in the initial month" + definition_period = MONTH + default_value = False + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + documentation = """Set for both spouses only in the initial application month when both lived together at the start of the month, entered approved care, applied, and were found eligible that month. Later institutional months are separate cases; reflect that in the federal SSI claim inputs too.""" diff --git a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py index 41ead044f46..e84418ca42a 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -22,6 +22,7 @@ def formula(spm_unit, period, parameters): "ky_ssp", # Kentucky benefits "de_ssp", # Delaware benefits "fl_oss", + "va_ag", "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits From ce107bf28210d19b99d3ccab491dae8a90db8851 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 01:05:46 -0400 Subject: [PATCH 2/5] Normalize Virginia SSP parameter and test formatting --- .../household/household_state_benefits.yaml | 1 + .../hud/annual_income/sources/unearned.yaml | 1 + .../gov/states/va/dars/ag/minimum_age.yaml | 7 +- .../dars/ag/northern_virginia_localities.yaml | 33 +++--- .../va/dars/ag/personal_needs_allowance.yaml | 13 +-- .../gov/states/va/dars/ag/proration_days.yaml | 10 +- .../va/dars/ag/rate/northern_virginia.yaml | 13 +-- .../gov/states/va/dars/ag/rate/standard.yaml | 13 +-- .../gov/states/va/dars/ag/integration.yaml | 100 +++++++----------- .../baseline/gov/states/va/dars/ag/va_ag.yaml | 54 +++++++--- 10 files changed, 122 insertions(+), 123 deletions(-) diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index 41e154ead96..be2402f48ba 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -405,6 +405,7 @@ values: - nj_property_tax_relief # New York benefits - ny_child_care_subsidies + metadata: unit: list period: year diff --git a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml index d0cadaf9343..df5fc9e3ee2 100644 --- a/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/hud/annual_income/sources/unearned.yaml @@ -30,6 +30,7 @@ values: - disability_benefits - survivor_benefits - financial_assistance + metadata: unit: list period: year diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml index fc3bb93307c..afc83edb43e 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml @@ -1,9 +1,10 @@ description: Virginia requires this minimum age for placement in adult Auxiliary Grant care. values: - '2026-01-01': 18 + 2026-01-01: 18 + metadata: unit: year label: Virginia Auxiliary Grant minimum age reference: - - title: 22VAC30-80-10, Adult foster care and assisted living facility definitions - href: https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section10/ + - title: 22VAC30-80-10, Adult foster care and assisted living facility definitions + href: https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section10/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml index 935103f8b8d..2a42258fe55 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml @@ -1,22 +1,23 @@ description: Virginia applies the Planning District 8 care rate in these localities. values: - '2026-01-01': - - ARLINGTON_COUNTY_VA - - FAIRFAX_COUNTY_VA - - LOUDOUN_COUNTY_VA - - PRINCE_WILLIAM_COUNTY_VA - - ALEXANDRIA_CITY_VA - - FAIRFAX_CITY_VA - - FALLS_CHURCH_CITY_VA - - MANASSAS_CITY_VA - - MANASSAS_PARK_CITY_VA + 2026-01-01: + - ARLINGTON_COUNTY_VA + - FAIRFAX_COUNTY_VA + - LOUDOUN_COUNTY_VA + - PRINCE_WILLIAM_COUNTY_VA + - ALEXANDRIA_CITY_VA + - FAIRFAX_CITY_VA + - FALLS_CHURCH_CITY_VA + - MANASSAS_CITY_VA + - MANASSAS_PARK_CITY_VA + metadata: unit: list label: Virginia Auxiliary Grant Northern Virginia localities reference: - - title: Northern Virginia Regional Commission member jurisdictions - href: https://www.novaregion.org/61/Commissioners - - title: Virginia Auxiliary Grant January 2026 rate letter - href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf - - title: Virginia 2026 Appropriation Act, Item 332 A - href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ + - title: Northern Virginia Regional Commission member jurisdictions + href: https://www.novaregion.org/61/Commissioners + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml index 0f5052f2293..b1d12546225 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml @@ -1,12 +1,13 @@ description: Virginia provides this monthly personal needs allowance under the Auxiliary Grant program. values: - '2024-01-01': 87 + 2024-01-01: 87 + metadata: unit: currency-USD + period: month label: Virginia Auxiliary Grant personal needs allowance reference: - - title: Virginia Auxiliary Grant January 2026 rate letter - href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf - - title: Virginia 2026 Appropriation Act, Item 332 A - href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ - period: month + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml index fef5c1da9fa..0187a9fa502 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml @@ -1,10 +1,10 @@ -description: Virginia divides the monthly care rate by this number of days when prorating an initial partial - month. +description: Virginia divides the monthly care rate by this number of days when prorating an initial partial month. values: - '2017-07-01': 30 + 2017-07-01: 30 + metadata: unit: day label: Virginia Auxiliary Grant proration days reference: - - title: Virginia Auxiliary Grant Manual, Chapter J section 3.3 - href: https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf + - title: Virginia Auxiliary Grant Manual, Chapter J section 3.3 + href: https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml index 20739c90013..91b6ca3d03c 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml @@ -1,12 +1,13 @@ description: Virginia provides this monthly approved Auxiliary Grant care rate in this locality group. values: - '2026-01-01': 2450 + 2026-01-01: 2_450 + metadata: unit: currency-USD + period: month label: Virginia Auxiliary Grant northern virginia care rate reference: - - title: Virginia Auxiliary Grant January 2026 rate letter - href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf - - title: Virginia 2026 Appropriation Act, Item 332 A - href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ - period: month + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml index d99b2d03d29..2bd05d25421 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml @@ -1,12 +1,13 @@ description: Virginia provides this monthly approved Auxiliary Grant care rate in this locality group. values: - '2026-01-01': 2130 + 2026-01-01: 2_130 + metadata: unit: currency-USD + period: month label: Virginia Auxiliary Grant standard care rate reference: - - title: Virginia Auxiliary Grant January 2026 rate letter - href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf - - title: Virginia 2026 Appropriation Act, Item 332 A - href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ - period: month + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml index f7aa7150cb4..d4b464b08ed 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml @@ -3,142 +3,114 @@ absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 va_ag_certified: true ssi_claim_is_joint: false - second: + person2: age: 65 ssi_claim_is_joint: false va_ag_certified: true marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: VA output: - va_ag: - - 1223 - - 1223 + va_ag: [1_223, 1_223] + - name: Case 2, initial couple computation. period: 2026-01 absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 va_ag_certified: true va_ag_is_joint_initial_month: true - second: + person2: age: 65 va_ag_certified: true va_ag_is_joint_initial_month: true marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: VA output: - va_ag: - - 1472 - - 1472 + va_ag: [1_472, 1_472] + - name: Case 3, non SSI spouse income is not deemed in ongoing care. period: 2026-01 absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 va_ag_certified: true - second: + person2: age: 40 - social_security_retirement: 60000 + social_security_retirement: 60_000 marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: VA output: - va_ag: - - 2217 - - 0 + va_ag: [2_217, 0] + - name: Case 4, initial couple resource limit. period: 2026-01 absolute_error_margin: 0.01 input: people: - first: + person1: age: 65 va_ag_certified: true va_ag_is_joint_initial_month: true - ssi_countable_resources: 1500 - second: + ssi_countable_resources: 1_500 + person2: age: 65 va_ag_certified: true va_ag_is_joint_initial_month: true - ssi_countable_resources: 1501 + ssi_countable_resources: 1_501 marital_units: couple: - members: - - first - - second + members: [person1, person2] tax_units: unit: - members: - - first - - second + members: [person1, person2] households: household: - members: - - first - - second + members: [person1, person2] state_code: VA output: - va_ag: - - 0 - - 0 + va_ag: [0, 0] + - name: Case 5, annual grant and SNAP income. - period: '2026' + period: 2026 absolute_error_margin: 0.01 input: state_code: VA age: 65 va_ag_certified: true output: - va_ag: 14676 - household_state_benefits: 14676 - snap_unearned_income: 26604 - hud_unearned_income: 26604 + va_ag: 14_676 + household_state_benefits: 14_676 + snap_unearned_income: 26_604 + hud_unearned_income: 26_604 diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml index 954895741ec..b24016ef56a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml @@ -6,7 +6,8 @@ age: 65 va_ag_certified: true output: - va_ag: 1223 + va_ag: 1_223 + - name: Case 2, Northern Virginia facility. period: 2026-01 absolute_error_margin: 0.01 @@ -16,7 +17,8 @@ va_ag_certified: true county: FAIRFAX_COUNTY_VA output: - va_ag: 1543 + va_ag: 1_543 + - name: Case 3, Northern Virginia independent city. period: 2026-01 absolute_error_margin: 0.01 @@ -26,7 +28,8 @@ va_ag_certified: true county: MANASSAS_PARK_CITY_VA output: - va_ag: 1543 + va_ag: 1_543 + - name: Case 4, state only grant. period: 2026-01 absolute_error_margin: 0.01 @@ -34,9 +37,10 @@ state_code: VA age: 65 va_ag_certified: true - social_security_retirement: 24000 + social_security_retirement: 24_000 output: va_ag: 237 + - name: Case 5, earned income while receiving SSI. period: 2026-01 absolute_error_margin: 0.01 @@ -44,9 +48,10 @@ state_code: VA age: 65 va_ag_certified: true - employment_income: 7200 + employment_income: 7_200 output: - va_ag: 1223 + va_ag: 1_223 + - name: Case 6, benefit rounds a half dollar up. period: 2026-01 absolute_error_margin: 0.01 @@ -54,9 +59,10 @@ state_code: VA age: 65 va_ag_certified: true - va_ag_countable_income: 2216.5 + va_ag_countable_income: 2_216.5 output: va_ag: 1 + - name: Case 7, deficiency below fifty cents does not pay. period: 2026-01 absolute_error_margin: 0.01 @@ -64,9 +70,10 @@ state_code: VA age: 65 va_ag_certified: true - va_ag_countable_income: 2216.51 + va_ag_countable_income: 2_216.51 output: va_ag: 0 + - name: Case 8, income at need standard. period: 2026-01 absolute_error_margin: 0.01 @@ -74,9 +81,10 @@ state_code: VA age: 65 va_ag_certified: true - va_ag_countable_income: 2217 + va_ag_countable_income: 2_217 output: va_ag: 0 + - name: Case 9, resources at limit. period: 2026-01 absolute_error_margin: 0.01 @@ -84,9 +92,10 @@ state_code: VA age: 65 va_ag_certified: true - ssi_countable_resources: 2000 + ssi_countable_resources: 2_000 output: - va_ag: 1223 + va_ag: 1_223 + - name: Case 10, excess resources. period: 2026-01 absolute_error_margin: 0.01 @@ -94,9 +103,10 @@ state_code: VA age: 65 va_ag_certified: true - ssi_countable_resources: 2001 + ssi_countable_resources: 2_001 output: va_ag: 0 + - name: Case 11, no approved care. period: 2026-01 absolute_error_margin: 0.01 @@ -106,6 +116,7 @@ va_ag_certified: false output: va_ag: 0 + - name: Case 12, nonresident. period: 2026-01 absolute_error_margin: 0.01 @@ -115,6 +126,7 @@ va_ag_certified: true output: va_ag: 0 + - name: Case 13, not aged blind or disabled. period: 2026-01 absolute_error_margin: 0.01 @@ -124,6 +136,7 @@ va_ag_certified: true output: va_ag: 0 + - name: Case 14, certified disabled adult. period: 2026-01 absolute_error_margin: 0.01 @@ -133,7 +146,8 @@ va_ag_certified: true meets_ssi_disability_criteria: true output: - va_ag: 1223 + va_ag: 1_223 + - name: Case 15, child does not qualify for adult care. period: 2026-01 absolute_error_margin: 0.01 @@ -144,6 +158,7 @@ is_blind: true output: va_ag: 0 + - name: Case 16, first month fifteen days of care. period: 2026-01 absolute_error_margin: 0.01 @@ -154,6 +169,7 @@ va_ag_days_eligible: 15 output: va_ag: 158 + - name: Case 17, zero eligible days. period: 2026-01 absolute_error_margin: 0.01 @@ -164,6 +180,7 @@ va_ag_days_eligible: 0 output: va_ag: 0 + - name: Case 18, first month community expenses. period: 2026-01 absolute_error_margin: 0.01 @@ -175,6 +192,7 @@ va_ag_allowable_income_exclusions: 400 output: va_ag: 558 + - name: Case 19, guardianship fee increases grant. period: 2026-01 absolute_error_margin: 0.01 @@ -184,7 +202,8 @@ va_ag_certified: true va_ag_allowable_income_exclusions: 10 output: - va_ag: 1233 + va_ag: 1_233 + - name: Case 20, actual approved rate below maximum. period: 2026-01 absolute_error_margin: 0.01 @@ -192,9 +211,10 @@ state_code: VA age: 65 va_ag_certified: true - va_ag_care_rate: 1500 + va_ag_care_rate: 1_500 output: va_ag: 593 + - name: Case 21, non SSI interest is countable under the AG manual. period: 2026-01 absolute_error_margin: 0.01 @@ -202,7 +222,7 @@ state_code: VA age: 65 va_ag_certified: true - social_security_retirement: 24000 - interest_income: 1200 + social_security_retirement: 24_000 + interest_income: 1_200 output: va_ag: 137 From 0e6fa7c292da5e8ab5c90fae38988735572feb0b Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 13 Oct 2026 02:53:13 -0400 Subject: [PATCH 3/5] Fix issues from review: Virginia Auxiliary Grant income, deeming notes and tests - Exclude interest and dividends from the non-SSI budget, per the AG manual - Document how ongoing-care spouses are represented; one locality-maximum lookup - Registry placement and comments, SNAP reference title, shorter programs.yaml note - Manual page anchors and Planning District 8 sources; age-gate citation - Corrected ongoing-care and interest cases; joint initial-month and realistic households Co-Authored-By: Claude Opus 5.5 --- .../household/household_state_benefits.yaml | 8 +- .../va/dars/ag/excluded_unearned_sources.yaml | 15 +++ .../gov/states/va/dars/ag/minimum_age.yaml | 10 -- .../dars/ag/northern_virginia_localities.yaml | 4 +- .../gov/states/va/dars/ag/proration_days.yaml | 2 +- .../va/dars/ag/rate/northern_virginia.yaml | 2 +- .../usda/snap/income/sources/unearned.yaml | 4 +- policyengine_us/programs.yaml | 8 +- .../gov/states/va/dars/ag/integration.yaml | 98 ++++++++++++++++++- .../baseline/gov/states/va/dars/ag/va_ag.yaml | 47 ++++++--- .../variables/gov/states/va/dars/ag/va_ag.py | 12 +-- .../ag/va_ag_allowable_income_exclusions.py | 3 +- .../gov/states/va/dars/ag/va_ag_care_rate.py | 9 +- .../gov/states/va/dars/ag/va_ag_certified.py | 8 +- .../va/dars/ag/va_ag_countable_income.py | 19 +++- .../states/va/dars/ag/va_ag_days_eligible.py | 4 +- .../gov/states/va/dars/ag/va_ag_eligible.py | 6 +- .../dars/ag/va_ag_is_joint_initial_month.py | 13 ++- .../va/dars/ag/va_ag_maximum_care_rate.py | 23 +++++ .../income/spm_unit/spm_unit_benefits.py | 2 +- 20 files changed, 227 insertions(+), 70 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/excluded_unearned_sources.yaml delete mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_maximum_care_rate.py diff --git a/policyengine_us/parameters/gov/household/household_state_benefits.yaml b/policyengine_us/parameters/gov/household/household_state_benefits.yaml index be2402f48ba..63e548cfb70 100644 --- a/policyengine_us/parameters/gov/household/household_state_benefits.yaml +++ b/policyengine_us/parameters/gov/household/household_state_benefits.yaml @@ -73,12 +73,12 @@ values: - tx_ssi_state_supplement # Virginia benefits - va_child_care_subsidies + - va_ag # Massachusetts benefits - ma_eaedc # DC benefits - dc_ossp # Kansas benefits - - va_ag - ks_sspp # Hawaii benefits - hi_oss @@ -166,6 +166,7 @@ values: - tx_ssi_state_supplement # Virginia benefits - va_child_care_subsidies + - va_ag # West Virginia benefits - wv_child_care_subsidies # North Carolina benefits @@ -177,7 +178,6 @@ values: # DC benefits - dc_ossp # Kansas benefits - - va_ag - ks_sspp # Hawaii benefits - hi_oss @@ -269,6 +269,7 @@ values: - tx_ssi_state_supplement # Virginia benefits - va_child_care_subsidies + - va_ag # West Virginia benefits - wv_child_care_subsidies # North Carolina benefits @@ -281,7 +282,6 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits - - va_ag - ks_sspp # Hawaii benefits - hi_oss @@ -373,6 +373,7 @@ values: - tx_ssi_state_supplement # Virginia benefits - va_child_care_subsidies + - va_ag # West Virginia benefits - wv_child_care_subsidies # North Carolina benefits @@ -385,7 +386,6 @@ values: - dc_ossp - dc_child_care_subsidies # Kansas benefits - - va_ag - ks_sspp # Hawaii benefits - hi_oss diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/excluded_unearned_sources.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/excluded_unearned_sources.yaml new file mode 100644 index 00000000000..0d17d75c45f --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/excluded_unearned_sources.yaml @@ -0,0 +1,15 @@ +description: Virginia excludes these sources from countable unearned income under the Auxiliary Grant program. +values: + # Section 24.1.1 excludes interest and dividends earned on countable resources. + # Section 24.1.2 counts interest on some excluded resources, which the inputs + # do not identify, so all interest and dividends are excluded. + 2019-07-01: + - dividend_income + - interest_income + +metadata: + unit: list + label: Virginia Auxiliary Grant non-SSI excluded unearned income sources + reference: + - title: Virginia Auxiliary Grant Manual, Chapter I section 24.1 + href: https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=439 diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml deleted file mode 100644 index afc83edb43e..00000000000 --- a/policyengine_us/parameters/gov/states/va/dars/ag/minimum_age.yaml +++ /dev/null @@ -1,10 +0,0 @@ -description: Virginia requires this minimum age for placement in adult Auxiliary Grant care. -values: - 2026-01-01: 18 - -metadata: - unit: year - label: Virginia Auxiliary Grant minimum age - reference: - - title: 22VAC30-80-10, Adult foster care and assisted living facility definitions - href: https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section10/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml index 2a42258fe55..d07e23ee70f 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml @@ -15,8 +15,8 @@ metadata: unit: list label: Virginia Auxiliary Grant Northern Virginia localities reference: - - title: Northern Virginia Regional Commission member jurisdictions - href: https://www.novaregion.org/61/Commissioners + - title: Virginia Auxiliary Grant Manual, Supportive Housing, AG rate and approved provider listing + href: https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=542 - title: Virginia Auxiliary Grant January 2026 rate letter href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf - title: Virginia 2026 Appropriation Act, Item 332 A diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml index 0187a9fa502..f1fffd6be4e 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml @@ -7,4 +7,4 @@ metadata: label: Virginia Auxiliary Grant proration days reference: - title: Virginia Auxiliary Grant Manual, Chapter J section 3.3 - href: https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf + href: https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=522 diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml index 91b6ca3d03c..ec3112ad5b4 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml @@ -5,7 +5,7 @@ values: metadata: unit: currency-USD period: month - label: Virginia Auxiliary Grant northern virginia care rate + label: Virginia Auxiliary Grant Northern Virginia care rate reference: - title: Virginia Auxiliary Grant January 2026 rate letter href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf diff --git a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml index 0930d78e715..d1af7d9284b 100644 --- a/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml +++ b/policyengine_us/parameters/gov/usda/snap/income/sources/unearned.yaml @@ -36,7 +36,6 @@ values: - hi_oss - id_aabd - in_ssp - - va_ag - ks_sspp - ky_ssp - la_oss @@ -50,6 +49,7 @@ values: - nm_ssi_state_supplement - sc_ssi_state_supplement - tx_ssi_state_supplement + - va_ag - wa_ssp # Listed elsewhere: ca_state_supplement is an SPM unit variable with no # person-level counterpart. policyengine-core projects a group value onto @@ -96,7 +96,7 @@ values: metadata: reference: - - title: 7 CFR 273.9(b)(2) and (c)(1), (5) + - title: 7 CFR 273.9(b)(2) and (c)(1) href: https://www.law.cornell.edu/cfr/text/7/273.9 - title: POMS SI 01401.001 General Information about State Supplementation href: https://secure.ssa.gov/poms.nsf/lnx/0501401001 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index f7c006e7fa4..4ca7caee0d2 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1097,11 +1097,9 @@ programs: variable: va_ag parameter_prefix: gov.states.va.dars.ag verified_years: '2026' - notes: Models 2026 locality rates, approved adult care placements, SSI and non-SSI income - budgets, resources, entry-month proration and whole-dollar payments. Placement certification - and allowable state income exclusions require explicit inputs; institutional SSI claims - must reflect separate cases after entry. Conditional resource benefits and historical - grandfathering are not modeled. + notes: Models 2026 locality rates and SSI and non-SSI budgets for certified assisted living, + adult foster care and supportive housing residents. Conditional resource benefits and + historical grandfathering are not modeled. - id: social_security name: Social Security diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml index d4b464b08ed..9398d55319f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml @@ -58,9 +58,10 @@ person1: age: 65 va_ag_certified: true + is_ssi_spousal_deeming_applies: false person2: - age: 40 - social_security_retirement: 60_000 + age: 63 + social_security_retirement: 18_000 marital_units: couple: members: [person1, person2] @@ -72,7 +73,13 @@ members: [person1, person2] state_code: VA output: - va_ag: [2_217, 0] + # No deeming: person1 has no income, so SSI is 994 - 0 = 994. + # person2 (63, not disabled) is not SSI-eligible. + # Deeming would count 1,500 - 20 = 1,480 and cut SSI to 1,491 - 1,480 = 11. + ssi: [994, 0] + # Countable income 0 + 994 = 994; 2,217 - 994 = 1,223. + # With deeming it would be 2,217 - (1,480 + 11) = 726. + va_ag: [1_223, 0] - name: Case 4, initial couple resource limit. period: 2026-01 @@ -114,3 +121,88 @@ household_state_benefits: 14_676 snap_unearned_income: 26_604 hud_unearned_income: 26_604 + +- name: Case 6, moderate earnings spouse in a separate marital unit is not deemed in ongoing care. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + va_ag_certified: true + person2: + age: 60 + employment_income: 30_000 + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # After the entry month the spouse sits in a separate marital unit, + # so none of the spouse's 2,500 monthly earnings is deemed. + is_ssi_spousal_deeming_applies: [false, false] + ssi_income_deemed_from_ineligible_spouse: [0, 0] + ssi_countable_income: [0, 0] + # person1 gets the individual FBR: 994 - 0 = 994. + # person2 (60, not disabled) is not SSI-eligible. + uncapped_ssi: [994, 0] + ssi: [994, 0] + va_ag_eligible: [true, false] + va_ag_maximum_care_rate: [2_130, 2_130] + # Countable income 0 + 994 = 994; 2,130 + 87 - 994 = 1,223. + # In one marital unit, (2,500 - 85) * 0.5 = 1,207.50 would be deemed: + # SSI 1,491 - 1,207.50 = 283.50 and the grant 2,217 - 1,491 = 726. + va_ag: [1_223, 0] + +- name: Case 7, couple entering care together pools income in the initial month. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + va_ag_certified: true + va_ag_is_joint_initial_month: true + social_security_retirement: 19_200 + person2: + age: 70 + va_ag_certified: true + va_ag_is_joint_initial_month: true + social_security_retirement: 19_200 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # Both spouses are aged, so SSI uses the couple computation. + ssi_claim_is_joint: [true, true] + ssi_couple_computation_applies: [true, true] + # 1,491 / 2 = 745.50 each. + ssi_amount_if_eligible: [745.5, 745.5] + # (1,600 + 1,600 - 20) / 2 = 1,590 each. + ssi_countable_income: [1_590, 1_590] + # 745.50 - 1,590 = -844.50, so no SSI. + uncapped_ssi: [-844.5, -844.5] + ssi: [0, 0] + # Pooled resources 0 are within the 3,000 couple limit. + va_ag_eligible: [true, true] + va_ag_maximum_care_rate: [2_130, 2_130] + # Non-SSI budget pools 3,200, takes one 20 exclusion and halves: + # (3,200 - 20) / 2 = 1,590 each (separate budgets would give 1,580). + va_ag_countable_income: [1_590, 1_590] + # 2,130 + 87 - 1,590 = 627 each (637 without the joint flag). + va_ag: [627, 627] diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml index b24016ef56a..f4ded61561a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml @@ -57,32 +57,45 @@ absolute_error_margin: 0.01 input: state_code: VA - age: 65 + age: 50 va_ag_certified: true - va_ag_countable_income: 2_216.5 + meets_ssi_disability_criteria: true + social_security_disability: 18_000 + employment_income: 7_224 output: - va_ag: 1 + # Earnings of 602 a month are below the 1,690 SGA level, so SSI disabled. + # Countable: (1,500 - 20) + (602 - 65) * 0.5 = 1,748.50 > 994, so SSI is 0. + # Need 2,130 + 87 = 2,217; 2,217 - 1,748.50 = 468.50, rounded up to 469 + # (half-to-even rounding would give 468). + va_ag: 469 -- name: Case 7, deficiency below fifty cents does not pay. +- name: Case 7, deficiency cents below fifty round down. period: 2026-01 absolute_error_margin: 0.01 input: state_code: VA age: 65 va_ag_certified: true - va_ag_countable_income: 2_216.51 + county: ARLINGTON_COUNTY_VA + va_ag_days_eligible: 14 output: - va_ag: 0 + # Entry on January 18 gives 14 days: 2,450 / 30 * 14 = 1,143.33. + # Need 1,143.33 + 87 = 1,230.33; SSI 994 makes countable income 994. + # 1,230.33 - 994 = 236.33, rounded down to 236. + va_ag: 236 -- name: Case 8, income at need standard. +- name: Case 8, income above need standard. period: 2026-01 absolute_error_margin: 0.01 input: state_code: VA age: 65 va_ag_certified: true - va_ag_countable_income: 2_217 + social_security_retirement: 24_000 + pension_income: 6_000 output: + # Countable: 2,000 + 500 - 20 = 2,480 > 994, so SSI is 0. + # 2,480 exceeds the 2,217 need, so no grant. va_ag: 0 - name: Case 9, resources at limit. @@ -148,16 +161,18 @@ output: va_ag: 1_223 -- name: Case 15, child does not qualify for adult care. +- name: Case 15, certified blind adult. period: 2026-01 absolute_error_margin: 0.01 input: state_code: VA - age: 17 + age: 45 va_ag_certified: true is_blind: true output: - va_ag: 0 + # Blindness qualifies for SSI at any age: SSI 994, countable income 994. + # 2,217 - 994 = 1,223. + va_ag: 1_223 - name: Case 16, first month fifteen days of care. period: 2026-01 @@ -215,7 +230,7 @@ output: va_ag: 593 -- name: Case 21, non SSI interest is countable under the AG manual. +- name: Case 21, interest on countable resources is not counted for a non SSI applicant. period: 2026-01 absolute_error_margin: 0.01 input: @@ -223,6 +238,10 @@ age: 65 va_ag_certified: true social_security_retirement: 24_000 - interest_income: 1_200 + ssi_countable_resources: 2_000 + interest_income: 60 output: - va_ag: 137 + # SSI counts the 5 monthly interest: 2,000 + 5 - 20 = 1,985 > 994, so SSI is 0. + # The AG budget excludes it: 2,000 - 20 = 1,980 (resources 2,000 at the limit). + # 2,217 - 1,980 = 237; counting the interest would give 232. + va_ag: 237 diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py index dfa92e58830..6fd99d5aa04 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py @@ -10,18 +10,16 @@ class va_ag(Variable): defined_for = "va_ag_eligible" reference = ( "https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section50/", - "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf", + # PDF pages 519-520, 522, 524 + "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=519", ) def formula(person, period, parameters): p = parameters(period).gov.states.va.dars.ag - rate = max_(person("va_ag_care_rate", period), 0) - northern = np.isin( - person.household("county_str", period.this_year), - p.northern_virginia_localities, + rate = min_( + max_(person("va_ag_care_rate", period), 0), + person("va_ag_maximum_care_rate", period), ) - maximum = where(northern, p.rate.northern_virginia, p.rate.standard) - rate = min_(rate, maximum) days = clip(person("va_ag_days_eligible", period), 0, period.days) rate = where(days == period.days, rate, rate / p.proration_days * days) need = rate + p.personal_needs_allowance diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py index 3e7f69e5cee..c023b9199be 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py @@ -7,7 +7,8 @@ class va_ag_allowable_income_exclusions(Variable): label = "Virginia Auxiliary Grant allowable state income exclusions" definition_period = MONTH unit = USD - reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + # PDF pages 127-132, 369-379, 383 + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=127" documentation = """ Total verified Virginia exclusions after applying Chapter D section 6 or Chapter H: entry-month community expenses, the applicable spouse/child diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py index 99937d72f51..0e8b1145aac 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py @@ -8,12 +8,7 @@ class va_ag_care_rate(Variable): definition_period = MONTH unit = USD reference = "https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf" - documentation = "Use the approved provider rate when it is below the published locality maximum." + documentation = "Defaults to the published locality maximum. Use the approved provider rate when it is below that maximum." def formula(person, period, parameters): - p = parameters(period).gov.states.va.dars.ag - northern = np.isin( - person.household("county_str", period.this_year), - p.northern_virginia_localities, - ) - return where(northern, p.rate.northern_virginia, p.rate.standard) + return person("va_ag_maximum_care_rate", period) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py index 98ea2bbfa63..50bcf352797 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py @@ -7,5 +7,9 @@ class va_ag_certified(Variable): label = "Certified for Virginia Auxiliary Grant care" definition_period = MONTH default_value = False - reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" - documentation = """An approved assisted living, adult foster care or supportive housing placement with the required needs assessment. Includes the Virginia residency period or exception, pursuit of other benefits, and satisfaction of applicable transfer, public-institution and nonfinancial conditions.""" + reference = ( + "https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section10/", + # PDF pages 69, 83-95 + "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=69", + ) + documentation = """An approved assisted living, adult foster care or supportive housing placement with the required needs assessment. Includes the Virginia residency period or exception, pursuit of other benefits, and satisfaction of applicable transfer, public-institution and nonfinancial conditions. These are adult settings, so certification also covers the program's adult requirement.""" diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py index 5b0da329ef5..2b51a97e186 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py @@ -10,9 +10,20 @@ class va_ag_countable_income(Variable): label = "Virginia Auxiliary Grant countable income" definition_period = MONTH unit = USD - reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + # PDF pages 34-35, 123, 126-128, 369-374, 439 + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=34" + documentation = """ + SSI recipients use SSA's net countable income plus the SSI payment. After + the initial month each spouse in care is a separate case and a spouse's + income is not deemed. The model's federal SSI deems an ineligible spouse's + income across the marital unit without checking the household, so set + ssi_claim_is_joint to false when both spouses are SSI-eligible; otherwise + use separate marital units or set is_ssi_spousal_deeming_applies to false + for the recipient. + """ def formula(person, period, parameters): + p = parameters(period).gov.states.va.dars.ag joint = ( person.marital_unit.sum(person("va_ag_is_joint_initial_month", period)) == 2 ) @@ -21,7 +32,11 @@ def formula(person, period, parameters): - person("ssi_blind_or_disabled_working_student_exclusion", period), 0, ) - unearned = max_(person("ssi_unearned_income", period), 0) + unearned = max_( + person("ssi_unearned_income", period) + - add(person, period, p.excluded_unearned_sources), + 0, + ) earned = where(joint, person.marital_unit.sum(earned), earned) unearned = where(joint, person.marital_unit.sum(unearned), unearned) non_ssi_countable = ( diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py index d9934458900..4ad74eef4f0 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py @@ -4,9 +4,9 @@ class va_ag_days_eligible(Variable): value_type = int entity = Person - label = "Days of Virginia Auxiliary Grant care in the initial month" + label = "Virginia Auxiliary Grant eligible days in the month" definition_period = MONTH - reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=522" documentation = """ Use actual days in an initial partial month, including entry and excluding discharge. Later discharge months retain the full monthly care rate. diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py index 5dad1e49a69..88f33a2a55c 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py @@ -7,11 +7,10 @@ class va_ag_eligible(Variable): label = "Virginia Auxiliary Grant non-income eligibility" definition_period = MONTH defined_for = StateCode.VA - reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" + # PDF pages 75-78, 93, 125, 152 + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=75" def formula(person, period, parameters): - p = parameters(period).gov.states.va.dars.ag - age = person("age", period.this_year) immigration = person("immigration_status", period.this_year) citizen = immigration == immigration.possible_values.CITIZEN immigrant = person("is_ssi_qualified_noncitizen", period.this_year) @@ -26,7 +25,6 @@ def formula(person, period, parameters): ) return ( person("va_ag_certified", period) - & (age >= p.minimum_age) & person("is_ssi_aged_blind_disabled", period.this_year) & (citizen | immigrant) & resource_eligible diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py index 8d76c405329..baa1e31f7aa 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py @@ -7,5 +7,14 @@ class va_ag_is_joint_initial_month(Variable): label = "Virginia Auxiliary Grant couple in the initial month" definition_period = MONTH default_value = False - reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf" - documentation = """Set for both spouses only in the initial application month when both lived together at the start of the month, entered approved care, applied, and were found eligible that month. Later institutional months are separate cases; reflect that in the federal SSI claim inputs too.""" + # PDF pages 34-35 + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=34" + documentation = """ + Set for both spouses only in the initial application month when both lived + together at the start of the month, entered approved care, applied, and + were found eligible that month. In later months each spouse is a separate + case and a spouse's income is not deemed. Represent that in the federal SSI + inputs: set ssi_claim_is_joint to false when both spouses are SSI-eligible; + otherwise use separate marital units or set is_ssi_spousal_deeming_applies + to false for the recipient. + """ diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_maximum_care_rate.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_maximum_care_rate.py new file mode 100644 index 00000000000..369f549d858 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_maximum_care_rate.py @@ -0,0 +1,23 @@ +from policyengine_us.model_api import * + + +class va_ag_maximum_care_rate(Variable): + value_type = float + entity = Person + label = "Virginia Auxiliary Grant maximum monthly care rate" + definition_period = MONTH + unit = USD + reference = ( + "https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf", + "https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/", + # PDF pages 520, 542 + "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=520", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.va.dars.ag + northern = np.isin( + person.household("county_str", period.this_year), + p.northern_virginia_localities, + ) + return where(northern, p.rate.northern_virginia, p.rate.standard) diff --git a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py index e84418ca42a..305c57be8c1 100644 --- a/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py +++ b/policyengine_us/variables/household/income/spm_unit/spm_unit_benefits.py @@ -22,7 +22,7 @@ def formula(spm_unit, period, parameters): "ky_ssp", # Kentucky benefits "de_ssp", # Delaware benefits "fl_oss", - "va_ag", + "va_ag", # Virginia benefits "ks_sspp", # Kansas benefits "hi_oss", "la_oss", # Louisiana benefits From af62c8b6dae9877a68cda8ea2f249b2428e51f36 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 15 Oct 2026 19:14:32 -0400 Subject: [PATCH 4/5] Address review: Virginia Auxiliary Grant rate, proration and input fixes Co-Authored-By: Claude Opus 5.5 --- .../dars/ag/northern_virginia_localities.yaml | 2 +- .../va/dars/ag/personal_needs_allowance.yaml | 4 + .../gov/states/va/dars/ag/proration_days.yaml | 3 +- .../states/va/dars/ag/rate/fbr_offset.yaml | 23 +++ .../va/dars/ag/rate/northern_virginia.yaml | 13 -- .../rate/northern_virginia_differential.yaml | 15 ++ .../gov/states/va/dars/ag/rate/standard.yaml | 13 -- .../gov/states/va/dars/ag/integration.yaml | 143 ++++++++++++-- .../baseline/gov/states/va/dars/ag/va_ag.yaml | 179 +++++++++++++++++- .../variables/gov/states/va/dars/ag/va_ag.py | 13 +- .../ag/va_ag_allowable_income_exclusions.py | 5 + .../gov/states/va/dars/ag/va_ag_care_rate.py | 5 +- .../gov/states/va/dars/ag/va_ag_certified.py | 2 +- .../va/dars/ag/va_ag_countable_income.py | 13 +- .../states/va/dars/ag/va_ag_days_eligible.py | 16 -- .../gov/states/va/dars/ag/va_ag_eligible.py | 12 +- .../states/va/dars/ag/va_ag_facility_rate.py | 16 ++ .../dars/ag/va_ag_is_joint_initial_month.py | 17 +- .../va/dars/ag/va_ag_maximum_care_rate.py | 9 +- .../va/dars/ag/va_ag_partial_month_days.py | 16 ++ 20 files changed, 427 insertions(+), 92 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/rate/fbr_offset.yaml delete mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml create mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia_differential.yaml delete mode 100644 policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml delete mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_facility_rate.py create mode 100644 policyengine_us/variables/gov/states/va/dars/ag/va_ag_partial_month_days.py diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml index d07e23ee70f..389c14d2b15 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/northern_virginia_localities.yaml @@ -1,4 +1,4 @@ -description: Virginia applies the Planning District 8 care rate in these localities. +description: Virginia applies the Planning District Eight care rate in these localities under the Auxiliary Grant program. values: 2026-01-01: - ARLINGTON_COUNTY_VA diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml index b1d12546225..344784943fc 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/personal_needs_allowance.yaml @@ -7,7 +7,11 @@ metadata: period: month label: Virginia Auxiliary Grant personal needs allowance reference: + - title: Va. Code ยง 51.5-160(C) + href: https://law.lis.virginia.gov/vacode/title51.5/chapter14/section51.5-160/ - title: Virginia Auxiliary Grant January 2026 rate letter href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2025 Appropriation Act, Item 328 A + href: https://budget.lis.virginia.gov/item/2025/1/HB1600/Chapter/1/328/ - title: Virginia 2026 Appropriation Act, Item 332 A href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml index f1fffd6be4e..ccdb5b05f01 100644 --- a/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml +++ b/policyengine_us/parameters/gov/states/va/dars/ag/proration_days.yaml @@ -1,9 +1,10 @@ -description: Virginia divides the monthly care rate by this number of days when prorating an initial partial month. +description: Virginia divides the monthly care rate by this number of days to prorate the entry month under the Auxiliary Grant program. values: 2017-07-01: 30 metadata: unit: day + period: month label: Virginia Auxiliary Grant proration days reference: - title: Virginia Auxiliary Grant Manual, Chapter J section 3.3 diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/fbr_offset.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/fbr_offset.yaml new file mode 100644 index 00000000000..840527cde2e --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/rate/fbr_offset.yaml @@ -0,0 +1,23 @@ +description: Virginia sets the maximum monthly care rate outside Planning District Eight at this amount above the federal Supplemental Security Income benefit rate under the Auxiliary Grant program. +values: + # Derived, not stated in law: 2,130 - 994 = 1,136 (2,103 - 967 and + # 2,079 - 943 also give 1,136). Tying the rate to the FBR passes through + # federal increases (Item 332 A.3; 20 CFR 416.2096); a reform that lowered + # the FBR would also lower this rate below the appropriated amount. + 2026-01-01: 1_136 + +metadata: + unit: currency-USD + period: month + label: Virginia Auxiliary Grant care rate offset above the SSI federal benefit rate + reference: + - title: 22VAC30-80-50 + href: https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section50/ + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf + - title: Virginia 2025 Appropriation Act, Item 328 A + href: https://budget.lis.virginia.gov/item/2025/1/HB1600/Chapter/1/328/ + - title: Virginia 2026 Appropriation Act, Item 332 A + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ + - title: 20 CFR 416.2096 + href: https://www.ecfr.gov/current/title-20/chapter-III/part-416/subpart-T/section-416.2096 diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml deleted file mode 100644 index ec3112ad5b4..00000000000 --- a/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: Virginia provides this monthly approved Auxiliary Grant care rate in this locality group. -values: - 2026-01-01: 2_450 - -metadata: - unit: currency-USD - period: month - label: Virginia Auxiliary Grant Northern Virginia care rate - reference: - - title: Virginia Auxiliary Grant January 2026 rate letter - href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf - - title: Virginia 2026 Appropriation Act, Item 332 A - href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia_differential.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia_differential.yaml new file mode 100644 index 00000000000..b9b1a15091c --- /dev/null +++ b/policyengine_us/parameters/gov/states/va/dars/ag/rate/northern_virginia_differential.yaml @@ -0,0 +1,15 @@ +description: Virginia increases the maximum monthly care rate by this share in Planning District Eight under the Auxiliary Grant program. +values: + 2026-01-01: 0.15 + +metadata: + unit: /1 + period: year + label: Virginia Auxiliary Grant Planning District Eight care rate differential + reference: + - title: Virginia 2026 Appropriation Act, Item 332 A.1 + href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ + - title: Virginia 2025 Appropriation Act, Item 328 A.1 + href: https://budget.lis.virginia.gov/item/2025/1/HB1600/Chapter/1/328/ + - title: Virginia Auxiliary Grant January 2026 rate letter + href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf diff --git a/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml b/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml deleted file mode 100644 index 2bd05d25421..00000000000 --- a/policyengine_us/parameters/gov/states/va/dars/ag/rate/standard.yaml +++ /dev/null @@ -1,13 +0,0 @@ -description: Virginia provides this monthly approved Auxiliary Grant care rate in this locality group. -values: - 2026-01-01: 2_130 - -metadata: - unit: currency-USD - period: month - label: Virginia Auxiliary Grant standard care rate - reference: - - title: Virginia Auxiliary Grant January 2026 rate letter - href: https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf - - title: Virginia 2026 Appropriation Act, Item 332 A - href: https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/ diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml index 9398d55319f..6b0ec8bf2de 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml @@ -1,4 +1,4 @@ -- name: Case 1, separate institutional SSI claims. +- name: Case 1, separate SSI claims. period: 2026-01 absolute_error_margin: 0.01 input: @@ -24,7 +24,7 @@ output: va_ag: [1_223, 1_223] -- name: Case 2, initial couple computation. +- name: Case 2, joint SSI couple claim. period: 2026-01 absolute_error_margin: 0.01 input: @@ -32,11 +32,9 @@ person1: age: 65 va_ag_certified: true - va_ag_is_joint_initial_month: true person2: age: 65 va_ag_certified: true - va_ag_is_joint_initial_month: true marital_units: couple: members: [person1, person2] @@ -48,9 +46,15 @@ members: [person1, person2] state_code: VA output: + # Both aged spouses claim SSI jointly: 1,491 / 2 = 745.50 each. + ssi_claim_is_joint: [true, true] + ssi: [745.5, 745.5] + # Chapter D: SSA's gross SSI plus net income, 745.50 + 0. + va_ag_countable_income: [745.5, 745.5] + # 2,130 + 87 - 745.50 = 1,471.50, rounded up to 1,472. va_ag: [1_472, 1_472] -- name: Case 3, non SSI spouse income is not deemed in ongoing care. +- name: Case 3, spouse at home has income deemed in the resident's entry month. period: 2026-01 absolute_error_margin: 0.01 input: @@ -58,7 +62,6 @@ person1: age: 65 va_ag_certified: true - is_ssi_spousal_deeming_applies: false person2: age: 63 social_security_retirement: 18_000 @@ -73,13 +76,16 @@ members: [person1, person2] state_code: VA output: - # No deeming: person1 has no income, so SSI is 994 - 0 = 994. - # person2 (63, not disabled) is not SSI-eligible. - # Deeming would count 1,500 - 20 = 1,480 and cut SSI to 1,491 - 1,480 = 11. - ssi: [994, 0] - # Countable income 0 + 994 = 994; 2,217 - 994 = 1,223. - # With deeming it would be 2,217 - (1,480 + 11) = 726. - va_ag: [1_223, 0] + # In the entry month the spouses are still one marital unit, and + # 20 CFR 416.1163(f)(2) stops deeming only from the following month + # (Case 6). person2 (63, not disabled) is not SSI-eligible, so SSI + # deems 1,500 - 20 = 1,480: 1,491 - 1,480 = 11. + ssi: [11, 0] + # Chapter D (p. 126) uses SSA's amounts: 1,480 + 11 = 1,491. + # person2's own non-SSI budget is 1,500 - 20 = 1,480. + va_ag_countable_income: [1_491, 1_480] + # 2,130 + 87 - 1,491 = 726; person2 is not certified. + va_ag: [726, 0] - name: Case 4, initial couple resource limit. period: 2026-01 @@ -206,3 +212,114 @@ va_ag_countable_income: [1_590, 1_590] # 2,130 + 87 - 1,590 = 627 each (637 without the joint flag). va_ag: [627, 627] + +- name: Case 8, asymmetric non SSI couple budgets separately after the initial month. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + va_ag_certified: true + social_security_retirement: 30_000 + person2: + age: 70 + va_ag_certified: true + social_security_retirement: 18_000 + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # After the initial month SSA treats spouses sharing a facility as + # individuals (POMS SI 00501.154 B): 2,500 - 20 = 2,480 and + # 1,500 - 20 = 1,480, both above 994, so no SSI. + ssi_countable_income: [2_480, 1_480] + ssi: [0, 0] + va_ag_eligible: [true, true] + # Chapter B section 6: after the initial month each spouse is a separate unit. + # 2,500 - 20 = 2,480 and 1,500 - 20 = 1,480. + va_ag_countable_income: [2_480, 1_480] + # 2,217 - 2,480 is below 0, so 0; 2,217 - 1,480 = 737. + va_ag: [0, 737] + +- name: Case 9, asymmetric non SSI couple pools income in the initial month. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + va_ag_certified: true + va_ag_is_joint_initial_month: true + social_security_retirement: 30_000 + person2: + age: 70 + va_ag_certified: true + va_ag_is_joint_initial_month: true + social_security_retirement: 18_000 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + ssi_claim_is_joint: [true, true] + ssi_couple_computation_applies: [true, true] + ssi_countable_income: [1_990, 1_990] + # 745.50 - 1,990 = -1,244.50, so no SSI. + uncapped_ssi: [-1_244.5, -1_244.5] + ssi: [0, 0] + va_ag_eligible: [true, true] + # Both entered care on January 1, so the month is not prorated. + # The pooled 4,000 gets one 20 exclusion and is halved: (4,000 - 20) / 2 = 1,990. + va_ag_countable_income: [1_990, 1_990] + # 2,130 + 87 - 1,990 = 227 each (separate budgets give [0, 737]). + va_ag: [227, 227] + +- name: Case 10, initial-month couple flag entered for January budgets the spouses separately in February. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + va_ag_certified: true + va_ag_is_joint_initial_month: + 2026-01: true + social_security_retirement: 19_200 + person2: + age: 70 + va_ag_certified: true + va_ag_is_joint_initial_month: + 2026-01: true + social_security_retirement: 19_200 + marital_units: + couple: + members: [person1, person2] + tax_units: + unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # January pools the couple (Case 7): 2,217 - 1,590 = 627 each. + # February: each spouse is a separate unit: 2,217 - (1,600 - 20) = 637. + va_ag: + 2026-01: [627, 627] + 2026-02: [637, 637] diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml index f4ded61561a..0f21c77ff63 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/va_ag.yaml @@ -77,7 +77,7 @@ age: 65 va_ag_certified: true county: ARLINGTON_COUNTY_VA - va_ag_days_eligible: 14 + va_ag_partial_month_days: 14 output: # Entry on January 18 gives 14 days: 2,450 / 30 * 14 = 1,143.33. # Need 1,143.33 + 87 = 1,230.33; SSI 994 makes countable income 994. @@ -181,20 +181,24 @@ state_code: VA age: 65 va_ag_certified: true - va_ag_days_eligible: 15 + va_ag_partial_month_days: 15 output: va_ag: 158 -- name: Case 17, zero eligible days. - period: 2026-01 +- name: Case 17, partial-month days equal to the month length are a full month. + period: 2026-02 absolute_error_margin: 0.01 input: - state_code: VA - age: 65 + state_code: + 2026: VA + age: + 2026: 65 va_ag_certified: true - va_ag_days_eligible: 0 + va_ag_partial_month_days: 28 output: - va_ag: 0 + # 28 days covers all of February, so the rate is not prorated: + # 2,130 + 87 - 994 = 1,223. + va_ag: 1_223 - name: Case 18, first month community expenses. period: 2026-01 @@ -203,7 +207,7 @@ state_code: VA age: 65 va_ag_certified: true - va_ag_days_eligible: 15 + va_ag_partial_month_days: 15 va_ag_allowable_income_exclusions: 400 output: va_ag: 558 @@ -226,7 +230,7 @@ state_code: VA age: 65 va_ag_certified: true - va_ag_care_rate: 1_500 + va_ag_facility_rate: 1_500 output: va_ag: 593 @@ -245,3 +249,158 @@ # The AG budget excludes it: 2,000 - 20 = 1,980 (resources 2,000 at the limit). # 2,217 - 1,980 = 237; counting the interest would give 232. va_ag: 237 + +- name: Case 22, noncitizen who is not a qualified alien. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + immigration_status: UNDOCUMENTED + output: + # Chapter C section 9.4 limits eligibility to qualified aliens. + # SSI is also 0, so without the gate the non-SSI budget would pay 2,217. + ssi: 0 + va_ag_eligible: false + va_ag: 0 + +- name: Case 23, incarcerated person. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + is_incarcerated: true + output: + va_ag_eligible: false + va_ag: 0 + +- name: Case 24, approved facility rate above the maximum is capped. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_facility_rate: 2_500 + output: + va_ag_maximum_care_rate: 2_130 + va_ag_care_rate: 2_130 + # 2,500 is capped at 2,130: 2,130 + 87 - 994 = 1,223 (uncapped 1,593). + va_ag: 1_223 + +- name: Case 25, applicant who appears eligible for SSI but does not apply is denied. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + takes_up_ssi_if_eligible: false + output: + # With no income the applicant meets SSI income standards (uncapped SSI + # 994), so Chapter C 8.2.2 requires an SSI application and 8.2.2.2.1 + # denies the grant without one; otherwise the grant would pay 2,217. + uncapped_ssi: 994 + ssi: 0 + va_ag_eligible: false + va_ag: 0 + +- name: Case 26, applicant over the SSI income limit need not apply for SSI. + period: 2026-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + takes_up_ssi_if_eligible: false + social_security_retirement: 24_000 + output: + # 994 - (2,000 - 20) = -986, so Chapter C 8.2.1 does not require an SSI + # application: 2,217 - 1,980 = 237. + uncapped_ssi: -986 + va_ag_eligible: true + va_ag: 237 + +- name: Case 27, unrelated residents with a facility rate and a partial month. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 65 + va_ag_certified: true + va_ag_facility_rate: 1_500 + person2: + age: 65 + va_ag_certified: true + va_ag_partial_month_days: 15 + marital_units: + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] + tax_units: + tax_unit1: + members: [person1] + tax_unit2: + members: [person2] + households: + household: + members: [person1, person2] + state_code: VA + output: + # Each input applies only to its own resident. + va_ag_care_rate: [1_500, 2_130] + # person1: 1,500 + 87 - 994 = 593. + # person2: 2,130 / 30 * 15 = 1,065; 1,065 + 87 - 994 = 158. + va_ag: [593, 158] + +- name: Case 28, partial-month days do not carry into the next month. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_partial_month_days: + 2026-02: 27 + output: + # February: 2,130 / 30 * 27 = 1,917; 1,917 + 87 - 994 = 1,010. + # March is a full month again: 2,130 + 87 - 994 = 1,223. + va_ag: + 2026-02: 1_010 + 2026-03: 1_223 + +- name: Case 29, standard rate follows the federal benefit rate in 2027. + period: 2027-01 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + output: + # The maximum rate is the federal benefit rate plus 1,136, so for an + # SSI-only resident the grant stays 1,136 + 87 = 1,223 whatever the FBR. + va_ag: 1_223 + +- name: Case 30, entry-month community expenses do not carry into the next month. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: VA + age: 65 + va_ag_certified: true + va_ag_partial_month_days: + 2026-01: 15 + va_ag_allowable_income_exclusions: + 2026-01: 400 + output: + # January: 2,130 / 30 * 15 = 1,065; countable income 994 - 400 = 594; + # 1,065 + 87 - 594 = 558. + # February has no exclusion and a full month: 2,130 + 87 - 994 = 1,223. + va_ag: + 2026-01: 558 + 2026-02: 1_223 diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py index 6fd99d5aa04..cfc3f714617 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag.py @@ -9,6 +9,7 @@ class va_ag(Variable): unit = USD defined_for = "va_ag_eligible" reference = ( + "https://law.lis.virginia.gov/vacode/title51.5/chapter14/section51.5-160/", "https://law.lis.virginia.gov/admincode/title22/agency30/chapter80/section50/", # PDF pages 519-520, 522, 524 "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=519", @@ -16,12 +17,10 @@ class va_ag(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.va.dars.ag - rate = min_( - max_(person("va_ag_care_rate", period), 0), - person("va_ag_maximum_care_rate", period), - ) - days = clip(person("va_ag_days_eligible", period), 0, period.days) - rate = where(days == period.days, rate, rate / p.proration_days * days) + rate = person("va_ag_care_rate", period) + days = person("va_ag_partial_month_days", period) + partial_month = (days > 0) & (days < period.days) + rate = where(partial_month, rate / p.proration_days * days, rate) need = rate + p.personal_needs_allowance deficiency = max_(need - person("va_ag_countable_income", period), 0) - return (days > 0) * np.floor(deficiency + 0.5) + return np.floor(deficiency + 0.5) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py index c023b9199be..2cf813d5192 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_allowable_income_exclusions.py @@ -16,4 +16,9 @@ class va_ag_allowable_income_exclusions(Variable): amount, not total expenses. These adjustments are additional to federal SSI exclusions. A percentage guardianship fee that includes the grant is calculated using the grant before that fee, as in Chapter D section 6.4.1.2.2. + Key each amount to its month; a yearly entry is spread evenly over the months. """ + + def formula(person, period, parameters): + # A formula stops a one-month input from carrying into later months. + return 0 diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py index 0e8b1145aac..45aef76c512 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_care_rate.py @@ -8,7 +8,8 @@ class va_ag_care_rate(Variable): definition_period = MONTH unit = USD reference = "https://www.dss.virginia.gov/media/vdss/licensing/documents/assisted-living-facilities/additional-resources/ARC2026_ag_rate_letter.pdf" - documentation = "Defaults to the published locality maximum. Use the approved provider rate when it is below that maximum." def formula(person, period, parameters): - return person("va_ag_maximum_care_rate", period) + maximum = person("va_ag_maximum_care_rate", period) + facility_rate = person("va_ag_facility_rate", period) + return where(facility_rate > 0, min_(facility_rate, maximum), maximum) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py index 50bcf352797..7e656f08df1 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_certified.py @@ -12,4 +12,4 @@ class va_ag_certified(Variable): # PDF pages 69, 83-95 "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=69", ) - documentation = """An approved assisted living, adult foster care or supportive housing placement with the required needs assessment. Includes the Virginia residency period or exception, pursuit of other benefits, and satisfaction of applicable transfer, public-institution and nonfinancial conditions. These are adult settings, so certification also covers the program's adult requirement.""" + documentation = """An approved assisted living, adult foster care or supportive housing placement with the required needs assessment. Includes the Virginia residency period or exception, pursuit of other benefits, and satisfaction of applicable transfer, public-institution and nonfinancial conditions. These are adult settings, so certification also covers the program's adult requirement. Marital units cannot change within a simulation. For months after spouses stop living in the same household, such as months after the entry month of a resident whose spouse stays at home, put them in separate marital units so that SSI and the Auxiliary Grant treat each spouse as an individual. Simulate the month of entry, including the initial month both spouses enter care together, with one marital unit.""" diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py index 2b51a97e186..314011cd7d3 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_countable_income.py @@ -15,11 +15,7 @@ class va_ag_countable_income(Variable): documentation = """ SSI recipients use SSA's net countable income plus the SSI payment. After the initial month each spouse in care is a separate case and a spouse's - income is not deemed. The model's federal SSI deems an ineligible spouse's - income across the marital unit without checking the household, so set - ssi_claim_is_joint to false when both spouses are SSI-eligible; otherwise - use separate marital units or set is_ssi_spousal_deeming_applies to false - for the recipient. + income is not deemed. """ def formula(person, period, parameters): @@ -27,6 +23,9 @@ def formula(person, period, parameters): joint = ( person.marital_unit.sum(person("va_ag_is_joint_initial_month", period)) == 2 ) + # NOTE: AG Manual Chapter H's exclusion list (p. 370) does not name the + # SSI student earned income exclusion, while Chapter D (p. 123) + # requires SSI policy; the model keeps the SSI exclusion. earned = max_( person("ssi_earned_income", period) - person("ssi_blind_or_disabled_working_student_exclusion", period), @@ -49,6 +48,10 @@ def formula(person, period, parameters): ssi = person("ssi", period) # Chapter D uses SSA's verified net income for current SSI recipients; # non-SSI institutional recipients have individual income budgets. + # NOTE: in the entry month of a resident whose spouse stays home, SSA + # still deems the spouse's income and Chapter D uses SSA's amounts, + # although Chapter B section 6 makes the assistance unit the applicant + # only. countable = where( ssi > 0, person("ssi_countable_income", period) + ssi, non_ssi_countable ) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py deleted file mode 100644 index 4ad74eef4f0..00000000000 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_days_eligible.py +++ /dev/null @@ -1,16 +0,0 @@ -from policyengine_us.model_api import * - - -class va_ag_days_eligible(Variable): - value_type = int - entity = Person - label = "Virginia Auxiliary Grant eligible days in the month" - definition_period = MONTH - reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=522" - documentation = """ - Use actual days in an initial partial month, including entry and excluding - discharge. Later discharge months retain the full monthly care rate. - """ - - def formula(person, period, parameters): - return period.days diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py index 88f33a2a55c..acc268b6f8e 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_eligible.py @@ -7,7 +7,7 @@ class va_ag_eligible(Variable): label = "Virginia Auxiliary Grant non-income eligibility" definition_period = MONTH defined_for = StateCode.VA - # PDF pages 75-78, 93, 125, 152 + # PDF pages 75-78, 93-96, 102-103, 125, 152 reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=75" def formula(person, period, parameters): @@ -20,13 +20,21 @@ def formula(person, period, parameters): resources = person("ssi_countable_resources", period.this_year) resources = where(joint, person.marital_unit.sum(resources), resources) limits = parameters(period).gov.ssa.ssi.eligibility.resources.limit - resource_eligible = (person("ssi", period) > 0) | ( + receives_ssi = (person("ssi", period) > 0) | person("receives_ssi", period) + resource_eligible = receives_ssi | ( resources <= where(joint, limits.couple, limits.individual) ) + # Chapter C 8.2.2: an applicant who appears to meet SSI income standards + # must apply for SSI, and 8.2.2.2.1 denies AG otherwise; 8.2.1 exempts + # an applicant over income for SSI. + pursues_ssi = person("takes_up_ssi_if_eligible", period.this_year) | ( + person("uncapped_ssi", period) <= 0 + ) return ( person("va_ag_certified", period) & person("is_ssi_aged_blind_disabled", period.this_year) & (citizen | immigrant) & resource_eligible & ~person("is_incarcerated", period) + & pursues_ssi ) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_facility_rate.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_facility_rate.py new file mode 100644 index 00000000000..ae90254d0d3 --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_facility_rate.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class va_ag_facility_rate(Variable): + value_type = float + entity = Person + label = "Virginia Auxiliary Grant approved facility monthly rate below the maximum" + definition_period = MONTH + unit = USD + defined_for = StateCode.VA + default_value = 0 + documentation = "The monthly rate approved for the resident's licensed assisted living facility when it is below the locality maximum; adult foster care homes use the maximum. Leave at 0 to use the maximum; a higher entry is capped at the maximum." + reference = ( + "https://budget.lis.virginia.gov/item/2026/2/HB30/Chapter/1/332/", + "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=520", + ) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py index baa1e31f7aa..28c19795f2f 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_is_joint_initial_month.py @@ -10,11 +10,14 @@ class va_ag_is_joint_initial_month(Variable): # PDF pages 34-35 reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=34" documentation = """ - Set for both spouses only in the initial application month when both lived - together at the start of the month, entered approved care, applied, and - were found eligible that month. In later months each spouse is a separate - case and a spouse's income is not deemed. Represent that in the federal SSI - inputs: set ssi_claim_is_joint to false when both spouses are SSI-eligible; - otherwise use separate marital units or set is_ssi_spousal_deeming_applies - to false for the recipient. + The Chapter B section 6 initial-month exception, under which the assistance + unit contains both spouses. Set for both spouses only in the initial + application month when both were married and lived together at the start + of the month, entered approved care, applied, and were found eligible that + month. Simulate that month with both spouses in one marital unit. In later + months each spouse is a separate case. """ + + def formula(person, period, parameters): + # A formula stops a one-month input from carrying into later months. + return False diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_maximum_care_rate.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_maximum_care_rate.py index 369f549d858..94dd62d7a66 100644 --- a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_maximum_care_rate.py +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_maximum_care_rate.py @@ -16,8 +16,15 @@ class va_ag_maximum_care_rate(Variable): def formula(person, period, parameters): p = parameters(period).gov.states.va.dars.ag + fbr = parameters(period).gov.ssa.ssi.amount.individual + standard = fbr + p.rate.fbr_offset + # The published $2,450 Planning District Eight rate is 2,130 x 1.15 + # rounded to the nearest dollar; the rounding is inferred. + northern_rate = np.floor( + standard * (1 + p.rate.northern_virginia_differential) + 0.5 + ) northern = np.isin( person.household("county_str", period.this_year), p.northern_virginia_localities, ) - return where(northern, p.rate.northern_virginia, p.rate.standard) + return where(northern, northern_rate, standard) diff --git a/policyengine_us/variables/gov/states/va/dars/ag/va_ag_partial_month_days.py b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_partial_month_days.py new file mode 100644 index 00000000000..6bf3160120d --- /dev/null +++ b/policyengine_us/variables/gov/states/va/dars/ag/va_ag_partial_month_days.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class va_ag_partial_month_days(Variable): + value_type = int + entity = Person + label = "Virginia Auxiliary Grant days in care in a partial entry month" + definition_period = MONTH + defined_for = StateCode.VA + default_value = 0 + reference = "https://townhall.virginia.gov/l/GetFile.cfm?File=C:%5CTownHall%5Cdocroot%5CGuidanceDocs%5C262%5CGDoc_DARS_5346_v2.pdf#page=522" + documentation = "Days in care in an entry month that starts after the first, or a month of entry and discharge, counting the day of entry but not discharge. Leave at 0 for a full month; a value of at least the month's length is also a full month. A later discharge month is not prorated. Key the entry to its month (for example 2026-01: 15); a yearly entry applies to every month of the year." + + def formula(person, period, parameters): + # A formula stops a one-month input from carrying into later months. + return 0 From 1a6e32cf8a79bead940e183708f7d4efdc947048 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 15 Oct 2026 19:20:08 -0400 Subject: [PATCH 5/5] Use separate marital units for Virginia separate SSI claims case Co-Authored-By: Claude Opus 5.5 --- .../baseline/gov/states/va/dars/ag/integration.yaml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml index 6b0ec8bf2de..25228f8d9a3 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/va/dars/ag/integration.yaml @@ -6,14 +6,16 @@ person1: age: 65 va_ag_certified: true - ssi_claim_is_joint: false person2: age: 65 - ssi_claim_is_joint: false va_ag_certified: true + # After the entry month spouses sharing a facility are individuals for + # SSI (POMS SI 00501.154 B), so they sit in separate marital units. marital_units: - couple: - members: [person1, person2] + marital_unit1: + members: [person1] + marital_unit2: + members: [person2] tax_units: unit: members: [person1, person2] @@ -22,6 +24,7 @@ members: [person1, person2] state_code: VA output: + ssi: [994, 994] va_ag: [1_223, 1_223] - name: Case 2, joint SSI couple claim.