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

Open
#868 0 comments 0 reactions 0 assignees View on GitHub

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.