Repository navigation
Project the Carer's Allowance earnings limit as 16 hours at the national living wage - #2699
Conversation
… wage Reg. 8(1) of the ICA Regulations 1976 states the limit as a fixed sum. From April 2025 the Government sets it at 16 times the hourly national living wage, rounded up to the nearest pound, "from April 2025 and in future years" (Explanatory Memorandum to SI 2025/352, para. 5.6; SI 2026/218 EM para. 5.3). The parameter had no projection, so every year after April 2026 held £204. Keep each legislated amount and derive later years with the repo's extend_after_last_stated projection step, from the national living wage in force on 30 April and a new hours parameter (16). A projected year never lowers the limit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gov.hmrc.minimum_wage.non_apprentice and .apprentice ended at April 2026 with no projection, so every rule that reads them froze: the UC benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and, from #2699, the Carer's Allowance earnings limit. Uprate each bracket amount (not the age thresholds) and the apprentice rate by gov.economic_assumptions.indices.earnings_uprating, the May-July AWE growth of the year before, never negative, rounded to the nearest penny. May-July 2026 growth was 3.9%, so April 2027 is £12.71 x 1.039 = £13.21. Rates set later take precedence and the projection continues from them. The bracket amounts move under `values:` to carry the uprating metadata, so most of the non_apprentice.yaml diff is indentation (git diff -w). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Review: Carer’s Allowance earnings-limit projection
Base repository: PolicyEngine/policyengine-uk
PR number: 2699
Reviewed head SHA: 7217486
Merge base SHA: 8ba8bd6
Scope: seven changed files and affected projection, reform and final-award paths.
Review status: PARTIAL
Review severity: COMMENT
Confirmed critical findings: 0
The independent policy and code reviews found no confirmed defects in this scope. Test completion remains the material evidence gap, so this is a partial review.
Policy and implementation
The 2025 Explanatory Memorandum, physical page 2, paragraphs 5.3 and 5.6 supports setting the limit at 16 times the hourly National Living Wage, rounded upwards to a whole pound, from April 2025 and in future years. The 2026 memorandum, physical page 2, paragraph 5.3 corroborates the increase from £196 to £204.
The existing dates and amounts remain intact. Regulation 8(1) still states a fixed £204 and applies when earnings exceed the limit; the helper projects only years after the last stated amount. The nondecreasing floor and 30 April sample are disclosed modelling conventions, rather than statutory guarantees. The Treasury’s 26 October announcement corroborates the 16-hour threshold; its prospective taper is outside this change.
Code inspection covered the adult-wage bracket, processing order, baseline copy, dated reforms, historical preservation and the path from the earnings test to the final allowance. With the current flat £12.71 wage, the projected limit remains £204. A £13.50 wage gives £216 under the stated rule. These are source and arithmetic checks, not executed benefit results.
Validation and remaining gap
- UK model tests, collection and imports: NOT RUN in this review. The new reform and final-award tests were inspected. Author-reported runs are separate evidence.
- The rounding helper was evaluated in isolation against exact Fraction arithmetic: 400,000 comparisons passed over integer hours 1–40 and penny wages 1–5,000, in both float representations. This does not execute the parameter pipeline or UK tests.
- Six primary originals and their text extracts were checked. The two memoranda’s relevant prose was read with physical page boundaries. No policy/source gap remains within this changed-behaviour scope.
- At 2026-10-27T19:54:58.806551+00:00, the exact reviewed commit has 19 observed raw checks: 10 SUCCESS, 8 IN_PROGRESS and 1 earlier FAILURE. YAML, all six Python shards and Aggregate impact remain pending;
Test / Resultis not yet observed. The earlier failed Fix evidence job122424634262is preserved alongside the separate newer successful Fix evidence job122429405822. No failure cause or official-attempt classification was acquired.
The updated description now names the added reproducer, so the provisional missing-description finding was withdrawn. A completed hosted suite on this commit can resolve the remaining execution gap; this review does not add a local rerun requirement.
The source acquisition window closed after 172.42 seconds of its 300-second budget. The local review, including snapshot cleanup, took 774.71 seconds. No population, private-data, deployment, Axiom-encoding or performance validation is claimed.
Each projected year is now ceil(hours x NLW) alone. The floor had no source, never bound under current law, and under a reform made an hours cut inert and a one-year change permanent. Tests cover reforms that lower the limit, the band the rule reads and the baseline copy. The rounding example is corrected: 1,325 x 0.01 is exactly 13.25; 20 x (1,020 x 0.01) is 204.00000000000003. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in Notes
Moves flagged for reviewNone. Spending by benefit and service
Caseloads
Standard reform costings (change in gov_balance)
Standard reforms: change in each reform's target
Household net income by decileNo household's net income changes in any year. No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles. Checks failing on both base and head (1)
Counted-once checkEach of 91 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.
Provenance
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
gov.hmrc.minimum_wage.non_apprentice and .apprentice ended at April 2026 with no projection, so every rule that reads them froze: the UC benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and, from #2699, the Carer's Allowance earnings limit. Uprate each bracket amount (not the age thresholds) and the apprentice rate by gov.economic_assumptions.indices.earnings_uprating, the May-July AWE growth of the year before, never negative, rounded to the nearest penny. May-July 2026 growth was 3.9%, so April 2027 is £12.71 x 1.039 = £13.21. Rates set later take precedence and the projection continues from them. The bracket amounts move under `values:` to carry the uprating metadata, so most of the non_apprentice.yaml diff is indentation (git diff -w). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Review status: COMPLETE
Review severity: APPROVE
Confirmed critical findings: 0
Incremental follow-up at 6a2f6848a5c70af5cf20075a711fe998c2bc1411, covering the five changed files since my review of 7217486087de8252a63133723f0d00daf57c61a6 and the prior execution gap.
The independent code and policy reviews found no blocking issue. The helper now applies each year’s hours × NLW rule directly, so a lower wage or hours reform can lower that projected year without carrying a previous-year floor forward. The new tests cover bounded reforms, recovery to the baseline, the last adult wage band, statutory-year precedence and baseline isolation. The processed Scenario.apply and day/month override limitations are documented consistently with the existing routing.
The 2025 uprating memorandum, physical page 2, §5.6 supports the future-years 16 × NLW policy, rounded upwards to a whole pound; the 2026 memorandum, physical page 2, §5.3 corroborates £196 → £204. Stated amounts remain distinct from the model’s future projection. Six cached primary originals and their text extracts were revalidated; no new source acquisition was needed.
The earlier execution gap is resolved by this head’s associated PR-source CI: YAML, all six Python shards and Test / Result passed, with the Result coverage audit and the later Fix evidence check also passing. Raw metadata retains 19 successful checks and one earlier cancelled Fix evidence check beside its later success; I am not claiming every historical row succeeded or inferring an attempt/cancellation cause. Local UK tests remain NOT RUN. This evidence is for the head-associated PR source workflow; the generated merge commit was not acquired, and it does not certify standalone-head, wheel, private population or performance results. #2700’s different head and CI are separate.
S1 — optional wording precision: in create_earnings_limit_projection.py, lines 14–15, the sentence saying the projected limit stays at least £204 while NLW remains at least its April 2026 rate also needs “and hours remain at least 16”, or a baseline qualifier. The same paragraph now discusses lower-hours reforms: 12 × £12.71 rounds up to £153. The test module’s invariant 4 already includes both conditions. This is a documentation nit; no wrong modeled output was demonstrated.
Uprating holds £14.45 as 14.450000000000001; exact arithmetic on that float makes 20 hours £290 rather than the model's (correct) £289. Also qualify the £204 floor on the hours, as the test's invariant 4 does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gov.hmrc.minimum_wage.non_apprentice and .apprentice ended at April 2026 with no projection, so every rule that reads them froze: the UC benefit cap earnings exception, the minimum income floor, ESA permitted work, the childcare earnings tests and, from #2699, the Carer's Allowance earnings limit. Uprate each bracket amount (not the age thresholds) and the apprentice rate by gov.economic_assumptions.indices.earnings_uprating, the May-July AWE growth of the year before, never negative, rounded to the nearest penny. May-July 2026 growth was 3.9%, so April 2027 is £12.71 x 1.039 = £13.21. Rates set later take precedence and the projection continues from them. The bracket amounts move under `values:` to carry the uprating metadata, so most of the non_apprentice.yaml diff is indentation (git diff -w). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks. I've taken S1 in 3c19621: the sentence now reads "While the national living wage stays at or above its April 2026 rate and the hours at or above 16, no projected year is below £204." The same commit has one test-only fix that #2700's CI caught. The tests' exact-arithmetic |
Resolves the tax_benefit_system.py conflict with #2699's Carer's Allowance earnings-limit projection. This branch moves the Savings Credit threshold and pension-age Housing Benefit allowance projections into GENERATION_STEPS, so they no longer run after uprating; main's project_carers_allowance_earnings_limit stays after uprating, for the tree and its baseline copy, as on main. The process_parameter_tree docstring now lists only that projection after uprating. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion #2699's Carer's Allowance earnings-limit projection imports extend_after_last_stated from the Savings Credit threshold module. This branch rewrote that module and dropped the helper, so the merged tree failed to import. The helper now lives, unchanged from main, in the Carer's Allowance module, its only remaining user; last_projected_year is still imported from the Savings Credit module, whose definition is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What and why
gov.dwp.carers_allowance.earnings_limitends at £204 from 6 April 2026 (SI 2026/218) and had no projection, so the model held £204 in every later year. The Carer's Allowance rate next to it is uprated by CPI, so the limit fell in real terms and against earnings in every projected year.The limit follows a stated rule. Reg. 8(1) of the Social Security (Invalid Care Allowance) Regulations 1976 holds a fixed sum, which each year's up-rating regulations replace. From April 2025 the Government sets that sum at 16 times the hourly national living wage, rounded up to the nearest pound:
(Autumn Budget 2024 itself says "raising the Carer's Allowance Weekly Earnings Limit to the equivalent of 16 hours at the NLW" without saying it continues; the "future years" commitment is in the 2025 Explanatory Memorandum.)
The change
The repo already projects derived amounts after their last stated value with
extend_after_last_stated(the Savings Credit threshold, the pension-age Housing Benefit allowances). This uses it:create_earnings_limit_projection.py: for each year after the last legislated amount, the limit isceil(hours × NLW). NLW is the national living wage in force on 30 April, the last amount ofgov.hmrc.minimum_wage.non_apprentice, asesa_exempt_work_higher_earnings_limitreads it. It runs after general uprating and before fiscal-year conversion, on the main tree and its baseline copy, so a reform's national living wage or hours are read when it is reprocessed.earnings_limit_national_living_wage_hours.yaml: the 16, from 7 April 2025, citing the 2025 Explanatory Memorandum. It is a stated policy, not law, and the description says so.earnings_limit.yaml: unchanged values; a comment and a reference record how later years are projected.Rounding.
ceil(round(hours × NLW, 6)). Rounding to six places first keeps an exact amount from rounding up when the float product sits just above it: 20 × (1,020 × 0.01) is 204.00000000000003, which must give £204, not £205. (At 16 hours no wage in whole pence needs this, but a reform can change the hours.)Each projected year is the rule alone, with no floor. A reform that lowers the national living wage or the hours lowers the limit, and a change to a single year changes only that year. The model's own national living wage never falls below its April 2026 rate, so in the baseline no projected year is below £204.
Changes made after the build don't move the limit. As with the other derived projections,
Scenario.applyon a built simulation and reform-dict keys naming a single day or month edit the processed parameters, so a change to the hours made that way has no effect. The hours parameter's description says so.Effect today.
gov.hmrc.minimum_wage.non_apprenticeis itself unprojected (#2537): it holds £12.71 after April 2026, so this still gives £204 in every later year, and the baseline doesn't move. #2700, stacked on this PR, projects the national living wage by May to July earnings growth. With it the limit is £212 from April 2027 (16 × £13.21), then £217, £221, £226 and £232 to April 2031.Invariants
Stated in the module docstring of
test_carers_allowance_earnings_limit_projection.pyand executed:earnings_limit.yamlstates for it, whatever the wage.ceil(hours × NLW on 30 April), whatever the years before it were.fractions.Fraction): exhaustively for wages from 1p to £50 and 1 to 40 hours, in both float representations (p / 100and uprating'sp × 0.01).parameters.baseline) keeps current law's limit under a reform. (While the national living wage is flat this can't tell a projected baseline from an unprojected one; it can once Project the minimum wage rates by the OBR's national living wage forecast #2700 lands.)Tests
test_projection_follows_any_national_living_wage_path(Hypothesis, derandomized, with explicit examples): any national living wage in 2025 and 2026, and any at or above £12.71 in 2027 to 2030. It checks that every year to 2040 keeps its legislated amount or equalsceil(16 × NLW), and that no projected year is below £204. The examples are:test_reforms_lower_the_limit_and_change_only_their_own_yearssets 12 hours in 2027-28 and 20 hours in 2028-29 only, a £12.00 national living wage in 2029-30, and £14.50 for the 25-and-over band alone in 2030-31. It checks:parameters.baselinestays at current law.test_baseline_projection_follows_the_model_national_living_wage: invariants 1, 3 and 4 on the model's own path, whatever it is, so the test holds before and after Project the minimum wage rates by the OBR's national living wage forecast #2700.test_hours_change_only_projected_years: 20 hours from 2025 changes 2027 onwards only.test_whole_pounds_are_exact_for_every_wage_in_pence: invariant 5.test_entitlement_reads_the_projected_limit: a £13.50 national living wage from April 2028 gives £216; earnings of £216 a week are within it and £217 over it.carers_allowance_earnings_limit_projection.yaml: 2027-28, 2028-29 and 2030-31, earnings at the limit (within) and £1 a week over it. They pin £204 while the national living wage is flat; the stacked PR moves them.Interaction with #2543
No file overlap. #2543 at 32f1639 merges cleanly onto this PR and onto #2700. Its CA tests pass on both merged trees: 34 Python tests and 31 YAML cases, run locally. Its properties test now takes years after the last legislated amount from the model, so a projected limit doesn't break it.
Aggregate impact
None: the Aggregate impact job on certified data finds no change in any measure, 2025-26 to 2031-32 (run), because the national living wage is flat after April 2026. With #2700 the limit rises from April 2027. Carer's Allowance spending doesn't change until 2030-31, and the change after that rests on very few survey records. #2700's body has its full impact.
Reproducer: policyengine_uk/tests/test_carers_allowance_earnings_limit_projection.py::test_entitlement_reads_the_projected_limit
axiom: n/a: projects years after the last legislated amount; reg. 8(1)'s legislated £204 (SI 2026/218) is unchanged
🤖 Generated with Claude Code