Skip to content

Fix benefit-cap statutory-pay earnings exemption - #2399

Merged
MaxGhenis merged 5 commits into
mainfrom
fix/release-statutory-pay-cap-exemption
Oct 14, 2026
Merged

MaxGhenis merged 5 commits into
mainfrom
fix/release-statutory-pay-cap-exemption

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #2397

Raising statutory sick pay could end the benefit-cap earnings exemption because it used a separate calculation that omitted statutory pay while deducting its tax and NI. The exemption now sums the assessed claimants' existing actual UC net earnings before the minimum income floor. This addresses the benefit-cap portion of #2370 and fixes item 1 of #1986 apart from its earnings threshold.

The release family is pinned in a plain regression and an explicit Hypothesis example. The monotonic property is retained, and statutory pay is compared with equivalent wages after the cap as well as before it. Policy cases cover all three modelled statutory payments, pension tax, relievable contributions, the MIF exclusion, and basic income with and without its means-test toggle (the award is set above the couple cap, so both cases bite). The dividend-tax earnings-exception regression now runs as a normal test, with its obsolete strict xfail and outcome-allowlist entry removed. The private-pension case identifies the lowest-slice tax allocation as the model's convention, as documented in uc_income_tax_on_earnings, rather than wording prescribed by reg. 55(5)(b).

Law: UC Regulations 2013 reg. 82(1)(a) and (4) test actual claimant/couple earned income and exclude earnings imputed by the minimum income floor. Reg. 55(4)–(5) includes statutory pay and permits employment-specific deductions. The existing £10,152 annual threshold is retained in this release fix. #1820 uses the same expression, benunit.sum(uc_individual_earned_income_before_mif * is_uc_assessed_claimant), plus a dated National Living Wage threshold parameter; its version of is_benefit_cap_exempt_earnings.py supersedes this file when it merges.

Scope: reusing UC's earned-income variable changes the old measure in each of these ways, including current main's #1965:

  • Statutory sick, maternity and paternity pay count as earnings.
  • Only income tax and NI on earnings are deducted; tax on unearned income is excluded.
  • The person's own relievable pension contributions are deducted.
  • taxable_miscellaneous_income counts as earnings; its classification is the open question in UC counts royalties, trust income and overseas pensions in miscellaneous_income as earned income #1961.
  • A trading loss is floored at nil instead of reducing employed earnings.
  • Each person's net earned income is floored at nil before summing, so one partner's excess deductions cannot reduce the other's earnings.
  • Voluntary Class 3 NI is not deducted.
  • Reg. 77 company income counts through the UC earned-income variable since Model Universal Credit reg 77 for owner-managers of a company #1965.
  • Basic income counts through the UC earned-income variable when gov.contrib.ubi_center.basic_income.interactions.include_in_means_tests is enabled. Main's formula never counted it, so this is new behaviour under that reform toggle (default off); see Open questions below.

History: the pinned family already loses its earnings exemption at the 2.127.0 version commit e01f2f5. #2119 did not change the cap earnings formula. Commit 70851ab fixed the UC earnings variable through #2380 but left the cap's duplicated calculation behind.

CI gap: both source and installed-wheel modes collect the property with locked Hypothesis 6.169.0. Hypothesis's function_digest hashes cleaned function source and signature, not the module name or file path. However, internal/conjecture/providers.py::_get_local_constants mines literals from imported local modules, and internal/constants_ast.py::is_local_module_file explicitly excludes /site-packages/. Source model modules therefore supply a different constant pool from installed-wheel modules, changing integer draws despite the same derandomized seed. Source #2394 collects and passes the property; release 38366204407 fails it. Separately, #2119's original green PR run tested a synthetic merge based on e01f2f5, which lacked the property. The explicit example covers the release family in both modes regardless of generated inputs.

