PolicyEngine / PolicyEngine/microcosm
UK spine: SLC plan-2 borrower stocks at a third of SLC's — the FRS flag captures repayers, not the liable stock
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 0
- Forks
- 4
- Avg merge
- 1d 3h
- Merged PRs (30d)
- 94
Description
Found while measuring the first calibrated rowwise UK local candidate (#762, receipts R8–R15 on uk-rowwise-candidate-762-b). Both rows are reviewed measure exclusions under #762 A16, expiring 2026-10-03, tracked on #736.
Measured on spine-m (FRS 2024-25, policyengine-uk 2.92.1, calibration year 2025), single-block engine resolution:
| row | spine | SLC | miss |
|---|---|---|---|
slc.borrowers.plan_2_liable |
3.37M | 9.71M | −65 % |
slc.borrowers.plan_2_above_threshold |
1.37M | 4.46M | −69 % |
Block-insensitive, so the misses are real. Under the ruled doctrine the solver moves them to −52 % / −43 % and no further within the stretch bound; the slc.repayments rows fit (England total within 10 % under grain_equal), which points at the stock being wrong while repayment flows are roughly right.
Likely cause: the FRS student-loan flag captures people currently repaying (or reporting a deduction), not the liable stock of plan-2 borrowers — those below the repayment threshold, abroad, or in deferment carry no FRS signal. The SLC statistics publish the liable stock and the above-threshold count directly.
Ask: impute plan-2 borrower status (liable / above threshold) from the SLC borrower statistics — by age cohort and graduate status — as a spine stage, keeping the FRS repayment amount where reported; and declare the reconciliation between the FRS "repaying" signal and the SLC "liable" concept on the target side if the contract means the latter.
Acceptance: both rows within 25 % at initialization on the next spine and the two A16 exclusions retire.
Refs #762, #736, #665.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the spine-m single-block run and the spine stage that produces slc.borrowers.plan_2_liable and slc.borrowers.plan_2_above_threshold, then compare the FRS repayment signal with the SLC borrower statistics by age cohort and graduate status. Keep reported FRS repayment amounts in scope and verify the next spine initialization against the two named acceptance rows; done means both are within 25% and the two A16 exclusions retire.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- data-engineering
- Issue type
- Feature
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100