From a08597a0b712febb8c93097cfa0331c1f242a28e Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Fri, 16 Oct 2026 16:10:18 -0400 Subject: [PATCH 1/2] Compare the Wisconsin Works CMC infant age limit with age in months wi_works_placement compared the 2-month CMC limit (8 weeks, Wis. Stat. 49.148(1m)(a)1) with monthly_age, which is the age in years. Children aged 1 and 2 got the CMC placement and the $673 grant instead of the $653 CSJ grant. Use age x 12, as the state child care age-group variables do, and set age in the placement tests instead of monthly_age. Co-Authored-By: Claude Opus 5.5 --- .../fix-9815-wi-works-cmc-age.fixed.md | 1 + .../gov/states/wi/dcf/works/integration.yaml | 29 +++++++++- .../wi/dcf/works/wi_works_placement.yaml | 58 ++++++++++++++----- .../states/wi/dcf/works/wi_works_placement.py | 5 +- 4 files changed, 76 insertions(+), 17 deletions(-) create mode 100644 changelog.d/fix-9815-wi-works-cmc-age.fixed.md diff --git a/changelog.d/fix-9815-wi-works-cmc-age.fixed.md b/changelog.d/fix-9815-wi-works-cmc-age.fixed.md new file mode 100644 index 00000000000..4d3ebd9ad3c --- /dev/null +++ b/changelog.d/fix-9815-wi-works-cmc-age.fixed.md @@ -0,0 +1 @@ +Compare the Wisconsin Works Custodial Parent of an Infant (CMC) age limit, which is in months, with the child's age in months, so children aged 1 and 2 no longer get the CMC placement and its $673 grant. diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/integration.yaml index 1a4539a0f86..1f4ea39db42 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/integration.yaml @@ -36,7 +36,7 @@ is_tax_unit_head_or_spouse: true tanf_gross_earned_income: 1_000 person2: - age: 0 # Newborn (monthly_age = 0 ≤ 2) + age: 0 # Newborn (0 x 12 = 0 months ≤ 2) spm_units: spm_unit: members: [person1, person2] @@ -211,7 +211,7 @@ is_tax_unit_head_or_spouse: true tanf_gross_earned_income: 0 person2: - age: 3 # monthly_age = 3 > 2 threshold + age: 3 # 3 x 12 = 36 months > 2 threshold spm_units: spm_unit: members: [person1, person2] @@ -280,3 +280,28 @@ wi_works_eligible: true wi_works_placement: CSJ wi_works: 653 + +- name: Case 12, child aged 1 year (above CMC threshold) gets CSJ. + period: 2025-01 + input: + people: + person1: + age: 27 + is_tax_unit_head_or_spouse: true + tanf_gross_earned_income: 0 + person2: + age: 1 # 1 x 12 = 12 months > 2 threshold + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_cash_assets: 500 + households: + household: + members: [person1, person2] + state_code: WI + output: + # CMC covers a custodial parent of a child 8 weeks old or less + # (Wis. Stat. 49.148(1m)(a)1); a 1-year-old gets the $653 CSJ grant. + wi_works_eligible: true + wi_works_placement: CSJ + wi_works: 653 diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_placement.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_placement.yaml index 24b7f69b8f3..4630320c1cb 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_placement.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_placement.yaml @@ -14,7 +14,7 @@ output: wi_works_placement: CSJ -- name: Case 2, CMC with infant under 2 months. +- name: Case 2, CMC with a newborn. period: 2025-01 input: people: @@ -22,48 +22,80 @@ age: 25 is_pregnant: false person2: - monthly_age: 1 + age: 0 households: household1: members: [person1, person2] state_code: WI output: + # Age 0 years = 0 months <= 2-month limit (8 weeks, Wis. Stat. 49.148(1m)(a)1) wi_works_placement: CMC -- name: Case 3, CMC with infant exactly 2 months. +- name: Case 3, CMC with an infant 1.5 months old. period: 2025-01 input: people: person1: age: 25 person2: - monthly_age: 2 + age: 0.125 households: household1: members: [person1, person2] state_code: WI output: + # 0.125 years x 12 = 1.5 months <= 2 wi_works_placement: CMC -- name: Case 4, CSJ with child over 2 months. +- name: Case 4, CSJ with an infant 3 months old. period: 2025-01 input: people: person1: age: 25 - # Explicit monthly_age to avoid formula calculation issues - monthly_age: 300 person2: - # monthly_age > 2 to exceed CMC threshold - monthly_age: 3 + age: 0.25 households: household1: members: [person1, person2] state_code: WI output: + # 0.25 years x 12 = 3 months > 2 wi_works_placement: CSJ -- name: Case 5, ARP with pregnant person in third trimester. +- name: Case 5, CSJ with a child aged 1 year. + period: 2025-01 + input: + people: + person1: + age: 25 + person2: + age: 1 + households: + household1: + members: [person1, person2] + state_code: WI + output: + # 1 year x 12 = 12 months > 2 + wi_works_placement: CSJ + +- name: Case 6, CSJ with a child aged 2 years. + period: 2025-01 + input: + people: + person1: + age: 25 + person2: + age: 2 + households: + household1: + members: [person1, person2] + state_code: WI + output: + # 2 years x 12 = 24 months > 2 + wi_works_placement: CSJ + +- name: Case 7, ARP with pregnant person in third trimester. period: 2025-01 input: people: @@ -78,7 +110,7 @@ output: wi_works_placement: ARP -- name: Case 6, CSJ with pregnant person not in third trimester. +- name: Case 8, CSJ with pregnant person not in third trimester. period: 2025-01 input: people: @@ -93,7 +125,7 @@ output: wi_works_placement: CSJ -- name: Case 7, CMC takes priority over ARP. +- name: Case 9, CMC takes priority over ARP. period: 2025-01 input: people: @@ -102,7 +134,7 @@ is_pregnant: true current_pregnancy_month: 8 person2: - monthly_age: 1 + age: 0 households: household1: members: [person1, person2] diff --git a/policyengine_us/variables/gov/states/wi/dcf/works/wi_works_placement.py b/policyengine_us/variables/gov/states/wi/dcf/works/wi_works_placement.py index 3460af39cdf..0936fa8d2eb 100644 --- a/policyengine_us/variables/gov/states/wi/dcf/works/wi_works_placement.py +++ b/policyengine_us/variables/gov/states/wi/dcf/works/wi_works_placement.py @@ -27,8 +27,9 @@ def formula(spm_unit, period, parameters): person = spm_unit.members # CMC: Custodial Parent of Infant (child <= 8 weeks ≈ 2 months) - child_age_months = person("monthly_age", period) - has_infant = spm_unit.any(child_age_months <= p.cmc_infant_age_limit) + # The limit is in months; monthly_age is in years, so convert age. + age_in_months = person("age", period.this_year) * MONTHS_IN_YEAR + has_infant = spm_unit.any(age_in_months <= p.cmc_infant_age_limit) # ARP: At Risk Pregnancy (3rd trimester = month 7+) is_pregnant = person("is_pregnant", period) From b03f836775d9da7cea5db14d8b6b99840fb631ed Mon Sep 17 00:00:00 2001 From: PavelMakarchuk Date: Tue, 27 Oct 2026 11:08:40 -0400 Subject: [PATCH 2/2] Encode the Wisconsin Works CMC infant age limit in weeks with its history Wis. Stat. 49.148(1m)(a)1 limits the Custodial Parent of an Infant placement to a child "8 weeks old or less". The limit was 12 weeks from the start of W-2 until 2011 Wis. Act 32 (SECTION 1361s) cut it to 8 weeks from January 1, 2012 (SECTION 9408 (1d)). The parameter was a 2-month approximation from 2011-10-01, so ages of 57-60 days still gave CMC, and the 12-week rule before 2012 was missing. - Set the limit to 12 weeks from 1997-09-01 and 8 weeks from 2012-01-01, with unit week. Fix the W-2 Manual section in the reference title (7.4.3, not 7.4.5) and cite the 1997-98 statutes and Act 32. - Compare the limit with age x WEEKS_IN_YEAR. Note that age 0 always gives CMC when ages are whole years. - Add boundary cases at 56 and 57 days (8-week rule) and at 84 and 85 days (12-week rule, 2011), and a 10-week-old in January 2011 (CMC) and January 2012 (CSJ). The ages sit away from the limit, so float32 rounding cannot flip them. Co-Authored-By: Claude Opus 5.5 --- .../fix-9815-wi-works-cmc-age.fixed.md | 2 +- .../works/placement/cmc_infant_age_limit.yaml | 14 +- .../gov/states/wi/dcf/works/integration.yaml | 6 +- .../wi/dcf/works/wi_works_placement.yaml | 123 ++++++++++++++++-- .../states/wi/dcf/works/wi_works_placement.py | 11 +- 5 files changed, 131 insertions(+), 25 deletions(-) diff --git a/changelog.d/fix-9815-wi-works-cmc-age.fixed.md b/changelog.d/fix-9815-wi-works-cmc-age.fixed.md index 4d3ebd9ad3c..c825395c7cb 100644 --- a/changelog.d/fix-9815-wi-works-cmc-age.fixed.md +++ b/changelog.d/fix-9815-wi-works-cmc-age.fixed.md @@ -1 +1 @@ -Compare the Wisconsin Works Custodial Parent of an Infant (CMC) age limit, which is in months, with the child's age in months, so children aged 1 and 2 no longer get the CMC placement and its $673 grant. +Compare the Wisconsin Works Custodial Parent of an Infant (CMC) age limit with the child's age in weeks, and set the limit to 12 weeks before 2012 and 8 weeks from 2012, so children aged 1 and 2 no longer get the CMC placement and its $673 grant. diff --git a/policyengine_us/parameters/gov/states/wi/dcf/works/placement/cmc_infant_age_limit.yaml b/policyengine_us/parameters/gov/states/wi/dcf/works/placement/cmc_infant_age_limit.yaml index cf3cedce366..7d2dd6de374 100644 --- a/policyengine_us/parameters/gov/states/wi/dcf/works/placement/cmc_infant_age_limit.yaml +++ b/policyengine_us/parameters/gov/states/wi/dcf/works/placement/cmc_infant_age_limit.yaml @@ -1,15 +1,19 @@ -description: Wisconsin limits the Custodial Parent of Infant placement to parents with children at or below this age in months under the Wisconsin Works program. +description: Wisconsin limits the Custodial Parent of an Infant placement to custodial parents of children at or below this age in weeks under the Wisconsin Works program. values: - 2011-10-01: 2 + 1997-09-01: 12 + 2012-01-01: 8 metadata: - unit: month + unit: week period: month label: Wisconsin Works CMC infant age limit reference: - # Wisconsin statute specifies 8 weeks; 2 months is an approximation. - title: Wisconsin Statutes 49.148(1m)(a)1 href: https://docs.legis.wisconsin.gov/statutes/statutes/49/iii/148 - - title: W-2 Manual 7.4.5 - Custodial Parent of an Infant + - title: 1997-98 Wisconsin Statutes 49.148(1m)(a) + href: https://docs.legis.wisconsin.gov/1997/statutes/statutes/49.pdf#page=19 + - title: "2011 Wisconsin Act 32, sections 1361s and 9408(1d) #page 226,530" + href: https://docs.legis.wisconsin.gov/2011/related/acts/32.pdf#page=226 + - title: W-2 Manual 7.4.3 - Custodial Parent of an Infant (CMC) href: https://dcf.wisconsin.gov/manuals/w-2-manual/Production/07/7.4.3_Custodial_Parent_of_an_Infant_CMC_.htm diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/integration.yaml index 1f4ea39db42..c78a5381a52 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/integration.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/integration.yaml @@ -36,7 +36,7 @@ is_tax_unit_head_or_spouse: true tanf_gross_earned_income: 1_000 person2: - age: 0 # Newborn (0 x 12 = 0 months ≤ 2) + age: 0 # Newborn (0 x 52 = 0 weeks ≤ 8) spm_units: spm_unit: members: [person1, person2] @@ -211,7 +211,7 @@ is_tax_unit_head_or_spouse: true tanf_gross_earned_income: 0 person2: - age: 3 # 3 x 12 = 36 months > 2 threshold + age: 3 # 3 x 52 = 156 weeks > 8-week limit spm_units: spm_unit: members: [person1, person2] @@ -290,7 +290,7 @@ is_tax_unit_head_or_spouse: true tanf_gross_earned_income: 0 person2: - age: 1 # 1 x 12 = 12 months > 2 threshold + age: 1 # 1 x 52 = 52 weeks > 8-week limit spm_units: spm_unit: members: [person1, person2] diff --git a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_placement.yaml b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_placement.yaml index 4630320c1cb..55d0309f1fc 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_placement.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/wi/dcf/works/wi_works_placement.yaml @@ -28,10 +28,10 @@ members: [person1, person2] state_code: WI output: - # Age 0 years = 0 months <= 2-month limit (8 weeks, Wis. Stat. 49.148(1m)(a)1) + # 0 years x 52 = 0 weeks <= 8-week limit (Wis. Stat. 49.148(1m)(a)1) wi_works_placement: CMC -- name: Case 3, CMC with an infant 1.5 months old. +- name: Case 3, CMC with an infant 6.5 weeks old. period: 2025-01 input: people: @@ -44,10 +44,44 @@ members: [person1, person2] state_code: WI output: - # 0.125 years x 12 = 1.5 months <= 2 + # 0.125 years x 52 = 6.5 weeks <= 8 wi_works_placement: CMC -- name: Case 4, CSJ with an infant 3 months old. +- name: Case 4, CMC with an infant 56 days old. + period: 2025-01 + input: + people: + person1: + age: 25 + person2: + age: 0.1533 + households: + household1: + members: [person1, person2] + state_code: WI + output: + # 0.1533 years (56 days) x 52 = 7.97 weeks <= 8. W-2 Manual 7.4.3.4 + # ends CMC on day 56 (7 days x 8 weeks). + wi_works_placement: CMC + +- name: Case 5, CSJ with an infant 57 days old. + period: 2025-01 + input: + people: + person1: + age: 25 + person2: + age: 0.1561 + households: + household1: + members: [person1, person2] + state_code: WI + output: + # 0.1561 years (57 days) x 52 = 8.12 weeks > 8. A 2-month limit would + # give CMC here (0.1561 x 12 = 1.87 months). + wi_works_placement: CSJ + +- name: Case 6, CSJ with an infant 13 weeks old. period: 2025-01 input: people: @@ -60,10 +94,10 @@ members: [person1, person2] state_code: WI output: - # 0.25 years x 12 = 3 months > 2 + # 0.25 years x 52 = 13 weeks > 8 wi_works_placement: CSJ -- name: Case 5, CSJ with a child aged 1 year. +- name: Case 7, CSJ with a child aged 1 year. period: 2025-01 input: people: @@ -76,10 +110,10 @@ members: [person1, person2] state_code: WI output: - # 1 year x 12 = 12 months > 2 + # 1 year x 52 = 52 weeks > 8 wi_works_placement: CSJ -- name: Case 6, CSJ with a child aged 2 years. +- name: Case 8, CSJ with a child aged 2 years. period: 2025-01 input: people: @@ -92,10 +126,75 @@ members: [person1, person2] state_code: WI output: - # 2 years x 12 = 24 months > 2 + # 2 years x 52 = 104 weeks > 8 + wi_works_placement: CSJ + +- name: Case 9, CMC with an infant 10 weeks old in January 2011. + period: 2011-01 + input: + people: + person1: + age: 25 + person2: + age: 0.19 + households: + household1: + members: [person1, person2] + state_code: WI + output: + # 0.19 years x 52 = 9.88 weeks <= 12. The limit was 12 weeks until + # 2011 Wis. Act 32 cut it to 8 weeks from January 1, 2012. + wi_works_placement: CMC + +- name: Case 10, CSJ with an infant 10 weeks old in January 2012. + period: 2012-01 + input: + people: + person1: + age: 25 + person2: + age: 0.19 + households: + household1: + members: [person1, person2] + state_code: WI + output: + # 0.19 years x 52 = 9.88 weeks > 8 + wi_works_placement: CSJ + +- name: Case 11, CMC with an infant 84 days old in January 2011. + period: 2011-01 + input: + people: + person1: + age: 25 + person2: + age: 0.23 + households: + household1: + members: [person1, person2] + state_code: WI + output: + # 0.23 years (84 days) x 52 = 11.96 weeks <= 12 + wi_works_placement: CMC + +- name: Case 12, CSJ with an infant 85 days old in January 2011. + period: 2011-01 + input: + people: + person1: + age: 25 + person2: + age: 0.233 + households: + household1: + members: [person1, person2] + state_code: WI + output: + # 0.233 years (85 days) x 52 = 12.12 weeks > 12 wi_works_placement: CSJ -- name: Case 7, ARP with pregnant person in third trimester. +- name: Case 13, ARP with pregnant person in third trimester. period: 2025-01 input: people: @@ -110,7 +209,7 @@ output: wi_works_placement: ARP -- name: Case 8, CSJ with pregnant person not in third trimester. +- name: Case 14, CSJ with pregnant person not in third trimester. period: 2025-01 input: people: @@ -125,7 +224,7 @@ output: wi_works_placement: CSJ -- name: Case 9, CMC takes priority over ARP. +- name: Case 15, CMC takes priority over ARP. period: 2025-01 input: people: diff --git a/policyengine_us/variables/gov/states/wi/dcf/works/wi_works_placement.py b/policyengine_us/variables/gov/states/wi/dcf/works/wi_works_placement.py index 0936fa8d2eb..e6df57b3f32 100644 --- a/policyengine_us/variables/gov/states/wi/dcf/works/wi_works_placement.py +++ b/policyengine_us/variables/gov/states/wi/dcf/works/wi_works_placement.py @@ -20,16 +20,19 @@ class wi_works_placement(Variable): reference = ( "https://docs.legis.wisconsin.gov/statutes/statutes/49/iii/148", "https://dcf.wisconsin.gov/manuals/w-2-manual/Production/07/7.4.1_Community_Service_Jobs_(CSJ).htm", + "https://dcf.wisconsin.gov/manuals/w-2-manual/Production/07/7.4.3_Custodial_Parent_of_an_Infant_CMC_.htm", ) def formula(spm_unit, period, parameters): p = parameters(period).gov.states.wi.dcf.works.placement person = spm_unit.members - # CMC: Custodial Parent of Infant (child <= 8 weeks ≈ 2 months) - # The limit is in months; monthly_age is in years, so convert age. - age_in_months = person("age", period.this_year) * MONTHS_IN_YEAR - has_infant = spm_unit.any(age_in_months <= p.cmc_infant_age_limit) + # CMC: Custodial Parent of Infant (child 8 weeks old or less; + # 12 weeks before 2012). The limit is in weeks and age is in years. + # With age in whole years (as in the microdata), every child aged 0 + # counts as at or below the limit, so age 0 always gives CMC. + age_in_weeks = person("age", period.this_year) * WEEKS_IN_YEAR + has_infant = spm_unit.any(age_in_weeks <= p.cmc_infant_age_limit) # ARP: At Risk Pregnancy (3rd trimester = month 7+) is_pregnant = person("is_pregnant", period)