Repository: PolicyEngine/policyengine-us

Issue:
Add SSN requirement to reconciliation CTC reform

Discussion:
@hua7450: The variable `tax_unit_has_ssn.py` created in #5953 can apply to this issue. 

Solution patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 57fa2acceb..cb37527a91 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
 and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
+## [1.278.0] - 2025-05-13 14:13:35
+
+### Added
+
+- Add SSN requirement to current EITC formula.
+
 ## [1.277.0] - 2025-05-13 13:15:11
 
 ### Added
@@ -11661,6 +11667,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 
 
+[1.278.0]: https://github.com/PolicyEngine/policyengine-us/compare/1.277.0...1.278.0
 [1.277.0]: https://github.com/PolicyEngine/policyengine-us/compare/1.276.0...1.277.0
 [1.276.0]: https://github.com/PolicyEngine/policyengine-us/compare/1.275.0...1.276.0
 [1.275.0]: https://github.com/PolicyEngine/policyengine-us/compare/1.274.1...1.275.0
diff --git a/changelog.yaml b/changelog.yaml
index 3e145df3ff..87b96b684c 100644
--- a/changelog.yaml
+++ b/changelog.yaml
@@ -9899,3 +9899,8 @@
     added:
     - 2024 West Virginia Income Tax Changes.
   date: 2025-05-13 13:15:11
