From the 2026-08-12 repo-wide review (Codex), finding 1 ("Critical — mid-tax-year runs ignore year-to-date income and allowance usage"), verified against fe0f95b.
Verified behaviour. A run starting mid-tax-year prorates first-period flows (engine.py:874, engine.py:2155) but assesses only the remaining-window income against the full personal allowance and full bands (engine.py:3093-3122; TaxInput has no year-to-date fields). ISA/LISA cap usage restarts at zero each run (engine.py:2534) and the AA carry-forward pool starts empty (engine.py:1563). There is no domain-model input anywhere for year-to-date income, tax paid, ISA subscriptions made, or Annual Allowance used.
Not a bug. This is the documented §4.6 partial-first-period decision — planning.md "Accepted costs" states verbatim that "annual caps, allowances, and tax bands apply whole to the partial year — the pro-rated income of the first modelled year meets full-year bands, understating its tax slightly" — and the empty AA carry-forward pool is recorded as deliberately conservative (§4.1). The review's Critical severity is not supportable.
The trackable gap. A user who has already received a large bonus, made ISA/LISA subscriptions, or used Annual Allowance earlier in the current tax year cannot represent that. Optional year-to-date inputs (income, tax paid, ISA subscriptions, AA used) seeded into the first period would remove the first-year distortion. Impact is bounded to a fraction of one year's allowances/bands, first modelled year only.
From the 2026-08-12 repo-wide review (Codex), finding 1 ("Critical — mid-tax-year runs ignore year-to-date income and allowance usage"), verified against
fe0f95b.Verified behaviour. A run starting mid-tax-year prorates first-period flows (
engine.py:874,engine.py:2155) but assesses only the remaining-window income against the full personal allowance and full bands (engine.py:3093-3122;TaxInputhas no year-to-date fields). ISA/LISA cap usage restarts at zero each run (engine.py:2534) and the AA carry-forward pool starts empty (engine.py:1563). There is no domain-model input anywhere for year-to-date income, tax paid, ISA subscriptions made, or Annual Allowance used.Not a bug. This is the documented §4.6 partial-first-period decision — planning.md "Accepted costs" states verbatim that "annual caps, allowances, and tax bands apply whole to the partial year — the pro-rated income of the first modelled year meets full-year bands, understating its tax slightly" — and the empty AA carry-forward pool is recorded as deliberately conservative (§4.1). The review's Critical severity is not supportable.
The trackable gap. A user who has already received a large bonus, made ISA/LISA subscriptions, or used Annual Allowance earlier in the current tax year cannot represent that. Optional year-to-date inputs (income, tax paid, ISA subscriptions, AA used) seeded into the first period would remove the first-year distortion. Impact is bounded to a fraction of one year's allowances/bands, first modelled year only.