Validation:

  • Source, in the locked environment (Python 3.13.9, core 3.33.2, Hypothesis 6.169.0, Ruff 0.17.0):
    • both full property files passed, 14 tests; the dividend earnings-exception regression now passes as a normal test;
    • the benefit-cap and UC policy folders and their sibling YAML files passed, 589 policy tests;
    • at the final head c0f501b5e, the earnings-exception YAML file passed 8 cases, including the basic-income case and its toggle-off control (run by the hub; log kept with the hub's review files).
  • From the installed wheel, the release's mode (uv build with .github/build-constraints.txt; installed with --no-deps into a scratch venv synced with --frozen --extra dev; run from an empty directory with the CI Hypothesis profile and strict xfail handling; installed files checked byte-identical to 05610e4d7; the later commits change only the earnings-exception YAML file, one comment in a test and the CI allowlist, so these results carry over):
    • test_uc_statutory_pay_properties.py and test_uc_income_from_capital_properties.py: 14 passed;
    • test_uc_company_owner_properties.py, test_uc_claimant_income_properties.py, test_benefit_cap_and_ctr_pension_age_properties.py and test_benefit_cap_specified_benefits_properties.py: 42 passed.
  • A wider source run of eight other search-matched Python files was interrupted by a host freeze at 36 of 122. CI runs the full suite.
  • ruff format --check and ruff check pass.
  • CI's release jobs at c0f501b5e (run 38479445636) ran the whole suite from the wheel: 5,537 passed, 69 skipped, 1 xfailed. Release test / Result still failed on one more release blocker, which main has had since 10/12. test_variable_code_sharing.py::test_a_simulation_leaves_coverage_no_new_code_objects skips in wheel mode ("coverage is not measuring with sys.monitoring") and had no allowlist entry. The statutory-pay failure hid it on main's release runs 38306431347 and 38366204407. The final commit, 8b997692f, adds a wheel-only allowlist entry limited to that skip reason; the test still runs and passes in source mode. Replaying run 38479445636's outcomes through check_test_shards.py with the entry gives: every collected test ran in exactly one shard and passed, apart from allowlisted outcomes.

Impact (measured by the UK hub, 2026-10-13): a real Microsimulation pair for 2026 on enhanced_frs_2024_25.h5 from uk-data 1.58.0 (sha256 5ba399ea5ab9…), with stored weights. The branch is 05610e4d7, which includes main a98f8f0 and so #1965. The later commits c0f501b5e and 8b997692f change only tests and the CI allowlist. The baseline is the same code with main's version of is_benefit_cap_exempt_earnings swapped in, which is this PR's only model change. A first run at e6564306b, before the main merge, gave the same figures to the pound.

2026 Baseline This PR Change
Universal Credit £83,569.0m £83,577.9m +£8.9m
Benefit cap reductions £1,156.0m £1,147.1m −£8.9m
Housing Benefit £8,456.2m £8,456.2m £0
  • About 1.7k households gain (2 survey records). No household's Universal Credit or Housing Benefit falls.
  • The exemption flag moves for many more households than the cash does, because most of them are not capped. About 400k households gain an earnings-exempt benefit unit and about 9k lose their only one, with no change in their awards. The run does not break these down by cause.

Open questions:

Reproducer: policyengine_uk/tests/test_uc_statutory_pay_properties.py::test_statutory_sick_pay_preserves_benefit_cap_earnings_exemption

axiom: TheAxiomFoundation/rulespec-uk#387 queued

That existing pe-parity issue queues reg. 55 statutory pay and earnings deductions; the pinned corpus lacks reg. 55, so the signed encoder is blocked. The existing reg. 82 module reads actual earnings excluding the MIF; cap-composition companion cases are added to the same queue. No billed encoder run or in-job review was started.

🤖 Generated with Claude Code

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Handoff at e656430 on fix/release-statutory-pay-cap-exemption; pushed once.

The cap now uses actual UC net earnings before the MIF. The release family is pinned in a plain regression and @example; six YAML cases cover the permitted earnings/deductions. make format, locked Ruff format check and lint pass.

Local model validation is incomplete. The sandbox rejected nice's setpriority; the source probe was interrupted (130). Disk subsequently fell to 44.847 GB, below the job's 45 GB stop floor. No further tests ran. The wheel check is left to release CI below the 60 GB guard, and national 2026 impact is left to the hub below the 50 GB microsimulation guard (compressor 11.839 GB). A real enhanced-FRS file and sequential comparison helper are ready in .job/.

Outstanding: pinned regression, full property file, remaining targeted UC/cap Python and YAML tests, controlled constant-pool comparison, microsim impact and the hub's independent review. No in-job review or merge was performed. The PR body includes cause, law, source/wheel local-constant mining and the additional stale-base gap in #2119's original check. Axiom composition cases are queued in rulespec-uk#387.

.job/HANDOFF.md and .job/handoffs.jsonl are written. Git metadata had to stay workspace-local because the sandbox protects the shared .git; .job/result.bundle and the pushed PR head preserve the commit. The handoff documents the required GIT_DIR/GIT_WORK_TREE exports.

@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

UK hub independent review (in-session Opus 5.5; the Codex and Claude lanes were closed), head e6564306b. A round-2 fix job is running for these findings.

VERDICT: REQUEST_CHANGES
Head reviewed: e656430

(UK hub in-session independent review, Opus 5.5, 2026-10-13 ~18:00Z. Used because every Codex lane was held and the Claude lane was closed.)

I ran no tests, simulations or builds. Everything below comes from reading code, hand arithmetic, legislation.gov.uk, and the logs of the PR's own CI run 38437021879, which finished during this review.

Findings

  1. [blocker] A strict xfail pinned to the bug this PR fixes now passes, so CI is red and the release would stay red.

    • Where: policyengine_uk/tests/test_uc_income_from_capital_properties.py:326-332, test_tax_on_dividends_does_not_remove_the_benefit_cap_earnings_exception, marked xfail(strict=True) for Benefit cap, targeted childcare and local CTR use the wrong UC earned income figure #1986.
    • CI at this head: Test / Python 2/4 failed with [XPASS(strict)] PolicyEngine/policyengine-uk#1986 (1 failed, 1475 passed, 16 skipped). Test / Result failed. Shards 1, 3, 4 and YAML passed.
    • Why it flips: the case is earnings £11,000 plus dividends £10,000. The old measure was 11,000 − 7,930 × 10.75% = 10,147.52, under 10,152. The new measure is 11,000, so the exemption holds with and without dividends.
    • The release job runs the same test from the wheel, so merging as is swaps one release failure for another.
    • Fix needed:
      • remove the marker;
      • remove the allowlist entry at .github/test_outcome_allowlist.toml:28-32;
      • update the stale docstring (lines 35-39) and comment (line 256) in that test file.
    • Pin benefit cap exemption rules with regression tests and legal references (#1818) #1820 already makes the marker and docstring edit, but not the allowlist one.
  2. [should-fix] The PR description misstates scope in three places.

  3. [should-fix] Basic income now counts toward the cap's earnings exception under a reform toggle.

    • Where: uc_individual_earned_income_before_mif.py:61-63, when gov.contrib.ubi_center.basic_income.interactions.include_in_means_tests is true (default false).
    • Example by reading, not run: a couple with no earnings and £5,200 of basic income each totals 10,400, at least 10,152, so the cap lifts.
    • The old formula never counted it. This is neither tested nor mentioned. Exclude it here or record it for Pin benefit cap exemption rules with regression tests and legal references (#1818) #1820, which has the same expression.
  4. [should-fix] Nothing has run from a wheel since the fix.

    • The release will be the first wheel-mode run of the two edited property tests.
    • test_award_never_rises… keeps its seed, because Hypothesis strips decorators from the digest. The release therefore replays the same sequence, including examples after the one that failed, which have never been evaluated.
    • test_statutory_pay_counts_as_wages… has a changed body, so it has a new seed in both modes; only source mode has run.
    • By reading I found no in-strategy counterexample (check 4), but that is not execution.
  5. [should-fix] The branch is 19 commits behind main.

  6. [nit] The hard-coded threshold is last year's. is_benefit_cap_exempt_earnings.py:24,36 keeps 10,152. For 2026, reg 82(1)(a) gives 16 × £12.71 × 52/12 = £881.23 a month (10,574.72 a year). This is pre-existing and left to Pin benefit cap exemption rules with regression tests and legal references (#1818) #1820, but the impact numbers inherit it.

  7. [nit] One YAML comment overstates the law. benefit_cap_earnings_exception_earned_income.yaml:86-88 attributes "none is in respect of the employment" to reg 55(5)(b). The lowest-slice allocation is a model convention, as uc_income_tax_on_earnings.py itself says.

  8. [nit] The retained "more pay never ends an exemption" assertion has a hole that predates this PR. By reading only, not executed:

    • Family: a mixed-age couple, 62 (recipient, no wages, pension £6,000) and 68 (wages £6,000, pension £6,000), one child aged 1, childcare £6,000, rent 0, pay £0 → £300.
    • At low pay: maximum 8,003.64 + 3,647.28 is under 12,000 of unearned income, so UC is nil and housing_benefit_pension_age_regulations_apply exempts.
    • At high pay: the childcare element (5,100) opens, UC is positive and the exemption ends.
    • The draw probability is negligible. It is not a reason to block.

Check 1: the law

  • Wording read on legislation.gov.uk (through a summarising fetch):
    • Reg 82(1)(a) and 82(4) came back in near-verbatim fragments and match the PR's quotes.
    • Reg 55(4)'s list and 55(5)(a)-(c), and reg 57(2)'s steps (a loss gives nil; no set-off against employed earnings), came back as summaries.
    • Reg 52 was only partly quoted. Reg 78(2) was not fetched; I relied on the repo's citation.
  • The quantity is right. "Earned income" is the Part 6 figure after the reg 55(5) and 57(2) deductions. Reg 82(4) removes only reg 62 income, so before the MIF is correct. The work allowance belongs to reg 22, not to earned income, so before the work allowance is correct.
  • Summing over is_uc_assessed_claimant is right. It gives the claimant or the couple, includes the partner of a reg 3(3) single claim, and excludes dependants.
  • Included but arguable: miscellaneous income, basic income under the toggle, and reg 77 company income on main.
  • Omitted, all pre-existing in the UC variable: the other reg 55(4) payments, HMRC refunds, surplus earnings, reg 60 notional earnings, payroll giving, and the reg 82(1)(b) grace period.

Check 2: the falsifying family

Hand arithmetic with the repo's parameters: personal allowance 12,570, basic rate 20%, primary threshold 241.73 × 52 = 12,569.96, Class 1 rate 8%, WEEKS_IN_YEAR = 52.

Statutory sick pay Old measure Old exempt New measure New exempt
£0 12,570 − 1,200 = 11,370 yes 12,570 (NI 0.003) yes
£6,000 12,570 − 2,400 − 480 = 9,690 no 18,570 − 1,200 − 480 = 16,890 yes
  • The old formula flips and the new one does not.
  • The prior attempt's executed output at e01f2f5 shows the same tax (1,200 / 2,400) and NI (0 / 480).
  • The regression test asserts 12,570 and 16,890 (tolerance 0.05), both exemption flags true, a nil cap reduction, and UC not rising. These are the right things, and it would fail on main at the high version.
  • The @example is well formed; explicit examples are not checked against min_size=4.
  • Both passed in CI, in shards 2 and 3.

Check 3: the six YAML cases

All six are right by hand, and CI's YAML job passed at this head. The single-claimant cap outside London is 14,753.

  1. Sick pay. 3,000 + 8,000 = 11,000, under the allowance and the threshold, so no tax or NI. 11,000 ≥ 10,152: exempt, reduction 0. Right. (Old: 3,000.)
  2. Paternity pay. Gross 11,000. The model does not tax it; the NI base of 11,000 gives nil. 11,000: exempt. Right.
  3. Maternity pay. As case 1. Right.
  4. Private pension. Income tax (21,000 − 12,570) × 20% = 1,686. Taxable earnings are max(0, 8,430 − 10,000) = 0, and NI is nil. 11,000: exempt. Right. (Old: 9,314.)
  5. Pension contributions. 11,000 − 1,000 = 10,000. Tax is nil after relief; NI on 11,000 is nil. 10,000 < 10,152: not exempt; 18,000 − 14,753 = 3,247. Right.
  6. Minimum income floor. Profit 5,000; tax nil; Class 2 rate 0; Class 4 limit 12,570. Before the floor 5,000, after it 20,000. Not exempt; 3,247. Right.

Check 4: the property file

  • The diff against main removes or weakens no assertion. There is no new skip, xfail, assume, health-check suppression or narrowed strategy.
  • Additions: one plain test, one @example, and two more variables in the wages-equivalence loop.
  • The extended equivalence holds inside the strategy, by reading:
    • Sick and maternity pay enter taxable_employment_income and ni_class_1_income exactly as wages do, in exact float32 integer sums, so earned income is identical.
    • No reported legacy awards exist, so WTC, CTC and working-age HB are nil.
    • The LCWRA element and the pension-age flag do not read pay beyond the pre-cap award, which was already asserted equal.
  • Paternity pay and under-covered pension contributions are excluded by counts_as_wages. That filter also excludes the one childcare mismatch I found (wages 0, profit −4,000, pay ≤ 4,000).
  • It is not a general invariant outside the strategy (reported HB, carers).

Check 5: who moves

  • Only relievable pension contributions can remove an exemption, and reg 55(5)(a) requires that. Every other difference adds to the measure.
  • impact-comparison.json matches the description:
    • UC +8,924,132; cap reductions −8,924,132; HB 0.
    • 2 records, 1,693 weighted households gaining, none losing.
    • 400,060 households gain an earnings-exempt unit; 8,818 lose their only one.
  • The file also shows 7,288 households losing every exempt unit overall, with no cash change.
  • Plausible, but two records is a thin base.
  • Unsupported claims are listed in finding 2.

Check 6: overlap with #1820

Check 7: the CI-gap claim

  • Verified by reading the saved Hypothesis source:
    • is_local_module_file rejects any path containing /site-packages/ (constants_ast.py:260-284).
    • _get_local_constants mines only local modules (providers.py:325-380).
    • _maybe_draw_constant spends PRNG draws that depend on that pool.
    • function_digest hashes cleaned source and signature only.
  • Verified in the repo: wheel mode installs under $RUNNER_TEMP/venv/…/site-packages, and core 3.33.2 registers variable files in sys.modules.
  • Could not verify:
  • Issue Release test fails: test_award_never_rises_with_a_claimants_statutory_pay passes from source, fails from the installed wheel #2397's comment reports the divergence empirically (constants mined from source, none from the wheel, examples differ from the third).

Check 8: anything else

  • Readers. Only is_benefit_cap_exempt reads the variable. No test embeds the old formula.
  • Cycles. None new. A cycle would need benefit_cap_reduction among the dependencies of the earned-income variable, and that would already be a cycle on main, because the pre-cap award reads it. Main's added dependencies from Model Universal Credit reg 77 for owner-managers of a company #1965 read inputs only.
  • Performance. No extra cost; UC already computes the variable.
  • Changelog. changelog.d/2397.fixed.md has the right name and type. The Fix evidence check passes.
  • PR state. It is still a draft.

MaxGhenis and others added 4 commits October 13, 2026 14:40
- The basic-income case now enters an award of 25,000, above the couple
  cap outside London (22,020), so its zero cap reduction shows the
  exemption working. A control case without the reform toggle shows
  basic income not counting: no exemption, reduction 2,980.
- Say that counting basic income in the earnings exception is new in this
  PR (main never counted it), not existing behaviour.
- The capital-income property compares the capped award only where the
  exemption is unchanged because capital income can change another
  exemption route, not because of the allowance taper.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The release workflow tests the installed wheel without coverage, so
test_a_simulation_leaves_coverage_no_new_code_objects skips there
("coverage is not measuring with sys.monitoring"). It had no allowlist
entry, so every wheel-mode Release test / Result failed on it, behind the
statutory-pay failure this PR fixes. The entry is limited to wheel mode
and to that skip reason. The test still runs and passes in source mode on
every PR.

Replaying this PR's own release run (38479445636) through
check_test_shards.py with the entry: every collected test ran in exactly
one shard and passed, apart from allowlisted outcomes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis
MaxGhenis marked this pull request as ready for review October 14, 2026 01:04
@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 14, 2026
Merged via the queue into main with commit 8565474 Oct 14, 2026
31 of 32 checks passed
@MaxGhenis
MaxGhenis deleted the fix/release-statutory-pay-cap-exemption branch October 14, 2026 01:32
@MaxGhenis

Copy link
Copy Markdown
Collaborator Author

Merged by the UK hub (audit). Merged with a merge commit at the tested head 8b997692f (expectedHeadOid, through the main merge queue). This unblocks PE-UK releases, which had two blockers since 2026-10-12 (PyPI was stuck at 2.127.0):

  • every main release run failed test_award_never_rises_with_a_claimants_statutory_pay;
  • behind that, wheel mode skipped test_a_simulation_leaves_coverage_no_new_code_objects with no allowlist entry.

This PR fixes the first in the model and allowlists the second for wheel mode only.

Gates:

  • CI: gh pr checks exits 0 at the head, with 29 checks passing. That includes Release test / Result, which ran 5,607 tests from the built wheel: every one ran and passed apart from allowlisted outcomes.
  • MERGEABLE, not a draft.
  • Independent review: three in-session Opus 5.5 reviews, run that way because the GPT-6.1 Sol and Claude lanes were all held (disk and ramp holds; Fleet ops approved the fallback).
    • e6564306b: REQUEST_CHANGES. Its blocker was a strict xfail for Benefit cap, targeted childcare and local CTR use the wrong UC earned income figure #1986 that the fix turned into an XPASS.
    • The round-2 delta: REQUEST_CHANGES, for the PR body and wheel coverage.
    • c0f501b5e: APPROVE (~/reviews/uk-hub/reviews/uk2399/review-final.md).
    • The final head, 8b997692f (the allowlist entry): APPROVE (review-final-8b997692f.md). One nit, about a test comment, is deferred.
    • Every round-1 and round-2 finding is fixed or recorded in the description.
  • Wheel-mode check (the release's failure mode), from the installed wheel, byte-identical to 05610e4d7:
    • the two edited property files: 14 passed;
    • the four other property files that read the cap: 42 passed.
  • Real-run impact: 2026, enhanced FRS from uk-data 1.58.0 (sha256 5ba399ea…), head against main's cap formula.
  • Law: UC Regs 2013 regs 82(1)(a) and 82(4), 55(4)–(5) and 57.
  • Follow-ups:

MaxGhenis added a commit that referenced this pull request Oct 14, 2026
#2399 landed the same benefit-cap earnings exception change this branch made
(is_benefit_cap_exempt_earnings reads uc_individual_earned_income_before_mif).
The only conflict was in that file's comments; take main's version, so this
PR no longer touches it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi added a commit that referenced this pull request Oct 14, 2026
Resolve conflicts with #2399, #2076 and #1965:

- is_benefit_cap_exempt_earnings: keep main's per-claimant
  uc_individual_earned_income_before_mif test and documentation; keep this
  PR's dated threshold parameter in place of 10_152 and its reg 57 and
  FA 2004 s.188 references.
- is_benefit_cap_exempt_health_disability: take main's version (#2076) and
  add the UC route for AFIP: on a Universal Credit award only a claimant's
  counts; otherwise Housing Benefit's young person counts too.
- is_benefit_cap_exempt: take main's label.
- test_uc_single_claim_properties: keep main's AFCS assertions and this
  PR's partner-only AFIP example.

Pin main's young-person AFIP YAML case to the Housing Benefit route, and
give the specified-benefits property oracle the family's scheme. Rewrite
the changelog fragment to what the PR still changes relative to main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 14, 2026
MaxGhenis added a commit that referenced this pull request Oct 15, 2026
…shared-cap-lha-rules

#2399 changed the shared earnings exception this PR deletes. Its
measure, uc_individual_earned_income_before_mif summed over the
assessed claimants (reg. 82(1)(a), excluding MIF income under reg.
82(4)), is carried over unchanged into the UC-only
is_uc_benefit_cap_exempt_earnings; the shared file stays deleted.

Main's new tests that read the deleted shared names now read the UC
ones, with their expected values unchanged:
- test_uc_statutory_pay_properties.py (#2399; conflict): main's text
  and regression case, reading is_uc_benefit_cap_exempt(_earnings).
- benefit_cap_earnings_exception_earned_income.yaml (#2399) and
  uc_trading_loss.yaml (#2085).
- test_trading_loss_properties.py (#2085).

Targeted YAML (benefit_cap folder, benefit_cap_by_scheme,
uc_trading_loss): 121 passed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
anth-volk added a commit that referenced this pull request Oct 15, 2026
Rebased onto main after #2399, which made the benefit cap earnings fix.
Only the test-environment change remains: conftest stops Hypothesis
drawing literal constants from policyengine_uk's own modules, and a
guard test fails if a Hypothesis upgrade bypasses that.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Oct 22, 2026
Picks up #2399 (8565474), which fixed test_award_never_rises_with_a_claimants_statutory_pay, the Release test failure on this branch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@MaxGhenis

This comment has been minimized.

@MaxGhenis

This comment has been minimized.

3 similar comments
@MaxGhenis

This comment has been minimized.

@MaxGhenis

This comment has been minimized.

@MaxGhenis

This comment has been minimized.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Release test fails: test_award_never_rises_with_a_claimants_statutory_pay passes from source, fails from the installed wheel

1 participant