+- bump: minor
+  changes:
+    added:
+    - Add SSN requirement to current EITC formula.
+  date: 2025-05-13 14:13:35
diff --git a/changelog_entry.yaml b/changelog_entry.yaml
index e69de29bb2..668ba70ebf 100644
--- a/changelog_entry.yaml
+++ b/changelog_entry.yaml
@@ -0,0 +1,4 @@
+- bump: minor
+  changes:
+    added:
+    - Add SSN requirement to reconciliation CTC reform.
diff --git a/policyengine_us/parameters/gov/contrib/reconciliation/ctc/in_effect.yaml b/policyengine_us/parameters/gov/contrib/reconciliation/ctc/in_effect.yaml
new file mode 100644
index 0000000000..376d29d25b
--- /dev/null
+++ b/policyengine_us/parameters/gov/contrib/reconciliation/ctc/in_effect.yaml
@@ -0,0 +1,12 @@
+description: The Committee on Ways and Means proposed to limit the CTC to filers with an SSN, which comes in effect if this is true. 
+
+values:
+  0000-01-01: false
+
+metadata:
+  unit: bool
+  period: year
+  label: Reconciled CTC with SSN requirement in effect
+  reference:
+    - title: COMMITTEE ON WAYS AND MEANS, THE ONE, BIG, BEAUTIFUL BILL
+      href: https://punchbowl.news/smitmo_017_xml/ #page 5
diff --git a/policyengine_us/reforms/reconciliation/__init__.py b/policyengine_us/reforms/reconciliation/__init__.py
index aaa31dde35..f410636207 100644
--- a/policyengine_us/reforms/reconciliation/__init__.py
+++ b/policyengine_us/reforms/reconciliation/__init__.py
@@ -10,3 +10,6 @@ from .reconciled_tip_and_overtime_exempt import (
 from .reconciled_auto_loan_interest_ald import (
     create_reconciled_auto_loan_interest_ald_reform,
 )
+from .ctc_ssn import (
+    create_ctc_ssn_reform,
+)
diff --git a/policyengine_us/reforms/reconciliation/ctc_ssn.py b/policyengine_us/reforms/reconciliation/ctc_ssn.py
new file mode 100644
index 0000000000..4b1e125c17
--- /dev/null
+++ b/policyengine_us/reforms/reconciliation/ctc_ssn.py
@@ -0,0 +1,109 @@
+from policyengine_us.model_api import *
+from policyengine_core.periods import period as period_
+from policyengine_core.periods import instant
+
+
+def create_ctc_ssn() -> Reform:
+    class ctc(Variable):
+        value_type = float
+        entity = TaxUnit
+        label = "Child Tax Credit"
+        unit = USD
+        documentation = "Total value of the non-refundable and refundable portions of the Child Tax Credit."
+        definition_period = YEAR
+        reference = "https://www.law.cornell.edu/uscode/text/26/24#a"
+        defined_for = "filer_meets_ctc_identification_requirements"
+
+        def formula(tax_unit, period, parameters):
+            maximum_amount = tax_unit("ctc_maximum_with_arpa_addition", period)
+            reduction = tax_unit("ctc_phase_out", period)
+            return max_(0, maximum_amount - reduction)
+
+    class ctc_qualifying_children(Variable):
+        value_type = int
+        entity = TaxUnit
+        label = "CTC-qualifying children"
+        documentation = (
+            "Count of children that qualify for the Child Tax Credit"
+        )
+        definition_period = YEAR
+        reference = "https://docs.house.gov/meetings/WM/WM00/20250513/118260/BILLS-119CommitteePrintih.pdf#page=4"
+
+        def formula(tax_unit, period, parameters):
+            person = tax_unit.members
+            ctc_qualifying_child = person("ctc_qualifying_child", period)
+            meets_ctc_identification_requirements = person(
+                "meets_ctc_identification_requirements", period
+            )
+            eligible_child = (
+                ctc_qualifying_child & meets_ctc_identification_requirements
+            )
+            # Only children who meet CTC identification requirements can claim benefit
+            return tax_unit.sum(eligible_child)
+
+    class filer_meets_ctc_identification_requirements(Variable):
+        value_type = bool
+        entity = TaxUnit
+        definition_period = YEAR
+        label = "Filer meets CTC identification requirements"
+
+        def formula(tax_unit, period, parameters):
+            # Both head and spouse in the tax unit must have valid SSN card type to be eligible for the CTC
+            person = tax_unit.members
+            is_head_or_spouse = person("is_tax_unit_head_or_spouse", period)
+            eligible_ssn_card_type = person(
+                "meets_ctc_identification_requirements", period
+            )
+            ineligible_head_or_spouse = (
+                is_head_or_spouse & ~eligible_ssn_card_type
+            )
+            return tax_unit.sum(ineligible_head_or_spouse) == 0
+
+    class meets_ctc_identification_requirements(Variable):
+        value_type = bool
+        entity = Person
+        definition_period = YEAR
+        label = "Person meets CTC identification requirements"
+        reference = "https://docs.house.gov/meetings/WM/WM00/20250513/118260/BILLS-119CommitteePrintih.pdf#page=4"
+
+        def formula(person, period, parameters):
+            ssn_card_type = person("ssn_card_type", period)
+            ssn_card_types = ssn_card_type.possible_values
+            citizen = ssn_card_type == ssn_card_types.CITIZEN
+            non_citizen_valid_ead = (
+                ssn_card_type == ssn_card_types.NON_CITIZEN_VALID_EAD
+            )
+            return citizen | non_citizen_valid_ead
+
+    class reform(Reform):
+        def apply(self):
+            self.update_variable(ctc)
+            self.update_variable(ctc_qualifying_children)
+            self.update_variable(filer_meets_ctc_identification_requirements)
+            self.update_variable(meets_ctc_identification_requirements)
+
+    return reform
+
+
+def create_ctc_ssn_reform(parameters, period, bypass: bool = False):
+    if bypass:
+        return create_ctc_ssn()
+
+    p = parameters.gov.contrib.reconciliation.ctc
+
+    reform_active = False
+    current_period = period_(period)
+
+    for i in range(5):
+        if p(current_period).in_effect:
+            reform_active = True
+            break
+        current_period = current_period.offset(1, "year")
+
+    if reform_active:
+        return create_ctc_ssn()
+    else:
+        return None
+
+
+ctc_ssn = create_ctc_ssn_reform(None, None, bypass=True)
diff --git a/policyengine_us/reforms/reforms.py b/policyengine_us/reforms/reforms.py
index 03f08f4800..981992dabc 100644
--- a/policyengine_us/reforms/reforms.py
+++ b/policyengine_us/reforms/reforms.py
@@ -106,6 +106,7 @@ from .reconciliation import (
     create_reconciled_pease_reform,
     create_reconciled_tip_and_overtime_exempt_reform,
     create_reconciled_auto_loan_interest_ald_reform,
+    create_ctc_ssn_reform,
 )
 
 from policyengine_core.reforms import Reform
@@ -233,6 +234,8 @@ def create_structural_reforms_from_parameters(parameters, period):
         create_reconciled_auto_loan_interest_ald_reform(parameters, period)
     )
 
