diff --git a/changelog.d/ga-liheap-cooling.added.md b/changelog.d/ga-liheap-cooling.added.md new file mode 100644 index 00000000000..ae4e33c7385 --- /dev/null +++ b/changelog.d/ga-liheap-cooling.added.md @@ -0,0 +1 @@ +Add Georgia LIHEAP regular cooling assistance. diff --git a/policyengine_us/parameters/gov/hhs/liheap/regular_payments.yaml b/policyengine_us/parameters/gov/hhs/liheap/regular_payments.yaml index e811bea6fbd..72b6f70d50d 100644 --- a/policyengine_us/parameters/gov/hhs/liheap/regular_payments.yaml +++ b/policyengine_us/parameters/gov/hhs/liheap/regular_payments.yaml @@ -15,6 +15,7 @@ values: - de_liheap # Delaware LIHEAP - fl_liheap # Florida LIHEAP - ga_liheap # Georgia LIHEAP + - ga_liheap_cooling # Georgia LIHEAP cooling - hi_liheap_subsidized_amount # Hawaii LIHEAP subsidized dwelling benefit - ia_liheap # Iowa LIHEAP - id_liheap # Idaho LIHEAP diff --git a/policyengine_us/parameters/gov/states/ga/dfcs/liheap/cooling/amount.yaml b/policyengine_us/parameters/gov/states/ga/dfcs/liheap/cooling/amount.yaml new file mode 100644 index 00000000000..deb224e13c5 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ga/dfcs/liheap/cooling/amount.yaml @@ -0,0 +1,24 @@ +description: Georgia provides this cooling payment by income level under the Low Income Home Energy Assistance Program. +# The matrices print one cooling amount per income level for every main heating +# fuel. FY2027 has no posted matrix; the FY2027 plan keeps the $400 minimum and $500 +# maximum, so the FY2026 amounts carry forward. +lower_income: + 2024-10-01: 500 +higher_income: + 2024-10-01: 400 +metadata: + unit: currency-USD + period: year + label: Georgia LIHEAP cooling payment by income level + propagate_metadata_to_children: true + reference: + - title: Georgia Benefit Matrix, FY2025 income guidelines, step 2 (cooling benefit, Level I and Level II) + href: https://liheapch.acf.gov/docs/2025/benefits-matricies/GA_BenefitMatrix_2025.pdf + - title: Georgia Benefit Matrix, FY2026 income guidelines, step 2 (cooling benefit, Level I and Level II) + href: https://liheapch.acf.gov/docs/2026/benefits-matricies/GA_BenefitMatrix_Heat-Cool_2026.pdf + - title: Georgia FY2025 LIHEAP State Plan, section 3.6 + href: https://liheapch.acf.gov/docs/2025/state-plans/GA_Plan_2025.pdf#page=11 + - title: Georgia FY2026 LIHEAP State Plan, section 3.6 + href: https://liheapch.acf.gov/docs/2026/state-plans/GA_Plan_2026.pdf#page=11 + - title: Georgia FY2027 LIHEAP State Plan, section 3.6 + href: https://liheapch.acf.gov/docs/2027/state-plans/GA_Plan_2027.pdf#page=11 diff --git a/policyengine_us/parameters/gov/states/ga/dfcs/liheap/payment/lower_income_limit.yaml b/policyengine_us/parameters/gov/states/ga/dfcs/liheap/payment/lower_income_limit.yaml index 391374081a6..58363766371 100644 --- a/policyengine_us/parameters/gov/states/ga/dfcs/liheap/payment/lower_income_limit.yaml +++ b/policyengine_us/parameters/gov/states/ga/dfcs/liheap/payment/lower_income_limit.yaml @@ -1,4 +1,4 @@ -description: Georgia limits annual income to this amount by household size for Level I heating payments under the Low Income Home Energy Assistance Program. +description: Georgia limits annual income to this amount by household size for Level I payments under the Low Income Home Energy Assistance Program. # Preserve the published size-four amount. The source does not define these # cutoffs as a fixed percentage of current federal poverty or median income. 1: diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 6f704d520fb..fc588ac6a52 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1101,7 +1101,15 @@ programs: variable: ga_liheap parameter_prefix: gov.states.ga.dfcs.liheap verified_years: "2025-2026" - notes: FY2025-FY2026 regular heating only, with the published fuel matrix and the bundled-utility rental payment. Crisis, cooling, weatherization and equipment assistance are out of scope. + notes: FY2025-FY2026 regular heating, with the published fuel matrix and the bundled-utility rental payment. Regular cooling is the separate Georgia LIHEAP cooling entry; crisis, weatherization and equipment assistance are out of scope. + - state: GA + status: partial + name: Georgia LIHEAP cooling + full_name: Georgia Low Income Home Energy Assistance Program regular cooling assistance + variable: ga_liheap_cooling + parameter_prefix: gov.states.ga.dfcs.liheap + verified_years: "2025-2026" + notes: FY2025-FY2026 regular cooling benefit of $500 (Level I) or $400 (Level II), with the heating income test. Crisis cooling and air-conditioner purchase are out of scope. - state: HI status: partial name: Hawaii LIHEAP subsidized dwelling benefit diff --git a/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling.yaml b/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling.yaml new file mode 100644 index 00000000000..af2b2edd79c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling.yaml @@ -0,0 +1,150 @@ +# Georgia regular cooling benefit: the FY2025 and FY2026 matrices (step 2, COOLING BENEFIT) +# pay $500 in Level I and $400 in Level II for every main heating fuel. Step 1 Level I +# cutoffs are inclusive. Wages: full time at the $7.25 federal minimum wage, +# 7.25 x 40 x 52 = 15_080; a Georgia cashier at the BLS OEWS May 2025 median, $29,070 +# (series OEUS130000000000041201113). The $1,800 electric bill does not change the +# cooling amount. + +# FY2026: size two, income 15_080 is at or below the 17_770 Level I cutoff and the +# 45_179 limit, so cooling pays 500. Electric heat also pays the Level I heating amount, +# 400 + 100 = 500, as a separate benefit, so the national LIHEAP total is 500 + 500 = 1_000. +- name: Case 1, a minimum wage parent receives the Level I cooling benefit beside the heating benefit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 15_080 + person2: + age: 7 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + ga_tanf: 0 + heating_type: ELECTRICITY + has_cooling_expense: true + pre_subsidy_electricity_expense: 1_800 + households: + household: + members: [person1, person2] + state_code: GA + output: + ga_liheap_household_size: 2 + ga_liheap_income: 15_080 + ga_liheap_income_limit: 45_179 + ga_liheap_cooling_eligible: true + ga_liheap_cooling: 500 + ga_liheap: 500 + liheap: 1_000 + +# FY2026: a one-person cashier, 29_070, is above the 13_589 Level I cutoff and within the +# 34_549 limit, so cooling pays the Level II amount, 400. The cooling column is one value +# for every fuel, so gas heat and no heat both receive it. +- name: Case 2, the Level II cooling benefit does not depend on the heating fuel. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [GA, GA] + age: [35, 35] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + ga_tanf: [0, 0] + employment_income_before_lsr: [29_070, 29_070] + heating_type: [NATURAL_GAS, NONE] + has_cooling_expense: [true, true] + pre_subsidy_electricity_expense: [1_800, 1_800] + output: + ga_liheap_income: [29_070, 29_070] + ga_liheap_cooling_eligible: [true, true] + ga_liheap_cooling: [400, 400] + +# Boundary: the FY2026 size-one Level I range is $0 - $13589 and Level II starts at +# $13590. Income of 13_589 pays 500; 13_589.01 pays 400. +- name: Case 3, the Level I cutoff is inclusive. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [GA, GA] + age: [40, 40] + immigration_status: [CITIZEN, CITIZEN] + heating_type: [ELECTRICITY, ELECTRICITY] + has_cooling_expense: [true, true] + pre_subsidy_electricity_expense: [1_800, 1_800] + ga_liheap_income: [13_589, 13_589.01] + output: + ga_liheap_cooling: [500, 400] + +# FY2025: Case 1's family, 15_080, is at or below the FY2025 size-two Level I cutoff of +# 16_993 and the 43_203 limit, so the FY2025 matrix pays 500. +- name: Case 4, FY2025 Level I cooling benefit. + period: 2025 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 15_080 + person2: + age: 7 + immigration_status: CITIZEN + ssi: 0 + spm_units: + spm_unit: + members: [person1, person2] + ga_tanf: 0 + heating_type: ELECTRICITY + has_cooling_expense: true + pre_subsidy_electricity_expense: 1_800 + households: + household: + members: [person1, person2] + state_code: GA + output: + ga_liheap_income: 15_080 + ga_liheap_income_limit: 43_203 + ga_liheap_cooling: 500 + +# The FY2026 matrix prints Level I cutoffs through household size 16, so a 17-person +# household uses the size 16 cutoff of 42_336; its 109_627 income limit is well above +# that. Income of 42_336 pays 500; 42_336.01 pays 400. +- name: Case 5, a household above the published table size uses the size sixteen Level I cutoff. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [GA, GA] + ga_liheap_household_size: [17, 17] + ga_liheap_income: [42_336, 42_336.01] + heating_type: [ELECTRICITY, ELECTRICITY] + has_cooling_expense: [true, true] + output: + ga_liheap_income_limit: [109_627, 109_627] + ga_liheap_cooling_eligible: [true, true] + ga_liheap_cooling: [500, 400] + +# Case 2's cashier in Georgia beside the same household in Alabama. The Alabama unit has +# Georgia household size 0 and receives no Georgia cooling benefit; the Georgia unit +# receives the Level II amount, 400. +- name: Case 6, a unit in another state beside a Georgia unit receives no Georgia cooling benefit. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [GA, AL] + age: [35, 35] + immigration_status: [CITIZEN, CITIZEN] + ssi: [0, 0] + ga_tanf: [0, 0] + employment_income_before_lsr: [29_070, 29_070] + heating_type: [ELECTRICITY, ELECTRICITY] + has_cooling_expense: [true, true] + pre_subsidy_electricity_expense: [1_800, 1_800] + output: + ga_liheap_household_size: [1, 0] + ga_liheap_cooling_eligible: [true, false] + ga_liheap_cooling: [400, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling_eligible.yaml new file mode 100644 index 00000000000..c95307caa9b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling_eligible.yaml @@ -0,0 +1,160 @@ +# Georgia regular cooling eligibility: the heating program's income and household tests +# (PAMMS chapter 100, page 4; cooling FAQ, page 1) with the household's own cooling cost, or +# unsubsidized rent that includes all utilities (heating's direct payment route), as the +# energy burden. Wages are Georgia BLS OEWS May 2025 medians: cashiers $29,070 (series +# OEUS130000000000041201113) and fast food and counter workers $26,920 (series +# OEUS130000000000035302313). + +# FY2026: a cashier and a fast food worker earn 29_070 + 26_920 = 55_990, above the +# 45_179 size-two limit (and the 110% poverty floor), so no cooling benefit is paid. +- name: Case 1, income above the limit prevents cooling eligibility. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 29_070 + person2: + age: 33 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 26_920 + spm_units: + spm_unit: + members: [person1, person2] + ga_tanf: 0 + heating_type: NATURAL_GAS + has_cooling_expense: true + pre_subsidy_electricity_expense: 1_800 + households: + household: + members: [person1, person2] + state_code: GA + output: + ga_liheap_income: 55_990 + ga_liheap_income_limit: 45_179 + ga_liheap_income_eligible: false + ga_liheap_cooling_eligible: false + ga_liheap_cooling: 0 + +# FY2026: a one-person cashier with gas heat and a gas bill receives the Level II gas +# heating amount, 560, but reports no cooling cost, so the cooling benefit is 0. +- name: Case 2, a heating recipient without cooling costs receives no cooling benefit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 29_070 + spm_units: + spm_unit: + members: [person1] + ga_tanf: 0 + heating_type: NATURAL_GAS + gas_expense: 1_200 + has_cooling_expense: false + pre_subsidy_electricity_expense: 1_800 + households: + household: + members: [person1] + state_code: GA + output: + ga_liheap_eligible: true + ga_liheap: 560 + ga_liheap_cooling_eligible: false + ga_liheap_cooling: 0 + +# With no income both households pass the income test, so only the qualified member +# requirement separates them: an undocumented adult alone has Georgia household size 0 +# (manual 1100.4, page 51). +- name: Case 3, a household with no qualified member is not eligible. + period: 2026 + input: + state_code: [GA, GA] + age: [40, 40] + immigration_status: [CITIZEN, UNDOCUMENTED] + ssi: [0, 0] + ga_tanf: [0, 0] + heating_type: [ELECTRICITY, ELECTRICITY] + has_cooling_expense: [true, true] + pre_subsidy_electricity_expense: [1_800, 1_800] + output: + ga_liheap_household_size: [1, 0] + ga_liheap_cooling_eligible: [true, false] + +# Case 2's cashier (29_070, within the 34_549 limit) reports a cooling cost but no fuel. The +# matrix prints one cooling amount for every fuel, so the fuel does not matter: 29_070 is +# above the 13_589 Level I cutoff, so cooling pays the Level II amount, 400. +- name: Case 4, an unspecified heating fuel receives the cooling benefit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 29_070 + spm_units: + spm_unit: + members: [person1] + ga_tanf: 0 + heating_type: UNSPECIFIED + has_cooling_expense: true + pre_subsidy_electricity_expense: 1_800 + households: + household: + members: [person1] + state_code: GA + output: + ga_liheap_income_eligible: true + # Was false and 0, now true and 400: cooling eligibility no longer adds a heating fuel + # condition. + ga_liheap_cooling_eligible: true + ga_liheap_cooling: 400 + +# Heating's Case 14 renter: one adult with 12_000 of wages and unsubsidized rent that +# includes all utilities, with no separate bill and no reported cooling cost. Rent is the +# HUD FY2026 one-bedroom Fair Market Rent for Dougherty County, 1_006 x 12 = 12_072. The +# manual's energy burden table pays this renter directly, and section 1300.2 pays costs +# "included in their rent and designated as a separate cost", which the rental agreement +# is assumed to do. 12_000 is at or below the 13_589 size-one Level I cutoff, so cooling +# pays 500 beside the 500 heating minimum, and the national total is 1_000. +- name: Case 5, rent that includes all utilities qualifies without a separate cooling cost. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + immigration_status: CITIZEN + ssi: 0 + employment_income_before_lsr: 12_000 + rent: 12_072 + spm_units: + spm_unit: + members: [person1] + ga_tanf: 0 + heating_type: UNSPECIFIED + heat_expense_included_in_rent: true + receives_housing_assistance: false + has_cooling_expense: false + households: + household: + members: [person1] + state_code: GA + tenant_pays_utilities: false + is_in_public_housing: false + output: + ga_liheap_income: 12_000 + ga_liheap_eligible: true + ga_liheap: 500 + ga_liheap_cooling_eligible: true + ga_liheap_cooling: 500 + liheap: 1_000 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_income_eligible.yaml new file mode 100644 index 00000000000..de9da75a914 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_income_eligible.yaml @@ -0,0 +1,30 @@ +# Georgia LIHEAP income test shared by heating and cooling: income at or below 60% of state +# median income (FY2026 plan sections 2.1 and 3.1), or below 110% of the poverty guideline +# (42 U.S.C. 8624(b)(2)(B)). Income is entered directly to pin each boundary. + +# FY2026 size one: the matrix limit is 34_549 and is inclusive. +- name: Case 1, the state median income limit is inclusive. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [GA, GA] + age: [40, 40] + immigration_status: [CITIZEN, CITIZEN] + ga_liheap_income: [34_549, 34_549.01] + output: + ga_liheap_income_limit: [34_549, 34_549] + ga_liheap_income_eligible: [true, false] + +# FY2026 size 16: the printed limit is 107_634. FY2026 uses the 2025 guidelines, so the +# floor is 1.1 x (15_650 + 15 x 5_500) = 1.1 x 98_150 = 107_965 (rounded to the cent). +# 107_964.99 is below the floor; 107_965 is not "less than" it. +- name: Case 2, the federal poverty floor is strict above the printed size 16 limit. + period: 2026 + absolute_error_margin: 0.01 + input: + state_code: [GA, GA] + ga_liheap_household_size: [16, 16] + ga_liheap_income: [107_964.99, 107_965] + output: + ga_liheap_income_limit: [107_634, 107_634] + ga_liheap_income_eligible: [true, false] diff --git a/policyengine_us/variables/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling.py b/policyengine_us/variables/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling.py new file mode 100644 index 00000000000..ef70a8d0504 --- /dev/null +++ b/policyengine_us/variables/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class ga_liheap_cooling(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "Georgia LIHEAP regular cooling benefit" + defined_for = "ga_liheap_cooling_eligible" + reference = ( + "https://liheapch.acf.gov/docs/2026/benefits-matricies/GA_BenefitMatrix_Heat-Cool_2026.pdf", + "https://liheapch.acf.gov/docs/2025/benefits-matricies/GA_BenefitMatrix_2025.pdf", + # FY2026 state plan section 3.6 ($400 to $500) and item 16.1 (no senior + # maximum). + # PDF pages 11, 30 + "https://liheapch.acf.gov/docs/2026/state-plans/GA_Plan_2026.pdf#page=11", + # PAMMS chapter 100: one cooling benefit per program year. + "https://pamms.dhs.ga.gov/dfcs/_exports/liheap.pdf#page=5", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ga.dfcs.liheap + size = spm_unit("ga_liheap_household_size", period) + income = spm_unit("ga_liheap_income", period) + # Step 1 sets the income level as for heating. Step 2 prints one cooling + # amount per level for every main heating fuel, with no cap at the bill. + lookup_size = clip(size, 1, p.payment.maximum_table_size) + lower_income = income <= p.payment.lower_income_limit[lookup_size] + return where( + lower_income, p.cooling.amount.lower_income, p.cooling.amount.higher_income + ) diff --git a/policyengine_us/variables/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling_eligible.py b/policyengine_us/variables/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling_eligible.py new file mode 100644 index 00000000000..b2dd91f920f --- /dev/null +++ b/policyengine_us/variables/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling_eligible.py @@ -0,0 +1,56 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.states.ga.dfcs.liheap.eligibility._ga_liheap_housing import ( + ga_liheap_has_direct_payment_route, +) + + +class ga_liheap_cooling_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Eligible for Georgia LIHEAP regular cooling assistance" + defined_for = StateCode.GA + reference = ( + # FY2026 state plan sections 3.1-3.5: 60% of state median income, no + # additional eligibility requirements, no asset test, the first 30 days + # for older and homebound residents, and the account-credit rule. + # PDF pages 10-11 + "https://liheapch.acf.gov/docs/2026/state-plans/GA_Plan_2026.pdf#page=10", + # PAMMS chapter 100, export dated 2026-11-04: cooling applicants "must + # meet the eligibility requirements set forth for the current fiscal + # year's Heating Program". + "https://pamms.dhs.ga.gov/dfcs/_exports/liheap.pdf#page=4", + "https://dfcs.georgia.gov/document/document/liheap-cooling-faq-fy2022/download#page=1", + # Manual section 1300.2 pays "eligible individuals whose heating or + # cooling costs are included in their rent and designated as a separate + # cost"; the rental agreement is assumed to designate it, as heating + # assumes the agreement is verified. The energy burden table pays + # unsubsidized rent that includes heat and electric directly to the + # applicant. + # PDF pages 70, 89 + "https://liheapch.acf.gov/sites/default/files/webfiles/docs/2023/manuals/GA_PolicyManual_2023.pdf#page=70", + # DHS 2026 cooling release: applicants provide the "Most recent cooling + # bill or statement of service from their energy providers". + "https://dhs.georgia.gov/press-releases/2026-04-06/liheap-cooling-open", + ) + + def formula(spm_unit, period, parameters): + # Heating's household size and income tests apply. The energy burden is + # the household's own cooling cost or the heating program's direct + # payment route: unsubsidized rent that includes all utilities. + # The matrix prints one cooling amount per level for every main heating + # fuel, so the fuel does not affect eligibility; paying a home with no + # heating reads that single cooling cell as covering it. + # Not modeled: the first 30 days reserved for residents 65 and older and + # the medically homebound (plan items 3.3 and 3.4), funding on a + # "first-come, first-served basis until all funds are exhausted" (DHS + # 2026 release) and targeting when funding is too limited (PAMMS + # page 4). The household's account is assumed to meet the $1,000 + # account-credit rule (plan item 3.5). + cooling_cost = spm_unit("has_cooling_expense", period) + all_utilities_in_rent = ga_liheap_has_direct_payment_route(spm_unit, period) + return ( + (spm_unit("ga_liheap_household_size", period) > 0) + & spm_unit("ga_liheap_income_eligible", period) + & (cooling_cost | all_utilities_in_rent) + ) diff --git a/policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_eligible.py b/policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_eligible.py index 9921403a949..037bd345607 100644 --- a/policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_eligible.py +++ b/policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_eligible.py @@ -1,5 +1,4 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg from policyengine_us.variables.gov.states.ga.dfcs.liheap.eligibility._ga_liheap_housing import ( ga_liheap_has_direct_payment_route, ga_liheap_has_electric_vendor_route, @@ -24,21 +23,8 @@ class ga_liheap_eligible(Variable): ) def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ga.dfcs.liheap.eligibility - p_hhs = parameters(period).gov.hhs.liheap size = spm_unit("ga_liheap_household_size", period) - income = spm_unit("ga_liheap_income", period) - limit = spm_unit("ga_liheap_income_limit", period) - # 42 U.S.C. 8624(b)(2)(B) bars excluding a household on income below 110% - # of the poverty guideline. The 60% SMI limit falls below that floor from - # household size 16 in FY2025 and FY2026. The printed matrices do too: size - # 16 prints $102,926 in FY2025 (floor $105,336) and $107,634 in FY2026 - # (floor $107,965). Georgia assures the floor (FY2025 and FY2026 plans, - # page 43), so the floor governs; the limit keeps the printed table. - state_group = spm_unit.household("state_group_str", period) - guideline = fpg(size, state_group, period, parameters, year_lag=p.fpg_year_lag) - floor = np.round(guideline * p_hhs.fpg_floor, 2) - income_eligible = (income <= limit) | (income < floor) + income_eligible = spm_unit("ga_liheap_income_eligible", period) heating_type = spm_unit("heating_type", period) heating_expense = spm_unit("heating_expense", period) # Explicit heating responsibility can qualify with no current bill. diff --git a/policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_income_eligible.py b/policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_income_eligible.py new file mode 100644 index 00000000000..53fbb93a379 --- /dev/null +++ b/policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_income_eligible.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class ga_liheap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "Georgia LIHEAP income eligible" + defined_for = StateCode.GA + reference = ( + # FY2026 state plan sections 2.1 (heating) and 3.1 (cooling) and + # assurance 2. + # PDF pages 8, 10, 43 + "https://liheapch.acf.gov/docs/2026/state-plans/GA_Plan_2026.pdf#page=8", + "https://liheapch.acf.gov/docs/2025/state-plans/GA_Plan_2025.pdf#page=43", + "https://www.law.cornell.edu/uscode/text/42/8624#b_2_B", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ga.dfcs.liheap.eligibility + p_hhs = parameters(period).gov.hhs.liheap + size = spm_unit("ga_liheap_household_size", period) + income = spm_unit("ga_liheap_income", period) + limit = spm_unit("ga_liheap_income_limit", period) + # 42 U.S.C. 8624(b)(2)(B) bars excluding a household on income below 110% + # of the poverty guideline. The 60% SMI limit falls below that floor from + # household size 16 in FY2025 and FY2026. The printed matrices do too: size + # 16 prints $102,926 in FY2025 (floor $105,336) and $107,634 in FY2026 + # (floor $107,965). Georgia assures the floor (FY2025 and FY2026 plans, + # page 43), so the floor governs; the limit keeps the printed table. + state_group = spm_unit.household("state_group_str", period) + guideline = fpg(size, state_group, period, parameters, year_lag=p.fpg_year_lag) + floor = np.round(guideline * p_hhs.fpg_floor, 2) + return (income <= limit) | (income < floor) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 352bbc3a578..89d77c1759c 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -2863,6 +2863,48 @@ candidates: - https://github.com/PolicyEngine/policyengine-us/pull/10562 state: ruled note: The model has no Railway Labor Act status for this test, so the exclusion applies to every employee. +- id: us-ga:liheap-cooling-benefit-amounts + program: liheap + years: + from: 2025 + to: 2026 + type: federal-fiscal + question: Does Georgia LIHEAP pay the FY2026 matrix cooling amounts ($500 at Level I, $400 at Level II, with no senior + maximum), although the PAMMS LIHEAP chapter sets benefits of $350 to $400 and gives seniors 60 and older the $400 + maximum? + sources: + - kind: plan + citation: FY2026 Georgia LIHEAP State Plan section 3.6 and item 16.1 + url: https://liheapch.acf.gov/docs/2026/state-plans/GA_Plan_2026.pdf#page=11 + - kind: guidance + citation: FY2026 Georgia LIHEAP benefit matrix, step 2 (cooling benefit) + url: https://liheapch.acf.gov/docs/2026/benefits-matricies/GA_BenefitMatrix_Heat-Cool_2026.pdf + - kind: manual + citation: Georgia PAMMS LIHEAP chapter 100, page 5 + url: https://pamms.dhs.ga.gov/dfcs/_exports/liheap.pdf#page=5 + - kind: manual + citation: Georgia LIHEAP Policy Manual, revised January 2022, section 101.4, page 5 + url: https://liheapch.acf.gov/sites/default/files/webfiles/docs/2023/manuals/GA_PolicyManual_2023.pdf#page=5 + readings: + statute: No statute is supplied. The FY2026 matrix pays $500 at Level I and $400 at Level II for every main + heating fuel, and plan item 16.1 (page 30) says the matrix was updated to remove the rule that households with a + member aged 60 or older receive the highest benefit regardless of income. + other: PAMMS page 5 offers benefits "at a minimum of $350 and maximum of $400", and households with seniors 60 and + older "will receive the maximum benefit amount of $400". The January 2022 manual (section 101.4) offers "a + minimum of $350 and maximum of $500" and gives households with seniors 60 and older the $500 maximum. + example: A one-person Level I household with a member aged 70 receives $500 of cooling under the FY2026 matrix and + $400 under PAMMS page 5. + pe_us: + follows: gap-fill + code: + - policyengine_us/parameters/gov/states/ga/dfcs/liheap/cooling/amount.yaml + - policyengine_us/variables/gov/states/ga/dfcs/liheap/cooling/ga_liheap_cooling.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10746 + state: ruled + note: 'Ruled 2026-11-13 by the project lead; the ruling record is https://github.com/PolicyEngine/policyengine-us/pull/10746#issuecomment-6863978318. The FY2026 matrix and plan + item 16.1 control the cooling amounts over the PAMMS chapter (effective October 2020) and the January 2022 manual. + FY2027 has no posted matrix, so the FY2026 amounts carry forward.' - id: us-ga:liheap-income-floor-vs-smi-limit program: liheap years: @@ -2886,16 +2928,17 @@ candidates: pe_us: follows: statute code: - - policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_eligible.py + - policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_income_eligible.py - policyengine_us/parameters/gov/hhs/liheap/fpg_floor.yaml - policyengine_us/parameters/gov/states/ga/dfcs/liheap/eligibility/fpg_year_lag.yaml - policyengine_us/variables/gov/states/ga/dfcs/liheap/eligibility/ga_liheap_income_limit.py prs: - https://github.com/PolicyEngine/policyengine-us/pull/9968 + - https://github.com/PolicyEngine/policyengine-us/pull/10746 state: unreviewed note: 'PE-US follows the statute: income below 110% of the prior year''s poverty guideline, rounded to cents, qualifies even above the 60% SMI limit. The comment says the limit and the printed matrices fall below that - floor from size 16 in FY2025 and FY2026 and that Georgia''s plans assure the floor (ga_liheap_eligible.py, gov/hhs/liheap/fpg_floor.yaml, + floor from size 16 in FY2025 and FY2026 and that Georgia''s plans assure the floor (ga_liheap_income_eligible.py, gov/hhs/liheap/fpg_floor.yaml, eligibility/fpg_year_lag.yaml, ga_liheap_income_limit.py).' - id: us-ga:liheap-lawful-noncitizen-household-members program: liheap