Summary
The contributed reforms in #8856 handle delayed activation asymmetrically:
id_ctc_reform.py gates the refundable payment per period (where(p.refundable.in_effect, refundable_credit, 0)), but its modify_parameters revives id_ctc in the nonrefundable list from a hardcoded 2026-01-01 regardless of when in_effect turns on.
ga_ctc_reform.py has no per-period gate at all: ga_refundable_ctc pays whenever the reform class is installed, and the 5-year lookahead in create_ga_ctc_reform installs it for all years of a simulation if in_effect is true in any of the next five.
So a multi-year simulation with in_effect starting mid-window pays the GA refund (and applies the ID revival) in pre-activation years. All single-year and activation-year-aligned uses are unaffected, and the reforms stay inert when in_effect is false everywhere.
Suggested fix
Add where(p.refundable.in_effect, ..., 0) to ga_refundable_ctc, and drive the ID modify_parameters start instant from the first period where the relevant in_effect parameter is true instead of the hardcoded 2026-01-01.
Follow-up to #8856.
Summary
The contributed reforms in #8856 handle delayed activation asymmetrically:
id_ctc_reform.pygates the refundable payment per period (where(p.refundable.in_effect, refundable_credit, 0)), but itsmodify_parametersrevivesid_ctcin the nonrefundable list from a hardcoded2026-01-01regardless of whenin_effectturns on.ga_ctc_reform.pyhas no per-period gate at all:ga_refundable_ctcpays whenever the reform class is installed, and the 5-year lookahead increate_ga_ctc_reforminstalls it for all years of a simulation ifin_effectis true in any of the next five.So a multi-year simulation with
in_effectstarting mid-window pays the GA refund (and applies the ID revival) in pre-activation years. All single-year and activation-year-aligned uses are unaffected, and the reforms stay inert whenin_effectis false everywhere.Suggested fix
Add
where(p.refundable.in_effect, ..., 0)toga_refundable_ctc, and drive the IDmodify_parametersstart instant from the first period where the relevantin_effectparameter is true instead of the hardcoded2026-01-01.Follow-up to #8856.