+    ctc_ssn = create_ctc_ssn_reform(parameters, period)
+
     reforms = [
         afa_reform,
         winship_reform,
@@ -280,6 +283,7 @@ def create_structural_reforms_from_parameters(parameters, period):
         reconciled_pease,
         reconciled_tip_and_overtime_exempt,
         reconciled_auto_loan_interest_ald,
+        ctc_ssn,
     ]
     reforms = tuple(filter(lambda x: x is not None, reforms))
 
diff --git a/policyengine_us/variables/gov/irs/credits/earned_income/eitc_child_count.py b/policyengine_us/variables/gov/irs/credits/earned_income/eitc_child_count.py
index 5b70c5499d..f0147cb617 100644
--- a/policyengine_us/variables/gov/irs/credits/earned_income/eitc_child_count.py
+++ b/policyengine_us/variables/gov/irs/credits/earned_income/eitc_child_count.py
@@ -8,5 +8,17 @@ class eitc_child_count(Variable):
     unit = USD
     documentation = "Number of children qualifying as children for the EITC."
     definition_period = YEAR
+    reference = (
+        # IRC 32(c)(3)(D)(i) specifies qualifying children need a taxpayer identification number.
+        "https://www.law.cornell.edu/uscode/text/26/32#c_3_D_i",
+    )
 
-    adds = ["is_child_dependent"]
+    def formula(tax_unit, period, parameters):
+        person = tax_unit.members
+        is_child = person("is_child_dependent", period)
+        meets_eitc_identification_requirements = person(
+            "meets_eitc_identification_requirements", period
+        )
+        eligible_child = is_child & meets_eitc_identification_requirements
+        # Only child who meets EITC identification requirements can claim benefit
+        return tax_unit.sum(eligible_child)
diff --git a/policyengine_us/variables/gov/irs/credits/earned_income/eligibility/eitc_eligible.py b/policyengine_us/variables/gov/irs/credits/earned_income/eligibility/eitc_eligible.py
index d57498f310..78af8da818 100644
--- a/policyengine_us/variables/gov/irs/credits/earned_income/eligibility/eitc_eligible.py
+++ b/policyengine_us/variables/gov/irs/credits/earned_income/eligibility/eitc_eligible.py
@@ -14,8 +14,14 @@ class eitc_eligible(Variable):
             "eitc_investment_income_eligible", period
         )
         demographic_eligible = tax_unit("eitc_demographic_eligible", period)
+        # The head or spouse in the tax unit must have valid SSN card type to be eligible for the EITC
+        filers_has_ssn = tax_unit(
+            "filer_meets_eitc_identification_requirements", period
+        )
         # Define eligibility before considering separate filer limitation.
-        eligible = demographic_eligible & investment_income_eligible
+        eligible = (
+            demographic_eligible & investment_income_eligible & filers_has_ssn
+        )
         # This parameter is true if separate filers are eligible.
         if eitc.eligibility.separate_filer:
             return eligible
