-
Notifications
You must be signed in to change notification settings - Fork 31
Add 2026 Plan 2 student loan interest rate thresholds #1420
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add parameters documenting student loan interest rate rules: - Plan 1: Lower of RPI or base rate + 1% - Plan 2: Income-contingent (RPI to RPI+3% based on income thresholds) - Plan 4: Same as Plan 1 - Plan 5: RPI only (no income-based component) - Postgraduate: RPI + 3% Add student_loan_interest_rate variable that calculates the applicable rate based on plan type and income, with Plan 2 tapering between the lower and upper income thresholds. Fixes #1417 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Lower threshold: £29,385 (2026-09-01), frozen at same value through 2029 per Budget 2025 repayment threshold freeze - Upper threshold: £52,885 (2026-09-01) Source: GOV.UK Student Loans Interest and Repayment Threshold Announcement Fixes #1419 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
…holds - Update lower_threshold.yaml and upper_threshold.yaml to use underscore separators (e.g., 29_385) - Replace Python test file with YAML test file (student_loan_interest_rate.yaml) - Tests cover Plan 2 income-contingent rates, threshold freeze 2027-2029, and other plan types 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Use p = parameters(period).gov.hmrc.student_loans.interest_rates then call p.x directly in calculations to make explicit that values come from parameters. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Create dedicated variable for Plan 2 income-contingent interest rate calculation. This makes the tapered rate logic reusable and explicit. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Replace hardcoded Plan 1, 4, 5 interest rate parameters with formula-based variables that calculate rates from underlying inputs: - Plan 1/4: min(RPI, BoE base rate + 1%) - Plan 5: RPI only - Plan 2: RPI to RPI+3% (income-contingent) New parameters: - gov.boe.base_rate: Bank of England base rate - gov.hmrc.student_loans.interest_rates.rpi: Student loan RPI rate Removed parameters: - interest_rates/plan_1.yaml (now calculated) - interest_rates/plan_4.yaml (now calculated) - interest_rates/plan_5.yaml (now calculated) - interest_rates/plan_2/base_rate.yaml (replaced by rpi.yaml) Sources: - Plan 1: SI 2009/470, Regulation 21 - Plan 4: Same formula via amendments to SI 2009/470 - Bank of England rate history 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Remove interest_rates/rpi.yaml (duplicative) - Reference gov.economic_assumptions.yoy_growth.obr.rpi in formulas - Add legislative references to all interest rate variables - Add OBR EFO November 2025 reference to BoE base rate forecasts - Update tests to use OBR RPI values (4.33% for 2025, 3.71% for 2026) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Calendar year 2026 uses 2025-09-01 thresholds (28,470 / 51,245), not the 2026-09-01 values which take effect in September. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Move uprating from dated value entries to top-level metadata - Reference Regulation 21A(12) for lower threshold (L) - Reference Regulation 21A(13) for upper threshold (H) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
- Remove 2020-2024 values that lacked proper references - Keep only 2025+ values with corroborating sources: - 2025-09-01: From Student loans guide 2025-26 - 2026-09-01: From government announcement - 2027-2029: Freeze per Budget 2025 - Update references to cite correct regulations (21AA/21AB) Every value now has a corroborating reference. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Lower threshold (2020-2024): - 2020-09-01: £26,575 (GOV.UK previous thresholds) - 2021-09-01: £27,295 (GOV.UK previous thresholds) - 2024-09-01: £27,295 (2024-25 Terms Guide) Upper threshold (2024): - 2024-09-01: £49,130 (SI 2022/1335 + 2024-25 Terms Guide) Every value now has a corroborating reference. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Uprating is set at the parameter level in top-level metadata. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Per Regulation 21AB, the lower interest threshold equals the Plan 2 repayment threshold. Instead of duplicating values in a separate parameter, reference the repayment threshold directly in the formula. This removes the lower_threshold.yaml file and updates plan_2_interest_rate to use gov.hmrc.student_loans.thresholds.plan_2. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
…ttern - Create plan_1/boe_margin.yaml parameter for the 1% margin - Update plan_1_interest_rate to use parameter instead of hardcoded 0.01 - Apply p = parameters(period).gov pattern to plan_5_interest_rate 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
p = parameters(period).gov.hmrc.student_loans for cleaner code. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
Changes
Lower threshold (
lower_threshold.yaml):Upper threshold (
upper_threshold.yaml):Rationale
The lower interest threshold equals the repayment threshold (as noted in the existing documentation). Budget 2025 froze the Plan 2 repayment threshold from 2027-28 until 2029-30, so the lower interest threshold should also be frozen.
The upper threshold has no announced freeze, so only the 2026 value is added.
Sources
Fixes #1419
🤖 Generated with Claude Code