diff --git a/policyengine_us/variables/gov/irs/credits/earned_income/filer_meets_eitc_identification_requirements.py b/policyengine_us/variables/gov/irs/credits/earned_income/filer_meets_eitc_identification_requirements.py
new file mode 100644
index 0000000000..9c9b2ec7ab
--- /dev/null
+++ b/policyengine_us/variables/gov/irs/credits/earned_income/filer_meets_eitc_identification_requirements.py
@@ -0,0 +1,22 @@
+from policyengine_us.model_api import *
+
+
+class filer_meets_eitc_identification_requirements(Variable):
+    value_type = bool
+    entity = TaxUnit
+    definition_period = YEAR
+    label = "Filer meets EITC identification requirements"
+    reference = (
+        # IRC 32(c)(1)(E) specifies filer and spouse needs a taxpayer identification number.
+        "https://www.law.cornell.edu/uscode/text/26/32#c_1_E",
+    )
+
+    def formula(tax_unit, period, parameters):
+        # Both head and spouse in the tax unit must have valid SSN card type to be eligible for the EITC
+        person = tax_unit.members
+        is_head_or_spouse = person("is_tax_unit_head_or_spouse", period)
+        eligible_ssn_card_type = person(
+            "meets_eitc_identification_requirements", period
+        )
+        ineligible_head_or_spouse = is_head_or_spouse & ~eligible_ssn_card_type
+        return tax_unit.sum(ineligible_head_or_spouse) == 0
diff --git a/policyengine_us/variables/gov/irs/credits/earned_income/meets_eitc_identification_requirements.py b/policyengine_us/variables/gov/irs/credits/earned_income/meets_eitc_identification_requirements.py
new file mode 100644
index 0000000000..d7d9844cbf
--- /dev/null
+++ b/policyengine_us/variables/gov/irs/credits/earned_income/meets_eitc_identification_requirements.py
@@ -0,0 +1,28 @@
+from policyengine_us.model_api import *
+
+
+class meets_eitc_identification_requirements(Variable):
+    value_type = bool
+    entity = Person
+    definition_period = YEAR
+    label = "Person meets EITC identification requirements"
+    reference = (
+        # IRC 32(c)(1)(E) specifies filer and spouse needs a taxpayer identification number.
+        "https://www.law.cornell.edu/uscode/text/26/32#c_1_E",
+        # IRC 32(c)(3)(D)(i) specifies qualifying children need a taxpayer identification number.
+        "https://www.law.cornell.edu/uscode/text/26/32#c_3_D_i",
+        # IRC 32(m) defines a taxpayer identification number as a SSN,
+        # except for those listed in sections II and III of SSA 205(c)(2)(B)(i).
+        "https://www.law.cornell.edu/uscode/text/26/32#m",
+        # SSA 205(c)(2)(B)(i) defines SSNs used for benefits.
+        "https://www.ssa.gov/OP_Home/ssact/title02/0205.htm",
+    )
+
+    def formula(person, period, parameters):
+        ssn_card_type = person("ssn_card_type", period)
+        ssn_card_types = ssn_card_type.possible_values
+        citizen = ssn_card_type == ssn_card_types.CITIZEN
+        non_citizen_valid_ead = (
+            ssn_card_type == ssn_card_types.NON_CITIZEN_VALID_EAD
+        )
+        return citizen | non_citizen_valid_ead
diff --git a/setup.py b/setup.py
index 9942fc333a..500a723997 100644
--- a/setup.py
+++ b/setup.py
@@ -7,7 +7,7 @@ with open("README.md", "r") as readme_file:
 
 setup(
     name="policyengine-us",
-    version="1.277.0",
+    version="1.278.0",
     author="PolicyEngine",
     author_email="hello@policyengine.org",
     long_description=readme,


Test patch:
diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_child_count.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_child_count.yaml
new file mode 100644
index 0000000000..5b04c3664a
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_child_count.yaml
@@ -0,0 +1,53 @@
+- name: One child meets EITC identification requirements.
+  period: 2023
+  input:
+    people:
+      person1:
+        is_tax_unit_head_or_spouse: true
+        meets_eitc_identification_requirements: true
+      person2:
+        is_child_dependent: true
+        meets_eitc_identification_requirements: true
+    tax_units:
+      tax_unit:
+        members: [person1, person2]
+  output:
+    eitc_child_count: 1
+
+- name: Both children meets EITC identification requirements.
+  period: 2023
+  input:
+    people:
+      person1:
+        is_tax_unit_head_or_spouse: true
+        meets_eitc_identification_requirements: true
+      person2:
+        is_child_dependent: true
+        meets_eitc_identification_requirements: true
+      person3:
+        is_child_dependent: true
+        meets_eitc_identification_requirements: true
+    tax_units:
+      tax_unit:
+        members: [person1, person2, person3]
+  output:
+    eitc_child_count: 2
+
+- name: Two children, one of them meet EITC identification requirements.
+  period: 2023
+  input:
+    people:
+      person1:
+        is_tax_unit_head_or_spouse: true
+        meets_eitc_identification_requirements: true
+      person2:
+        is_child_dependent: true
+        meets_eitc_identification_requirements: true
+      person3:
+        is_child_dependent: true
+        meets_eitc_identification_requirements: false
+    tax_units:
+      tax_unit:
+        members: [person1, person2, person3]
+  output:
+    eitc_child_count: 1
diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_eligible.yaml
index 2f0c36d4e2..fc13da2b3b 100644
--- a/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_eligible.yaml
+++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/eitc_eligible.yaml
@@ -3,6 +3,17 @@
   input:
     eitc_investment_income_eligible: false
     eitc_demographic_eligible: true
+    filer_meets_eitc_identification_requirements: true
+    filing_status: JOINT
+  output:
+    eitc_eligible: false
+
+- name: Ineligible due to no ITIN nor SSN.
+  period: 2022
+  input:
+    eitc_investment_income_eligible: true
+    eitc_demographic_eligible: true
+    filer_meets_eitc_identification_requirements: false
     filing_status: JOINT
   output:
     eitc_eligible: false
@@ -12,6 +23,7 @@
   input:
     eitc_investment_income_eligible: true
     eitc_demographic_eligible: false
+    filer_meets_eitc_identification_requirements: true
     filing_status: JOINT
   output:
     eitc_eligible: false
@@ -21,6 +33,7 @@
   input:
     eitc_investment_income_eligible: true
     eitc_demographic_eligible: true
+    filer_meets_eitc_identification_requirements: true
     filing_status: JOINT
   output:
     eitc_eligible: true
diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/filer_meets_eitc_identification_requirements.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/filer_meets_eitc_identification_requirements.yaml
new file mode 100644
index 0000000000..c9fd65af00
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/filer_meets_eitc_identification_requirements.yaml
@@ -0,0 +1,52 @@
+- name: Default is citizen, which is an eligible SSN card type for EITC.
+  period: 2023
+  output:
+    filer_meets_eitc_identification_requirements: true
+
+- name: Both are eligible SSN card type.
+  period: 2023
+  input:
+    people:
+      person1:
+        is_tax_unit_head_or_spouse: true
+        ssn_card_type: CITIZEN
+      person2:
+        is_tax_unit_head_or_spouse: true
+        ssn_card_type: NON_CITIZEN_VALID_EAD
+    tax_units:
+      tax_unit:
+        members: [person1, person2]
+  output:
+    filer_meets_eitc_identification_requirements: true
+
+- name: One person with an ineligible SSN card type.
+  period: 2023
+  input:
+    people:
+      person1:
+        is_tax_unit_head_or_spouse: true
+        ssn_card_type: OTHER_NON_CITIZEN
+      person2:
+        is_tax_unit_head_or_spouse: true
+        ssn_card_type: NON_CITIZEN_VALID_EAD
+    tax_units:
+      tax_unit:
+        members: [person1, person2]
+  output:
+    filer_meets_eitc_identification_requirements: false
+
+- name: The head meets EITC identification requirements. 
+  period: 2023
+  input:
+    people:
+      person1:
+        is_tax_unit_head_or_spouse: false
+        ssn_card_type: OTHER_NON_CITIZEN
+      person2:
+        is_tax_unit_head_or_spouse: true
+        ssn_card_type: NON_CITIZEN_VALID_EAD
+    tax_units:
+      tax_unit:
+        members: [person1, person2]
+  output:
+    filer_meets_eitc_identification_requirements: true
diff --git a/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/meets_eitc_identification_requirements.yaml b/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/meets_eitc_identification_requirements.yaml
new file mode 100644
index 0000000000..fbcf111a96
--- /dev/null
+++ b/policyengine_us/tests/policy/baseline/gov/irs/credits/earned_income/meets_eitc_identification_requirements.yaml
@@ -0,0 +1,18 @@
+- name: Default is citizen, which is an eligible SSN card type for EITC.
+  period: 2023
+  output:
+    meets_eitc_identification_requirements: true
+
+- name: Person is not eligible for EITC. 
+  period: 2023
+  input:
+    ssn_card_type: OTHER_NON_CITIZEN
+  output:
+    meets_eitc_identification_requirements: false
+
+- name: Person is eligible for EITC. 
+  period: 2023
+  input:
+    ssn_card_type: NON_CITIZEN_VALID_EAD
+  output:
+    meets_eitc_identification_requirements: true
diff --git a/policyengine_us/tests/policy/contrib/reconciliation/ctc_ssn.yaml b/policyengine_us/tests/policy/contrib/reconciliation/ctc_ssn.yaml
new file mode 100644
index 0000000000..1c029ec715
--- /dev/null
+++ b/policyengine_us/tests/policy/contrib/reconciliation/ctc_ssn.yaml
@@ -0,0 +1,86 @@
+- name: Case 1, CTC higher than 0.
+  period: 2026
+  absolute_error_margin: 0.9
+  reforms: policyengine_us.reforms.reconciliation.ctc_ssn.ctc_ssn
+  input:
+    gov.contrib.reconciliation.ctc.in_effect: true
+    ctc_maximum_with_arpa_addition: 100
+    ctc_phase_out: 80
+    filer_meets_ctc_identification_requirements: true
+  output:
+    ctc: 20
+
+- name: Case 2, CTC capped at 0.
+  period: 2026
+  absolute_error_margin: 0.9
+  reforms: policyengine_us.reforms.reconciliation.ctc_ssn.ctc_ssn
+  input:
+    gov.contrib.reconciliation.ctc.in_effect: true
+    ctc_maximum_with_arpa_addition: 80
+    ctc_phase_out: 100
+    filer_meets_ctc_identification_requirements: true
+  output:
+    ctc: 0
+
+- name: Case 3, don't have valid SSN card type, CTC is 0. 
+  period: 2026
+  absolute_error_margin: 0.9
+  reforms: policyengine_us.reforms.reconciliation.ctc_ssn.ctc_ssn
+  input:
+    gov.contrib.reconciliation.ctc.in_effect: true
+    ctc_maximum_with_arpa_addition: 100
+    ctc_phase_out: 80
+    filer_meets_ctc_identification_requirements: false
+  output:
+    ctc: 0
+
+- name: One person has a valid SSN card type, the other does not
+  period: 2026
+  absolute_error_margin: 0.9
+  reforms: policyengine_us.reforms.reconciliation.ctc_ssn.ctc_ssn
+  input:
+    gov.contrib.reconciliation.ctc.in_effect: true
+    people:
+      person1:
+        ssn_card_type: CITIZEN
+      person2:
+        ssn_card_type: NONE
+  output:
+    meets_ctc_identification_requirements: [true, false]
+    filer_meets_ctc_identification_requirements: false
+
+- name: Both people are eligible
+  period: 2026
+  absolute_error_margin: 0.9
+  reforms: policyengine_us.reforms.reconciliation.ctc_ssn.ctc_ssn
+  input:
+    gov.contrib.reconciliation.ctc.in_effect: true
+    people:
+      person1:
+        ssn_card_type: CITIZEN
+      person2:
+        ssn_card_type: NON_CITIZEN_VALID_EAD
+  output:
+    meets_ctc_identification_requirements: [true, true]
+    filer_meets_ctc_identification_requirements: true
+
+- name: One of three children eligible 
+  period: 2026
+  absolute_error_margin: 0.9
+  reforms: policyengine_us.reforms.reconciliation.ctc_ssn.ctc_ssn
+  input:
+    gov.contrib.reconciliation.ctc.in_effect: true
+    people:
+      person1:
+        ssn_card_type: CITIZEN
+      person2:
+        ctc_qualifying_child: true
+        ssn_card_type: NON_CITIZEN_VALID_EAD
+      person3:
+        ctc_qualifying_child: true
+        ssn_card_type: NONE
+      person4:
+        ctc_qualifying_child: false
+        ssn_card_type: CITIZEN
+  output:
+    ctc_qualifying_children: 1