diff --git a/changelog.d/1074-fsa-student-loan-targets.added.md b/changelog.d/1074-fsa-student-loan-targets.added.md new file mode 100644 index 000000000..8633359b9 --- /dev/null +++ b/changelog.d/1074-fsa-student-loan-targets.added.md @@ -0,0 +1,7 @@ +The US build can calibrate the SCF-imputed federal student loan balances to Federal Student Aid's portfolio tables (microcosm#1074, the student debt pilot). A new runtime module, `fsa_student_loan_targets`, binds the FSA facts Chronicle stores (PolicyEngine/chronicle#310) to the person columns `federal_student_loan_balance` and `federal_parent_plus_loan_balance`: the balance and borrower count of each state and DC, of five borrower age bands and of nine debt-size bands, and the Parent PLUS balance beside the balance of every other loan type. A borrower is a person whose own plus Parent PLUS balance is positive. Repayment plans, the portfolio summary and the loan-type recipient counts stay diagnostic only, each with its reason in the receipt. + +Every family binds at one reference date, the latest quarter every bound table publishes (FY2026 Q2, 31 March 2026), as a stock unaged at the 2024 build period: target aging gains a declared `stock_at_source_reference_date` alignment, which only these targets carry. FSA's "Not Reported" row is allocated to every reported location in proportion to its reported value; Puerto Rico and "Other" are outside the host universe and leave with their share. The 51 allocated state levels make one in-scope control, and the age, debt-size and loan-type rows bind as their table's shares of it, so every family sums to the same total. + +`compile_us_fiscal_target_registry` binds the facts only with `student_loan_targets`, which the fiscal-refresh release tool sets with `--scf-education-debt`; the release materializes the rows from the stage's stored person columns, accepts their age and balance bands in its restated-filter guard only on that materializer, records every FSA fact's disposition in `us_source_coverage.json`, and keeps the opt-in family off the target-parity contract. Default compiles and releases are unchanged, and the pinned US feed carries no FSA facts until it moves to a Chronicle commit with the packages. The `ED · Federal Student Aid` provider and its four categories join the calibration label registries, so the family shows on the calibration dashboard once a release carries it. + +Fit receipts are in `experiments/1074-fsa-calibration-receipts.md`, generated by `experiments/fit_1074_fsa_calibration.py` on Modal through `experiments/modal_1074.py` against a candidate feed (the pinned feed plus chronicle#347's FSA rows, built at its merge commit on Chronicle main). diff --git a/docs/us-fact-to-target.md b/docs/us-fact-to-target.md index e4ae417a8..1d153af29 100644 --- a/docs/us-fact-to-target.md +++ b/docs/us-fact-to-target.md @@ -186,6 +186,89 @@ binds them: band. `experiments/940-state-agi-bands/` measures pre-calibration support per state and band on the #982 fix's offline outputs. +### Federal Student Aid's portfolio binds the student loan balances (microcosm#1074) + +Federal Student Aid publishes its federal student loan portfolio quarterly. +Chronicle stores each table as published (PolicyEngine/chronicle#310); the +alignment across tables is Microcosm's, in +`us_runtime/fsa_student_loan_targets.py`. The targets bind the person columns +the SCF education-debt stage writes (microcosm#1073): +`federal_student_loan_balance` (own loans) and +`federal_parent_plus_loan_balance`. A person's federal balance is the sum, and a +borrower is a person whose federal balance is positive. + +- **Which rows.** The borrower-based tables: by location (the 50 states and DC, + balance and borrowers), by age (five bands on the person's age) and by debt + size (nine bands on the person's federal balance, lower edge inclusive). From + the loan-type table, the Parent PLUS balance and the balance of every other + loan type. Each fact's disposition, bound or not, is in + `fsa_student_loan_target_receipt` and in a release's + `us_source_coverage.json` (`fsa_student_loan_target_receipt`). +- **Diagnostic only.** Repayment plans: the SCF records only an income-driven + yes/no, the build has no plan column, and FSA counts plan recipients loan by + loan. The portfolio summary: recipient totals by loan program, which the + balances do not record. Loan-type recipient counts: loan-level, so a person + with two loan types counts twice. Stafford (Combined): a subtotal. +- **The reference date.** The latest quarter every bound table publishes, FY2026 + Q2 (31 March 2026) in the chronicle#347 packages: the location workbook + publishes only that date, so the age, debt-size and loan-type tables bind at + it too, and every family describes one portfolio on one day. The facts are stocks the + build carries as they stand at that date, unaged at the 2024 build period + (`period_alignment = stock_at_source_reference_date`, factor policy 5 in + `target_aging`): no income-growth series describes a loan stock, and the + analysis reads the columns in 2026. +- **Not Reported, Puerto Rico and Other.** The location table has no total row. + Its "Not Reported" row ($52.2B, 1.95M borrowers) holds FFEL and Perkins loans + whose commercial lenders need not report an address. It is allocated to every + reported location in proportion to that location's reported balance (or + borrowers, for the count). Puerto Rico and "Other" (an address outside the + listed states and territories) are outside the host universe, the 50 states + and DC the CPS samples, and leave with their share. The 51 allocated state + levels sum to the **in-scope control**: $1,679.1B and 44.31M borrowers at the + chronicle#347 packages, against $1,696.3B and 44.76M in the table. +- **One control.** FSA's tables disagree slightly (the borrower tables total + $1,696.3B, the recipient-based loan-type table $1,723.8B). The age and + debt-size bands and the two loan-type rows bind as their table's share of the + in-scope control, `control x row / partition`, the state AGI band pattern. A + table's own "not reported" age row is in no partition, which allocates it + across the reported bands. So the state, age, debt-size and loan-type families + each sum to the same total. +- **Opt-in.** `compile_us_fiscal_target_registry(student_loan_targets=True)` + binds the facts; the release tool sets it with `--scf-education-debt`, the + only builds that carry the columns. The release materializes the rows from + the stored person columns (`fsa_student_loan_household_values`), because the + pinned policyengine-us does not define them yet. The release's + restated-filter guard accepts the age and balance bands only on that + materializer. While the stage is opt-in the family stays off the one-surface + target-parity contract (`_without_opt_in_student_loan_targets`). +- **Known limits, measured.** The receipt + (`experiments/1074-fsa-calibration-receipts.md`) refits the published + default with and without the family. The stage gives balances to reference + persons, spouses and co-resident adult children (a loan for a child's + education is the adult child's own unless only a parent could have borrowed + it), and Parent PLUS to the reference person. The SCF misses independent + adults who live on their own or in someone else's household, so the host + holds about half of FSA's borrowers ($0.86T and 21.2M at the published + weights). Calibration closes that by reweighting: borrower households' + weight doubles and their share of household weight goes from 16.4% to + 33.7%, against 18.2% of SCF families. Routing child loans to adult children + moved balances between people in the same households, not into new ones, so + it did not shrink that doubling; it did give the host young borrowers (1,246 + borrower records under 25, from 561), and the under-25 borrower band now + fits. FSA's Parent PLUS row counts only unconsolidated Parent PLUS loans (a + consolidated one sits in "Consolidation"), while the SCF's loans for a + child's education include consolidated ones, so that target is a lower bound + on the concept it binds; it pulls the Parent PLUS share from 10.7% to 6.8%. +- **When the facts reach the pin.** The US pin moves to a Chronicle commit that + carries the six `packages/ed_fsa` packages: add their (record set, period) + pairs to `us/chronicle_feed_scope.json` (build year 2026), rebuild the feed, + re-pin `us/chronicle_feed.json`, and regenerate the two parity resources with + the FSA families declared as reviewed exclusions that bind only with + `--scf-education-debt`. The fixture + `tests/fixtures/us_fsa_portfolio_chronicle_347_facts.jsonl.gz` holds rows of + the chronicle#347 export the tests pin, byte-identical at its merge commit + (`acbedb5`); refresh it if a later Chronicle commit restates the facts. + ## 4. Keep the exclusion register honest `US_FISCAL_TARGET_SUPPORT_EXCLUSIONS` is keyed by `source_record_id` and its diff --git a/experiments/1074-fsa-calibration-receipts.md b/experiments/1074-fsa-calibration-receipts.md new file mode 100644 index 000000000..e98cfe2cb --- /dev/null +++ b/experiments/1074-fsa-calibration-receipts.md @@ -0,0 +1,291 @@ +# microcosm#1074 receipts: Federal Student Aid portfolio targets + +Generated 2026-10-23 by `experiments/fit_1074_fsa_calibration.py`, commit `4b6bfce9a240cd44c45210fbf508640d8402343d`, Modal run `20261023T191527Z-4b6bfce9a` (`experiments/modal_1074.py`). Machine-readable copy: `experiments/receipts/1074-fsa-calibration-fit.json`. + +Host: the published default `populace-us-2024-spm-20260915` (sha256 `6496cc4393d4…`, 57,240 households), with the SCF 2025 education-debt stage run at seed 0. Feed: the pinned `51aa40f` US feed plus the merged chronicle#347 FSA rows (`d8e3d0fd9e21…`, 40,639 rows). Arms: **release** = the published weights; **A** = a dense refit to the `national_state` surface without the FSA family; **B** = the same refit with it. Same epochs (1500), learning rate, 5x weight cap and conserved mass as a release. Not a release: no gate ran and nothing was published. + +## FSA targets: the reconciled levels + +| | Balance | Borrowers | +|---|---:|---:| +| 50 states and DC, as published | $1,627.4B | 42.38M | +| Puerto Rico and Other (leave) | $16.7B | 433,400 | +| Not Reported (allocated) | $52.2B | 1.95M | +| Location table total | $1,696.3B | 44.76M | +| Allocation factor | 1.0317 | 1.0456 | +| In-scope control (every family sums to it) | $1,679.1B | 44.31M | + +Reference date: Data as of Mar. 31, 2026 (`2026-03`), the latest quarter all four bound tables publish; unaged at the 2024 build period (`period_alignment = stock_at_source_reference_date`). + +## Fit by FSA family + +Mean absolute relative error (share of targets within 5%). + +| FSA family | Targets | Release | A, no FSA | B, with FSA | A + L2 | B + L2 | +|---|---:|---:|---:|---:|---:|---:| +| fsa_age_band_balance | 5 | 47.5% (0%) | 45.0% (0%) | 0.1% (100%) | 47.1% (0%) | 0.3% (100%) | +| fsa_age_band_borrowers | 5 | 54.5% (0%) | 53.7% (0%) | 0.2% (100%) | 54.1% (0%) | 6.5% (40%) | +| fsa_balance_excluding_parent_plus | 1 | 51.0% (0%) | 49.9% (0%) | 0.1% (100%) | 51.2% (0%) | 0.5% (100%) | +| fsa_debt_size_band_balance | 9 | 50.6% (0%) | 49.8% (0%) | 0.4% (100%) | 50.5% (0%) | 3.6% (78%) | +| fsa_debt_size_band_borrowers | 9 | 49.0% (0%) | 49.0% (0%) | 2.7% (89%) | 49.3% (0%) | 5.3% (67%) | +| fsa_parent_plus_balance | 1 | 20.1% (0%) | 10.8% (0%) | 0.0% (100%) | 18.9% (0%) | 0.0% (100%) | +| fsa_state_balance | 51 | 47.0% (0%) | 46.7% (2%) | 0.2% (98%) | 47.0% (0%) | 1.0% (96%) | +| fsa_state_borrowers | 51 | 49.1% (0%) | 49.4% (0%) | 1.1% (92%) | 48.9% (0%) | 6.2% (63%) | + +## Headline levels + +| | FSA target | Release | A, no FSA | B, with FSA | A + L2 | B + L2 | +|---|---:|---:|---:|---:|---:|---:| +| Federal balance, own plus Parent PLUS | $1,679.1B | $858.4B | $886.0B | $1,677.3B | $855.8B | $1,671.2B | +| Borrowers (people with a balance) | 44.31M | 21.18M | 21.59M | 44.26M | 21.42M | 42.67M | +| Parent PLUS balance | $114.8B | $91.8B | $102.5B | $114.8B | $93.2B | $114.8B | +| Parent PLUS share of the balance | 6.8% | 10.7% | 11.6% | 6.8% | 10.9% | 6.9% | +| Mean balance per borrower | $37,894 | $40,535 | $41,040 | $37,897 | $39,951 | $39,162 | +| Households with federal education debt | | 16.4% | 16.6% | 33.7% | 16.6% | 32.3% | + +## Every other family: does adding FSA cost the rest of the surface? + +Mean absolute relative error over the `national_state` surface's non-FSA targets, by provider/category (the dashboard's family), each miss capped at 100% of its target as the loss caps it, sorted by how much adding the FSA family moves it: + +| Family | Targets | Release | A, no FSA | B, with FSA | A + L2 | B + L2 | B - A (pp) | B+L2 - A+L2 (pp) | +|---|---:|---:|---:|---:|---:|---:|---:|---:| +| hhs_acf_tanf/hhs_acf_tanf.hhs_acf_tanf | 30 | 29.8% | 18.3% | 20.9% | 22.5% | 22.4% | +2.56 | -0.09 | +| ssa/ssa.ssi_federal_payment_recipients | 3 | 28.5% | 15.6% | 17.5% | 24.3% | 23.1% | +1.83 | -1.25 | +| jct/jct.individual_tax_expenditure_revenue_loss | 11 | 42.3% | 35.3% | 37.1% | 39.9% | 39.5% | +1.72 | -0.39 | +| bea/bea.nipa_proprietors_income | 1 | 11.6% | 5.9% | 7.3% | 11.2% | 9.6% | +1.40 | -1.64 | +| irs_soi/irs_soi.capital_gains_gross | 104 | 30.1% | 17.0% | 18.1% | 26.0% | 24.8% | +1.12 | -1.18 | +| irs_soi/irs_soi.real_estate_taxes | 106 | 6.5% | 5.3% | 6.3% | 6.3% | 6.6% | +1.00 | +0.29 | +| irs_soi/irs_soi.assigned_aca_ptc | 104 | 0.9% | 0.6% | 1.5% | 0.7% | 1.1% | +0.91 | +0.37 | +| irs_soi/irs_soi.refundable_ctc | 104 | 0.8% | 0.3% | 1.0% | 0.7% | 1.1% | +0.70 | +0.41 | +| irs_soi/irs_soi.eitc | 781 | 3.1% | 2.5% | 3.1% | 2.7% | 3.1% | +0.67 | +0.39 | +| irs_soi/irs_soi.ctc | 104 | 1.5% | 0.6% | 1.2% | 1.2% | 1.4% | +0.59 | +0.22 | +| irs_soi/irs_soi.salt_deduction | 106 | 1.9% | 1.8% | 2.4% | 2.1% | 2.1% | +0.58 | +0.05 | +| irs_soi/irs_soi.charitable_deduction | 2 | 7.5% | 6.8% | 7.3% | 6.2% | 6.6% | +0.49 | +0.45 | +| irs_soi/irs_soi.interest_deduction | 2 | 2.0% | 1.7% | 1.3% | 2.4% | 2.0% | -0.46 | -0.39 | +| irs_soi/irs_soi.taxable_interest_income | 1038 | 6.0% | 5.7% | 6.2% | 6.0% | 5.9% | +0.45 | -0.05 | +| irs_soi/irs_soi.count | 260 | 31.7% | 20.5% | 21.0% | 22.9% | 22.3% | +0.45 | -0.58 | +| irs_soi/irs_soi.unemployment_compensation | 106 | 0.1% | 0.3% | 0.5% | 0.2% | 0.6% | +0.27 | +0.41 | +| census_stc/census_stc.individual_income_tax_collections | 44 | 13.9% | 13.7% | 14.0% | 13.9% | 14.0% | +0.26 | +0.06 | +| irs_soi/irs_soi.qualified_dividends | 104 | 0.3% | 0.5% | 0.7% | 0.5% | 0.5% | +0.19 | +0.02 | +| irs_soi/irs_soi.income_tax | 104 | 0.6% | 0.7% | 0.8% | 0.8% | 0.9% | +0.14 | +0.09 | +| irs_soi/irs_soi.ordinary_dividend_income | 108 | 0.8% | 0.8% | 0.9% | 0.8% | 0.8% | +0.14 | -0.08 | +| irs_soi/irs_soi.tax_exempt_interest_income | 104 | 0.1% | 0.7% | 0.8% | 1.0% | 1.0% | +0.13 | -0.02 | +| irs_soi/irs_soi.partnership_and_s_corp_income | 104 | 0.6% | 0.4% | 0.5% | 0.6% | 0.6% | +0.11 | -0.05 | +| irs_soi/irs_soi.taxable_income | 107 | 0.3% | 0.4% | 0.5% | 0.6% | 0.6% | +0.10 | +0.02 | +| irs_soi/irs_soi.tip_income | 1 | 21.3% | 0.1% | 0.0% | 0.1% | 0.0% | -0.09 | -0.03 | +| cms_medicare/cms_medicare.cms_medicare | 1 | 13.8% | 13.5% | 13.6% | 13.5% | 13.4% | +0.09 | -0.05 | +| irs_soi/irs_soi.income_tax_before_credits | 104 | 1.6% | 1.6% | 1.7% | 1.9% | 2.0% | +0.09 | +0.07 | +| irs_soi/irs_soi.estate_losses | 2 | 50.0% | 50.2% | 50.1% | 50.2% | 50.0% | -0.08 | -0.18 | +| irs_soi/irs_soi.medical_expense_deduction | 104 | 6.0% | 6.3% | 6.3% | 6.2% | 6.5% | +0.08 | +0.26 | +| ssa/ssa.ssi_recipients | 51 | 4.8% | 0.7% | 0.8% | 2.0% | 1.5% | +0.08 | -0.47 | +| ssa/ssa.ssi_payments | 51 | 3.7% | 0.4% | 0.5% | 0.5% | 1.0% | +0.07 | +0.45 | +| bea/bea.nipa_wages_and_salaries | 1 | 13.3% | 13.6% | 13.6% | 13.5% | 13.5% | -0.07 | +0.06 | +| irs_soi/irs_soi.adjusted_gross_income | 261 | 19.7% | 0.6% | 0.6% | 2.8% | 2.2% | +0.07 | -0.59 | +| usda_snap/usda_snap.usda_snap | 104 | 7.9% | 0.1% | 0.2% | 0.6% | 0.7% | +0.05 | +0.07 | +| irs_soi/irs_soi.employment_income | 106 | 0.1% | 0.1% | 0.2% | 0.2% | 0.2% | +0.05 | +0.02 | +| irs_soi/irs_soi.rent_and_royalty_net_income | 104 | 4.0% | 3.1% | 3.1% | 3.1% | 3.1% | +0.04 | -0.03 | +| irs_soi/irs_soi.estate_income | 2 | 0.0% | 0.1% | 0.1% | 0.1% | 0.1% | -0.03 | +0.01 | +| ssa/ssa.ssa | 6 | 3.7% | 0.1% | 0.1% | 1.4% | 1.3% | -0.02 | -0.10 | +| cms_medicaid/cms_medicaid.cms_medicaid | 135 | 3.1% | 2.3% | 2.3% | 2.3% | 2.3% | +0.02 | -0.00 | +| irs_soi/irs_soi.ira_distributions | 108 | 0.1% | 0.1% | 0.2% | 0.1% | 0.1% | +0.02 | +0.00 | +| irs_soi/irs_soi.non_sch_d_capital_gains | 2 | 0.0% | 0.0% | 0.1% | 0.1% | 0.0% | +0.02 | -0.06 | +| irs_soi/irs_soi.deductible_mortgage_interest | 2 | 0.4% | 0.0% | 0.0% | 0.1% | 0.0% | -0.01 | -0.07 | +| federal_reserve/federal_reserve.federal_reserve | 1 | 0.0% | 0.0% | 0.0% | 0.1% | 0.0% | -0.01 | -0.04 | +| irs_soi/irs_soi.business_net_profits | 104 | 1.3% | 1.1% | 1.1% | 1.1% | 1.1% | -0.01 | +0.02 | +| irs_soi/irs_soi.taxable_social_security | 108 | 0.3% | 0.2% | 0.3% | 0.3% | 0.3% | +0.01 | +0.01 | +| cbo/cbo.cbo | 5 | 4.5% | 4.6% | 4.6% | 4.6% | 4.6% | +0.01 | +0.07 | +| cms_aca/cms_aca.cms_aca | 102 | 1.6% | 0.2% | 0.2% | 0.7% | 0.6% | +0.01 | -0.12 | +| census_pep/census_pep.resident_population | 936 | 0.1% | 0.1% | 0.1% | 0.1% | 0.1% | +0.00 | +0.01 | +| hhs_acf_liheap/hhs_acf_liheap.hhs_acf_liheap | 1 | 0.0% | 0.0% | 0.0% | 0.0% | 0.0% | -0.00 | +0.01 | +| irs_soi/irs_soi.taxable_pension_income | 108 | 0.1% | 0.1% | 0.1% | 0.1% | 0.1% | -0.00 | +0.00 | +| irs_soi/irs_soi.itemized_taxable_income_deductions | 55 | 2.0% | 2.3% | 2.3% | 2.5% | 2.4% | -0.00 | -0.16 | +| **all non-FSA targets** | 6102 | 5.3% | 3.3% | 3.6% | 3.8% | 3.9% | +0.31 | +0.00 | + +## Racial composition of borrowers, before and after calibration + +Borrower households by the reference person's race (the SCF's `racecl4`; the SCF column pools the five implicates): + +| | SCF 2025 | Release | A, no FSA | B, with FSA | A + L2 | B + L2 | B - release (pp) | +|---|---:|---:|---:|---:|---:|---:|---:| +| white_non_hispanic | 57.6% | 60.8% | 60.0% | 57.6% | 62.1% | 59.9% | -3.2 | +| black_non_hispanic | 18.6% | 17.4% | 16.4% | 18.8% | 16.8% | 19.2% | +1.5 | +| hispanic | 9.2% | 12.9% | 13.8% | 14.4% | 12.4% | 12.4% | +1.5 | +| other_or_multiple | 14.7% | 9.0% | 9.8% | 9.2% | 8.7% | 8.5% | +0.2 | + +Borrowers (people) by their own race, and the share of adults who borrow: + +| | Release | A, no FSA | B, with FSA | A + L2 | B + L2 | Adults with a balance: release | B | B + L2 | +|---|---:|---:|---:|---:|---:|---:|---:|---:| +| white_non_hispanic | 60.2% | 59.3% | 57.2% | 61.4% | 59.4% | 7.7% | 15.7% | 14.9% | +| black_non_hispanic | 16.6% | 16.2% | 18.4% | 16.4% | 18.4% | 12.9% | 26.8% | 26.5% | +| hispanic | 13.5% | 13.9% | 14.7% | 12.6% | 12.7% | 6.4% | 14.8% | 14.6% | +| other_or_multiple | 9.6% | 10.6% | 9.7% | 9.6% | 9.4% | 8.1% | 15.4% | 15.5% | + +## Weight movement against the published weights + +| | A, no FSA | B, with FSA | A + L2 | B + L2 | +|---|---:|---:|---:|---:| +| Borrower households' weight ratio | 1.01 | 2.05 | 1.01 | 1.97 | +| Other households' weight ratio | 0.998 | 0.793 | 0.998 | 0.810 | +| Borrower households' share of weight | 16.6% | 33.7% | 16.6% | 32.3% | +| Median household weight ratio | 0.02 | 7.0e-04 | 0.13 | 0.01 | +| 99th percentile weight ratio | 4.76 | 4.98 | 1.97 | 2.77 | +| Effective sample size (release 9,174) | 4,149 | 3,045 | 6,435 | 4,424 | + +## FSA facts that do not bind + +| Disposition | Facts | Reason | +|---|---:|---| +| allocated | 2 | 'Not Reported' (FFEL and Perkins loans whose commercial lenders need not report an address) has no state; it is allocated to every reported location in proportion to that location's reported value. | +| allocated | 2 | Age not reported: in no partition, so the reported bands, which bind as shares of the in-scope control, absorb it pro rata. | +| diagnostic | 12 | ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only. | +| diagnostic | 45 | ED-held FFEL by repayment plan: no plan column in the build; diagnostic only. | +| diagnostic | 24 | Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only. | +| diagnostic | 65 | Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only. | +| diagnostic | 24 | Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only. | +| diagnostic | 24 | Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead. | +| diagnostic | 57 | Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074). | +| excluded | 6 | Loan-type recipient counts are loan-level (a borrower with two loan types counts twice), so they are not counts of people. | +| excluded | 2 | Stafford (Combined) is a subtotal of rows the loan-type targets already count. | +| other_quarter | 58 | Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03). | +| out_of_scope | 2 | 'Other' is a borrower address outside the states and territories the table lists, outside the host universe; it leaves the in-scope control with its pro-rata share of Not Reported. | +| out_of_scope | 2 | Puerto Rico is outside the host universe (the CPS samples the 50 states and DC). Its rows, with their pro-rata share of Not Reported, leave the in-scope control. | + +Materialization dropped 0 FSA targets. + +## Every FSA target + +| Target | FSA (reconciled) | Release | A, no FSA | B, with FSA | A + L2 | B + L2 | +|---|---:|---:|---:|---:|---:|---:| +| Federal student loan balance, Alabama | $26.8B | $8.3B (-69.0%) | $7.3B (-72.7%) | $26.8B (-0.1%) | $7.9B (-70.7%) | $26.4B (-1.8%) | +| Federal student loan balance, Alaska | $2.5B | $1.1B (-53.6%) | $1.4B (-42.4%) | $2.5B (-0.2%) | $1.2B (-52.7%) | $2.2B (-11.4%) | +| Federal student loan balance, Arizona | $35.1B | $24.3B (-30.7%) | $14.4B (-59.0%) | $35.1B (-0.0%) | $18.5B (-47.1%) | $35.0B (-0.2%) | +| Federal student loan balance, Arkansas | $15.0B | $6.0B (-59.9%) | $6.1B (-59.3%) | $15.0B (-0.0%) | $6.3B (-57.6%) | $15.0B (+0.0%) | +| Federal student loan balance, California | $161.7B | $91.3B (-43.5%) | $99.2B (-38.6%) | $161.8B (+0.1%) | $96.8B (-40.1%) | $161.4B (-0.2%) | +| Federal student loan balance, Colorado | $30.6B | $12.2B (-60.0%) | $6.4B (-79.1%) | $30.6B (-0.2%) | $9.0B (-70.5%) | $30.6B (-0.2%) | +| Federal student loan balance, Connecticut | $20.4B | $8.2B (-59.8%) | $8.1B (-60.2%) | $20.5B (+0.1%) | $7.9B (-61.1%) | $20.3B (-0.5%) | +| Federal student loan balance, Delaware | $5.8B | $2.6B (-54.7%) | $3.3B (-42.6%) | $5.8B (+0.1%) | $2.9B (-49.4%) | $5.5B (-3.9%) | +| Federal student loan balance, District of Columbia | $6.6B | $2.6B (-60.6%) | $1.5B (-77.5%) | $6.6B (+0.1%) | $2.5B (-62.1%) | $6.6B (-0.2%) | +| Federal student loan balance, Florida | $116.7B | $42.9B (-63.2%) | $43.9B (-62.4%) | $116.7B (+0.0%) | $42.8B (-63.4%) | $116.7B (+0.0%) | +| Federal student loan balance, Georgia | $77.0B | $38.4B (-50.1%) | $51.9B (-32.5%) | $77.0B (+0.0%) | $33.3B (-56.8%) | $76.9B (-0.1%) | +| Federal student loan balance, Hawaii | $5.1B | $3.3B (-35.6%) | $3.2B (-36.0%) | $5.0B (-0.2%) | $3.2B (-36.7%) | $5.1B (+0.1%) | +| Federal student loan balance, Idaho | $7.7B | $6.2B (-20.5%) | $6.4B (-17.2%) | $7.7B (-0.1%) | $6.5B (-16.0%) | $7.7B (-0.2%) | +| Federal student loan balance, Illinois | $67.4B | $34.1B (-49.3%) | $50.4B (-25.2%) | $67.2B (-0.3%) | $47.7B (-29.2%) | $67.5B (+0.2%) | +| Federal student loan balance, Indiana | $32.0B | $25.3B (-20.8%) | $26.4B (-17.3%) | $32.0B (+0.1%) | $28.2B (-11.8%) | $32.0B (+0.1%) | +| Federal student loan balance, Iowa | $13.9B | $5.5B (-60.6%) | $6.5B (-53.1%) | $13.9B (+0.0%) | $6.1B (-56.5%) | $13.9B (-0.1%) | +| Federal student loan balance, Kansas | $13.5B | $6.5B (-52.1%) | $6.5B (-52.1%) | $13.5B (+0.2%) | $6.9B (-49.2%) | $13.5B (-0.2%) | +| Federal student loan balance, Kentucky | $22.3B | $12.8B (-42.6%) | $20.2B (-9.5%) | $22.3B (+0.1%) | $13.2B (-40.6%) | $22.3B (+0.1%) | +| Federal student loan balance, Louisiana | $25.9B | $6.1B (-76.6%) | $9.0B (-65.4%) | $24.0B (-7.3%) | $6.6B (-74.4%) | $20.4B (-21.4%) | +| Federal student loan balance, Maine | $6.9B | $4.0B (-42.0%) | $2.7B (-60.9%) | $6.9B (-0.1%) | $3.6B (-48.5%) | $6.9B (-0.2%) | +| Federal student loan balance, Maryland | $39.6B | $14.4B (-63.8%) | $15.2B (-61.5%) | $39.6B (+0.0%) | $14.4B (-63.6%) | $39.6B (+0.0%) | +| Federal student loan balance, Massachusetts | $34.5B | $19.3B (-44.0%) | $16.5B (-52.3%) | $34.4B (-0.0%) | $18.7B (-45.8%) | $34.4B (-0.0%) | +| Federal student loan balance, Michigan | $54.9B | $34.0B (-38.1%) | $39.5B (-28.0%) | $54.9B (+0.0%) | $34.5B (-37.1%) | $54.9B (+0.0%) | +| Federal student loan balance, Minnesota | $28.4B | $20.9B (-26.4%) | $21.5B (-24.1%) | $28.4B (+0.1%) | $22.3B (-21.3%) | $28.4B (+0.0%) | +| Federal student loan balance, Mississippi | $18.4B | $7.9B (-57.1%) | $6.3B (-65.8%) | $18.4B (+0.0%) | $7.9B (-56.9%) | $18.4B (+0.0%) | +| Federal student loan balance, Missouri | $31.6B | $15.7B (-50.2%) | $24.7B (-21.7%) | $31.6B (+0.1%) | $18.4B (-41.7%) | $31.6B (+0.2%) | +| Federal student loan balance, Montana | $4.6B | $3.6B (-23.5%) | $3.5B (-25.1%) | $4.7B (+0.2%) | $3.6B (-22.8%) | $4.6B (-0.1%) | +| Federal student loan balance, Nebraska | $8.5B | $3.9B (-54.3%) | $4.3B (-49.1%) | $8.5B (-0.1%) | $3.7B (-56.7%) | $8.5B (-0.0%) | +| Federal student loan balance, Nevada | $13.6B | $5.4B (-60.4%) | $6.8B (-50.2%) | $13.6B (-0.1%) | $6.0B (-55.9%) | $13.4B (-1.5%) | +| Federal student loan balance, New Hampshire | $7.0B | $3.6B (-48.4%) | $2.9B (-58.9%) | $7.0B (-0.0%) | $3.1B (-55.9%) | $7.0B (-0.1%) | +| Federal student loan balance, New Jersey | $49.9B | $22.9B (-54.1%) | $27.5B (-44.9%) | $49.9B (+0.0%) | $24.2B (-51.5%) | $50.0B (+0.2%) | +| Federal student loan balance, New Mexico | $8.3B | $9.6B (+15.8%) | $4.6B (-44.1%) | $8.3B (+0.1%) | $7.4B (-10.5%) | $8.3B (+0.1%) | +| Federal student loan balance, New York | $103.1B | $59.0B (-42.7%) | $52.1B (-49.4%) | $103.0B (-0.1%) | $54.5B (-47.1%) | $103.3B (+0.2%) | +| Federal student loan balance, North Carolina | $57.6B | $30.7B (-46.7%) | $48.5B (-15.8%) | $57.7B (+0.2%) | $34.4B (-40.2%) | $57.6B (+0.1%) | +| Federal student loan balance, North Dakota | $2.8B | $1.5B (-47.1%) | $1.6B (-42.6%) | $2.8B (+0.1%) | $1.6B (-44.3%) | $2.8B (-0.4%) | +| Federal student loan balance, Ohio | $66.3B | $24.9B (-62.4%) | $17.5B (-73.7%) | $66.3B (-0.0%) | $22.7B (-65.7%) | $66.2B (-0.2%) | +| Federal student loan balance, Oklahoma | $17.6B | $12.7B (-28.1%) | $10.4B (-41.1%) | $17.7B (+0.2%) | $11.9B (-32.6%) | $17.7B (+0.2%) | +| Federal student loan balance, Oregon | $21.5B | $9.8B (-54.5%) | $10.2B (-52.6%) | $21.4B (-0.1%) | $9.8B (-54.5%) | $20.9B (-2.7%) | +| Federal student loan balance, Pennsylvania | $71.8B | $27.9B (-61.1%) | $19.5B (-72.9%) | $71.9B (+0.1%) | $24.6B (-65.7%) | $71.9B (+0.2%) | +| Federal student loan balance, Rhode Island | $5.3B | $2.8B (-46.9%) | $2.2B (-58.6%) | $5.3B (-0.1%) | $2.7B (-48.8%) | $5.3B (-0.2%) | +| Federal student loan balance, South Carolina | $32.4B | $17.5B (-46.1%) | $14.4B (-55.5%) | $32.4B (+0.1%) | $13.3B (-58.9%) | $32.4B (-0.1%) | +| Federal student loan balance, South Dakota | $3.8B | $2.5B (-33.3%) | $1.2B (-67.7%) | $3.8B (-0.2%) | $1.8B (-52.5%) | $3.8B (+0.0%) | +| Federal student loan balance, Tennessee | $35.7B | $30.7B (-14.0%) | $34.8B (-2.6%) | $35.7B (-0.0%) | $30.9B (-13.5%) | $35.7B (-0.1%) | +| Federal student loan balance, Texas | $142.7B | $69.0B (-51.6%) | $44.8B (-68.6%) | $142.6B (-0.0%) | $58.3B (-59.2%) | $142.3B (-0.2%) | +| Federal student loan balance, Utah | $11.5B | $7.1B (-38.2%) | $9.2B (-19.8%) | $11.4B (-0.0%) | $8.6B (-24.6%) | $11.5B (+0.0%) | +| Federal student loan balance, Vermont | $3.0B | $1.5B (-49.1%) | $1.4B (-51.9%) | $3.0B (-0.2%) | $1.6B (-48.0%) | $3.0B (-0.2%) | +| Federal student loan balance, Virginia | $46.9B | $23.9B (-49.1%) | $37.9B (-19.2%) | $46.9B (-0.2%) | $31.0B (-34.0%) | $47.0B (+0.0%) | +| Federal student loan balance, Washington | $30.5B | $16.0B (-47.4%) | $13.4B (-56.1%) | $30.6B (+0.1%) | $15.4B (-49.5%) | $30.4B (-0.4%) | +| Federal student loan balance, West Virginia | $7.9B | $5.6B (-29.1%) | $6.4B (-19.2%) | $7.9B (-0.1%) | $5.6B (-29.9%) | $7.9B (-0.1%) | +| Federal student loan balance, Wisconsin | $24.8B | $11.6B (-53.1%) | $11.8B (-52.5%) | $24.8B (+0.0%) | $11.0B (-55.5%) | $24.7B (-0.1%) | +| Federal student loan balance, Wyoming | $1.9B | $799,653,011 (-56.9%) | $494,870,182 (-73.4%) | $1.9B (+0.2%) | $732,630,963 (-60.6%) | $1.9B (+0.2%) | +| Federal student loan borrowers, Alabama | 694,297 | 299,661 (-56.8%) | 250,982 (-63.9%) | 693,709 (-0.1%) | 306,411 (-55.9%) | 693,173 (-0.2%) | +| Federal student loan borrowers, Alaska | 67,443 | 42,678 (-36.7%) | 43,211 (-35.9%) | 67,354 (-0.1%) | 41,674 (-38.2%) | 67,485 (+0.1%) | +| Federal student loan borrowers, Arizona | 957,900 | 581,654 (-39.3%) | 478,956 (-50.0%) | 956,836 (-0.1%) | 553,297 (-42.2%) | 957,195 (-0.1%) | +| Federal student loan borrowers, Arkansas | 427,034 | 178,289 (-58.2%) | 163,756 (-61.7%) | 426,375 (-0.2%) | 178,797 (-58.1%) | 380,809 (-10.8%) | +| Federal student loan borrowers, California | 4.10M | 2.28M (-44.4%) | 2.44M (-40.5%) | 4.23M (+3.3%) | 2.28M (-44.4%) | 4.10M (+0.1%) | +| Federal student loan borrowers, Colorado | 799,487 | 334,926 (-58.1%) | 239,763 (-70.0%) | 798,939 (-0.1%) | 263,859 (-67.0%) | 750,791 (-6.1%) | +| Federal student loan borrowers, Connecticut | 538,917 | 209,988 (-61.0%) | 227,777 (-57.7%) | 483,745 (-10.2%) | 221,602 (-58.9%) | 389,148 (-27.8%) | +| Federal student loan borrowers, Delaware | 144,088 | 59,672 (-58.6%) | 65,530 (-54.5%) | 125,864 (-12.6%) | 61,575 (-57.3%) | 113,234 (-21.4%) | +| Federal student loan borrowers, District of Columbia | 119,829 | 54,421 (-54.6%) | 42,781 (-64.3%) | 119,567 (-0.2%) | 52,682 (-56.0%) | 98,909 (-17.5%) | +| Federal student loan borrowers, Florida | 2.87M | 987,744 (-65.6%) | 1.16M (-59.5%) | 2.87M (-0.0%) | 1.05M (-63.6%) | 2.87M (-0.2%) | +| Federal student loan borrowers, Georgia | 1.78M | 917,964 (-48.4%) | 963,914 (-45.9%) | 1.78M (+0.0%) | 823,647 (-53.7%) | 1.78M (-0.0%) | +| Federal student loan borrowers, Hawaii | 126,521 | 67,915 (-46.3%) | 69,764 (-44.9%) | 126,286 (-0.2%) | 64,639 (-48.9%) | 108,157 (-14.5%) | +| Federal student loan borrowers, Idaho | 226,378 | 167,325 (-26.1%) | 169,172 (-25.3%) | 226,231 (-0.1%) | 181,780 (-19.7%) | 226,158 (-0.1%) | +| Federal student loan borrowers, Illinois | 1.67M | 832,380 (-50.3%) | 1.02M (-39.0%) | 1.67M (-0.1%) | 966,614 (-42.3%) | 1.68M (+0.1%) | +| Federal student loan borrowers, Indiana | 939,497 | 516,324 (-45.0%) | 518,545 (-44.8%) | 939,741 (+0.0%) | 554,968 (-40.9%) | 921,590 (-1.9%) | +| Federal student loan borrowers, Iowa | 442,719 | 212,727 (-51.9%) | 250,949 (-43.3%) | 442,914 (+0.0%) | 250,321 (-43.5%) | 443,024 (+0.1%) | +| Federal student loan borrowers, Kansas | 396,607 | 215,828 (-45.6%) | 218,049 (-45.0%) | 397,536 (+0.2%) | 208,432 (-47.4%) | 396,131 (-0.1%) | +| Federal student loan borrowers, Kentucky | 643,689 | 292,355 (-54.6%) | 324,504 (-49.6%) | 612,160 (-4.9%) | 301,880 (-53.1%) | 497,613 (-22.7%) | +| Federal student loan borrowers, Louisiana | 725,666 | 235,996 (-67.5%) | 283,225 (-61.0%) | 726,299 (+0.1%) | 256,063 (-64.7%) | 713,961 (-1.6%) | +| Federal student loan borrowers, Maine | 195,114 | 118,656 (-39.2%) | 99,175 (-49.2%) | 172,283 (-11.7%) | 111,983 (-42.6%) | 154,282 (-20.9%) | +| Federal student loan borrowers, Maryland | 880,732 | 395,480 (-55.1%) | 371,603 (-57.8%) | 880,547 (-0.0%) | 358,898 (-59.3%) | 848,622 (-3.6%) | +| Federal student loan borrowers, Massachusetts | 941,693 | 463,106 (-50.8%) | 403,617 (-57.1%) | 941,438 (-0.0%) | 436,881 (-53.6%) | 940,063 (-0.2%) | +| Federal student loan borrowers, Michigan | 1.44M | 799,647 (-44.5%) | 832,618 (-42.2%) | 1.44M (+0.1%) | 832,371 (-42.2%) | 1.44M (+0.0%) | +| Federal student loan borrowers, Minnesota | 807,852 | 479,454 (-40.7%) | 503,733 (-37.6%) | 809,206 (+0.2%) | 505,119 (-37.5%) | 806,648 (-0.1%) | +| Federal student loan borrowers, Mississippi | 477,120 | 213,185 (-55.3%) | 208,576 (-56.3%) | 477,629 (+0.1%) | 228,615 (-52.1%) | 476,147 (-0.2%) | +| Federal student loan borrowers, Missouri | 864,211 | 472,395 (-45.3%) | 567,763 (-34.3%) | 865,294 (+0.1%) | 479,060 (-44.6%) | 836,071 (-3.3%) | +| Federal student loan borrowers, Montana | 132,167 | 88,576 (-33.0%) | 81,204 (-38.6%) | 132,441 (+0.2%) | 88,555 (-33.0%) | 129,928 (-1.7%) | +| Federal student loan borrowers, Nebraska | 254,610 | 123,018 (-51.7%) | 144,097 (-43.4%) | 254,409 (-0.1%) | 118,509 (-53.5%) | 246,521 (-3.2%) | +| Federal student loan borrowers, Nevada | 384,687 | 176,512 (-54.1%) | 215,537 (-44.0%) | 384,459 (-0.1%) | 196,479 (-48.9%) | 358,894 (-6.7%) | +| Federal student loan borrowers, New Hampshire | 196,264 | 104,938 (-46.5%) | 96,432 (-50.9%) | 196,352 (+0.0%) | 104,241 (-46.9%) | 190,750 (-2.8%) | +| Federal student loan borrowers, New Jersey | 1.29M | 450,356 (-65.1%) | 629,605 (-51.3%) | 1.31M (+1.3%) | 519,952 (-59.8%) | 1.22M (-5.8%) | +| Federal student loan borrowers, New Mexico | 236,312 | 153,772 (-34.9%) | 88,408 (-62.6%) | 236,428 (+0.0%) | 130,651 (-44.7%) | 233,314 (-1.3%) | +| Federal student loan borrowers, New York | 2.57M | 1.22M (-52.5%) | 1.19M (-53.7%) | 2.57M (+0.0%) | 1.25M (-51.3%) | 2.57M (+0.1%) | +| Federal student loan borrowers, North Carolina | 1.44M | 732,861 (-49.2%) | 950,046 (-34.1%) | 1.44M (+0.1%) | 789,713 (-45.2%) | 1.44M (-0.1%) | +| Federal student loan borrowers, North Dakota | 92,434 | 52,351 (-43.4%) | 64,873 (-29.8%) | 92,391 (-0.0%) | 56,986 (-38.3%) | 86,386 (-6.5%) | +| Federal student loan borrowers, Ohio | 1.85M | 699,900 (-62.2%) | 507,458 (-72.6%) | 1.75M (-5.3%) | 613,616 (-66.9%) | 1.57M (-15.2%) | +| Federal student loan borrowers, Oklahoma | 534,002 | 315,480 (-40.9%) | 256,421 (-52.0%) | 534,088 (+0.0%) | 278,947 (-47.8%) | 485,430 (-9.1%) | +| Federal student loan borrowers, Oregon | 550,628 | 312,082 (-43.3%) | 348,077 (-36.8%) | 551,112 (+0.1%) | 332,063 (-39.7%) | 550,033 (-0.1%) | +| Federal student loan borrowers, Pennsylvania | 1.94M | 633,413 (-67.3%) | 491,520 (-74.6%) | 1.96M (+1.2%) | 596,122 (-69.2%) | 1.75M (-9.6%) | +| Federal student loan borrowers, Rhode Island | 156,531 | 91,242 (-41.7%) | 70,034 (-55.3%) | 156,520 (-0.0%) | 85,691 (-45.3%) | 146,908 (-6.1%) | +| Federal student loan borrowers, South Carolina | 817,995 | 307,174 (-62.4%) | 272,651 (-66.7%) | 819,067 (+0.1%) | 268,406 (-67.2%) | 667,053 (-18.5%) | +| Federal student loan borrowers, South Dakota | 122,025 | 49,540 (-59.4%) | 35,772 (-70.7%) | 121,939 (-0.1%) | 44,993 (-63.1%) | 83,721 (-31.4%) | +| Federal student loan borrowers, Tennessee | 935,732 | 645,574 (-31.0%) | 728,891 (-22.1%) | 935,831 (+0.0%) | 686,035 (-26.7%) | 935,468 (-0.0%) | +| Federal student loan borrowers, Texas | 4.13M | 1.80M (-56.4%) | 1.74M (-57.8%) | 4.13M (+0.0%) | 1.90M (-54.0%) | 4.12M (-0.1%) | +| Federal student loan borrowers, Utah | 327,595 | 239,327 (-26.9%) | 276,270 (-15.7%) | 327,597 (+0.0%) | 277,588 (-15.3%) | 328,133 (+0.2%) | +| Federal student loan borrowers, Vermont | 78,213 | 50,912 (-34.9%) | 53,367 (-31.8%) | 78,213 (+0.0%) | 52,194 (-33.3%) | 78,167 (-0.1%) | +| Federal student loan borrowers, Virginia | 1.14M | 542,755 (-52.2%) | 569,480 (-49.8%) | 1.13M (-0.0%) | 542,429 (-52.2%) | 1.02M (-10.2%) | +| Federal student loan borrowers, Washington | 811,512 | 507,889 (-37.4%) | 394,762 (-51.4%) | 811,796 (+0.0%) | 465,433 (-42.6%) | 809,698 (-0.2%) | +| Federal student loan borrowers, West Virginia | 238,717 | 97,733 (-59.1%) | 110,576 (-53.7%) | 234,183 (-1.9%) | 104,567 (-56.2%) | 165,129 (-30.8%) | +| Federal student loan borrowers, Wisconsin | 741,455 | 322,918 (-56.4%) | 325,050 (-56.2%) | 741,856 (+0.1%) | 320,358 (-56.8%) | 740,079 (-0.2%) | +| Federal student loan borrowers, Wyoming | 57,300 | 33,514 (-41.5%) | 25,898 (-54.8%) | 57,400 (+0.2%) | 30,505 (-46.8%) | 56,980 (-0.6%) | +| Federal student loan balance, borrower age 24 and Younger | $84.9B | $52.1B (-38.6%) | $49.2B (-42.0%) | $84.9B (-0.0%) | $51.9B (-38.9%) | $84.8B (-0.1%) | +| Federal student loan balance, borrower age 25 to 34 | $462.0B | $216.2B (-53.2%) | $206.3B (-55.3%) | $461.9B (-0.0%) | $212.5B (-54.0%) | $460.8B (-0.2%) | +| Federal student loan balance, borrower age 35 to 49 | $679.5B | $353.4B (-48.0%) | $349.6B (-48.5%) | $677.9B (-0.2%) | $340.7B (-49.9%) | $672.9B (-1.0%) | +| Federal student loan balance, borrower age 50 to 61 | $310.2B | $168.5B (-45.7%) | $201.0B (-35.2%) | $310.2B (-0.0%) | $180.3B (-41.9%) | $310.1B (-0.0%) | +| Federal student loan balance, borrower age 62 and Older | $142.5B | $68.1B (-52.2%) | $80.0B (-43.9%) | $142.5B (-0.0%) | $70.3B (-50.6%) | $142.5B (-0.0%) | +| Federal student loan borrowers, borrower age 24 and Younger | 6.13M | 2.58M (-57.9%) | 2.57M (-58.2%) | 6.13M (+0.0%) | 2.65M (-56.8%) | 5.52M (-10.0%) | +| Federal student loan borrowers, borrower age 25 to 34 | 13.85M | 6.59M (-52.4%) | 6.72M (-51.5%) | 13.84M (-0.1%) | 6.66M (-51.9%) | 13.83M (-0.1%) | +| Federal student loan borrowers, borrower age 35 to 49 | 14.84M | 7.87M (-46.9%) | 8.08M (-45.5%) | 14.83M (-0.0%) | 8.00M (-46.1%) | 14.84M (+0.0%) | +| Federal student loan borrowers, borrower age 50 to 61 | 6.33M | 2.91M (-54.1%) | 2.98M (-52.9%) | 6.33M (+0.0%) | 2.88M (-54.6%) | 5.73M (-9.4%) | +| Federal student loan borrowers, borrower age 62 and Older | 3.16M | 1.23M (-61.2%) | 1.24M (-60.7%) | 3.13M (-1.1%) | 1.23M (-61.0%) | 2.75M (-13.2%) | +| Federal student loan balance, borrower debt size Less than 5K | $18.7B | $7.2B (-61.5%) | $7.3B (-61.2%) | $18.5B (-1.3%) | $7.4B (-60.2%) | $15.8B (-15.3%) | +| Federal student loan balance, borrower debt size 5K to 10K | $52.0B | $20.4B (-60.7%) | $18.5B (-64.4%) | $50.8B (-2.2%) | $19.5B (-62.6%) | $43.9B (-15.5%) | +| Federal student loan balance, borrower debt size 10K to 20K | $131.2B | $55.2B (-57.9%) | $56.1B (-57.2%) | $131.1B (-0.0%) | $57.0B (-56.5%) | $131.1B (-0.0%) | +| Federal student loan balance, borrower debt size 20K to 40K | $268.0B | $139.9B (-47.8%) | $155.4B (-42.0%) | $268.0B (-0.0%) | $145.5B (-45.7%) | $267.8B (-0.1%) | +| Federal student loan balance, borrower debt size 40K to 60K | $204.3B | $110.4B (-46.0%) | $108.8B (-46.7%) | $204.2B (-0.0%) | $110.9B (-45.7%) | $204.3B (+0.0%) | +| Federal student loan balance, borrower debt size 60K to 80K | $175.6B | $131.5B (-25.1%) | $144.6B (-17.7%) | $175.7B (+0.0%) | $137.1B (-21.9%) | $178.3B (+1.5%) | +| Federal student loan balance, borrower debt size 80K to 100K | $126.4B | $62.9B (-50.3%) | $55.8B (-55.8%) | $126.4B (-0.0%) | $59.6B (-52.9%) | $126.4B (+0.0%) | +| Federal student loan balance, borrower debt size 100K to 200K | $350.7B | $140.7B (-59.9%) | $145.0B (-58.7%) | $350.6B (-0.0%) | $136.2B (-61.2%) | $351.3B (+0.2%) | +| Federal student loan balance, borrower debt size 200K+ | $352.2B | $190.3B (-46.0%) | $194.6B (-44.8%) | $352.0B (-0.0%) | $182.6B (-48.2%) | $352.2B (+0.0%) | +| Federal student loan borrowers, borrower debt size Less than 5K | 6.82M | 2.70M (-60.4%) | 2.81M (-58.9%) | 6.65M (-2.6%) | 2.87M (-58.0%) | 5.96M (-12.7%) | +| Federal student loan borrowers, borrower debt size 5K to 10K | 7.12M | 2.89M (-59.4%) | 2.64M (-62.9%) | 7.12M (-0.0%) | 2.76M (-61.3%) | 6.16M (-13.5%) | +| Federal student loan borrowers, borrower debt size 10K to 20K | 9.10M | 3.82M (-58.0%) | 3.86M (-57.5%) | 8.97M (-1.4%) | 3.92M (-57.0%) | 8.98M (-1.4%) | +| Federal student loan borrowers, borrower debt size 20K to 40K | 9.40M | 5.06M (-46.1%) | 5.56M (-40.8%) | 9.39M (-0.1%) | 5.24M (-44.2%) | 9.39M (-0.0%) | +| Federal student loan borrowers, borrower debt size 40K to 60K | 4.15M | 2.27M (-45.3%) | 2.24M (-46.2%) | 4.19M (+0.9%) | 2.28M (-45.1%) | 4.20M (+1.1%) | +| Federal student loan borrowers, borrower debt size 60K to 80K | 2.57M | 1.91M (-25.8%) | 2.09M (-18.5%) | 2.56M (-0.6%) | 1.98M (-23.0%) | 2.57M (-0.0%) | +| Federal student loan borrowers, borrower debt size 80K to 100K | 1.38M | 728,545 (-47.4%) | 640,771 (-53.7%) | 1.45M (+4.5%) | 688,165 (-50.3%) | 1.45M (+4.9%) | +| Federal student loan borrowers, borrower debt size 100K to 200K | 2.57M | 1.09M (-57.6%) | 1.09M (-57.8%) | 2.58M (+0.3%) | 1.05M (-59.3%) | 2.64M (+2.7%) | +| Federal student loan borrowers, borrower debt size 200K+ | 1.19M | 699,994 (-41.0%) | 656,475 (-44.7%) | 1.36M (+14.3%) | 644,088 (-45.7%) | 1.32M (+11.3%) | +| Parent PLUS loan balance | $114.8B | $91.8B (-20.1%) | $102.5B (-10.8%) | $114.8B (+0.0%) | $93.2B (-18.9%) | $114.8B (-0.0%) | +| Federal student loan balance excluding Parent PLUS | $1,564.2B | $766.6B (-51.0%) | $783.6B (-49.9%) | $1,562.5B (-0.1%) | $762.6B (-51.2%) | $1,556.4B (-0.5%) | diff --git a/experiments/fit_1074_fsa_calibration.py b/experiments/fit_1074_fsa_calibration.py new file mode 100644 index 000000000..0ff1109e8 --- /dev/null +++ b/experiments/fit_1074_fsa_calibration.py @@ -0,0 +1,1088 @@ +#!/usr/bin/env python +"""Fit Federal Student Aid portfolio targets on the published US default (#1074). + +What it measures. The published default ``populace-us-2024-spm-20260915`` with +the SCF 2025 education-debt stage run on it (seed 0, as microcosm#1073's host +receipt), calibrated on its own 57,240-household support: + +- **release**: the published weights, which never saw the student loan + columns (the "before"); +- **A, no FSA**: a dense refit from those weights to the release's + ``national_state`` surface, compiled from the candidate feed without the + FSA family. It separates what re-solving on the current surface moves from + what the FSA family moves; +- **B, with FSA**: the same refit with the 132 FSA targets added; +- **A + L2, B + L2**: both again with an L2 anchor to the published weights + (``l2_lambda = 0.03``). The release default has none, and a dense refit of + an L0-selected support without one concentrates weight, so these show how + much of the movement the anchor holds back. + +Each arm uses the release tool's own compile (``compile_us_fiscal_target_registry`` +with ``student_loan_targets``), Medicaid substitutions, ``national_state`` +surface, target materializer (``_materialize_target_frame``, the FSA rows +through ``fsa_student_loan_household_values``), loss weights and loss cap, and +``calibrate`` with the release's epochs, learning rate, weight cap and +conserved mass. It is not a release: it runs no release gate, uses a +candidate feed (the pinned ``51aa40f`` feed plus the merged chronicle#347 FSA +rows) and publishes nothing. + +Outputs: the fit table per family and per FSA target, the borrower and +household composition by race before and after (and in the SCF), the weight +movement, every FSA fact that does not bind with its reason, and a schema-8 +``calibration_diagnostics.json`` for arm B (left on the run volume; the +dashboard's staging page reads that format). + + python experiments/fit_1074_fsa_calibration.py --h5 populace_us_2024.h5 \\ + --feed candidate_feed.jsonl --scf-cache-dir dta +""" + +from __future__ import annotations + +import argparse +import hashlib +import importlib.util +import json +import math +import subprocess +import sys +import time +from collections.abc import Mapping, Sequence +from datetime import UTC, datetime +from pathlib import Path + +import numpy as np + +REPO = Path(__file__).resolve().parents[1] +ISSUE = "PolicyEngine/microcosm#1074" +HOST_RELEASE = "populace-us-2024-spm-20260915" +TARGET_SURFACE = "national_state" +ARMS = ("release", "a_no_fsa", "b_with_fsa", "a_no_fsa_l2", "b_with_fsa_l2") +#: The L2 anchor of the sensitivity arms: ``l2_lambda`` times +#: ``mean((w / w_release) ** 2)``, the configuration +#: ``docs/calibration-l2-basis.md`` studies. The release default is 0. +L2_SENSITIVITY_LAMBDA = 0.03 +#: solved arm -> (with the FSA family, l2_lambda or None for the release's). +SOLVED_ARMS = { + "a_no_fsa": (False, None), + "b_with_fsa": (True, None), + "a_no_fsa_l2": (False, L2_SENSITIVITY_LAMBDA), + "b_with_fsa_l2": (True, L2_SENSITIVITY_LAMBDA), +} +ARM_LABELS = { + "release": "Release", + "a_no_fsa": "A, no FSA", + "b_with_fsa": "B, with FSA", + "a_no_fsa_l2": "A + L2", + "b_with_fsa_l2": "B + L2", +} +#: The release's per-target loss cap (``US_FISCAL_TARGET_LOSS_CAP``): a miss +#: counts at most 100% of the target's scale, as the loss counts it. +ERROR_CAP = 1.0 +_RACE_LABELS = { + 1: "white_non_hispanic", + 2: "black_non_hispanic", + 3: "hispanic", + 4: "other_or_multiple", +} + + +def _log(message: str) -> None: + print(f"[{datetime.now(UTC).strftime('%H:%M:%S')}] {message}", flush=True) + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for block in iter(lambda: handle.read(1 << 20), b""): + digest.update(block) + return digest.hexdigest() + + +def _git_commit() -> str: + try: + return subprocess.check_output( + ["git", "rev-parse", "HEAD"], cwd=REPO, text=True + ).strip() + except (OSError, subprocess.CalledProcessError): + return "unknown" + + +def _load_release(): + path = REPO / "tools" / "build_us_fiscal_refresh_release.py" + spec = importlib.util.spec_from_file_location( + "build_us_fiscal_refresh_release", path + ) + module = importlib.util.module_from_spec(spec) + sys.modules[spec.name] = module + assert spec.loader is not None + spec.loader.exec_module(module) + return module + + +def engine_ready_frame(release, frame): + """The host frame without the columns the locked engine computes itself. + + The published H5 was written on an older policyengine-us, so a few of its + stored columns are formula-owned on the locked 2.2.1, and the release + materializer refuses them. ``has_marketplace_health_coverage`` carries the + reported Marketplace coverage the ACA enrollment target reads under its + 2.2.1 name, ``has_marketplace_health_coverage_at_interview``; it moves + there, as the release's ACA source stage does (``_aca_source_person_table``). + Every other formula-owned column is dropped, and both lists are recorded. + """ + + from microcosm.frame import Frame + + tables = {entity: frame.table(entity).copy() for entity in frame.entities} + owned = sorted( + release._formula_owned_gate_adapter()._engine_computed_columns( + tables, period=release.PERIOD + ) + ) + person = tables["person"] + renamed = {} + reported = release.US_ACA_REPORTED_MARKETPLACE_COVERAGE + if "has_marketplace_health_coverage" in owned and reported not in person: + person[reported] = person["has_marketplace_health_coverage"] + renamed["has_marketplace_health_coverage"] = reported + dropped = {} + for entity, table in tables.items(): + present = [column for column in owned if column in table.columns] + if present: + tables[entity] = table.drop(columns=present) + dropped[entity] = present + ready = Frame( + tables, + frame.schema, + {entity: frame.weights_for(entity) for entity in frame.weighted_entities}, + ) + return ready, {"formula_owned_dropped": dropped, "renamed": renamed} + + +def _read_facts(path: Path) -> list[dict]: + with path.open("r", encoding="utf-8") as handle: + return [json.loads(line) for line in handle if line.strip()] + + +def _relative_error(estimate: float, target: float) -> float: + return (estimate - target) / max(abs(target), 1.0) + + +def _family(spec) -> str: + """The dashboard's family (provider/category), with the FSA rows by role.""" + + if spec.family == "ed_fsa": + return f"ed_fsa/{spec.metadata['target_role']}" + hierarchy = spec.hierarchy + if hierarchy is None: + return f"{spec.family}/(no hierarchy)" + return f"{hierarchy.provider.id}/{hierarchy.category.id}" + + +def _summary(errors: Sequence[float]) -> dict[str, float]: + values = np.abs(np.asarray(errors, dtype=np.float64)) + capped = np.minimum(values, ERROR_CAP) + return { + "targets": len(values), + "mean_capped_abs_rel_error": float(capped.mean()) if len(values) else math.nan, + "mean_abs_rel_error": float(values.mean()) if len(values) else math.nan, + "median_abs_rel_error": float(np.median(values)) if len(values) else math.nan, + "max_abs_rel_error": float(values.max()) if len(values) else math.nan, + "share_within_5pct": float((values <= 0.05).mean()) + if len(values) + else math.nan, + "share_within_10pct": float((values <= 0.10).mean()) + if len(values) + else math.nan, + } + + +def _person_weights(frame, household_weights: np.ndarray) -> np.ndarray: + import pandas as pd + + household_ids = frame.table("household")["household_id"].to_numpy() + by_household = pd.Series(np.asarray(household_weights), index=household_ids) + return by_household.reindex( + frame.table("person")["person_household_id"].to_numpy() + ).to_numpy(dtype=np.float64) + + +def _person_balances(frame) -> tuple[np.ndarray, np.ndarray]: + import pandas as pd + + person = frame.table("person") + own = pd.to_numeric(person["federal_student_loan_balance"], errors="coerce") + plus = pd.to_numeric(person["federal_parent_plus_loan_balance"], errors="coerce") + return ( + own.fillna(0.0).to_numpy(dtype=np.float64), + plus.fillna(0.0).to_numpy(dtype=np.float64), + ) + + +def race_composition(frame, household_weights: np.ndarray) -> dict[str, object]: + """Borrowers by race (person and reference-person household), at weights.""" + + from microcosm.build.us_runtime.scf_education_debt import _racecl4_from_cps + + person = frame.table("person") + own, plus = _person_balances(frame) + total = own + plus + weights = _person_weights(frame, household_weights) + race = _racecl4_from_cps(person) + age = person["age"].to_numpy(dtype=np.float64) + borrower = total > 0 + adult = age >= 18 + + def shares(mask: np.ndarray, value: np.ndarray | None = None) -> dict[str, float]: + base = weights * (value if value is not None else 1.0) + denominator = float(base[mask].sum()) + return { + label: float(base[mask & (race == code)].sum()) / denominator + for code, label in _RACE_LABELS.items() + } + + return { + "borrowers": shares(borrower), + "balance": shares(borrower, total), + "adults": shares(adult), + "borrower_share_of_adults_by_race": { + label: float(weights[borrower & adult & (race == code)].sum()) + / float(weights[adult & (race == code)].sum()) + for code, label in _RACE_LABELS.items() + }, + } + + +def borrower_support(frame) -> dict[str, object]: + """Unweighted borrower records in each FSA age band: the carriers a band's + count can be reweighted from (the stage gives balances to reference + persons, spouses and co-resident adult children, so young borrowers living + on their own are missed).""" + + own, plus = _person_balances(frame) + borrower = (own + plus) > 0 + age = frame.table("person")["age"].to_numpy(dtype=np.float64) + bands = ( + ("24_and_younger", -math.inf, 25.0), + ("25_to_34", 25.0, 35.0), + ("35_to_49", 35.0, 50.0), + ("50_to_61", 50.0, 62.0), + ("62_and_older", 62.0, math.inf), + ) + return { + "borrower_records": int(borrower.sum()), + "people": int(len(age)), + "borrower_records_by_age_band": { + label: int((borrower & (age >= low) & (age < high)).sum()) + for label, low, high in bands + }, + "people_by_age_band": { + label: int(((age >= low) & (age < high)).sum()) + for label, low, high in bands + }, + } + + +def household_race_composition(fit_table: Mapping[str, object]) -> dict[str, float]: + """Borrower households by the reference person's race, from a fit table.""" + + by_race = fit_table["by_race"] + holders = { + label: float(row["household_weight"]) + * float(row["share_with_federal_education_debt"]) + for label, row in by_race.items() + } + total = sum(holders.values()) + return {label: value / total for label, value in holders.items()} + + +def weight_movement( + frame, initial: np.ndarray, final: np.ndarray, cap: float +) -> dict[str, object]: + import pandas as pd + + ratio = final / initial + own, plus = _person_balances(frame) + household_ids = frame.table("household")["household_id"].to_numpy() + debt = ( + pd.Series(own + plus, index=frame.table("person")["person_household_id"]) + .groupby(level=0) + .sum() + .reindex(household_ids) + .fillna(0.0) + .to_numpy() + ) + holds = debt > 0 + + def ess(weights: np.ndarray) -> float: + return float(weights.sum() ** 2 / np.square(weights).sum()) + + return { + "ratio_quantiles": { + str(q): float(np.quantile(ratio, q)) + for q in (0.01, 0.05, 0.25, 0.5, 0.75, 0.95, 0.99) + }, + "share_at_cap": float((ratio >= cap * 0.999).mean()), + "borrower_households_weighted_mean_ratio": float( + final[holds].sum() / initial[holds].sum() + ), + "other_households_weighted_mean_ratio": float( + final[~holds].sum() / initial[~holds].sum() + ), + "borrower_household_weight_share": { + "initial": float(initial[holds].sum() / initial.sum()), + "final": float(final[holds].sum() / final.sum()), + }, + "effective_sample_size": {"initial": ess(initial), "final": ess(final)}, + "total_weight": {"initial": float(initial.sum()), "final": float(final.sum())}, + } + + +def repayment_plan_diagnostic(facts: Sequence[Mapping]) -> dict[str, object]: + """FSA's Direct Loan portfolio by repayment plan, latest quarter (no model + counterpart: the build carries no plan column).""" + + rows = [ + fact + for fact in facts + if str(fact.get("layout", {}).get("record_set_id", "")).startswith( + "ed_fsa.dl_by_repayment_plan." + ) + ] + if not rows: + return {"status": "absent"} + latest = max(str(fact["period"]["value"]) for fact in rows) + table: dict[str, dict[str, float]] = {} + for fact in rows: + if str(fact["period"]["value"]) != latest: + continue + layout = fact["layout"] + entry = table.setdefault( + layout["groupby_value_id"], {"label": layout["groupby_value_label"]} + ) + entry[layout["measure_id"]] = float(fact["value"]) + dollars = sum(row.get("dollars_outstanding", 0.0) for row in table.values()) + for row in table.values(): + if "dollars_outstanding" in row and dollars: + row["share_of_dollars"] = row["dollars_outstanding"] / dollars + return {"status": "diagnostic_only", "period": latest, "plans": table} + + +def _fmt_pct(value: float, digits: int = 1) -> str: + return "" if value != value else f"{100 * value:.{digits}f}%" + + +def _fmt_signed_pct(value: float) -> str: + return "" if value != value else f"{100 * value:+.1f}%" + + +def _fmt_money(value: float) -> str: + if value != value: + return "" + if abs(value) >= 1e9: + return f"${value / 1e9:,.1f}B" + return f"${value:,.0f}" + + +def _fmt_ratio(value: float) -> str: + return f"{value:.1e}" if abs(value) < 0.01 else f"{value:.2f}" + + +def _fmt_count(value: float) -> str: + if value != value: + return "" + if abs(value) >= 1e6: + return f"{value / 1e6:,.2f}M" + return f"{value:,.0f}" + + +def markdown(receipt: Mapping[str, object]) -> str: + lines = [ + "# microcosm#1074 receipts: Federal Student Aid portfolio targets", + "", + f"Generated {receipt['generated_at']} by " + "`experiments/fit_1074_fsa_calibration.py`, commit " + f"`{receipt['provenance']['commit']}`, Modal run " + f"`{receipt['provenance']['run']}` (`experiments/modal_1074.py`). " + "Machine-readable copy: `experiments/receipts/1074-fsa-calibration-fit.json`.", + "", + "Host: the published default " + f"`{receipt['host']['release']}` (sha256 `{receipt['host']['sha256'][:12]}…`, " + f"{receipt['host']['households']:,} households), with the SCF 2025 " + "education-debt stage run at seed 0. Feed: the pinned " + f"`51aa40f` US feed plus the merged chronicle#347 FSA rows " + f"(`{receipt['feed']['candidate_sha256'][:12]}…`, " + f"{receipt['feed']['rows']:,} rows). Arms: **release** = the published " + "weights; **A** = a dense refit to the `national_state` surface without " + "the FSA family; **B** = the same refit with it. Same epochs " + f"({receipt['solver']['epochs']}), learning rate, 5x weight cap and " + "conserved mass as a release. Not a release: no gate ran and nothing " + "was published.", + "", + "## FSA targets: the reconciled levels", + "", + ] + controls = receipt["fsa"]["controls"] + lines += [ + "| | Balance | Borrowers |", + "|---|---:|---:|", + ] + for key, label in ( + ("published_states_and_dc", "50 states and DC, as published"), + ("published_out_of_scope", "Puerto Rico and Other (leave)"), + ("published_not_reported", "Not Reported (allocated)"), + ("published_total", "Location table total"), + ("not_reported_allocation_factor", "Allocation factor"), + ("in_scope_control", "In-scope control (every family sums to it)"), + ): + balance = controls["total_balance"][key] + borrowers = controls["borrowers"][key] + if key == "not_reported_allocation_factor": + lines.append(f"| {label} | {balance:.4f} | {borrowers:.4f} |") + else: + lines.append( + f"| {label} | {_fmt_money(balance)} | {_fmt_count(borrowers)} |" + ) + lines += [ + "", + f"Reference date: {receipt['fsa']['reference_label']} " + f"(`{receipt['fsa']['reference_period']}`), the latest quarter all four " + "bound tables publish; unaged at the 2024 build period " + "(`period_alignment = stock_at_source_reference_date`).", + "", + "## Fit by FSA family", + "", + "Mean absolute relative error (share of targets within 5%).", + "", + "| FSA family | Targets | " + + " | ".join(ARM_LABELS[arm] for arm in ARMS) + + " |", + "|---|---:|" + "---:|" * len(ARMS), + ] + for family, row in receipt["fit_by_family"].items(): + if not family.startswith("ed_fsa/"): + continue + cells = [ + f"{_fmt_pct(row[arm]['mean_abs_rel_error'])} " + f"({_fmt_pct(row[arm]['share_within_5pct'], 0)})" + for arm in ARMS + ] + lines.append( + f"| {family.removeprefix('ed_fsa/')} | {row['release']['targets']} | " + + " | ".join(cells) + + " |" + ) + lines += [ + "", + "## Headline levels", + "", + "| | FSA target | " + " | ".join(ARM_LABELS[arm] for arm in ARMS) + " |", + "|---|---:|" + "---:|" * len(ARMS), + ] + for row in receipt["headline"]: + formatter = _fmt_count if row["kind"] == "count" else _fmt_money + if row["kind"] == "share": + formatter = _fmt_pct + lines.append( + f"| {row['label']} | {formatter(row['target'])} | " + + " | ".join(formatter(row[arm]) for arm in ARMS) + + " |" + ) + lines += [ + "", + "## Every other family: does adding FSA cost the rest of the surface?", + "", + "Mean absolute relative error over the `national_state` surface's " + "non-FSA targets, by provider/category (the dashboard's family), each " + "miss capped at 100% of its target as the loss caps it, sorted by how " + "much adding the FSA family moves it:", + "", + "| Family | Targets | " + + " | ".join(ARM_LABELS[arm] for arm in ARMS) + + " | B - A (pp) | B+L2 - A+L2 (pp) |", + "|---|---:|" + "---:|" * (len(ARMS) + 2), + ] + others = [ + (family, row) + for family, row in receipt["fit_by_family"].items() + if not family.startswith("ed_fsa/") + ] + metric = "mean_capped_abs_rel_error" + + def delta(row, with_arm: str, without_arm: str) -> float: + return row[with_arm][metric] - row[without_arm][metric] + + others.sort(key=lambda item: -abs(delta(item[1], "b_with_fsa", "a_no_fsa"))) + for family, row in others: + lines.append( + f"| {family} | {row['release']['targets']} | " + + " | ".join(_fmt_pct(row[arm][metric]) for arm in ARMS) + + f" | {100 * delta(row, 'b_with_fsa', 'a_no_fsa'):+.2f}" + + f" | {100 * delta(row, 'b_with_fsa_l2', 'a_no_fsa_l2'):+.2f} |" + ) + totals = receipt["fit_overall"]["non_fsa"] + lines += [ + f"| **all non-FSA targets** | {totals['release']['targets']} | " + + " | ".join(_fmt_pct(totals[arm][metric]) for arm in ARMS) + + f" | {100 * delta(totals, 'b_with_fsa', 'a_no_fsa'):+.2f}" + + f" | {100 * delta(totals, 'b_with_fsa_l2', 'a_no_fsa_l2'):+.2f} |", + "", + "## Racial composition of borrowers, before and after calibration", + "", + "Borrower households by the reference person's race (the SCF's " + "`racecl4`; the SCF column pools the five implicates):", + "", + "| | SCF 2025 | " + + " | ".join(ARM_LABELS[arm] for arm in ARMS) + + " | B - release (pp) |", + "|---|---:|" + "---:|" * (len(ARMS) + 1), + ] + race = receipt["race"] + for label in _RACE_LABELS.values(): + lines.append( + f"| {label} | {_fmt_pct(race['households']['scf_2025'][label])} | " + + " | ".join(_fmt_pct(race["households"][arm][label]) for arm in ARMS) + + f" | {100 * (race['households']['b_with_fsa'][label] - race['households']['release'][label]):+.1f} |" + ) + lines += [ + "", + "Borrowers (people) by their own race, and the share of adults who borrow:", + "", + "| | " + + " | ".join(ARM_LABELS[arm] for arm in ARMS) + + " | Adults with a balance: release | B | B + L2 |", + "|---|" + "---:|" * (len(ARMS) + 3), + ] + for label in _RACE_LABELS.values(): + lines.append( + f"| {label} | " + + " | ".join( + _fmt_pct(race["people"][arm]["borrowers"][label]) for arm in ARMS + ) + + f" | {_fmt_pct(race['people']['release']['borrower_share_of_adults_by_race'][label])}" + + f" | {_fmt_pct(race['people']['b_with_fsa']['borrower_share_of_adults_by_race'][label])}" + + f" | {_fmt_pct(race['people']['b_with_fsa_l2']['borrower_share_of_adults_by_race'][label])} |" + ) + weights = receipt["weights"] + lines += [ + "", + "## Weight movement against the published weights", + "", + "| | " + " | ".join(ARM_LABELS[arm] for arm in SOLVED_ARMS) + " |", + "|---|" + "---:|" * len(SOLVED_ARMS), + ] + rows_movement = ( + ( + "Borrower households' weight ratio", + lambda m: f"{m['borrower_households_weighted_mean_ratio']:.2f}", + ), + ( + "Other households' weight ratio", + lambda m: f"{m['other_households_weighted_mean_ratio']:.3f}", + ), + ( + "Borrower households' share of weight", + lambda m: _fmt_pct(m["borrower_household_weight_share"]["final"]), + ), + ( + "Median household weight ratio", + lambda m: _fmt_ratio(m["ratio_quantiles"]["0.5"]), + ), + ( + "99th percentile weight ratio", + lambda m: _fmt_ratio(m["ratio_quantiles"]["0.99"]), + ), + ( + "Effective sample size (release " + f"{weights['b_with_fsa']['effective_sample_size']['initial']:,.0f})", + lambda m: f"{m['effective_sample_size']['final']:,.0f}", + ), + ) + for label, getter in rows_movement: + lines.append( + f"| {label} | " + + " | ".join(getter(weights[arm]) for arm in SOLVED_ARMS) + + " |" + ) + lines += [ + "", + "## FSA facts that do not bind", + "", + "| Disposition | Facts | Reason |", + "|---|---:|---|", + ] + reasons: dict[tuple[str, str], int] = {} + for item in receipt["fsa"]["dispositions"]: + if item["disposition"] == "bound": + continue + key = (item["disposition"], item["reason"]) + reasons[key] = reasons.get(key, 0) + 1 + for (disposition, reason), count in sorted(reasons.items()): + lines.append(f"| {disposition} | {count} | {reason} |") + dropped = receipt["fsa"]["materialization_dropped"] + lines += [ + "", + f"Materialization dropped {len(dropped)} FSA targets" + + (f": {', '.join(dropped)}." if dropped else "."), + "", + "## Every FSA target", + "", + "| Target | FSA (reconciled) | " + + " | ".join(ARM_LABELS[arm] for arm in ARMS) + + " |", + "|---|---:|" + "---:|" * len(ARMS), + ] + for row in receipt["fsa_targets"]: + formatter = _fmt_count if row["measure_mode"] == "indicator_sum" else _fmt_money + lines.append( + f"| {row['label']} | {formatter(row['target'])} | " + + " | ".join( + f"{formatter(row[arm])} ({_fmt_signed_pct(row[arm + '_error'])})" + for arm in ARMS + ) + + " |" + ) + return "\n".join(lines) + "\n" + + +def main(argv: Sequence[str] | None = None) -> int: + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument("--h5", type=Path, required=True) + parser.add_argument("--feed", type=Path, required=True) + parser.add_argument("--feed-provenance", type=Path) + parser.add_argument("--scf-cache-dir", type=Path, required=True) + parser.add_argument("--run", default="") + parser.add_argument("--seed", type=int, default=0) + parser.add_argument("--epochs", type=int) + parser.add_argument("--diagnostics-dir", type=Path) + parser.add_argument( + "--materialization-cache-dir", + type=Path, + help="Cache the JCT reform passes here, so a restarted run reuses them.", + ) + parser.add_argument( + "--maximum-microsim-batch-size", + type=int, + default=0, + help=( + "Households per engine batch; 0 (default) runs the whole support " + "in one simulation, the batch-invariant reading." + ), + ) + parser.add_argument( + "--out-json", + type=Path, + default=REPO / "experiments" / "receipts" / "1074-fsa-calibration-fit.json", + ) + parser.add_argument( + "--out-md", + type=Path, + default=REPO / "experiments" / "1074-fsa-calibration-receipts.md", + ) + args = parser.parse_args(argv) + started = time.perf_counter() + + release = _load_release() + from microcosm.build.us_runtime import compile_us_fiscal_target_registry + from microcosm.build.us_runtime.fsa_student_loan_targets import ( + FSA_TARGET_FAMILY, + fsa_student_loan_target_receipt, + ) + from microcosm.build.us_runtime.scf_education_debt import ( + SCF_2025_FULL_EXTRACT, + SCF_2025_SUMMARY_EXTRACT, + fetch_scf_public_file, + load_scf_2025_education_debt_donor, + scf_education_debt_donor_fit_table, + us_scf_education_debt_fit_table, + us_scf_education_debt_signal_gate, + with_us_scf_education_debt_inputs, + ) + from microcosm.calibrate import ( + TargetRegistry, + build_constraint_matrix, + calibrate, + write_calibration_diagnostics, + ) + from microcosm.frame import Frame, WeightKind, Weights + + # The release's own defaults (epochs, learning rate, weight cap, aging, + # batch size), read from its parser rather than restated here. + cli = release._parse_args( + [ + "--base-h5", + str(args.h5), + "--ledger-facts", + str(args.feed), + "--out", + str(Path("/tmp") / "fit-1074-release-args"), + "--no-staging", + ] + ) + epochs = int(args.epochs or cli.epochs) + + _log(f"reading feed {args.feed}") + facts = _read_facts(args.feed) + feed_sha = _sha256(args.feed) + crosswalk_path = release.default_congressional_district_vintage_crosswalk_path() + crosswalk = release.load_congressional_district_vintage_crosswalk(crosswalk_path) + + _log("compiling the target registry with and without the FSA family") + registry = compile_us_fiscal_target_registry( + facts, + target_period=release.PERIOD, + congressional_district_vintage_crosswalk=crosswalk, + age_targets=cli.age_targets, + allow_unaged_dollar_targets=cli.allow_unaged_dollar_targets, + student_loan_targets=True, + ) + without_flag = compile_us_fiscal_target_registry( + facts, + target_period=release.PERIOD, + congressional_district_vintage_crosswalk=crosswalk, + age_targets=cli.age_targets, + allow_unaged_dollar_targets=cli.allow_unaged_dollar_targets, + ) + non_fsa_names = [s.name for s in registry.specs if s.family != FSA_TARGET_FAMILY] + if non_fsa_names != [s.name for s in without_flag.specs]: + raise RuntimeError("The FSA flag changed the non-FSA surface.") + registry, _ = release.apply_us_medicaid_enrollment_substitutions(registry) + specs, surface_receipt = release._select_target_surface( + registry.specs, TARGET_SURFACE + ) + fsa_receipt = fsa_student_loan_target_receipt(facts, target_period=release.PERIOD) + _log(f"{len(specs)} targets on the {TARGET_SURFACE} surface") + + _log("loading the host and running the SCF education-debt stage") + summary_path = fetch_scf_public_file(SCF_2025_SUMMARY_EXTRACT, args.scf_cache_dir) + full_path = fetch_scf_public_file(SCF_2025_FULL_EXTRACT, args.scf_cache_dir) + donor = load_scf_2025_education_debt_donor(summary_path, full_path) + host_sha = _sha256(args.h5) + base = release._load_frame(args.h5) + frame = with_us_scf_education_debt_inputs( + base, + seed=args.seed, + time_period=release.PERIOD, + scf_education_debt_donor=donor, + ) + del base + gate = us_scf_education_debt_signal_gate(frame) + _log(f"stage gate passed={gate.passed}") + frame, engine_adaptation = engine_ready_frame(release, frame) + _log(f"engine adaptation: {engine_adaptation}") + + _log("materializing the target frame") + batch_size = args.maximum_microsim_batch_size or None + cache_context = None + if args.materialization_cache_dir is not None: + args.materialization_cache_dir.mkdir(parents=True, exist_ok=True) + # Binds the reform caches to these exact staged inputs and engine. + cache_context = { + "experiment": ISSUE, + "base_dataset_sha256": host_sha, + "staged_frame_sha256": release._staged_frame_sha256(frame), + "policyengine_us_version": release._package_or_workspace_version( + "policyengine-us" + ), + "target_period": release.PERIOD, + "maximum_microsim_batch_size": batch_size, + # Not a release producer: the release binds its materializer + # identity here, and declares None otherwise. + "target_frame_materializer_identity_sha256": None, + } + target_frame, materialized, compilation = release._materialize_target_frame( + frame, + tuple(specs), + maximum_microsim_batch_size=batch_size, + target_materialization_cache_dir=args.materialization_cache_dir, + target_materialization_cache_context=cache_context, + ) + dropped = list(compilation.get("dropped_target_names") or []) + _log(f"materialized {len(materialized)} targets; dropped {len(dropped)}") + registry_b = materialized + registry_a = TargetRegistry( + tuple(s for s in materialized.specs if s.family != FSA_TARGET_FAMILY), + country="us", + ) + initial = np.asarray(target_frame.weights_for("household").values, dtype=np.float64) + + results = {} + timings = {} + for arm, (with_fsa, l2_lambda) in SOLVED_ARMS.items(): + arm_registry = registry_b if with_fsa else registry_a + _log(f"calibrating arm {arm} ({len(arm_registry)} targets, {epochs} epochs)") + t0 = time.perf_counter() + results[arm] = calibrate( + target_frame, + arm_registry.to_target_set(), + epochs=epochs, + learning_rate=cli.learning_rate, + max_weight_ratio=cli.max_weight_ratio, + seed=args.seed, + mass="conserve", + l2_lambda=cli.l2_lambda if l2_lambda is None else l2_lambda, + target_loss_weights=release._fiscal_target_loss_weights( + arm_registry, cli.target_family_loss_multipliers + ), + target_loss_cap=release.US_FISCAL_TARGET_LOSS_CAP, + ) + timings[arm] = time.perf_counter() - t0 + _log( + f"arm {arm}: loss {results[arm].initial_loss:.5f} -> " + f"{results[arm].final_loss:.5f} in {timings[arm]:.0f}s" + ) + weights = { + "release": initial, + **{ + arm: np.asarray(results[arm].weights, dtype=np.float64) + for arm in SOLVED_ARMS + }, + } + + problem = build_constraint_matrix(target_frame, registry_b.to_target_set()) + estimates = {arm: problem.estimates(w) for arm, w in weights.items()} + specs_by_row = {f"{spec.name}@{spec.period}": spec for spec in registry_b.specs} + rows = [] + for index, name in enumerate(problem.names): + spec = specs_by_row[name] + target = float(problem.target_vector[index]) + row = { + "name": spec.name, + "family": _family(spec), + "is_fsa": spec.family == FSA_TARGET_FAMILY, + "target": target, + } + for arm in ARMS: + value = float(estimates[arm][index]) + row[arm] = value + row[f"{arm}_error"] = _relative_error(value, target) + if row["is_fsa"]: + row["label"] = spec.hierarchy.target.label + row["measure_mode"] = spec.metadata["measure_mode"] + row["target_role"] = spec.metadata["target_role"] + rows.append(row) + + if args.diagnostics_dir is not None: + # Every target's row, kept on the run volume beside the diagnostics. + args.diagnostics_dir.mkdir(parents=True, exist_ok=True) + (args.diagnostics_dir / "targets.json").write_text( + json.dumps(rows, default=float), encoding="utf-8" + ) + fit_by_family: dict[str, dict[str, object]] = {} + for family in sorted({row["family"] for row in rows}): + members = [row for row in rows if row["family"] == family] + fit_by_family[family] = { + arm: _summary([row[f"{arm}_error"] for row in members]) for arm in ARMS + } + fit_overall = { + group: { + arm: _summary( + [row[f"{arm}_error"] for row in rows if row["is_fsa"] == is_fsa] + ) + for arm in ARMS + } + for group, is_fsa in (("fsa", True), ("non_fsa", False)) + } + + _log("tabulating composition and fit tables") + + def with_weights(values: np.ndarray): + return Frame( + {entity: target_frame.table(entity) for entity in target_frame.entities}, + target_frame.schema, + {"household": Weights(values, WeightKind.CALIBRATED)}, + ) + + fit_tables = { + arm: us_scf_education_debt_fit_table(with_weights(w)) + for arm, w in weights.items() + } + scf_fit = scf_education_debt_donor_fit_table(donor) + race = { + "households": { + "scf_2025": household_race_composition(scf_fit), + **{arm: household_race_composition(fit_tables[arm]) for arm in ARMS}, + }, + "people": { + arm: race_composition(target_frame, w) for arm, w in weights.items() + }, + } + own, plus = _person_balances(target_frame) + person_weights = { + arm: _person_weights(target_frame, w) for arm, w in weights.items() + } + controls = fsa_receipt["controls"] + pp_target = next( + row["target"] + for row in rows + if row["is_fsa"] and row["target_role"] == "fsa_parent_plus_balance" + ) + headline = [ + { + "label": "Federal balance, own plus Parent PLUS", + "kind": "amount", + "target": controls["total_balance"]["in_scope_control"], + **{arm: float(np.dot(own + plus, person_weights[arm])) for arm in ARMS}, + }, + { + "label": "Borrowers (people with a balance)", + "kind": "count", + "target": controls["borrowers"]["in_scope_control"], + **{arm: float(person_weights[arm][(own + plus) > 0].sum()) for arm in ARMS}, + }, + { + "label": "Parent PLUS balance", + "kind": "amount", + "target": pp_target, + **{arm: float(np.dot(plus, person_weights[arm])) for arm in ARMS}, + }, + { + "label": "Parent PLUS share of the balance", + "kind": "share", + "target": pp_target / controls["total_balance"]["in_scope_control"], + **{ + arm: float(np.dot(plus, person_weights[arm])) + / float(np.dot(own + plus, person_weights[arm])) + for arm in ARMS + }, + }, + { + "label": "Mean balance per borrower", + "kind": "amount", + "target": controls["total_balance"]["in_scope_control"] + / controls["borrowers"]["in_scope_control"], + **{ + arm: float(np.dot(own + plus, person_weights[arm])) + / float(person_weights[arm][(own + plus) > 0].sum()) + for arm in ARMS + }, + }, + { + "label": "Households with federal education debt", + "kind": "share", + "target": math.nan, + **{ + arm: float( + fit_tables[arm]["households"]["share_with_federal_education_debt"] + ) + for arm in ARMS + }, + }, + ] + + if args.diagnostics_dir is not None: + args.diagnostics_dir.mkdir(parents=True, exist_ok=True) + try: + outcome = write_calibration_diagnostics( + results["b_with_fsa"], + args.diagnostics_dir / "calibration_diagnostics.json", + target_registry=registry_b, + target_surface=release.target_surface_payload(results["b_with_fsa"]), + build={ + "base_dataset_sha256": host_sha, + "experiment": ISSUE, + "candidate_feed_sha256": feed_sha, + "target_compilation": compilation, + }, + ) + _log(f"diagnostics written: {outcome}") + except Exception as error: # noqa: BLE001 - a receipt still ships + _log(f"diagnostics not written: {error!r}") + + fsa_dropped = sorted( + name for name in dropped if name.startswith(f"{FSA_TARGET_FAMILY}.") + ) + receipt = { + "schema_version": 1, + "issue": ISSUE, + "generated_at": datetime.now(UTC).strftime("%Y-%m-%d"), + "provenance": {"commit": _git_commit(), "run": args.run}, + "host": { + "release": HOST_RELEASE, + "sha256": host_sha, + "households": int(target_frame.n("household")), + "people": int(target_frame.n("person")), + "scf_stage_seed": args.seed, + "scf_stage_gate_passed": bool(gate.passed), + "engine_adaptation": engine_adaptation, + }, + "feed": { + "candidate_sha256": feed_sha, + "rows": len(facts), + "provenance": ( + json.loads(args.feed_provenance.read_text()) + if args.feed_provenance is not None + else None + ), + }, + "solver": { + "kernel": "microcosm.calibrate.calibrate (dense refit, no L0)", + "epochs": epochs, + "learning_rate": cli.learning_rate, + "max_weight_ratio": cli.max_weight_ratio, + "l2_lambda": cli.l2_lambda, + "mass": "conserve", + "target_surface": TARGET_SURFACE, + "age_targets": cli.age_targets, + "loss": { + arm: { + "initial": float(results[arm].initial_loss), + "final": float(results[arm].final_loss), + "seconds": timings[arm], + } + for arm in results + }, + "arms": { + arm: { + "with_fsa": with_fsa, + "targets": len(registry_b if with_fsa else registry_a), + "l2_lambda": cli.l2_lambda if l2_lambda is None else l2_lambda, + } + for arm, (with_fsa, l2_lambda) in SOLVED_ARMS.items() + }, + "surface": surface_receipt, + }, + "fsa": { + **{ + key: fsa_receipt[key] + for key in ( + "status", + "reference_period", + "reference_label", + "period_alignment", + "controls", + "disposition_counts", + "dispositions", + ) + }, + "materialization_dropped": fsa_dropped, + "repayment_plan_diagnostic": repayment_plan_diagnostic(facts), + }, + "headline": headline, + "fit_by_family": fit_by_family, + "fit_overall": fit_overall, + "fsa_targets": [row for row in rows if row["is_fsa"]], + "race": race, + "support": borrower_support(target_frame), + "scf_fit_tables": {"scf_2025": scf_fit, **fit_tables}, + "weights": { + arm: weight_movement( + target_frame, initial, weights[arm], cli.max_weight_ratio + ) + for arm in SOLVED_ARMS + }, + "seconds": time.perf_counter() - started, + } + args.out_json.parent.mkdir(parents=True, exist_ok=True) + args.out_json.write_text( + json.dumps(receipt, indent=2, default=float, allow_nan=True) + "\n", + encoding="utf-8", + newline="\n", + ) + args.out_md.write_text(markdown(receipt), encoding="utf-8", newline="\n") + _log(f"wrote {args.out_json} and {args.out_md}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/experiments/modal_1074.py b/experiments/modal_1074.py new file mode 100644 index 000000000..f8e8948d1 --- /dev/null +++ b/experiments/modal_1074.py @@ -0,0 +1,696 @@ +"""Run the microcosm#1074 FSA-target experiments on Modal instead of local RAM. + +Each run clones a pushed commit of PolicyEngine/microcosm, syncs that tree's +uv.lock, fetches the inputs and verifies each sha256, runs the requested steps +in order, and saves every receipt the steps write plus a run log to the +`microcosm-1074-cache` volume under results//. `collect` copies a +run's files back into this checkout. Inputs: + +- the published host release `populace-us-2024-spm-20260915` from Hugging Face + (policyengine/populace-us at a pinned revision); +- the Federal Reserve's SCF 2025 public zips (summary extract and full file); +- for ``fit``: a candidate Chronicle feed, built in the container and cached + on the volume. It is the pinned US feed (rebuilt byte for byte at Chronicle + ``51aa40f`` with ``tools/build_us_chronicle_feed.py`` and checked against + ``us/chronicle_feed.json``) plus the six FSA packages of + PolicyEngine/chronicle#347 (``chronicle build-bundle --year 2026`` at the + merge commit ``acbedb5`` on Chronicle main, which reads the raw files from + R2). The candidate is a reviewed diagnostic input only; no pin in the + repository names it. + + export PYTHONIOENCODING=utf-8 PYTHONUTF8=1 + modal run experiments/modal_1074.py::preflight --commit + modal run --detach experiments/modal_1074.py::launch --commit --steps tests,fit + modal run experiments/modal_1074.py::collect --run-id + +Steps (see STEPS; each runs one or more commands, stopping at the first that +fails): + +- ``tests``: the FSA target, fiscal-target, ledger, parity, chronicle-feed, + label and release-tool filter tests (engine-free); +- ``contract``: the engine-contract fiscal-target and release-input tests; +- ``spec``: the bundle generator and the spec-engine coverage attestation in + ``--check`` mode, and the engine-free spec-engine tests, which fail if the + change moved a spec identity; +- ``feed``: build (or verify the cached) candidate feed only; +- ``fit``: the calibration fit and receipt + (``experiments/fit_1074_fsa_calibration.py``), labelled with the run id. + +After the steps the run saves every tracked file they changed +(``git status --porcelain``) and every untracked file matching OUTPUT_GLOBS, +so ``collect`` brings receipts back. This is an experiment runner, not the +registered stage runner in tools/modal_us_stage.py; it writes nothing to the +Hub and publishes nothing. +""" + +from __future__ import annotations + +import hashlib +import json +import os +import shutil +import subprocess +import time +import urllib.request +import zipfile +from datetime import UTC, datetime +from pathlib import Path + +import modal + +REPO_URL = "https://github.com/PolicyEngine/microcosm.git" +HOST = { + "repo_id": "policyengine/populace-us", + "filename": "populace_us_2024.h5", + "revision": "8ab57ffc2ca41d8af631ff62ebbce95e966299f3", + "sha256": "6496cc4393d4d3c6574f76eca231de5898c803b9067645591fd5c4d3e65aee84", +} +# zip name -> (url, zip sha256, member, member sha256) +SCF_ZIPS = { + "scfp2025s.zip": ( + "https://www.federalreserve.gov/econres/files/scfp2025s.zip", + "32dcf86be48b20fb5fd9e659f79fa22a4d9cccf456e44b6ca9b1329e9869bbeb", + "rscfp2025.dta", + "454a287f188bf13f94efc09820fa878482d897db1d2a16ac63bec14eb580d2dd", + ), + "scf2025s.zip": ( + "https://www.federalreserve.gov/econres/files/scf2025s.zip", + "c4010bd5decaa13d5d027862ed4b6c41b4106925089290f879749f8f5a467741", + "p25i6.dta", + "38926275dfb8f00ea843b80ced7a9412ad4653d39c7fab8fe24c3bdf912902ad", + ), +} +#: The pinned US feed (us/chronicle_feed.json) and where it is rebuilt from. +PINNED_FEED = { + "repo": "https://github.com/PolicyEngine/chronicle.git", + "commit": "51aa40fd28e2ca81937752515e773d123fecfb71", + "facts_sha256": "965a29ac9458edb58a05184917ee4a19772fd3dc7b4588db6eb6da5803641aac", + "rows": 40178, +} +#: PolicyEngine/chronicle#347: the six FSA portfolio packages. +FSA_PACKAGES = { + "repo": "https://github.com/PolicyEngine/chronicle.git", + # The merge commit of chronicle#347 on Chronicle main (2026-10-22). Its + # packages/ed_fsa tree is the PR head's (81e3f98), whose FSA facts are the + # first draft's (4448a7c), the export the test fixture holds. The digest + # is of the LF export the container wrote at the PR head (run + # 20261022T194252Z-c94516ee1); a Windows build writes the same rows with + # CRLF endings. The run records whether the merge commit's export matches. + "commit": "acbedb5fef490137219207cf40945d70c2db34ea", + "facts_sha256": "58774e11cf63754f85be0a082c29b581033c304e5d26dc71b2b23eac0cc3f1d8", + "pull_request": "https://github.com/PolicyEngine/chronicle/pull/347", + "year": 2026, + "packages": [ + "packages/ed_fsa/portfolio_summary_fy2026_q3", + "packages/ed_fsa/portfolio_by_location_fy2026_q2", + "packages/ed_fsa/portfolio_by_age_fy2026_q2", + "packages/ed_fsa/portfolio_by_debt_size_fy2026_q2", + "packages/ed_fsa/portfolio_by_loan_type_fy2026_q3", + "packages/ed_fsa/dl_portfolio_by_repayment_plan_fy2026_q3", + ], + "rows": 461, +} +_TESTS = "packages/microcosm-build/tests" +_CALIBRATE_TESTS = "packages/microcosm-calibrate/tests" +#: step -> commands. A part "glob:" expands to the sorted matches. +STEPS: dict[str, list[list[str]]] = { + "tests": [ + [ + "{python}", + "-m", + "pytest", + "-q", + f"{_TESTS}/engine_free/us/test_us_fsa_student_loan_targets.py", + f"{_TESTS}/engine_free/us/test_us_fiscal_targets.py", + f"{_TESTS}/engine_free/us/test_us_chronicle_feed.py", + f"{_TESTS}/engine_free/shared/test_ledger_targets.py", + f"{_TESTS}/engine_free/shared/test_ledger_artifact.py", + f"{_TESTS}/engine_free/shared/test_release_target_parity.py", + f"{_CALIBRATE_TESTS}/engine_free/shared/test_provider_labels.py", + f"{_CALIBRATE_TESTS}/engine_free/shared/test_variable_labels.py", + ], + [ + "{python}", + "-m", + "pytest", + "-q", + f"{_TESTS}/engine_free/us/test_us_fiscal_refresh_builder.py", + "-k", + "ledger_filter or restated or scf_education_debt or parity or materializ", + ], + ], + "contract": [ + [ + "{python}", + "-m", + "pytest", + "-q", + f"{_TESTS}/engine_contract/us/test_us_fiscal_targets.py", + f"{_TESTS}/engine_contract/us/test_release_input_coverage.py", + ], + ], + "spec": [ + ["{python}", "tools/generate_us_bundle_from_constants.py", "--check"], + ["{python}", "tools/spec_engine_coverage.py", "--check"], + [ + "{python}", + "-m", + "pytest", + "-q", + f"glob:{_TESTS}/engine_free/shared/test_spec_engine_*.py", + f"{_TESTS}/engine_free/us/test_us_spec_bundle.py", + f"{_TESTS}/engine_free/us/test_us_bundle_core_contracts.py", + ], + ], + "feed": [], + "fit": [ + [ + "{python}", + "experiments/fit_1074_fsa_calibration.py", + "--h5", + "{h5}", + "--feed", + "{feed}", + "--feed-provenance", + "{feed_provenance}", + "--scf-cache-dir", + "{scf}", + "--diagnostics-dir", + "{results}/diagnostics", + "--materialization-cache-dir", + "/cache/materialization", + "--run", + "{run_id}", + ] + ], +} +OUTPUT_GLOBS = ("experiments/receipts/1074-*.json", "experiments/1074-*.md") +CPU = 8.0 +# The whole 57,240-household support in one engine peaks near 88 GB. +MEMORY_MB = 131072 + +image = ( + modal.Image.debian_slim(python_version="3.14") + .apt_install("git") + .pip_install("uv==0.11.7", "huggingface_hub") +) +app = modal.App("microcosm-1074-experiments") +cache = modal.Volume.from_name("microcosm-1074-cache", create_if_missing=True) +CACHE = Path("/cache") +WORK = Path("/work/microcosm") +VENV = Path("/opt/venv") + + +def _sha256(path: Path) -> str: + digest = hashlib.sha256() + with path.open("rb") as handle: + for block in iter(lambda: handle.read(1 << 20), b""): + digest.update(block) + return digest.hexdigest() + + +def _verified(path: Path, sha256: str) -> bool: + return path.exists() and _sha256(path) == sha256 + + +def _clean_env(**overrides: str) -> dict[str, str]: + """The container environment without the Modal runtime's Python path. + + Modal puts its own client and dependencies (under /pkg) on PYTHONPATH. A + subprocess that inherits it sees those packages beside the venv's, and the + build's worker-identity check refuses the duplicates (e.g. idna). + """ + env = { + key: value + for key, value in os.environ.items() + if key not in {"PYTHONPATH", "PYTHONHOME", "PYTHONSTARTUP"} + } + env.update(overrides) + return env + + +def _uv_env(**overrides: str) -> dict[str, str]: + # A Modal volume cannot host uv's cache: uv persists temporary files by + # atomic rename, which the volume refuses. + return _clean_env(UV_CACHE_DIR="/root/.cache/uv", UV_LINK_MODE="copy", **overrides) + + +def _clone(url: str, commit: str, target: Path) -> None: + target.mkdir(parents=True, exist_ok=True) + run = lambda *args: subprocess.run(args, cwd=target, check=True) # noqa: E731 + run("git", "init", "-q") + run("git", "remote", "add", "origin", url) + run("git", "fetch", "-q", "--depth", "1", "origin", commit) + run("git", "checkout", "-q", "--detach", "FETCH_HEAD") + head = subprocess.run( + ["git", "rev-parse", "HEAD"], + cwd=target, + check=True, + capture_output=True, + text=True, + ).stdout.strip() + if head != commit: + raise RuntimeError(f"{url}: checked out {head}, expected {commit}") + + +def _checkout(commit: str) -> None: + _clone(REPO_URL, commit, WORK) + subprocess.run( + ["uv", "sync", "--all-packages", "--extra", "us", "--frozen"], + cwd=WORK, + env=_uv_env(UV_PROJECT_ENVIRONMENT=str(VENV)), + check=True, + ) + + +def _inputs() -> dict[str, Path]: + from huggingface_hub import hf_hub_download + + host_dir = CACHE / "host" / HOST["revision"] + host = host_dir / HOST["filename"] + if not _verified(host, HOST["sha256"]): + hf_hub_download( + repo_id=HOST["repo_id"], + filename=HOST["filename"], + revision=HOST["revision"], + repo_type="dataset", + local_dir=host_dir, + ) + if not _verified(host, HOST["sha256"]): + raise RuntimeError("host H5 sha256 mismatch") + zips = CACHE / "scf" / "zips" + scf = CACHE / "scf" / "dta" + zips.mkdir(parents=True, exist_ok=True) + scf.mkdir(parents=True, exist_ok=True) + for name, (url, zip_sha, member, member_sha) in SCF_ZIPS.items(): + archive = zips / name + if not _verified(archive, zip_sha): + request = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) + with urllib.request.urlopen(request, timeout=600) as response: + archive.write_bytes(response.read()) + if not _verified(archive, zip_sha): + raise RuntimeError(f"{name} sha256 mismatch") + target = scf / member + if not _verified(target, member_sha): + with zipfile.ZipFile(archive) as bundle: + target.write_bytes(bundle.read(member)) + if not _verified(target, member_sha): + raise RuntimeError(f"{member} sha256 mismatch") + cache.commit() + return {"h5": host, "zips": zips, "scf": scf} + + +def _pinned_feed(log) -> Path: + """The pinned US feed, rebuilt at its Chronicle commit and sha-checked.""" + + feeds = CACHE / "feeds" + feeds.mkdir(parents=True, exist_ok=True) + path = feeds / f"consumer_facts_us_{PINNED_FEED['commit'][:7]}.jsonl" + if _verified(path, PINNED_FEED["facts_sha256"]): + return path + root = Path("/work/chronicle-pinned") + _clone(PINNED_FEED["repo"], PINNED_FEED["commit"], root) + subprocess.run(["uv", "sync", "--frozen"], cwd=root, env=_uv_env(), check=True) + out = Path("/tmp/us-feed") + t0 = time.time() + subprocess.run( + [ + str(VENV / "bin" / "python"), + "tools/build_us_chronicle_feed.py", + "--chronicle-root", + str(root), + "--out", + str(out), + "--replace", + "--skip-artifact", + ], + cwd=WORK, + env=_uv_env(), + check=True, + ) + log["pinned_feed_build_seconds"] = round(time.time() - t0, 1) + built = out / "consumer_facts.jsonl" + if not _verified(built, PINNED_FEED["facts_sha256"]): + raise RuntimeError( + f"rebuilt US feed sha256 {_sha256(built)} != pinned " + f"{PINNED_FEED['facts_sha256']}" + ) + shutil.copyfile(built, path) + cache.commit() + return path + + +def _fsa_rows(log) -> Path: + """The FSA packages' consumer facts at chronicle#347's merge commit.""" + + feeds = CACHE / "feeds" + path = feeds / f"ed_fsa_{FSA_PACKAGES['commit'][:7]}.jsonl" + receipt = feeds / f"ed_fsa_{FSA_PACKAGES['commit'][:7]}.json" + if path.exists() and receipt.exists(): + if json.loads(receipt.read_text())["sha256"] == _sha256(path): + return path + root = Path("/work/chronicle-fsa") + _clone(FSA_PACKAGES["repo"], FSA_PACKAGES["commit"], root) + subprocess.run(["uv", "sync", "--frozen"], cwd=root, env=_uv_env(), check=True) + out = Path("/tmp/fsa-bundle") + command = [ + "uv", + "run", + "--frozen", + "chronicle", + "build-bundle", + "--year", + str(FSA_PACKAGES["year"]), + *[ + part + for package in FSA_PACKAGES["packages"] + for part in ("--source", package) + ], + "--out", + str(out), + "--replace", + ] + subprocess.run( + command, cwd=root, env=_uv_env(), check=True, stdout=subprocess.DEVNULL + ) + built = out / "consumer_facts.jsonl" + rows = [line for line in built.read_bytes().splitlines() if line.strip()] + if len(rows) != FSA_PACKAGES["rows"]: + raise RuntimeError(f"FSA bundle has {len(rows)} rows, expected 461") + shutil.copyfile(built, path) + sha256 = _sha256(path) + receipt.write_text( + json.dumps( + { + "sha256": sha256, + "matches_facts_sha256": sha256 == FSA_PACKAGES["facts_sha256"], + "command": command, + }, + indent=1, + ), + encoding="utf-8", + ) + log["fsa_command"] = command + cache.commit() + return path + + +def _candidate_feed(log) -> tuple[Path, Path]: + """The pinned feed plus the FSA rows, sorted by aggregate_fact_key.""" + + pinned = _pinned_feed(log) + fsa = _fsa_rows(log) + feeds = CACHE / "feeds" + path = feeds / ( + f"candidate_us_{PINNED_FEED['commit'][:7]}_ed_fsa_" + f"{FSA_PACKAGES['commit'][:7]}.jsonl" + ) + provenance = path.with_suffix(".provenance.json") + if path.exists() and provenance.exists(): + if json.loads(provenance.read_text())["candidate_sha256"] == _sha256(path): + return path, provenance + pinned_rows = [line for line in pinned.read_bytes().splitlines() if line.strip()] + fsa_rows = [line for line in fsa.read_bytes().splitlines() if line.strip()] + keys = {} + ids = set() + for line in pinned_rows: + row = json.loads(line) + keys[row["aggregate_fact_key"]] = line + ids.add(row["lineage"]["source_record_id"]) + for line in fsa_rows: + row = json.loads(line) + if ( + row["aggregate_fact_key"] in keys + or row["lineage"]["source_record_id"] in ids + ): + raise RuntimeError( + f"FSA row collides with the pinned feed: {row['lineage']}" + ) + keys[row["aggregate_fact_key"]] = line + payload = b"".join(keys[key] + b"\n" for key in sorted(keys)) + path.write_bytes(payload) + provenance.write_text( + json.dumps( + { + "kind": "reviewed diagnostic candidate (not a pin)", + "pinned_feed": {**PINNED_FEED, "path": pinned.name}, + "fsa_packages": { + **FSA_PACKAGES, + "path": fsa.name, + "sha256": _sha256(fsa), + "matches_facts_sha256": _sha256(fsa) + == FSA_PACKAGES["facts_sha256"], + }, + "rule": ( + "pinned feed rows plus the FSA rows, no shared " + "aggregate_fact_key or source_record_id, sorted by " + "aggregate_fact_key" + ), + "rows": len(keys), + "candidate_sha256": _sha256(path), + }, + indent=1, + ), + encoding="utf-8", + ) + cache.commit() + return path, provenance + + +def _expand(command: list[str], fields: dict[str, str]) -> list[str]: + parts: list[str] = [] + for part in command: + if part.startswith("glob:"): + matches = sorted(WORK.glob(part.removeprefix("glob:"))) + if not matches: + raise RuntimeError(f"{part} matched nothing") + parts.extend(str(path.relative_to(WORK)) for path in matches) + else: + parts.append(part.format(**fields)) + return parts + + +def _save_changed_files(target_root: Path) -> list[str]: + """Copy tracked files the steps changed, and new outputs, under target_root.""" + + status = subprocess.run( + ["git", "status", "--porcelain", "--untracked-files=all"], + cwd=WORK, + check=True, + capture_output=True, + text=True, + ).stdout.splitlines() + saved = [] + for line in status: + code, rel = line[:2], line[3:] + path = WORK / rel + untracked = code == "??" + if untracked and not any(path.match(p) for p in OUTPUT_GLOBS): + continue + if not path.is_file(): + continue + target = target_root / rel + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(path.read_bytes()) + saved.append(f"{code} {rel}") + return saved + + +@app.function( + image=image, cpu=2.0, memory=8192, timeout=3600, volumes={"/cache": cache} +) +def preflight_remote(commit: str) -> dict: + """Clone, sync and stage the inputs without running a step.""" + started = time.time() + _checkout(commit) + paths = _inputs() + probe = subprocess.run( + [ + str(VENV / "bin" / "python"), + "-c", + "import microcosm.build.us_runtime.fsa_student_loan_targets as m; " + "print(m.__file__)", + ], + cwd=WORK, + capture_output=True, + text=True, + ) + return { + "commit": commit, + "inputs": {key: str(path) for key, path in paths.items()}, + "import_ok": probe.returncode == 0, + "import_output": (probe.stdout + probe.stderr)[-2000:], + "seconds": round(time.time() - started, 1), + } + + +# Non-preemptible, as tools/modal_us_stage.py runs its heavy stages: a +# preempted container restarts the whole run from the clone. +@app.function( + image=image, + cpu=CPU, + memory=MEMORY_MB, + timeout=8 * 3600, + volumes={"/cache": cache}, + retries=0, + nonpreemptible=True, +) +def run_steps( + commit: str, steps: list[str], run_id: str, script_text: str = "" +) -> dict: + import resource # Unix-only; the local entrypoint runs on Windows too + + started = datetime.now(UTC) + _checkout(commit) + paths = _inputs() + out = CACHE / "results" / run_id + out.mkdir(parents=True, exist_ok=True) + fields = {key: str(path) for key, path in paths.items()} | { + "python": str(VENV / "bin" / "python"), + "run_id": run_id, + "results": str(out), + } + log = { + "run_id": run_id, + "commit": commit, + "steps": [], + "cpu": CPU, + "memory_mb": MEMORY_MB, + "inputs": {"host": HOST, "scf": {k: v[1] for k, v in SCF_ZIPS.items()}}, + "started_at": started.isoformat(), + } + if {"feed", "fit"} & set(steps): + feed_log: dict[str, object] = {} + feed, provenance = _candidate_feed(feed_log) + fields |= {"feed": str(feed), "feed_provenance": str(provenance)} + log["feed"] = { + **json.loads(provenance.read_text()), + **feed_log, + "path": str(feed), + } + threads = str(int(CPU)) + env = _clean_env( + PYTHONUNBUFFERED="1", + OMP_NUM_THREADS=threads, + MKL_NUM_THREADS=threads, + OPENBLAS_NUM_THREADS=threads, + ) + failed = False + for step in steps: + if step == "script": + # An uncommitted local probe passed by --script; it runs in the + # clone like any step, and the run log records its text. + (WORK / "_modal_probe.py").write_text(script_text, encoding="utf-8") + log["script_sha256"] = hashlib.sha256(script_text.encode()).hexdigest() + commands = [[fields["python"], "_modal_probe.py"]] + else: + commands = [_expand(command, fields) for command in STEPS[step]] + before = resource.getrusage(resource.RUSAGE_CHILDREN).ru_maxrss + t0 = time.time() + returncodes = [] + with (out / f"{step}.log").open("w", encoding="utf-8") as handle: + for command in commands: + handle.write("$ " + " ".join(command) + "\n") + handle.flush() + result = subprocess.run( + command, + cwd=WORK, + env=env, + stdout=handle, + stderr=subprocess.STDOUT, + text=True, + ) + returncodes.append(result.returncode) + if result.returncode != 0: + break + peak_kb = resource.getrusage(resource.RUSAGE_CHILDREN).ru_maxrss + log["steps"].append( + { + "step": step, + "commands": commands, + "returncodes": returncodes, + "returncode": next((code for code in returncodes if code), 0), + "seconds": round(time.time() - t0, 1), + "peak_child_rss_gb": round(max(peak_kb, before) / 1024 / 1024, 2), + } + ) + cache.commit() + if any(returncodes): + failed = True + break + log["failed"] = failed + log["changed_files"] = _save_changed_files(out / "files") + log["finished_at"] = datetime.now(UTC).isoformat() + (out / "run.json").write_text(json.dumps(log, indent=2) + "\n", encoding="utf-8") + cache.commit() + return log + + +@app.function(image=image, volumes={"/cache": cache}) +def fetch_results(run_id: str) -> dict[str, bytes]: + root = CACHE / "results" / run_id + return { + str(p.relative_to(root)): p.read_bytes() + for p in root.rglob("*") + if p.is_file() and "diagnostics" not in p.parts + } + + +def _check_commit(commit: str) -> None: + if len(commit) != 40 or any(c not in "0123456789abcdef" for c in commit): + raise SystemExit("--commit must be a full 40-hex sha that is pushed to GitHub") + + +def _names(steps: str, script: str) -> tuple[list[str], str]: + names = [s for s in steps.split(",") if s] + script_text = Path(script).read_text(encoding="utf-8") if script else "" + if script and "script" not in names: + names.append("script") + unknown = sorted(set(names) - set(STEPS) - {"script"}) + if unknown: + raise SystemExit(f"unknown steps: {unknown}") + return names, script_text + + +@app.local_entrypoint() +def preflight(commit: str) -> None: + _check_commit(commit) + print(json.dumps(preflight_remote.remote(commit), indent=2)) + + +@app.local_entrypoint() +def launch(commit: str, steps: str = "tests", script: str = "") -> None: + """Spawn the run and exit at once (use with ``modal run --detach``). + + A client attached for the whole run cancels the remote input when it is + stopped (for example when the machine runs low on memory), even under + --detach. ``launch`` returns as soon as the call is spawned, so nothing + local can cancel it; ``collect`` fetches the results. + """ + _check_commit(commit) + names, script_text = _names(steps, script) + run_id = datetime.now(UTC).strftime("%Y%m%dT%H%M%SZ") + "-" + commit[:9] + call = run_steps.spawn(commit, names, run_id, script_text) + print(f"run_id={run_id}") + print(f"function_call_id={call.object_id}") + + +@app.local_entrypoint() +def collect(run_id: str, logs_dir: str = "") -> None: + """Write a run's changed files into this checkout and its logs to logs_dir.""" + repo = Path(__file__).resolve().parents[1] + logs = ( + Path(logs_dir) + if logs_dir + else Path.home() / ".cache" / "microcosm" / "modal-1074" / run_id + ) + logs.mkdir(parents=True, exist_ok=True) + for rel, data in fetch_results.remote(run_id).items(): + if rel.startswith("files/"): + target = repo / rel.removeprefix("files/") + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(data) + print("file", target.relative_to(repo)) + else: + (logs / rel).write_bytes(data) + print("log", logs / rel) diff --git a/experiments/receipts/1074-fsa-calibration-fit.json b/experiments/receipts/1074-fsa-calibration-fit.json new file mode 100644 index 000000000..419f6c9fd --- /dev/null +++ b/experiments/receipts/1074-fsa-calibration-fit.json @@ -0,0 +1,10564 @@ +{ + "schema_version": 1, + "issue": "PolicyEngine/microcosm#1074", + "generated_at": "2026-10-23", + "provenance": { + "commit": "4b6bfce9a240cd44c45210fbf508640d8402343d", + "run": "20261023T191527Z-4b6bfce9a" + }, + "host": { + "release": "populace-us-2024-spm-20260915", + "sha256": "6496cc4393d4d3c6574f76eca231de5898c803b9067645591fd5c4d3e65aee84", + "households": 57240, + "people": 166321, + "scf_stage_seed": 0, + "scf_stage_gate_passed": true, + "engine_adaptation": { + "formula_owned_dropped": { + "person": [ + "has_marketplace_health_coverage" + ] + }, + "renamed": {} + } + }, + "feed": { + "candidate_sha256": "d8e3d0fd9e2113ba95e561ff2c746ed5edd28b9f65885c3deb55b7e88ec94d45", + "rows": 40639, + "provenance": { + "kind": "reviewed diagnostic candidate (not a pin)", + "pinned_feed": { + "repo": "https://github.com/PolicyEngine/chronicle.git", + "commit": "51aa40fd28e2ca81937752515e773d123fecfb71", + "facts_sha256": "965a29ac9458edb58a05184917ee4a19772fd3dc7b4588db6eb6da5803641aac", + "rows": 40178, + "path": "consumer_facts_us_51aa40f.jsonl" + }, + "fsa_packages": { + "repo": "https://github.com/PolicyEngine/chronicle.git", + "commit": "acbedb5fef490137219207cf40945d70c2db34ea", + "facts_sha256": "58774e11cf63754f85be0a082c29b581033c304e5d26dc71b2b23eac0cc3f1d8", + "pull_request": "https://github.com/PolicyEngine/chronicle/pull/347", + "year": 2026, + "packages": [ + "packages/ed_fsa/portfolio_summary_fy2026_q3", + "packages/ed_fsa/portfolio_by_location_fy2026_q2", + "packages/ed_fsa/portfolio_by_age_fy2026_q2", + "packages/ed_fsa/portfolio_by_debt_size_fy2026_q2", + "packages/ed_fsa/portfolio_by_loan_type_fy2026_q3", + "packages/ed_fsa/dl_portfolio_by_repayment_plan_fy2026_q3" + ], + "rows": 461, + "path": "ed_fsa_acbedb5.jsonl", + "sha256": "58774e11cf63754f85be0a082c29b581033c304e5d26dc71b2b23eac0cc3f1d8", + "matches_facts_sha256": true + }, + "rule": "pinned feed rows plus the FSA rows, no shared aggregate_fact_key or source_record_id, sorted by aggregate_fact_key", + "rows": 40639, + "candidate_sha256": "d8e3d0fd9e2113ba95e561ff2c746ed5edd28b9f65885c3deb55b7e88ec94d45" + } + }, + "solver": { + "kernel": "microcosm.calibrate.calibrate (dense refit, no L0)", + "epochs": 1500, + "learning_rate": 0.02, + "max_weight_ratio": 5.0, + "l2_lambda": 0.0, + "mass": "conserve", + "target_surface": "national_state", + "age_targets": true, + "loss": { + "a_no_fsa": { + "initial": 0.03675158694386482, + "final": 0.01565397913686619, + "seconds": 92.772574701 + }, + "b_with_fsa": { + "initial": 0.05507756769657135, + "final": 0.01628154753487812, + "seconds": 88.44137602299998 + }, + "a_no_fsa_l2": { + "initial": 0.03675158694386482, + "final": 0.019865802644470798, + "seconds": 87.35640279799998 + }, + "b_with_fsa_l2": { + "initial": 0.05507756769657135, + "final": 0.019343231231045796, + "seconds": 89.61900807300003 + } + }, + "arms": { + "a_no_fsa": { + "with_fsa": false, + "targets": 6102, + "l2_lambda": 0.0 + }, + "b_with_fsa": { + "with_fsa": true, + "targets": 6234, + "l2_lambda": 0.0 + }, + "a_no_fsa_l2": { + "with_fsa": false, + "targets": 6102, + "l2_lambda": 0.03 + }, + "b_with_fsa_l2": { + "with_fsa": true, + "targets": 6234, + "l2_lambda": 0.03 + } + }, + "surface": { + "mode": "national_state", + "compiled_targets": 33382, + "calibrated_targets": 6234, + "dropped_congressional_district_targets": 27148 + } + }, + "fsa": { + "status": "bound", + "reference_period": "2026-03", + "reference_label": "Data as of Mar. 31, 2026", + "period_alignment": "stock_at_source_reference_date", + "controls": { + "borrowers": { + "published_states_and_dc": 42375900.0, + "published_out_of_scope": 433400.0, + "published_not_reported": 1953300.0, + "published_total": 44762600.0, + "not_reported_allocation_factor": 1.0456279359858722, + "in_scope_control": 44309424.85254373, + "in_scope_share_of_total": 0.989876031609954 + }, + "total_balance": { + "published_states_and_dc": 1627400000000.0, + "published_out_of_scope": 16700000000.0, + "published_not_reported": 52200000000.0, + "published_total": 1696300000000.0, + "not_reported_allocation_factor": 1.0317498935587859, + "in_scope_control": 1679069776777.568, + "in_scope_share_of_total": 0.9898424670032235 + } + }, + "disposition_counts": { + "allocated": 4, + "bound": 136, + "diagnostic": 251, + "excluded": 8, + "other_quarter": 58, + "out_of_scope": 4 + }, + "dispositions": [ + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q2.recipients.direct_loans.recipients", + "table": "portfolio_summary", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ar.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ar.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.alternative.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q2.recipients.income_based_without_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.grad_plus.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "A member of the balance-excluding-Parent-PLUS target: the build records own and Parent PLUS balances, not loan types.", + "target": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.excluding_parent_plus.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.level_over_10_years.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nm.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nm.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.recipients.parent_plus.recipients", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.me.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.me.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.mn.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.mn.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.mi.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.mi.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.other.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.income_based.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.az.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.az.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.income_based.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.pa.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.pa.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ks.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ks.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.recipients.stafford_unsubsidized.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "recipients", + "disposition": "excluded", + "reason": "Loan-type recipient counts are loan-level (a borrower with two loan types counts twice), so they are not counts of people." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.co.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.co.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q2.recipients.income_based_without_pfh.recipients", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_10k_to_20k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_10k_to_20k.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.pay_as_you_earn_with_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.income_contingent.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.mt.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.mt.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.save.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ak.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ak.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q2.recipients.pay_as_you_earn_with_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ca.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ca.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ut.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ut.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.save.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_100k_to_200k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.not_reported.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "allocated", + "reason": "'Not Reported' (FFEL and Perkins loans whose commercial lenders need not report an address) has no state; it is allocated to every reported location in proportion to that location's reported value." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_100k_to_200k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.other.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nh.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nh.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.pay_as_you_earn_without_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.fl.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.fl.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.save.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.pay_as_you_earn_with_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.pay_as_you_earn.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q2.recipients.ffel.recipients", + "table": "portfolio_summary", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_5k_to_10k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_80k_to_100k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ms.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ms.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.level_over_10_years.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q1.unduplicated_recipients.all.unduplicated_recipients", + "table": "portfolio_summary", + "period": "2025-12", + "measure": "unduplicated_recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.dc.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.dc.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_5k_to_10k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_5k_to_10k.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.dollars_outstanding.income_sensitive.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.income_contingent.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.sd.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.sd.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_24_and_younger.borrowers", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_24_and_younger.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.income_based.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.recipients.income_sensitive.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.dollars_outstanding.alternative.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.mo.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.mo.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ar.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ar.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q2.recipients.income_based_without_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.id.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.id.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_not_reported.borrowers", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "borrowers", + "disposition": "allocated", + "reason": "Age not reported: in no partition, so the reported bands, which bind as shares of the in-scope control, absorb it pro rata." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.borrowers.age_24_and_younger.borrowers", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q3.unduplicated_recipients.all.unduplicated_recipients", + "table": "portfolio_summary", + "period": "2026-06", + "measure": "unduplicated_recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q3.recipients.perkins.recipients", + "table": "portfolio_summary", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q3.recipients.income_based_without_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.other.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "out_of_scope", + "reason": "'Other' is a borrower address outside the states and territories the table lists, outside the host universe; it leaves the in-scope control with its pro-rata share of Not Reported." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.not_reported.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "allocated", + "reason": "'Not Reported' (FFEL and Perkins loans whose commercial lenders need not report an address) has no state; it is allocated to every reported location in proportion to that location's reported value." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.other.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.de.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.de.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q3.recipients.income_based_with_pfh.recipients", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.level_over_10_years.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.pay_as_you_earn.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ga.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ga.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ok.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ok.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.dollars_outstanding.grad_plus.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.pr.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "out_of_scope", + "reason": "Puerto Rico is outside the host universe (the CPS samples the 50 states and DC). Its rows, with their pro-rata share of Not Reported, leave the in-scope control." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_24_and_younger.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_24_and_younger.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.graduated_10_years_or_less.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ga.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ga.borrowers" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.recipients.level_over_10_years.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_62_and_older.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_62_and_older.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.pay_as_you_earn_with_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.dollars_outstanding.other.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.dollars_outstanding.stafford_unsubsidized.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_less_than_5k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.md.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.md.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q1.recipients.ffel.recipients", + "table": "portfolio_summary", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_80k_to_100k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_80k_to_100k.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.borrowers.age_not_reported.borrowers", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.borrowers.age_62_and_older.borrowers", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.income_contingent.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.recipients.consolidation.recipients", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q3.recipients.pay_as_you_earn_without_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nj.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nj.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.recipients.consolidation.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "recipients", + "disposition": "excluded", + "reason": "Loan-type recipient counts are loan-level (a borrower with two loan types counts twice), so they are not counts of people." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.save.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q3.recipients.pay_as_you_earn_with_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.save.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.dollars_outstanding.income_based.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ne.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ne.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.graduated_10_years_or_less.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_40k_to_60k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_40k_to_60k.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.dollars_outstanding.perkins.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.tx.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.tx.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.stafford_combined_unique_recipients.stafford_combined.stafford_combined_unique_recipients", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "stafford_combined_unique_recipients", + "disposition": "excluded", + "reason": "Stafford (Combined) is a subtotal of rows the loan-type targets already count." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.graduated_10_years_or_less.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.dollars_outstanding.age_50_to_61.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_40k_to_60k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.dollars_outstanding.stafford_subsidized.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.save.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_10k_to_20k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_10k_to_20k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.income_contingent.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.pay_as_you_earn_with_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.level_10_years_or_less.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.pay_as_you_earn_without_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.income_contingent.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.dollars_outstanding.other.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.dollars_outstanding.income_based.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.recipients.level_10_years_or_less.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.or.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.or.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.level_10_years_or_less.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q2.dollars_outstanding.direct_loans.dollars_outstanding", + "table": "portfolio_summary", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.recipients.perkins.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "recipients", + "disposition": "excluded", + "reason": "Loan-type recipient counts are loan-level (a borrower with two loan types counts twice), so they are not counts of people." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nc.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nc.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.consolidation.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "A member of the balance-excluding-Parent-PLUS target: the build records own and Parent PLUS balances, not loan types.", + "target": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.excluding_parent_plus.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.income_based.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.recipients.level_over_10_years.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_5k_to_10k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q1.recipients.pay_as_you_earn_with_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nh.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nh.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.income_based.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.income_sensitive.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.income_based.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.stafford_combined_unique_recipients.stafford_combined.stafford_combined_unique_recipients", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "stafford_combined_unique_recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q1.recipients.pay_as_you_earn_with_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.save.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.pay_as_you_earn_without_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.graduated_over_10_years.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_35_to_49.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_35_to_49.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.tn.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.tn.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.income_contingent.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.borrowers.age_35_to_49.borrowers", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.other.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.recipients.level_over_10_years.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.income_contingent.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ct.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ct.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ma.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ma.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.graduated_over_10_years.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nd.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nd.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.sc.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.sc.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.income_sensitive.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.graduated_10_years_or_less.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.save.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q1.recipients.income_based_without_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.income_sensitive.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ok.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ok.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.recipients.stafford_subsidized.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.income_contingent.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.level_over_10_years.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.dollars_outstanding.other.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_60k_to_80k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_60k_to_80k.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.dollars_outstanding.consolidation.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q3.recipients.income_based_without_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.recipients.parent_plus.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.dollars_outstanding.income_based.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.recipients.income_sensitive.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.wi.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.wi.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nm.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nm.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_40k_to_60k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.alternative.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ny.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ny.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q2.recipients.income_based_with_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.mi.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.mi.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.recipients.grad_plus.recipients", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.pay_as_you_earn.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q1.recipients.income_based_without_pfh.recipients", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.mo.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.mo.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.borrowers.age_50_to_61.borrowers", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q1.recipients.income_based_without_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.save.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.income_based.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.dollars_outstanding.consolidation.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.pr.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "out_of_scope", + "reason": "Puerto Rico is outside the host universe (the CPS samples the 50 states and DC). Its rows, with their pro-rata share of Not Reported, leave the in-scope control." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.level_10_years_or_less.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.sd.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.sd.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.recipients.alternative.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_20k_to_40k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_20k_to_40k.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_50_to_61.borrowers", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_50_to_61.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.mt.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.mt.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.dollars_outstanding.parent_plus.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_50_to_61.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_50_to_61.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.il.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.il.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q3.recipients.pay_as_you_earn_without_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.pay_as_you_earn.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ky.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ky.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.income_based.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ca.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ca.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q1.dollars_outstanding.perkins.dollars_outstanding", + "table": "portfolio_summary", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.pay_as_you_earn.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.dc.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.dc.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.alternative.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ri.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ri.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.other.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.dollars_outstanding.income_sensitive.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q1.recipients.perkins.recipients", + "table": "portfolio_summary", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q2.recipients.income_based_with_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.dollars_outstanding.age_24_and_younger.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.level_10_years_or_less.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.sc.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.sc.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q2.recipients.pay_as_you_earn_without_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.dollars_outstanding.alternative.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.income_based.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_less_than_5k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_less_than_5k.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.income_sensitive.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.wy.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.wy.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.recipients.income_sensitive.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.recipients.perkins.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q1.dollars_outstanding.all.dollars_outstanding", + "table": "portfolio_summary", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.level_10_years_or_less.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_20k_to_40k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_20k_to_40k.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_20k_to_40k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_35_to_49.borrowers", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_35_to_49.borrowers" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.dollars_outstanding.income_sensitive.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.pay_as_you_earn.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ct.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ct.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q2.recipients.perkins.recipients", + "table": "portfolio_summary", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.hi.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.hi.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.va.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.va.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q3.recipients.income_based_with_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.dollars_outstanding.stafford_subsidized.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q3.recipients.pay_as_you_earn_with_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nv.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nv.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ak.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ak.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.vt.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.vt.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ia.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ia.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.graduated_over_10_years.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.recipients.graduated_over_10_years.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.alternative.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_80k_to_100k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_80k_to_100k.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_200k_plus.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_200k_plus.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.pay_as_you_earn_without_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.stafford_combined_unique_recipients.stafford_combined.stafford_combined_unique_recipients", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "stafford_combined_unique_recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.income_based.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.recipients.graduated_10_years_or_less.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ne.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ne.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q1.recipients.direct_loans.recipients", + "table": "portfolio_summary", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ia.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ia.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q3.recipients.income_based_with_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q2.recipients.pay_as_you_earn_with_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.al.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.al.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.income_sensitive.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.hi.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.hi.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.recipients.stafford_subsidized.recipients", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_not_reported.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "allocated", + "reason": "Age not reported: in no partition, so the reported bands, which bind as shares of the in-scope control, absorb it pro rata." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.other.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.pay_as_you_earn.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.save.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.income_contingent.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.pay_as_you_earn_without_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.recipients.level_10_years_or_less.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.tx.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.tx.borrowers" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.recipients.graduated_over_10_years.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.recipients.income_based.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.me.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.me.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.other.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.in.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.in.borrowers" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q2.dollars_outstanding.perkins.dollars_outstanding", + "table": "portfolio_summary", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q1.dollars_outstanding.direct_loans.dollars_outstanding", + "table": "portfolio_summary", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q3.recipients.ffel.recipients", + "table": "portfolio_summary", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.alternative.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q1.dollars_outstanding.ffel.dollars_outstanding", + "table": "portfolio_summary", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q1.recipients.pay_as_you_earn_without_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.or.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.or.borrowers" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.recipients.graduated_10_years_or_less.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_less_than_5k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.de.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.de.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.dollars_outstanding.age_35_to_49.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.recipients.grad_plus.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_25_to_34.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_25_to_34.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ks.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ks.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.recipients.consolidation.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_60k_to_80k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_60k_to_80k.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.stafford_subsidized.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "A member of the balance-excluding-Parent-PLUS target: the build records own and Parent PLUS balances, not loan types.", + "target": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.excluding_parent_plus.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q2.unduplicated_recipients.all.unduplicated_recipients", + "table": "portfolio_summary", + "period": "2026-03", + "measure": "unduplicated_recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.pay_as_you_earn_with_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.level_over_10_years.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_20k_to_40k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.pay_as_you_earn.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.graduated_10_years_or_less.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.save.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_25_to_34.borrowers", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_25_to_34.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.alternative.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.alternative.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_40k_to_60k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_40k_to_60k.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q2.dollars_outstanding.all.dollars_outstanding", + "table": "portfolio_summary", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.graduated_over_10_years.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.recipients.stafford_subsidized.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "recipients", + "disposition": "excluded", + "reason": "Loan-type recipient counts are loan-level (a borrower with two loan types counts twice), so they are not counts of people." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.la.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.la.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_less_than_5k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_less_than_5k.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_60k_to_80k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.graduated_10_years_or_less.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ri.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ri.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ny.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ny.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.stafford_unsubsidized.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "A member of the balance-excluding-Parent-PLUS target: the build records own and Parent PLUS balances, not loan types.", + "target": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.excluding_parent_plus.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.wi.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.wi.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_100k_to_200k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_100k_to_200k.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.dollars_outstanding.age_not_reported.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_5k_to_10k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_5k_to_10k.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.alternative.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.recipients.parent_plus.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "recipients", + "disposition": "excluded", + "reason": "Loan-type recipient counts are loan-level (a borrower with two loan types counts twice), so they are not counts of people." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.recipients.graduated_10_years_or_less.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.stafford_combined_dollars_outstanding.stafford_combined.stafford_combined_dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "stafford_combined_dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nj.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nj.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.stafford_combined_dollars_outstanding.stafford_combined.stafford_combined_dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "stafford_combined_dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.perkins.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "A member of the balance-excluding-Parent-PLUS target: the build records own and Parent PLUS balances, not loan types.", + "target": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.excluding_parent_plus.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.pay_as_you_earn.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.recipients.grad_plus.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "recipients", + "disposition": "excluded", + "reason": "Loan-type recipient counts are loan-level (a borrower with two loan types counts twice), so they are not counts of people." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_200k_plus.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_200k_plus.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.wy.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.wy.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.wv.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.wv.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.alternative.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.recipients.stafford_unsubsidized.recipients", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_200k_plus.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.borrowers.age_25_to_34.borrowers", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ut.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ut.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.dollars_outstanding.grad_plus.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.il.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.il.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q2.dollars_outstanding.ffel.dollars_outstanding", + "table": "portfolio_summary", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.co.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.co.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.va.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.va.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q2.recipients.pay_as_you_earn_without_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nd.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nd.borrowers" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.dollars_outstanding.alternative.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q2.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.recipients.other.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.mn.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.mn.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.income_based.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.md.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.md.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q3.dollars_outstanding.direct_loans.dollars_outstanding", + "table": "portfolio_summary", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.recipients.alternative.recipients", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q1.recipients.perkins.recipients", + "table": "portfolio_by_loan_type", + "period": "2025-12", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.oh.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.oh.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.wa.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.wa.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q3.dollars_outstanding.income_based_without_pfh.dollars_outstanding", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q1.recipients.pay_as_you_earn_without_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.recipients.alternative.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ma.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ma.borrowers" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q2.recipients.income_based_with_pfh.recipients", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.parent_plus.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Parent PLUS share of the in-scope control.", + "target": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.parent_plus.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.dollars_outstanding.parent_plus.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q3.recipients.direct_loans.recipients", + "table": "portfolio_summary", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.tn.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.tn.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.az.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.az.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.recipients.level_10_years_or_less.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_10k_to_20k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_10k_to_20k.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.dollars_outstanding.perkins.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.dollars_outstanding.graduated_10_years_or_less.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.pa.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.pa.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.dollars_outstanding.stafford_unsubsidized.dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.level_10_years_or_less.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.recipients.pay_as_you_earn.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q1.recipients.income_based_with_pfh.recipients", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.fl.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.fl.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ky.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ky.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.id.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.id.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.pay_as_you_earn.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q3.dollars_outstanding.ffel.dollars_outstanding", + "table": "portfolio_summary", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.vt.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.vt.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.income_contingent.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.recipients.income_based.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q3.recipients.stafford_unsubsidized.recipients", + "table": "portfolio_by_loan_type", + "period": "2026-06", + "measure": "recipients", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.wv.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.wv.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.pay_as_you_earn_without_pfh.dollars_outstanding", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.in.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.in.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.graduated_over_10_years.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.dollars_outstanding.income_sensitive.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.dollars_outstanding.age_25_to_34.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_loan_type.fy2026_q2.stafford_combined_dollars_outstanding.stafford_combined.stafford_combined_dollars_outstanding", + "table": "portfolio_by_loan_type", + "period": "2026-03", + "measure": "stafford_combined_dollars_outstanding", + "disposition": "excluded", + "reason": "Stafford (Combined) is a subtotal of rows the loan-type targets already count." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q3.dollars_outstanding.perkins.dollars_outstanding", + "table": "portfolio_summary", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.pay_as_you_earn.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q2.recipients.level_over_10_years.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nv.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nv.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.ms.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.ms.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.dollars_outstanding.level_over_10_years.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.alternative.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_62_and_older.borrowers", + "table": "portfolio_by_age", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_62_and_older.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.al.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.al.borrowers" + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.income_contingent.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.oh.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.oh.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_200k_plus.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.recipients.alternative.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.income_based_with_pfh.dollars_outstanding", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q1.recipients.income_based.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q3.dollars_outstanding.level_10_years_or_less.dollars_outstanding", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.la.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.la.borrowers" + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.borrowers.debt_60k_to_80k.borrowers", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "borrowers", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q1.recipients.income_based_with_pfh.recipients", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q2.recipients.income_based.recipients", + "table": "dl_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q1.dollars_outstanding.graduated_over_10_years.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.other.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "out_of_scope", + "reason": "'Other' is a borrower address outside the states and territories the table lists, outside the host universe; it leaves the in-scope control with its pro-rata share of Not Reported." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_idr_by_partial_financial_hardship.fy2026_q3.recipients.income_based_without_pfh.recipients", + "table": "ed_held_ffel_idr_by_partial_financial_hardship", + "period": "2026-06", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL IBR by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_age.fy2026_q1.dollars_outstanding.age_62_and_older.dollars_outstanding", + "table": "portfolio_by_age", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + }, + { + "source_record_id": "ed_fsa.portfolio_summary.fy2026_q3.dollars_outstanding.all.dollars_outstanding", + "table": "portfolio_summary", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). The stage's balances do not record the program, and FSA counts the student, not the parent, as the recipient of a Parent PLUS loan; the borrower-based location table sets the level instead." + }, + { + "source_record_id": "ed_fsa.dl_idr_by_partial_financial_hardship.fy2026_q1.recipients.income_based_with_pfh.recipients", + "table": "dl_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Income-driven plans by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.graduated_over_10_years.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.federally_managed_idr_by_partial_financial_hardship.fy2026_q1.dollars_outstanding.pay_as_you_earn_with_pfh.dollars_outstanding", + "table": "federally_managed_idr_by_partial_financial_hardship", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed IBR/PAYE by partial financial hardship: no plan or hardship column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.nc.dollars_outstanding", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.nc.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q1.recipients.save.recipients", + "table": "federally_managed_by_repayment_plan", + "period": "2025-12", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.ed_held_ffel_by_repayment_plan.fy2026_q2.recipients.graduated_over_10_years.recipients", + "table": "ed_held_ffel_by_repayment_plan", + "period": "2026-03", + "measure": "recipients", + "disposition": "diagnostic", + "reason": "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_100k_to_200k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2026-03", + "measure": "dollars_outstanding", + "disposition": "bound", + "reason": "Band share of the in-scope control.", + "target": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_100k_to_200k.dollars_outstanding" + }, + { + "source_record_id": "ed_fsa.portfolio_by_location.2026_03_31.wa.borrowers", + "table": "portfolio_by_location", + "period": "2026-03", + "measure": "borrowers", + "disposition": "bound", + "reason": "State level, Not Reported allocated pro rata.", + "target": "ed_fsa.portfolio_by_location.2026_03_31.wa.borrowers" + }, + { + "source_record_id": "ed_fsa.federally_managed_by_repayment_plan.fy2026_q3.dollars_outstanding.income_contingent.dollars_outstanding", + "table": "federally_managed_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Federally managed portfolio by repayment plan: no plan column in the build; diagnostic only." + }, + { + "source_record_id": "ed_fsa.dl_by_repayment_plan.fy2026_q3.dollars_outstanding.alternative.dollars_outstanding", + "table": "dl_by_repayment_plan", + "period": "2026-06", + "measure": "dollars_outstanding", + "disposition": "diagnostic", + "reason": "Repayment plan: diagnostic only. The SCF records only an income-driven yes/no, the build carries no plan column, and FSA's recipient counts are loan-level (microcosm#1074)." + }, + { + "source_record_id": "ed_fsa.portfolio_by_debt_size.fy2026_q1.dollars_outstanding.debt_80k_to_100k.dollars_outstanding", + "table": "portfolio_by_debt_size", + "period": "2025-12", + "measure": "dollars_outstanding", + "disposition": "other_quarter", + "reason": "Not the reference quarter: every bound table binds at the latest quarter all four publish (2026-03)." + } + ], + "materialization_dropped": [], + "repayment_plan_diagnostic": { + "status": "diagnostic_only", + "period": "2026-06", + "plans": { + "other": { + "label": "Other", + "dollars_outstanding": 9000000000.0, + "share_of_dollars": 0.007282142568168946 + }, + "income_based": { + "label": "Income-Based", + "recipients": 3310000.0, + "dollars_outstanding": 225000000000.0, + "share_of_dollars": 0.18205356420422364 + }, + "level_over_10_years": { + "label": "Level: over 10 years", + "dollars_outstanding": 78500000000.0, + "recipients": 1500000.0, + "share_of_dollars": 0.06351646573347358 + }, + "graduated_10_years_or_less": { + "label": "Graduated: 10 years or less", + "dollars_outstanding": 62000000000.0, + "recipients": 2040000.0, + "share_of_dollars": 0.05016587102516385 + }, + "save": { + "label": "SAVE", + "dollars_outstanding": 354300000000.0, + "recipients": 6520000.0, + "share_of_dollars": 0.2866736791002508 + }, + "level_10_years_or_less": { + "label": "Level: 10 years or less", + "recipients": 11670000.0, + "dollars_outstanding": 265200000000.0, + "share_of_dollars": 0.21458046767537828 + }, + "income_contingent": { + "label": "Income-Contingent", + "dollars_outstanding": 55900000000.0, + "recipients": 1320000.0, + "share_of_dollars": 0.04523019661784934 + }, + "alternative": { + "label": "Alternative", + "recipients": 390000.0, + "dollars_outstanding": 12000000000.0, + "share_of_dollars": 0.00970952342422526 + }, + "pay_as_you_earn": { + "label": "Pay As You Earn", + "dollars_outstanding": 136800000000.0, + "recipients": 1610000.0, + "share_of_dollars": 0.11068856703616797 + }, + "graduated_over_10_years": { + "label": "Graduated: over 10 years", + "dollars_outstanding": 37200000000.0, + "recipients": 650000.0, + "share_of_dollars": 0.03009952261509831 + } + } + } + }, + "headline": [ + { + "label": "Federal balance, own plus Parent PLUS", + "kind": "amount", + "target": 1679069776777.568, + "release": 858421208954.9309, + "a_no_fsa": 886045907243.1461, + "b_with_fsa": 1677332270434.8613, + "a_no_fsa_l2": 855750475417.7096, + "b_with_fsa_l2": 1671167058305.7954 + }, + { + "label": "Borrowers (people with a balance)", + "kind": "count", + "target": 44309424.85254373, + "release": 21177503.938145176, + "a_no_fsa": 21589996.24192015, + "b_with_fsa": 44260352.59952934, + "a_no_fsa_l2": 21420219.92046372, + "b_with_fsa_l2": 42673022.28692794 + }, + { + "label": "Parent PLUS balance", + "kind": "amount", + "target": 114840658244.6196, + "release": 91774549445.125, + "a_no_fsa": 102454167482.18747, + "b_with_fsa": 114846618687.44533, + "a_no_fsa_l2": 93165691088.92984, + "b_with_fsa_l2": 114810235390.82658 + }, + { + "label": "Parent PLUS share of the balance", + "kind": "share", + "target": 0.0683954054994779, + "release": 0.10691085971286082, + "a_no_fsa": 0.11563076658292412, + "b_with_fsa": 0.06846980810645852, + "a_no_fsa_l2": 0.10887015989497842, + "b_with_fsa_l2": 0.06870063338085393 + }, + { + "label": "Mean balance per borrower", + "kind": "amount", + "target": 37894.19028491803, + "release": 40534.57912047568, + "a_no_fsa": 41039.650832488696, + "b_with_fsa": 37896.947762966935, + "a_no_fsa_l2": 39950.592411993486, + "b_with_fsa_l2": 39162.14434190018 + }, + { + "label": "Households with federal education debt", + "kind": "share", + "target": NaN, + "release": 0.16413671000206656, + "a_no_fsa": 0.1662222969167077, + "b_with_fsa": 0.33694036417552564, + "a_no_fsa_l2": 0.16563645838046798, + "b_with_fsa_l2": 0.323233835865687 + } + ], + "fit_by_family": { + "bea/bea.nipa_proprietors_income": { + "release": { + "targets": 1, + "mean_capped_abs_rel_error": 0.11597006907246497, + "mean_abs_rel_error": 0.11597006907246497, + "median_abs_rel_error": 0.11597006907246497, + "max_abs_rel_error": 0.11597006907246497, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.05901850848659409, + "mean_abs_rel_error": 0.05901850848659409, + "median_abs_rel_error": 0.05901850848659409, + "max_abs_rel_error": 0.05901850848659409, + "share_within_5pct": 0.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.072973775107902, + "mean_abs_rel_error": 0.072973775107902, + "median_abs_rel_error": 0.072973775107902, + "max_abs_rel_error": 0.072973775107902, + "share_within_5pct": 0.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.11240408230436258, + "mean_abs_rel_error": 0.11240408230436258, + "median_abs_rel_error": 0.11240408230436258, + "max_abs_rel_error": 0.11240408230436258, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.09597858381832397, + "mean_abs_rel_error": 0.09597858381832397, + "median_abs_rel_error": 0.09597858381832397, + "max_abs_rel_error": 0.09597858381832397, + "share_within_5pct": 0.0, + "share_within_10pct": 1.0 + } + }, + "bea/bea.nipa_wages_and_salaries": { + "release": { + "targets": 1, + "mean_capped_abs_rel_error": 0.13332695492526814, + "mean_abs_rel_error": 0.13332695492526814, + "median_abs_rel_error": 0.13332695492526814, + "max_abs_rel_error": 0.13332695492526814, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.1363734288665621, + "mean_abs_rel_error": 0.1363734288665621, + "median_abs_rel_error": 0.1363734288665621, + "max_abs_rel_error": 0.1363734288665621, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.13567592546531304, + "mean_abs_rel_error": 0.13567592546531304, + "median_abs_rel_error": 0.13567592546531304, + "max_abs_rel_error": 0.13567592546531304, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.13461077210218045, + "mean_abs_rel_error": 0.13461077210218045, + "median_abs_rel_error": 0.13461077210218045, + "max_abs_rel_error": 0.13461077210218045, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.1352312798367748, + "mean_abs_rel_error": 0.1352312798367748, + "median_abs_rel_error": 0.1352312798367748, + "max_abs_rel_error": 0.1352312798367748, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + } + }, + "cbo/cbo.cbo": { + "release": { + "targets": 5, + "mean_capped_abs_rel_error": 0.044886494463663405, + "mean_abs_rel_error": 0.044886494463663405, + "median_abs_rel_error": 0.024859653610540784, + "max_abs_rel_error": 0.14751886788196705, + "share_within_5pct": 0.8, + "share_within_10pct": 0.8 + }, + "a_no_fsa": { + "targets": 5, + "mean_capped_abs_rel_error": 0.046322088518647865, + "mean_abs_rel_error": 0.046322088518647865, + "median_abs_rel_error": 0.027402816984955274, + "max_abs_rel_error": 0.15263583510916579, + "share_within_5pct": 0.8, + "share_within_10pct": 0.8 + }, + "b_with_fsa": { + "targets": 5, + "mean_capped_abs_rel_error": 0.04638769224031864, + "mean_abs_rel_error": 0.04638769224031864, + "median_abs_rel_error": 0.033288489292768265, + "max_abs_rel_error": 0.14787481906251057, + "share_within_5pct": 0.8, + "share_within_10pct": 0.8 + }, + "a_no_fsa_l2": { + "targets": 5, + "mean_capped_abs_rel_error": 0.045544006493019595, + "mean_abs_rel_error": 0.045544006493019595, + "median_abs_rel_error": 0.02636882870152744, + "max_abs_rel_error": 0.1496630113389258, + "share_within_5pct": 0.8, + "share_within_10pct": 0.8 + }, + "b_with_fsa_l2": { + "targets": 5, + "mean_capped_abs_rel_error": 0.046211064132730226, + "mean_abs_rel_error": 0.046211064132730226, + "median_abs_rel_error": 0.028917037011657078, + "max_abs_rel_error": 0.15070982513889103, + "share_within_5pct": 0.8, + "share_within_10pct": 0.8 + } + }, + "census_pep/census_pep.resident_population": { + "release": { + "targets": 936, + "mean_capped_abs_rel_error": 0.0008166069293017941, + "mean_abs_rel_error": 0.0008166069293017941, + "median_abs_rel_error": 0.000398140836767011, + "max_abs_rel_error": 0.14883727112667133, + "share_within_5pct": 0.9967948717948718, + "share_within_10pct": 0.9989316239316239 + }, + "a_no_fsa": { + "targets": 936, + "mean_capped_abs_rel_error": 0.0010923216362779607, + "mean_abs_rel_error": 0.0010923216362779607, + "median_abs_rel_error": 0.0008963041193611138, + "max_abs_rel_error": 0.007167850517970487, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 936, + "mean_capped_abs_rel_error": 0.0011403047005545, + "mean_abs_rel_error": 0.0011403047005545, + "median_abs_rel_error": 0.0008866943351217389, + "max_abs_rel_error": 0.00722893029690502, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 936, + "mean_capped_abs_rel_error": 0.0013480743818330221, + "mean_abs_rel_error": 0.0013480743818330221, + "median_abs_rel_error": 0.0009814870081182054, + "max_abs_rel_error": 0.11610886026341212, + "share_within_5pct": 0.9978632478632479, + "share_within_10pct": 0.9989316239316239 + }, + "b_with_fsa_l2": { + "targets": 936, + "mean_capped_abs_rel_error": 0.0014310287873557706, + "mean_abs_rel_error": 0.0014310287873557706, + "median_abs_rel_error": 0.0009388517805447508, + "max_abs_rel_error": 0.20968513670340985, + "share_within_5pct": 0.9989316239316239, + "share_within_10pct": 0.9989316239316239 + } + }, + "census_stc/census_stc.individual_income_tax_collections": { + "release": { + "targets": 44, + "mean_capped_abs_rel_error": 0.1387694906239689, + "mean_abs_rel_error": 0.1387694906239689, + "median_abs_rel_error": 0.0817977528572078, + "max_abs_rel_error": 0.9802700376479009, + "share_within_5pct": 0.20454545454545456, + "share_within_10pct": 0.5227272727272727 + }, + "a_no_fsa": { + "targets": 44, + "mean_capped_abs_rel_error": 0.13694536314207992, + "mean_abs_rel_error": 0.13694536314207992, + "median_abs_rel_error": 0.08629711318112472, + "max_abs_rel_error": 0.9582224296340295, + "share_within_5pct": 0.3181818181818182, + "share_within_10pct": 0.5454545454545454 + }, + "b_with_fsa": { + "targets": 44, + "mean_capped_abs_rel_error": 0.13952878464865884, + "mean_abs_rel_error": 0.13952878464865884, + "median_abs_rel_error": 0.0935089937085738, + "max_abs_rel_error": 0.9535385015273399, + "share_within_5pct": 0.29545454545454547, + "share_within_10pct": 0.5454545454545454 + }, + "a_no_fsa_l2": { + "targets": 44, + "mean_capped_abs_rel_error": 0.13935415133342344, + "mean_abs_rel_error": 0.13935415133342344, + "median_abs_rel_error": 0.08674287949365106, + "max_abs_rel_error": 0.9639374765709391, + "share_within_5pct": 0.25, + "share_within_10pct": 0.5454545454545454 + }, + "b_with_fsa_l2": { + "targets": 44, + "mean_capped_abs_rel_error": 0.1399691659284497, + "mean_abs_rel_error": 0.1399691659284497, + "median_abs_rel_error": 0.0906741723626813, + "max_abs_rel_error": 0.9587123053633434, + "share_within_5pct": 0.29545454545454547, + "share_within_10pct": 0.5227272727272727 + } + }, + "cms_aca/cms_aca.cms_aca": { + "release": { + "targets": 102, + "mean_capped_abs_rel_error": 0.01586129128705996, + "mean_abs_rel_error": 0.01586129128705996, + "median_abs_rel_error": 0.0005847636316140955, + "max_abs_rel_error": 0.32418334107435615, + "share_within_5pct": 0.9215686274509803, + "share_within_10pct": 0.9411764705882353 + }, + "a_no_fsa": { + "targets": 102, + "mean_capped_abs_rel_error": 0.002138141454170261, + "mean_abs_rel_error": 0.002138141454170261, + "median_abs_rel_error": 0.0010425762448456977, + "max_abs_rel_error": 0.08696151008224245, + "share_within_5pct": 0.9901960784313726, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 102, + "mean_capped_abs_rel_error": 0.002203091741008821, + "mean_abs_rel_error": 0.002203091741008821, + "median_abs_rel_error": 0.0010865212193206415, + "max_abs_rel_error": 0.08791220486942433, + "share_within_5pct": 0.9901960784313726, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 102, + "mean_capped_abs_rel_error": 0.0068536496628184415, + "mean_abs_rel_error": 0.0068536496628184415, + "median_abs_rel_error": 0.0012764569858142393, + "max_abs_rel_error": 0.21429337109416566, + "share_within_5pct": 0.9607843137254902, + "share_within_10pct": 0.9705882352941176 + }, + "b_with_fsa_l2": { + "targets": 102, + "mean_capped_abs_rel_error": 0.005627535776596321, + "mean_abs_rel_error": 0.005627535776596321, + "median_abs_rel_error": 0.0015126728676859472, + "max_abs_rel_error": 0.1568814231559175, + "share_within_5pct": 0.9705882352941176, + "share_within_10pct": 0.9705882352941176 + } + }, + "cms_medicaid/cms_medicaid.cms_medicaid": { + "release": { + "targets": 135, + "mean_capped_abs_rel_error": 0.03118764716800679, + "mean_abs_rel_error": 26.991128695971362, + "median_abs_rel_error": 0.005565208356549112, + "max_abs_rel_error": 3640.592041588453, + "share_within_5pct": 0.8444444444444444, + "share_within_10pct": 0.9333333333333333 + }, + "a_no_fsa": { + "targets": 135, + "mean_capped_abs_rel_error": 0.02257194371356277, + "mean_abs_rel_error": 49.36865205798679, + "median_abs_rel_error": 0.001224701629756466, + "max_abs_rel_error": 6662.7208154268865, + "share_within_5pct": 0.8740740740740741, + "share_within_10pct": 0.9629629629629629 + }, + "b_with_fsa": { + "targets": 135, + "mean_capped_abs_rel_error": 0.02280554729969237, + "mean_abs_rel_error": 29.41811785190712, + "median_abs_rel_error": 0.0012239951028114291, + "max_abs_rel_error": 3969.3671611220025, + "share_within_5pct": 0.8666666666666667, + "share_within_10pct": 0.9629629629629629 + }, + "a_no_fsa_l2": { + "targets": 135, + "mean_capped_abs_rel_error": 0.023348326560020703, + "mean_abs_rel_error": 42.16681985635679, + "median_abs_rel_error": 0.0014885841411165402, + "max_abs_rel_error": 5690.368656522565, + "share_within_5pct": 0.8666666666666667, + "share_within_10pct": 0.9703703703703703 + }, + "b_with_fsa_l2": { + "targets": 135, + "mean_capped_abs_rel_error": 0.023339581671304226, + "mean_abs_rel_error": 28.96638799139496, + "median_abs_rel_error": 0.001196187357340689, + "max_abs_rel_error": 3908.3115353126927, + "share_within_5pct": 0.8740740740740741, + "share_within_10pct": 0.9481481481481482 + } + }, + "cms_medicare/cms_medicare.cms_medicare": { + "release": { + "targets": 1, + "mean_capped_abs_rel_error": 0.1376839681598146, + "mean_abs_rel_error": 0.1376839681598146, + "median_abs_rel_error": 0.1376839681598146, + "max_abs_rel_error": 0.1376839681598146, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.13491446262196688, + "mean_abs_rel_error": 0.13491446262196688, + "median_abs_rel_error": 0.13491446262196688, + "max_abs_rel_error": 0.13491446262196688, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.13577227994033636, + "mean_abs_rel_error": 0.13577227994033636, + "median_abs_rel_error": 0.13577227994033636, + "max_abs_rel_error": 0.13577227994033636, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.13494514241175348, + "mean_abs_rel_error": 0.13494514241175348, + "median_abs_rel_error": 0.13494514241175348, + "max_abs_rel_error": 0.13494514241175348, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.13449507306603722, + "mean_abs_rel_error": 0.13449507306603722, + "median_abs_rel_error": 0.13449507306603722, + "max_abs_rel_error": 0.13449507306603722, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + } + }, + "ed_fsa/fsa_age_band_balance": { + "release": { + "targets": 5, + "mean_capped_abs_rel_error": 0.47531703614338827, + "mean_abs_rel_error": 0.47531703614338827, + "median_abs_rel_error": 0.4798408016804903, + "max_abs_rel_error": 0.5319428420236529, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 5, + "mean_capped_abs_rel_error": 0.45003409096098557, + "mean_abs_rel_error": 0.45003409096098557, + "median_abs_rel_error": 0.43860336479652445, + "max_abs_rel_error": 0.5534851188359154, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 5, + "mean_capped_abs_rel_error": 0.0006237713858470242, + "mean_abs_rel_error": 0.0006237713858470242, + "median_abs_rel_error": 0.00018139662880679364, + "max_abs_rel_error": 0.002313480477636543, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 5, + "mean_capped_abs_rel_error": 0.47052974287952887, + "mean_abs_rel_error": 0.47052974287952887, + "median_abs_rel_error": 0.4985250143422751, + "max_abs_rel_error": 0.5399700682800176, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 5, + "mean_capped_abs_rel_error": 0.002705832592825113, + "mean_abs_rel_error": 0.002705832592825113, + "median_abs_rel_error": 0.0009443801851267433, + "max_abs_rel_error": 0.009624327084029868, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "ed_fsa/fsa_age_band_borrowers": { + "release": { + "targets": 5, + "mean_capped_abs_rel_error": 0.5450448270708922, + "mean_abs_rel_error": 0.5450448270708922, + "median_abs_rel_error": 0.5409897880257578, + "max_abs_rel_error": 0.6117632997996701, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 5, + "mean_capped_abs_rel_error": 0.5374936021203442, + "mean_abs_rel_error": 0.5374936021203442, + "median_abs_rel_error": 0.5289811646412323, + "max_abs_rel_error": 0.6066612935629189, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 5, + "mean_capped_abs_rel_error": 0.0024812758545991313, + "mean_abs_rel_error": 0.0024812758545991313, + "median_abs_rel_error": 0.00032439478877849785, + "max_abs_rel_error": 0.010958746894467084, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 5, + "mean_capped_abs_rel_error": 0.5407186017130619, + "mean_abs_rel_error": 0.5407186017130619, + "median_abs_rel_error": 0.5455004381961818, + "max_abs_rel_error": 0.6103985874268487, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 5, + "mean_capped_abs_rel_error": 0.06544285464979317, + "mean_abs_rel_error": 0.06544285464979317, + "median_abs_rel_error": 0.09421434444832352, + "max_abs_rel_error": 0.1320281770466291, + "share_within_5pct": 0.4, + "share_within_10pct": 0.8 + } + }, + "ed_fsa/fsa_balance_excluding_parent_plus": { + "release": { + "targets": 1, + "mean_capped_abs_rel_error": 0.5098885128613239, + "mean_abs_rel_error": 0.5098885128613239, + "median_abs_rel_error": 0.5098885128613239, + "max_abs_rel_error": 0.5098885128613239, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.499055649535622, + "mean_abs_rel_error": 0.499055649535622, + "median_abs_rel_error": 0.499055649535622, + "max_abs_rel_error": 0.499055649535622, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.0011145853026752253, + "mean_abs_rel_error": 0.0011145853026752253, + "median_abs_rel_error": 0.0011145853026752253, + "max_abs_rel_error": 0.0011145853026752253, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.5124852393465293, + "mean_abs_rel_error": 0.5124852393465293, + "median_abs_rel_error": 0.5124852393465293, + "max_abs_rel_error": 0.5124852393465293, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.005032699829398045, + "mean_abs_rel_error": 0.005032699829398045, + "median_abs_rel_error": 0.005032699829398045, + "max_abs_rel_error": 0.005032699829398045, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "ed_fsa/fsa_debt_size_band_balance": { + "release": { + "targets": 9, + "mean_capped_abs_rel_error": 0.5057816892076177, + "mean_abs_rel_error": 0.5057816892076177, + "median_abs_rel_error": 0.5027590010397739, + "max_abs_rel_error": 0.6154141407734927, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 9, + "mean_capped_abs_rel_error": 0.49830052904007505, + "mean_abs_rel_error": 0.49830052904007505, + "median_abs_rel_error": 0.5582075405461717, + "max_abs_rel_error": 0.6436899300347263, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 9, + "mean_capped_abs_rel_error": 0.0041365691063925, + "mean_abs_rel_error": 0.0041365691063925, + "median_abs_rel_error": 0.00040707261356366637, + "max_abs_rel_error": 0.021612252699654517, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 9, + "mean_capped_abs_rel_error": 0.5054057910286176, + "mean_abs_rel_error": 0.5054057910286176, + "median_abs_rel_error": 0.5286566828201376, + "max_abs_rel_error": 0.6256266601373306, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 9, + "mean_capped_abs_rel_error": 0.03628391110103244, + "mean_abs_rel_error": 0.03628391110103244, + "median_abs_rel_error": 0.0009042930853802697, + "max_abs_rel_error": 0.15525626995155736, + "share_within_5pct": 0.7777777777777778, + "share_within_10pct": 0.7777777777777778 + } + }, + "ed_fsa/fsa_debt_size_band_borrowers": { + "release": { + "targets": 9, + "mean_capped_abs_rel_error": 0.49006224060438847, + "mean_abs_rel_error": 0.49006224060438847, + "median_abs_rel_error": 0.47384912828798875, + "max_abs_rel_error": 0.6041748481877873, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 9, + "mean_capped_abs_rel_error": 0.48998971841561356, + "mean_abs_rel_error": 0.48998971841561356, + "median_abs_rel_error": 0.537239004660869, + "max_abs_rel_error": 0.6294021633899607, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 9, + "mean_capped_abs_rel_error": 0.027433691760850153, + "mean_abs_rel_error": 0.027433691760850153, + "median_abs_rel_error": 0.009336531467595615, + "max_abs_rel_error": 0.14264923040127336, + "share_within_5pct": 0.8888888888888888, + "share_within_10pct": 0.8888888888888888 + }, + "a_no_fsa_l2": { + "targets": 9, + "mean_capped_abs_rel_error": 0.49319820747613424, + "mean_abs_rel_error": 0.49319820747613424, + "median_abs_rel_error": 0.5030112054538538, + "max_abs_rel_error": 0.6125670629136993, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 9, + "mean_capped_abs_rel_error": 0.0528427961725171, + "mean_abs_rel_error": 0.0528427961725171, + "median_abs_rel_error": 0.0266176034591858, + "max_abs_rel_error": 0.13493110130471153, + "share_within_5pct": 0.6666666666666666, + "share_within_10pct": 0.6666666666666666 + } + }, + "ed_fsa/fsa_parent_plus_balance": { + "release": { + "targets": 1, + "mean_capped_abs_rel_error": 0.2008531573405126, + "mean_abs_rel_error": 0.2008531573405126, + "median_abs_rel_error": 0.2008531573405126, + "max_abs_rel_error": 0.2008531573405126, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.10785806135008236, + "mean_abs_rel_error": 0.10785806135008236, + "median_abs_rel_error": 0.10785806135008236, + "max_abs_rel_error": 0.10785806135008236, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 5.190185180759451e-05, + "mean_abs_rel_error": 5.190185180759451e-05, + "median_abs_rel_error": 5.190185180759451e-05, + "max_abs_rel_error": 5.190185180759451e-05, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.1887394890189531, + "mean_abs_rel_error": 0.1887394890189531, + "median_abs_rel_error": 0.1887394890189531, + "max_abs_rel_error": 0.1887394890189531, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.00026491361385558705, + "mean_abs_rel_error": 0.00026491361385558705, + "median_abs_rel_error": 0.00026491361385558705, + "max_abs_rel_error": 0.00026491361385558705, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "ed_fsa/fsa_state_balance": { + "release": { + "targets": 51, + "mean_capped_abs_rel_error": 0.47042010551679647, + "mean_abs_rel_error": 0.47042010551679647, + "median_abs_rel_error": 0.49107556607463815, + "max_abs_rel_error": 0.7656073975800927, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 51, + "mean_capped_abs_rel_error": 0.46701767344178086, + "mean_abs_rel_error": 0.46701767344178086, + "median_abs_rel_error": 0.5186134409589465, + "max_abs_rel_error": 0.7908842397953412, + "share_within_5pct": 0.0196078431372549, + "share_within_10pct": 0.0392156862745098 + }, + "b_with_fsa": { + "targets": 51, + "mean_capped_abs_rel_error": 0.0023877162047448845, + "mean_abs_rel_error": 0.0023877162047448845, + "median_abs_rel_error": 0.0009562334304321907, + "max_abs_rel_error": 0.07347017637112539, + "share_within_5pct": 0.9803921568627451, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 51, + "mean_capped_abs_rel_error": 0.47045480363827946, + "mean_abs_rel_error": 0.47045480363827946, + "median_abs_rel_error": 0.49420621330441966, + "max_abs_rel_error": 0.7444172537466162, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 51, + "mean_capped_abs_rel_error": 0.009652642288365843, + "mean_abs_rel_error": 0.009652642288365843, + "median_abs_rel_error": 0.0016627200908797643, + "max_abs_rel_error": 0.21376478193206117, + "share_within_5pct": 0.9607843137254902, + "share_within_10pct": 0.9607843137254902 + } + }, + "ed_fsa/fsa_state_borrowers": { + "release": { + "targets": 51, + "mean_capped_abs_rel_error": 0.4909450265178525, + "mean_abs_rel_error": 0.4909450265178525, + "median_abs_rel_error": 0.5029298728760372, + "max_abs_rel_error": 0.674786513275884, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 51, + "mean_capped_abs_rel_error": 0.49436590536591424, + "mean_abs_rel_error": 0.49436590536591424, + "median_abs_rel_error": 0.5086634117540434, + "max_abs_rel_error": 0.7464418676869138, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa": { + "targets": 51, + "mean_capped_abs_rel_error": 0.01093351273326499, + "mean_abs_rel_error": 0.01093351273326499, + "median_abs_rel_error": 0.0008468225319544138, + "max_abs_rel_error": 0.12647648232306657, + "share_within_5pct": 0.9215686274509803, + "share_within_10pct": 0.9411764705882353 + }, + "a_no_fsa_l2": { + "targets": 51, + "mean_capped_abs_rel_error": 0.4886798989395737, + "mean_abs_rel_error": 0.4886798989395737, + "median_abs_rel_error": 0.48910215376855937, + "max_abs_rel_error": 0.6924811961501464, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 51, + "mean_capped_abs_rel_error": 0.061612358463562444, + "mean_abs_rel_error": 0.061612358463562444, + "median_abs_rel_error": 0.01613018684177716, + "max_abs_rel_error": 0.3139045998065022, + "share_within_5pct": 0.6274509803921569, + "share_within_10pct": 0.7647058823529411 + } + }, + "federal_reserve/federal_reserve.federal_reserve": { + "release": { + "targets": 1, + "mean_capped_abs_rel_error": 0.00020658420256524772, + "mean_abs_rel_error": 0.00020658420256524772, + "median_abs_rel_error": 0.00020658420256524772, + "max_abs_rel_error": 0.00020658420256524772, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.00019041353443063037, + "mean_abs_rel_error": 0.00019041353443063037, + "median_abs_rel_error": 0.00019041353443063037, + "max_abs_rel_error": 0.00019041353443063037, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 9.355381930900899e-05, + "mean_abs_rel_error": 9.355381930900899e-05, + "median_abs_rel_error": 9.355381930900899e-05, + "max_abs_rel_error": 9.355381930900899e-05, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.0005778975601046028, + "mean_abs_rel_error": 0.0005778975601046028, + "median_abs_rel_error": 0.0005778975601046028, + "max_abs_rel_error": 0.0005778975601046028, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.00018304890562130473, + "mean_abs_rel_error": 0.00018304890562130473, + "median_abs_rel_error": 0.00018304890562130473, + "max_abs_rel_error": 0.00018304890562130473, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "hhs_acf_liheap/hhs_acf_liheap.hhs_acf_liheap": { + "release": { + "targets": 1, + "mean_capped_abs_rel_error": 3.687217242812956e-05, + "mean_abs_rel_error": 3.687217242812956e-05, + "median_abs_rel_error": 3.687217242812956e-05, + "max_abs_rel_error": 3.687217242812956e-05, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.00018143350960117058, + "mean_abs_rel_error": 0.00018143350960117058, + "median_abs_rel_error": 0.00018143350960117058, + "max_abs_rel_error": 0.00018143350960117058, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.00013881512874296765, + "mean_abs_rel_error": 0.00013881512874296765, + "median_abs_rel_error": 0.00013881512874296765, + "max_abs_rel_error": 0.00013881512874296765, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.000134645247973753, + "mean_abs_rel_error": 0.000134645247973753, + "median_abs_rel_error": 0.000134645247973753, + "max_abs_rel_error": 0.000134645247973753, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.00024399910708085724, + "mean_abs_rel_error": 0.00024399910708085724, + "median_abs_rel_error": 0.00024399910708085724, + "max_abs_rel_error": 0.00024399910708085724, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "hhs_acf_tanf/hhs_acf_tanf.hhs_acf_tanf": { + "release": { + "targets": 30, + "mean_capped_abs_rel_error": 0.2978595794895298, + "mean_abs_rel_error": 0.4375298436206908, + "median_abs_rel_error": 0.016672799716027278, + "max_abs_rel_error": 5.190107923934829, + "share_within_5pct": 0.5666666666666667, + "share_within_10pct": 0.5666666666666667 + }, + "a_no_fsa": { + "targets": 30, + "mean_capped_abs_rel_error": 0.1832076424179612, + "mean_abs_rel_error": 0.4911379873085325, + "median_abs_rel_error": 0.002288565024625105, + "max_abs_rel_error": 10.237910346717138, + "share_within_5pct": 0.7666666666666667, + "share_within_10pct": 0.7666666666666667 + }, + "b_with_fsa": { + "targets": 30, + "mean_capped_abs_rel_error": 0.20878676134327898, + "mean_abs_rel_error": 0.5330327171396277, + "median_abs_rel_error": 0.004809468136682763, + "max_abs_rel_error": 10.727378673890463, + "share_within_5pct": 0.7333333333333333, + "share_within_10pct": 0.7333333333333333 + }, + "a_no_fsa_l2": { + "targets": 30, + "mean_capped_abs_rel_error": 0.22452818376553715, + "mean_abs_rel_error": 0.46108972954731875, + "median_abs_rel_error": 0.003201263884579972, + "max_abs_rel_error": 8.096846373453449, + "share_within_5pct": 0.7333333333333333, + "share_within_10pct": 0.7333333333333333 + }, + "b_with_fsa_l2": { + "targets": 30, + "mean_capped_abs_rel_error": 0.22366553518054724, + "mean_abs_rel_error": 0.5585767600388062, + "median_abs_rel_error": 0.0035582317798861997, + "max_abs_rel_error": 11.047336745747767, + "share_within_5pct": 0.7, + "share_within_10pct": 0.7 + } + }, + "irs_soi/irs_soi.adjusted_gross_income": { + "release": { + "targets": 261, + "mean_capped_abs_rel_error": 0.19663707672066658, + "mean_abs_rel_error": 0.20663449906601936, + "median_abs_rel_error": 0.11132067311133242, + "max_abs_rel_error": 2.2503366584396702, + "share_within_5pct": 0.32950191570881227, + "share_within_10pct": 0.4674329501915709 + }, + "a_no_fsa": { + "targets": 261, + "mean_capped_abs_rel_error": 0.00560711171565893, + "mean_abs_rel_error": 0.00560711171565893, + "median_abs_rel_error": 0.0012466062434296217, + "max_abs_rel_error": 0.21057897392214897, + "share_within_5pct": 0.9770114942528736, + "share_within_10pct": 0.9846743295019157 + }, + "b_with_fsa": { + "targets": 261, + "mean_capped_abs_rel_error": 0.006297296057091836, + "mean_abs_rel_error": 0.006297296057091836, + "median_abs_rel_error": 0.0014074985118962583, + "max_abs_rel_error": 0.2465393420144133, + "share_within_5pct": 0.9808429118773946, + "share_within_10pct": 0.9846743295019157 + }, + "a_no_fsa_l2": { + "targets": 261, + "mean_capped_abs_rel_error": 0.027700957184308844, + "mean_abs_rel_error": 0.03066478373728214, + "median_abs_rel_error": 0.00222307457067258, + "max_abs_rel_error": 1.4091831670080337, + "share_within_5pct": 0.8812260536398467, + "share_within_10pct": 0.9195402298850575 + }, + "b_with_fsa_l2": { + "targets": 261, + "mean_capped_abs_rel_error": 0.02176768362701182, + "mean_abs_rel_error": 0.02260080631057763, + "median_abs_rel_error": 0.0019261297948088589, + "max_abs_rel_error": 1.1373996887967437, + "share_within_5pct": 0.9195402298850575, + "share_within_10pct": 0.9578544061302682 + } + }, + "irs_soi/irs_soi.assigned_aca_ptc": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.00909180172620293, + "mean_abs_rel_error": 0.00909180172620293, + "median_abs_rel_error": 0.00154530852092596, + "max_abs_rel_error": 0.10792354375934472, + "share_within_5pct": 0.9519230769230769, + "share_within_10pct": 0.9903846153846154 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.005985339399899384, + "mean_abs_rel_error": 0.005985339399899384, + "median_abs_rel_error": 0.001650172154851086, + "max_abs_rel_error": 0.06815358371378129, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.015041311198050066, + "mean_abs_rel_error": 0.015041311198050066, + "median_abs_rel_error": 0.0034350632651596034, + "max_abs_rel_error": 0.148280800014568, + "share_within_5pct": 0.9134615384615384, + "share_within_10pct": 0.9903846153846154 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.007477481733709767, + "mean_abs_rel_error": 0.007477481733709767, + "median_abs_rel_error": 0.0017370585943573776, + "max_abs_rel_error": 0.07638780591319803, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.011186366764431226, + "mean_abs_rel_error": 0.011186366764431226, + "median_abs_rel_error": 0.0021983243948999137, + "max_abs_rel_error": 0.18645543892864105, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9903846153846154 + } + }, + "irs_soi/irs_soi.business_net_profits": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.01262846757916334, + "mean_abs_rel_error": 0.04868417436047841, + "median_abs_rel_error": 0.00038960307456523146, + "max_abs_rel_error": 4.749793505256766, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9711538461538461 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.010793071183906851, + "mean_abs_rel_error": 0.023757897981115425, + "median_abs_rel_error": 0.0010861997643184665, + "max_abs_rel_error": 2.3483419869096913, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 0.9903846153846154 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.010709555644649303, + "mean_abs_rel_error": 0.023806395123263522, + "median_abs_rel_error": 0.0009399467875366968, + "max_abs_rel_error": 2.362071305775879, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 0.9903846153846154 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.010740991705871564, + "mean_abs_rel_error": 0.029452449223890977, + "median_abs_rel_error": 0.0008826247883481169, + "max_abs_rel_error": 2.945991581874019, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 0.9903846153846154 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.010919885321442366, + "mean_abs_rel_error": 0.02853568273375395, + "median_abs_rel_error": 0.0012036572528151815, + "max_abs_rel_error": 2.832042930880405, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 0.9903846153846154 + } + }, + "irs_soi/irs_soi.capital_gains_gross": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.30064035723865834, + "mean_abs_rel_error": 0.30064035723865834, + "median_abs_rel_error": 0.5122380643529997, + "max_abs_rel_error": 0.6202426419265462, + "share_within_5pct": 0.46153846153846156, + "share_within_10pct": 0.4807692307692308 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.1700647395619795, + "mean_abs_rel_error": 0.1700647395619795, + "median_abs_rel_error": 0.07988232021112178, + "max_abs_rel_error": 0.5710116750196225, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.18125545931193726, + "mean_abs_rel_error": 0.18125545931193726, + "median_abs_rel_error": 0.06257047740355261, + "max_abs_rel_error": 0.6408619302557813, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.2599820788706441, + "mean_abs_rel_error": 0.2599820788706441, + "median_abs_rel_error": 0.3301115906440001, + "max_abs_rel_error": 0.6122424569574894, + "share_within_5pct": 0.47115384615384615, + "share_within_10pct": 0.4807692307692308 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.24821079481786507, + "mean_abs_rel_error": 0.24821079481786507, + "median_abs_rel_error": 0.2644502418562126, + "max_abs_rel_error": 0.6391546223634336, + "share_within_5pct": 0.47115384615384615, + "share_within_10pct": 0.4807692307692308 + } + }, + "irs_soi/irs_soi.charitable_deduction": { + "release": { + "targets": 2, + "mean_capped_abs_rel_error": 0.07549810938870608, + "mean_abs_rel_error": 0.07549810938870608, + "median_abs_rel_error": 0.07549810938870608, + "max_abs_rel_error": 0.13579883267800233, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "a_no_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.06836009563478894, + "mean_abs_rel_error": 0.06836009563478894, + "median_abs_rel_error": 0.06836009563478894, + "max_abs_rel_error": 0.1363441478136048, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "b_with_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0732713019645474, + "mean_abs_rel_error": 0.0732713019645474, + "median_abs_rel_error": 0.0732713019645474, + "max_abs_rel_error": 0.14631191266054525, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "a_no_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.06178775018808723, + "mean_abs_rel_error": 0.06178775018808723, + "median_abs_rel_error": 0.06178775018808723, + "max_abs_rel_error": 0.12315823694037376, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "b_with_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.06626823798504265, + "mean_abs_rel_error": 0.06626823798504265, + "median_abs_rel_error": 0.06626823798504265, + "max_abs_rel_error": 0.13250464153567054, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + } + }, + "irs_soi/irs_soi.count": { + "release": { + "targets": 260, + "mean_capped_abs_rel_error": 0.3166848849883814, + "mean_abs_rel_error": 0.40326526038258764, + "median_abs_rel_error": 0.18199437484285094, + "max_abs_rel_error": 2.7227640658310186, + "share_within_5pct": 0.2423076923076923, + "share_within_10pct": 0.36538461538461536 + }, + "a_no_fsa": { + "targets": 260, + "mean_capped_abs_rel_error": 0.20520200909301745, + "mean_abs_rel_error": 0.2773888360862469, + "median_abs_rel_error": 0.015296557988083555, + "max_abs_rel_error": 3.8118562719624336, + "share_within_5pct": 0.5884615384615385, + "share_within_10pct": 0.6615384615384615 + }, + "b_with_fsa": { + "targets": 260, + "mean_capped_abs_rel_error": 0.20969868570434438, + "mean_abs_rel_error": 0.28266486092124005, + "median_abs_rel_error": 0.03503409643888316, + "max_abs_rel_error": 3.745503433192329, + "share_within_5pct": 0.5615384615384615, + "share_within_10pct": 0.6423076923076924 + }, + "a_no_fsa_l2": { + "targets": 260, + "mean_capped_abs_rel_error": 0.22854349421531497, + "mean_abs_rel_error": 0.31440734053596664, + "median_abs_rel_error": 0.046206254473677835, + "max_abs_rel_error": 4.030512468294826, + "share_within_5pct": 0.5115384615384615, + "share_within_10pct": 0.6423076923076924 + }, + "b_with_fsa_l2": { + "targets": 260, + "mean_capped_abs_rel_error": 0.22273492020316457, + "mean_abs_rel_error": 0.30434160679866745, + "median_abs_rel_error": 0.041994837452325795, + "max_abs_rel_error": 3.8462248643378336, + "share_within_5pct": 0.5269230769230769, + "share_within_10pct": 0.6384615384615384 + } + }, + "irs_soi/irs_soi.ctc": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.014883365957134898, + "mean_abs_rel_error": 0.014883365957134898, + "median_abs_rel_error": 0.0009906973193060172, + "max_abs_rel_error": 0.23015638509580028, + "share_within_5pct": 0.8942307692307693, + "share_within_10pct": 0.9711538461538461 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.005908759282159332, + "mean_abs_rel_error": 0.005908759282159332, + "median_abs_rel_error": 0.0010482057217409435, + "max_abs_rel_error": 0.16514834825772237, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9903846153846154 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.011831195660376194, + "mean_abs_rel_error": 0.011831195660376194, + "median_abs_rel_error": 0.0013480847782112626, + "max_abs_rel_error": 0.17526482480328326, + "share_within_5pct": 0.9326923076923077, + "share_within_10pct": 0.9807692307692307 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.01205671562836164, + "mean_abs_rel_error": 0.01205671562836164, + "median_abs_rel_error": 0.0012899958538655192, + "max_abs_rel_error": 0.16617462139688066, + "share_within_5pct": 0.9326923076923077, + "share_within_10pct": 0.9711538461538461 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.014289769793436317, + "mean_abs_rel_error": 0.014289769793436317, + "median_abs_rel_error": 0.0012378049901395996, + "max_abs_rel_error": 0.25314319057111284, + "share_within_5pct": 0.9134615384615384, + "share_within_10pct": 0.9711538461538461 + } + }, + "irs_soi/irs_soi.deductible_mortgage_interest": { + "release": { + "targets": 2, + "mean_capped_abs_rel_error": 0.004212181536801498, + "mean_abs_rel_error": 0.004212181536801498, + "median_abs_rel_error": 0.004212181536801498, + "max_abs_rel_error": 0.008093566400504711, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0003088815087523626, + "mean_abs_rel_error": 0.0003088815087523626, + "median_abs_rel_error": 0.0003088815087523626, + "max_abs_rel_error": 0.0005785441950716589, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.00017634528259281065, + "mean_abs_rel_error": 0.00017634528259281065, + "median_abs_rel_error": 0.00017634528259281065, + "max_abs_rel_error": 0.000190677401266382, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0010364878105201362, + "mean_abs_rel_error": 0.0010364878105201362, + "median_abs_rel_error": 0.0010364878105201362, + "max_abs_rel_error": 0.001079293767505114, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0003306389499027504, + "mean_abs_rel_error": 0.0003306389499027504, + "median_abs_rel_error": 0.0003306389499027504, + "max_abs_rel_error": 0.0004901633205709908, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.eitc": { + "release": { + "targets": 781, + "mean_capped_abs_rel_error": 0.03101466800898182, + "mean_abs_rel_error": 148507.27624598873, + "median_abs_rel_error": 0.0010954134600590925, + "max_abs_rel_error": 112185089.03921935, + "share_within_5pct": 0.8847631241997439, + "share_within_10pct": 0.9270166453265045 + }, + "a_no_fsa": { + "targets": 781, + "mean_capped_abs_rel_error": 0.024646730572943344, + "mean_abs_rel_error": 17885.78116582838, + "median_abs_rel_error": 0.0015665870578707476, + "max_abs_rel_error": 7327317.240634516, + "share_within_5pct": 0.912932138284251, + "share_within_10pct": 0.941101152368758 + }, + "b_with_fsa": { + "targets": 781, + "mean_capped_abs_rel_error": 0.03135064108613714, + "mean_abs_rel_error": 8834.474931803066, + "median_abs_rel_error": 0.002191711516720503, + "max_abs_rel_error": 5656263.079775462, + "share_within_5pct": 0.8950064020486556, + "share_within_10pct": 0.9308578745198464 + }, + "a_no_fsa_l2": { + "targets": 781, + "mean_capped_abs_rel_error": 0.026654239355800184, + "mean_abs_rel_error": 67582.15087615496, + "median_abs_rel_error": 0.002023205334616561, + "max_abs_rel_error": 48105138.60023324, + "share_within_5pct": 0.9052496798975672, + "share_within_10pct": 0.9436619718309859 + }, + "b_with_fsa_l2": { + "targets": 781, + "mean_capped_abs_rel_error": 0.030513863501867654, + "mean_abs_rel_error": 22066.45578104443, + "median_abs_rel_error": 0.002137286994002946, + "max_abs_rel_error": 13148881.339845233, + "share_within_5pct": 0.8809218950064021, + "share_within_10pct": 0.9257362355953905 + } + }, + "irs_soi/irs_soi.employment_income": { + "release": { + "targets": 106, + "mean_capped_abs_rel_error": 0.0013911471291655777, + "mean_abs_rel_error": 0.0013911471291655777, + "median_abs_rel_error": 0.00042289411827262124, + "max_abs_rel_error": 0.04252057383685228, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 106, + "mean_capped_abs_rel_error": 0.001312591392063708, + "mean_abs_rel_error": 0.001312591392063708, + "median_abs_rel_error": 0.000754015358900607, + "max_abs_rel_error": 0.026540576928519407, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 106, + "mean_capped_abs_rel_error": 0.0017772854137874513, + "mean_abs_rel_error": 0.0017772854137874513, + "median_abs_rel_error": 0.0006142697222231128, + "max_abs_rel_error": 0.028575878229875607, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 106, + "mean_capped_abs_rel_error": 0.0016811389819555082, + "mean_abs_rel_error": 0.0016811389819555082, + "median_abs_rel_error": 0.0006893492878843807, + "max_abs_rel_error": 0.026342267149062615, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 106, + "mean_capped_abs_rel_error": 0.0019257048262869214, + "mean_abs_rel_error": 0.0019257048262869214, + "median_abs_rel_error": 0.000699334136511469, + "max_abs_rel_error": 0.023067038434221743, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.estate_income": { + "release": { + "targets": 2, + "mean_capped_abs_rel_error": 7.487397009837113e-05, + "mean_abs_rel_error": 7.487397009837113e-05, + "median_abs_rel_error": 7.487397009837113e-05, + "max_abs_rel_error": 0.00012197174495040293, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0011195594211380968, + "mean_abs_rel_error": 0.0011195594211380968, + "median_abs_rel_error": 0.0011195594211380968, + "max_abs_rel_error": 0.001356944195799437, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0008029280124277604, + "mean_abs_rel_error": 0.0008029280124277604, + "median_abs_rel_error": 0.0008029280124277604, + "max_abs_rel_error": 0.0012715516358064473, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0008330375310934147, + "mean_abs_rel_error": 0.0008330375310934147, + "median_abs_rel_error": 0.0008330375310934147, + "max_abs_rel_error": 0.0013903992717356672, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0009747515122147666, + "mean_abs_rel_error": 0.0009747515122147666, + "median_abs_rel_error": 0.0009747515122147666, + "max_abs_rel_error": 0.0015855484807002235, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.estate_losses": { + "release": { + "targets": 2, + "mean_capped_abs_rel_error": 0.5003557900118631, + "mean_abs_rel_error": 2.4096962606395236, + "median_abs_rel_error": 2.4096962606395236, + "max_abs_rel_error": 4.818680941255321, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "a_no_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.5023233498785507, + "mean_abs_rel_error": 2.847737224874748, + "median_abs_rel_error": 2.847737224874748, + "max_abs_rel_error": 5.690827749992395, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "b_with_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.5014992036446648, + "mean_abs_rel_error": 2.8510485449679464, + "median_abs_rel_error": 2.8510485449679464, + "max_abs_rel_error": 5.6990986826465635, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "a_no_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.5021547788285446, + "mean_abs_rel_error": 2.279233961516832, + "median_abs_rel_error": 2.279233961516832, + "max_abs_rel_error": 4.5541583653765745, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + }, + "b_with_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.5004044857228734, + "mean_abs_rel_error": 2.3209561125481355, + "median_abs_rel_error": 2.3209561125481355, + "max_abs_rel_error": 4.641103253650524, + "share_within_5pct": 0.5, + "share_within_10pct": 0.5 + } + }, + "irs_soi/irs_soi.income_tax": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.00591216773635846, + "mean_abs_rel_error": 0.00591216773635846, + "median_abs_rel_error": 0.001231917007359049, + "max_abs_rel_error": 0.04979244902101185, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.006680512752353824, + "mean_abs_rel_error": 0.006680512752353824, + "median_abs_rel_error": 0.0016412757728019277, + "max_abs_rel_error": 0.06112604309450738, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.008091273660202802, + "mean_abs_rel_error": 0.008091273660202802, + "median_abs_rel_error": 0.0017067540619252854, + "max_abs_rel_error": 0.054414561822623025, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.007779930302231824, + "mean_abs_rel_error": 0.007779930302231824, + "median_abs_rel_error": 0.0013392291427244177, + "max_abs_rel_error": 0.08521704507168248, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.008680344114608505, + "mean_abs_rel_error": 0.008680344114608505, + "median_abs_rel_error": 0.0016779619103704491, + "max_abs_rel_error": 0.12513583231103562, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9903846153846154 + } + }, + "irs_soi/irs_soi.income_tax_before_credits": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.015753662102975522, + "mean_abs_rel_error": 0.015753662102975522, + "median_abs_rel_error": 0.00610196109833669, + "max_abs_rel_error": 0.05389399243218597, + "share_within_5pct": 0.9615384615384616, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.01627038787699486, + "mean_abs_rel_error": 0.01627038787699486, + "median_abs_rel_error": 0.006901983503721909, + "max_abs_rel_error": 0.08910537186407726, + "share_within_5pct": 0.9519230769230769, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.017123720339473972, + "mean_abs_rel_error": 0.017123720339473972, + "median_abs_rel_error": 0.007757779093589578, + "max_abs_rel_error": 0.08977190671914732, + "share_within_5pct": 0.9423076923076923, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.01925922184222164, + "mean_abs_rel_error": 0.01925922184222164, + "median_abs_rel_error": 0.007048960089457322, + "max_abs_rel_error": 0.08494512637463637, + "share_within_5pct": 0.8942307692307693, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.019924574284363603, + "mean_abs_rel_error": 0.019924574284363603, + "median_abs_rel_error": 0.008560981397328391, + "max_abs_rel_error": 0.08710807380894497, + "share_within_5pct": 0.9038461538461539, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.interest_deduction": { + "release": { + "targets": 2, + "mean_capped_abs_rel_error": 0.02017258787338146, + "mean_abs_rel_error": 0.02017258787338146, + "median_abs_rel_error": 0.02017258787338146, + "max_abs_rel_error": 0.024832284029232203, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.017397461117208596, + "mean_abs_rel_error": 0.017397461117208596, + "median_abs_rel_error": 0.017397461117208596, + "max_abs_rel_error": 0.025192991873928317, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.01279067946016243, + "mean_abs_rel_error": 0.01279067946016243, + "median_abs_rel_error": 0.01279067946016243, + "max_abs_rel_error": 0.025340640548623006, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.02406619768443205, + "mean_abs_rel_error": 0.02406619768443205, + "median_abs_rel_error": 0.02406619768443205, + "max_abs_rel_error": 0.024186073566146018, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.02015368627140951, + "mean_abs_rel_error": 0.02015368627140951, + "median_abs_rel_error": 0.02015368627140951, + "max_abs_rel_error": 0.024676926211463585, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.ira_distributions": { + "release": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0010455493271411087, + "mean_abs_rel_error": 0.0010455493271411087, + "median_abs_rel_error": 0.000519918058975545, + "max_abs_rel_error": 0.018449562592512434, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0014589689346000206, + "mean_abs_rel_error": 0.0014589689346000206, + "median_abs_rel_error": 0.00097091165317698, + "max_abs_rel_error": 0.018252799279044208, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0016716955844113966, + "mean_abs_rel_error": 0.0016716955844113966, + "median_abs_rel_error": 0.001202497376687854, + "max_abs_rel_error": 0.018331244228501766, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0014439519266552345, + "mean_abs_rel_error": 0.0014439519266552345, + "median_abs_rel_error": 0.0009070486894192687, + "max_abs_rel_error": 0.018699321276828457, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 108, + "mean_capped_abs_rel_error": 0.001454700096901229, + "mean_abs_rel_error": 0.001454700096901229, + "median_abs_rel_error": 0.0009587681817742259, + "max_abs_rel_error": 0.018405278301024442, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.itemized_taxable_income_deductions": { + "release": { + "targets": 55, + "mean_capped_abs_rel_error": 0.02007493919626953, + "mean_abs_rel_error": 0.02007493919626953, + "median_abs_rel_error": 0.0008678423325651685, + "max_abs_rel_error": 0.558473311147004, + "share_within_5pct": 0.9636363636363636, + "share_within_10pct": 0.9636363636363636 + }, + "a_no_fsa": { + "targets": 55, + "mean_capped_abs_rel_error": 0.022765555175292627, + "mean_abs_rel_error": 0.022765555175292627, + "median_abs_rel_error": 0.0012773491755963587, + "max_abs_rel_error": 0.5327818555736837, + "share_within_5pct": 0.9272727272727272, + "share_within_10pct": 0.9454545454545454 + }, + "b_with_fsa": { + "targets": 55, + "mean_capped_abs_rel_error": 0.022764546163640636, + "mean_abs_rel_error": 0.022764546163640636, + "median_abs_rel_error": 0.001314923845724305, + "max_abs_rel_error": 0.5418766424703838, + "share_within_5pct": 0.9454545454545454, + "share_within_10pct": 0.9454545454545454 + }, + "a_no_fsa_l2": { + "targets": 55, + "mean_capped_abs_rel_error": 0.02527733886148011, + "mean_abs_rel_error": 0.02527733886148011, + "median_abs_rel_error": 0.0015739349924736358, + "max_abs_rel_error": 0.5421771569634773, + "share_within_5pct": 0.9090909090909091, + "share_within_10pct": 0.9454545454545454 + }, + "b_with_fsa_l2": { + "targets": 55, + "mean_capped_abs_rel_error": 0.023645446894039388, + "mean_abs_rel_error": 0.023645446894039388, + "median_abs_rel_error": 0.0013086919159114225, + "max_abs_rel_error": 0.5268561285777368, + "share_within_5pct": 0.9272727272727272, + "share_within_10pct": 0.9636363636363636 + } + }, + "irs_soi/irs_soi.medical_expense_deduction": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.06015916911251376, + "mean_abs_rel_error": 0.19381445136084371, + "median_abs_rel_error": 0.0007900230138132156, + "max_abs_rel_error": 5.246878554163409, + "share_within_5pct": 0.9326923076923077, + "share_within_10pct": 0.9326923076923077 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.06255714766612655, + "mean_abs_rel_error": 0.21915213897963717, + "median_abs_rel_error": 0.0018862982597838817, + "max_abs_rel_error": 6.055044655443635, + "share_within_5pct": 0.9134615384615384, + "share_within_10pct": 0.9230769230769231 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.06332869561784696, + "mean_abs_rel_error": 0.22682351132417106, + "median_abs_rel_error": 0.0018603841078285012, + "max_abs_rel_error": 6.829757421312947, + "share_within_5pct": 0.9134615384615384, + "share_within_10pct": 0.9326923076923077 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.06196751488293596, + "mean_abs_rel_error": 0.21903406770609576, + "median_abs_rel_error": 0.0011722964726428847, + "max_abs_rel_error": 5.826701009935935, + "share_within_5pct": 0.9230769230769231, + "share_within_10pct": 0.9230769230769231 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.06454838693265773, + "mean_abs_rel_error": 0.22646527443051673, + "median_abs_rel_error": 0.0015604065109537432, + "max_abs_rel_error": 6.254428850529265, + "share_within_5pct": 0.9134615384615384, + "share_within_10pct": 0.9230769230769231 + } + }, + "irs_soi/irs_soi.non_sch_d_capital_gains": { + "release": { + "targets": 2, + "mean_capped_abs_rel_error": 3.481195300880114e-05, + "mean_abs_rel_error": 3.481195300880114e-05, + "median_abs_rel_error": 3.481195300880114e-05, + "max_abs_rel_error": 6.016751449214431e-05, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.00046277584278425136, + "mean_abs_rel_error": 0.00046277584278425136, + "median_abs_rel_error": 0.00046277584278425136, + "max_abs_rel_error": 0.0006878835299126856, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0006257222499286407, + "mean_abs_rel_error": 0.0006257222499286407, + "median_abs_rel_error": 0.0006257222499286407, + "max_abs_rel_error": 0.0011418640077648435, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.0007670849671854666, + "mean_abs_rel_error": 0.0007670849671854666, + "median_abs_rel_error": 0.0007670849671854666, + "max_abs_rel_error": 0.0009591411387268395, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 2, + "mean_capped_abs_rel_error": 0.00016496188968251208, + "mean_abs_rel_error": 0.00016496188968251208, + "median_abs_rel_error": 0.00016496188968251208, + "max_abs_rel_error": 0.00018239016969446862, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.ordinary_dividend_income": { + "release": { + "targets": 108, + "mean_capped_abs_rel_error": 0.008161402730339133, + "mean_abs_rel_error": 0.008161402730339133, + "median_abs_rel_error": 0.0005953274186073485, + "max_abs_rel_error": 0.18985227259152918, + "share_within_5pct": 0.9444444444444444, + "share_within_10pct": 0.9629629629629629 + }, + "a_no_fsa": { + "targets": 108, + "mean_capped_abs_rel_error": 0.007837376013250854, + "mean_abs_rel_error": 0.007837376013250854, + "median_abs_rel_error": 0.0012309325567304583, + "max_abs_rel_error": 0.21066669820529482, + "share_within_5pct": 0.9629629629629629, + "share_within_10pct": 0.9814814814814815 + }, + "b_with_fsa": { + "targets": 108, + "mean_capped_abs_rel_error": 0.009216785537855286, + "mean_abs_rel_error": 0.009216785537855286, + "median_abs_rel_error": 0.001341816246766275, + "max_abs_rel_error": 0.21188323859872704, + "share_within_5pct": 0.9537037037037037, + "share_within_10pct": 0.9814814814814815 + }, + "a_no_fsa_l2": { + "targets": 108, + "mean_capped_abs_rel_error": 0.008462048030127045, + "mean_abs_rel_error": 0.008462048030127045, + "median_abs_rel_error": 0.0011011199008410016, + "max_abs_rel_error": 0.2093145935080321, + "share_within_5pct": 0.9537037037037037, + "share_within_10pct": 0.9814814814814815 + }, + "b_with_fsa_l2": { + "targets": 108, + "mean_capped_abs_rel_error": 0.00765159989288703, + "mean_abs_rel_error": 0.00765159989288703, + "median_abs_rel_error": 0.0012243355436728502, + "max_abs_rel_error": 0.1986799027393836, + "share_within_5pct": 0.9629629629629629, + "share_within_10pct": 0.9814814814814815 + } + }, + "irs_soi/irs_soi.partnership_and_s_corp_income": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.005986955480571794, + "mean_abs_rel_error": 0.005986955480571794, + "median_abs_rel_error": 0.0007943959849150306, + "max_abs_rel_error": 0.2536978029402277, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9711538461538461 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.003791101571681395, + "mean_abs_rel_error": 0.003791101571681395, + "median_abs_rel_error": 0.0009258451206316087, + "max_abs_rel_error": 0.2097297011009019, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 0.9903846153846154 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.004916336976458922, + "mean_abs_rel_error": 0.004916336976458922, + "median_abs_rel_error": 0.0011355031715880907, + "max_abs_rel_error": 0.3415042221048066, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 0.9903846153846154 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.006425655274376408, + "mean_abs_rel_error": 0.006425655274376408, + "median_abs_rel_error": 0.0013163536718126718, + "max_abs_rel_error": 0.4187035242989705, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 0.9903846153846154 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.005880995408295681, + "mean_abs_rel_error": 0.005880995408295681, + "median_abs_rel_error": 0.001390300841369094, + "max_abs_rel_error": 0.3816121914761583, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 0.9903846153846154 + } + }, + "irs_soi/irs_soi.qualified_dividends": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.0032877840000221804, + "mean_abs_rel_error": 0.0032877840000221804, + "median_abs_rel_error": 0.0005550933856634234, + "max_abs_rel_error": 0.10353574451953144, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 0.9903846153846154 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.005206923837114242, + "mean_abs_rel_error": 0.005206923837114242, + "median_abs_rel_error": 0.0012518395650151185, + "max_abs_rel_error": 0.10977752647623817, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9903846153846154 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.007125985921611428, + "mean_abs_rel_error": 0.007125985921611428, + "median_abs_rel_error": 0.0014603020581961841, + "max_abs_rel_error": 0.14108491904410003, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 0.9903846153846154 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.004640975804753294, + "mean_abs_rel_error": 0.004640975804753294, + "median_abs_rel_error": 0.0013933409854692508, + "max_abs_rel_error": 0.06001458554484444, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.004858882621875776, + "mean_abs_rel_error": 0.004858882621875776, + "median_abs_rel_error": 0.0012625258881575254, + "max_abs_rel_error": 0.09974601527867168, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.real_estate_taxes": { + "release": { + "targets": 106, + "mean_capped_abs_rel_error": 0.06530305356694628, + "mean_abs_rel_error": 0.09219380512831919, + "median_abs_rel_error": 0.0009109996393883125, + "max_abs_rel_error": 1.8381971604151794, + "share_within_5pct": 0.8584905660377359, + "share_within_10pct": 0.9150943396226415 + }, + "a_no_fsa": { + "targets": 106, + "mean_capped_abs_rel_error": 0.05325371776134614, + "mean_abs_rel_error": 0.0738779721711236, + "median_abs_rel_error": 0.0014744687411256323, + "max_abs_rel_error": 1.9273895008890598, + "share_within_5pct": 0.8962264150943396, + "share_within_10pct": 0.9245283018867925 + }, + "b_with_fsa": { + "targets": 106, + "mean_capped_abs_rel_error": 0.06322719672388397, + "mean_abs_rel_error": 0.09168356156278071, + "median_abs_rel_error": 0.0023487196394437367, + "max_abs_rel_error": 2.310141244857711, + "share_within_5pct": 0.8773584905660378, + "share_within_10pct": 0.9150943396226415 + }, + "a_no_fsa_l2": { + "targets": 106, + "mean_capped_abs_rel_error": 0.06264712014920974, + "mean_abs_rel_error": 0.08429610423278819, + "median_abs_rel_error": 0.0015365545747915823, + "max_abs_rel_error": 1.8211025769578548, + "share_within_5pct": 0.8962264150943396, + "share_within_10pct": 0.9150943396226415 + }, + "b_with_fsa_l2": { + "targets": 106, + "mean_capped_abs_rel_error": 0.06555904390465889, + "mean_abs_rel_error": 0.09052502187658329, + "median_abs_rel_error": 0.0015619785905789765, + "max_abs_rel_error": 1.997451072133554, + "share_within_5pct": 0.8679245283018868, + "share_within_10pct": 0.9056603773584906 + } + }, + "irs_soi/irs_soi.refundable_ctc": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.008139040475283662, + "mean_abs_rel_error": 0.008139040475283662, + "median_abs_rel_error": 0.0008233578397344743, + "max_abs_rel_error": 0.12663746254860164, + "share_within_5pct": 0.9519230769230769, + "share_within_10pct": 0.9807692307692307 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.0033094117565394513, + "mean_abs_rel_error": 0.0033094117565394513, + "median_abs_rel_error": 0.001122166874529885, + "max_abs_rel_error": 0.11807714161445394, + "share_within_5pct": 0.9903846153846154, + "share_within_10pct": 0.9903846153846154 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.01027086993187906, + "mean_abs_rel_error": 0.01027086993187906, + "median_abs_rel_error": 0.0017072033605070977, + "max_abs_rel_error": 0.07547486645524604, + "share_within_5pct": 0.9326923076923077, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.007115012838632084, + "mean_abs_rel_error": 0.007115012838632084, + "median_abs_rel_error": 0.0016434663364857586, + "max_abs_rel_error": 0.07636292293909935, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.011233836379507572, + "mean_abs_rel_error": 0.011233836379507572, + "median_abs_rel_error": 0.0013264100824115156, + "max_abs_rel_error": 0.09794567039691594, + "share_within_5pct": 0.9230769230769231, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.rent_and_royalty_net_income": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.039618566928938045, + "mean_abs_rel_error": 1.8030999836115063, + "median_abs_rel_error": 0.0007176159023661206, + "max_abs_rel_error": 97.38462804815869, + "share_within_5pct": 0.9615384615384616, + "share_within_10pct": 0.9615384615384616 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.03066594390696861, + "mean_abs_rel_error": 1.446877217472869, + "median_abs_rel_error": 0.0011371044924908885, + "max_abs_rel_error": 124.10983338268886, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9711538461538461 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.031039928237652052, + "mean_abs_rel_error": 1.7523792804316058, + "median_abs_rel_error": 0.0015571620230278925, + "max_abs_rel_error": 171.11203601712717, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9711538461538461 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.03125273529956563, + "mean_abs_rel_error": 1.6613107808905454, + "median_abs_rel_error": 0.0013871139318421635, + "max_abs_rel_error": 117.59125274511325, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9711538461538461 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.030944860064104122, + "mean_abs_rel_error": 1.6769302354353437, + "median_abs_rel_error": 0.0010064273312434795, + "max_abs_rel_error": 133.7718828948195, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9711538461538461 + } + }, + "irs_soi/irs_soi.salt_deduction": { + "release": { + "targets": 106, + "mean_capped_abs_rel_error": 0.018914635756625123, + "mean_abs_rel_error": 0.018914635756625123, + "median_abs_rel_error": 0.002280995063845683, + "max_abs_rel_error": 0.19976339462746978, + "share_within_5pct": 0.8490566037735849, + "share_within_10pct": 0.9622641509433962 + }, + "a_no_fsa": { + "targets": 106, + "mean_capped_abs_rel_error": 0.01820633523366054, + "mean_abs_rel_error": 0.01820633523366054, + "median_abs_rel_error": 0.0019400854118390722, + "max_abs_rel_error": 0.19762685326308188, + "share_within_5pct": 0.8773584905660378, + "share_within_10pct": 0.9622641509433962 + }, + "b_with_fsa": { + "targets": 106, + "mean_capped_abs_rel_error": 0.024003804714745787, + "mean_abs_rel_error": 0.024003804714745787, + "median_abs_rel_error": 0.006425492566295503, + "max_abs_rel_error": 0.26177314686305, + "share_within_5pct": 0.8679245283018868, + "share_within_10pct": 0.9528301886792453 + }, + "a_no_fsa_l2": { + "targets": 106, + "mean_capped_abs_rel_error": 0.02087703439938497, + "mean_abs_rel_error": 0.02087703439938497, + "median_abs_rel_error": 0.0033282491912103676, + "max_abs_rel_error": 0.2461527557983996, + "share_within_5pct": 0.8679245283018868, + "share_within_10pct": 0.9622641509433962 + }, + "b_with_fsa_l2": { + "targets": 106, + "mean_capped_abs_rel_error": 0.0213399101103332, + "mean_abs_rel_error": 0.0213399101103332, + "median_abs_rel_error": 0.004087402025151453, + "max_abs_rel_error": 0.23738595964118808, + "share_within_5pct": 0.8679245283018868, + "share_within_10pct": 0.9716981132075472 + } + }, + "irs_soi/irs_soi.tax_exempt_interest_income": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.0010230797937469554, + "mean_abs_rel_error": 0.0010230797937469554, + "median_abs_rel_error": 0.0008028656581808397, + "max_abs_rel_error": 0.005289848949676127, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.007157986053412043, + "mean_abs_rel_error": 0.007157986053412043, + "median_abs_rel_error": 0.0010709043889362922, + "max_abs_rel_error": 0.3406158635952663, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 0.9807692307692307 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.008476714009436103, + "mean_abs_rel_error": 0.008476714009436103, + "median_abs_rel_error": 0.001326595098523722, + "max_abs_rel_error": 0.381143802863377, + "share_within_5pct": 0.9807692307692307, + "share_within_10pct": 0.9807692307692307 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.010196405712620819, + "mean_abs_rel_error": 0.010196405712620819, + "median_abs_rel_error": 0.001047388682693757, + "max_abs_rel_error": 0.3872956647629681, + "share_within_5pct": 0.9711538461538461, + "share_within_10pct": 0.9711538461538461 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.00994683810792408, + "mean_abs_rel_error": 0.00994683810792408, + "median_abs_rel_error": 0.0013561242422237638, + "max_abs_rel_error": 0.4032943862793465, + "share_within_5pct": 0.9615384615384616, + "share_within_10pct": 0.9807692307692307 + } + }, + "irs_soi/irs_soi.taxable_income": { + "release": { + "targets": 107, + "mean_capped_abs_rel_error": 0.0028796123855853047, + "mean_abs_rel_error": 0.0028796123855853047, + "median_abs_rel_error": 0.001449392590926156, + "max_abs_rel_error": 0.015306031772363558, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 107, + "mean_capped_abs_rel_error": 0.0036495019258125563, + "mean_abs_rel_error": 0.0036495019258125563, + "median_abs_rel_error": 0.0017350205504192123, + "max_abs_rel_error": 0.029707876155350702, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 107, + "mean_capped_abs_rel_error": 0.004690154555384832, + "mean_abs_rel_error": 0.004690154555384832, + "median_abs_rel_error": 0.0019646415145805423, + "max_abs_rel_error": 0.03985183043937748, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 107, + "mean_capped_abs_rel_error": 0.0059890398568411, + "mean_abs_rel_error": 0.0059890398568411, + "median_abs_rel_error": 0.0015632785791814953, + "max_abs_rel_error": 0.041000424140849624, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 107, + "mean_capped_abs_rel_error": 0.006142543742870245, + "mean_abs_rel_error": 0.006142543742870245, + "median_abs_rel_error": 0.002315088948380751, + "max_abs_rel_error": 0.04425997571847816, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.taxable_interest_income": { + "release": { + "targets": 1038, + "mean_capped_abs_rel_error": 0.059861527861838994, + "mean_abs_rel_error": 0.08053300872511363, + "median_abs_rel_error": 0.00104381615042951, + "max_abs_rel_error": 6.944870490104277, + "share_within_5pct": 0.8872832369942196, + "share_within_10pct": 0.9036608863198459 + }, + "a_no_fsa": { + "targets": 1038, + "mean_capped_abs_rel_error": 0.05743217597899222, + "mean_abs_rel_error": 0.08237603798195878, + "median_abs_rel_error": 0.0018662802925159467, + "max_abs_rel_error": 11.32795841407572, + "share_within_5pct": 0.8921001926782274, + "share_within_10pct": 0.9104046242774566 + }, + "b_with_fsa": { + "targets": 1038, + "mean_capped_abs_rel_error": 0.06194858041067646, + "mean_abs_rel_error": 0.0791206838089129, + "median_abs_rel_error": 0.0023553203966199575, + "max_abs_rel_error": 11.400209646536714, + "share_within_5pct": 0.869942196531792, + "share_within_10pct": 0.8988439306358381 + }, + "a_no_fsa_l2": { + "targets": 1038, + "mean_capped_abs_rel_error": 0.059826440441635514, + "mean_abs_rel_error": 0.08512234275278145, + "median_abs_rel_error": 0.002049171527631015, + "max_abs_rel_error": 9.170798570811668, + "share_within_5pct": 0.882466281310212, + "share_within_10pct": 0.9075144508670521 + }, + "b_with_fsa_l2": { + "targets": 1038, + "mean_capped_abs_rel_error": 0.059342730943852055, + "mean_abs_rel_error": 0.08108749133815571, + "median_abs_rel_error": 0.002027108689994185, + "max_abs_rel_error": 10.139970087449136, + "share_within_5pct": 0.873795761078998, + "share_within_10pct": 0.9007707129094412 + } + }, + "irs_soi/irs_soi.taxable_pension_income": { + "release": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0007702053107311273, + "mean_abs_rel_error": 0.0007702053107311273, + "median_abs_rel_error": 0.0005300520540812743, + "max_abs_rel_error": 0.011549613331512092, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0012355022536187433, + "mean_abs_rel_error": 0.0012355022536187433, + "median_abs_rel_error": 0.0009436839594206578, + "max_abs_rel_error": 0.011376805419169666, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0012078536915383102, + "mean_abs_rel_error": 0.0012078536915383102, + "median_abs_rel_error": 0.0007961076569292685, + "max_abs_rel_error": 0.011491231771221204, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0012142279219895882, + "mean_abs_rel_error": 0.0012142279219895882, + "median_abs_rel_error": 0.0008726696048781046, + "max_abs_rel_error": 0.011617196510599547, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0012311815891408156, + "mean_abs_rel_error": 0.0012311815891408156, + "median_abs_rel_error": 0.0007921485302220244, + "max_abs_rel_error": 0.01111146110858599, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.taxable_social_security": { + "release": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0032985455804529326, + "mean_abs_rel_error": 0.0032985455804529326, + "median_abs_rel_error": 0.0005862333442026984, + "max_abs_rel_error": 0.10858679373892052, + "share_within_5pct": 0.9907407407407407, + "share_within_10pct": 0.9907407407407407 + }, + "a_no_fsa": { + "targets": 108, + "mean_capped_abs_rel_error": 0.002461165012778316, + "mean_abs_rel_error": 0.002461165012778316, + "median_abs_rel_error": 0.0008284681472116246, + "max_abs_rel_error": 0.11041443069483925, + "share_within_5pct": 0.9814814814814815, + "share_within_10pct": 0.9907407407407407 + }, + "b_with_fsa": { + "targets": 108, + "mean_capped_abs_rel_error": 0.0025410773934886445, + "mean_abs_rel_error": 0.0025410773934886445, + "median_abs_rel_error": 0.0008587694854825479, + "max_abs_rel_error": 0.1108729300561391, + "share_within_5pct": 0.9814814814814815, + "share_within_10pct": 0.9907407407407407 + }, + "a_no_fsa_l2": { + "targets": 108, + "mean_capped_abs_rel_error": 0.002666767129625355, + "mean_abs_rel_error": 0.002666767129625355, + "median_abs_rel_error": 0.0010431696210772673, + "max_abs_rel_error": 0.1100913490921742, + "share_within_5pct": 0.9814814814814815, + "share_within_10pct": 0.9907407407407407 + }, + "b_with_fsa_l2": { + "targets": 108, + "mean_capped_abs_rel_error": 0.002803911234913741, + "mean_abs_rel_error": 0.002803911234913741, + "median_abs_rel_error": 0.000890129205524575, + "max_abs_rel_error": 0.10991972483801984, + "share_within_5pct": 0.9814814814814815, + "share_within_10pct": 0.9907407407407407 + } + }, + "irs_soi/irs_soi.tip_income": { + "release": { + "targets": 1, + "mean_capped_abs_rel_error": 0.21253556635193796, + "mean_abs_rel_error": 0.21253556635193796, + "median_abs_rel_error": 0.21253556635193796, + "max_abs_rel_error": 0.21253556635193796, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.0013406511894002552, + "mean_abs_rel_error": 0.0013406511894002552, + "median_abs_rel_error": 0.0013406511894002552, + "max_abs_rel_error": 0.0013406511894002552, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 1, + "mean_capped_abs_rel_error": 0.0004249800895334228, + "mean_abs_rel_error": 0.0004249800895334228, + "median_abs_rel_error": 0.0004249800895334228, + "max_abs_rel_error": 0.0004249800895334228, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.000684443037459516, + "mean_abs_rel_error": 0.000684443037459516, + "median_abs_rel_error": 0.000684443037459516, + "max_abs_rel_error": 0.000684443037459516, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 1, + "mean_capped_abs_rel_error": 0.0004279212081868519, + "mean_abs_rel_error": 0.0004279212081868519, + "median_abs_rel_error": 0.0004279212081868519, + "max_abs_rel_error": 0.0004279212081868519, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + } + }, + "irs_soi/irs_soi.unemployment_compensation": { + "release": { + "targets": 106, + "mean_capped_abs_rel_error": 0.0011696769194290445, + "mean_abs_rel_error": 0.0011696769194290445, + "median_abs_rel_error": 0.0008714788178793252, + "max_abs_rel_error": 0.012311829291160554, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa": { + "targets": 106, + "mean_capped_abs_rel_error": 0.0026520198433075555, + "mean_abs_rel_error": 0.0026520198433075555, + "median_abs_rel_error": 0.0011314453752402226, + "max_abs_rel_error": 0.11622417159829035, + "share_within_5pct": 0.9905660377358491, + "share_within_10pct": 0.9905660377358491 + }, + "b_with_fsa": { + "targets": 106, + "mean_capped_abs_rel_error": 0.005318217807061679, + "mean_abs_rel_error": 0.005318217807061679, + "median_abs_rel_error": 0.001480907092962697, + "max_abs_rel_error": 0.12714237492620808, + "share_within_5pct": 0.9716981132075472, + "share_within_10pct": 0.9905660377358491 + }, + "a_no_fsa_l2": { + "targets": 106, + "mean_capped_abs_rel_error": 0.0021110455963787842, + "mean_abs_rel_error": 0.0021110455963787842, + "median_abs_rel_error": 0.0013036635865510439, + "max_abs_rel_error": 0.026135531312713716, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 106, + "mean_capped_abs_rel_error": 0.006211229937105544, + "mean_abs_rel_error": 0.006211229937105544, + "median_abs_rel_error": 0.0019753424166971314, + "max_abs_rel_error": 0.1918390627335188, + "share_within_5pct": 0.9811320754716981, + "share_within_10pct": 0.9905660377358491 + } + }, + "jct/jct.individual_tax_expenditure_revenue_loss": { + "release": { + "targets": 11, + "mean_capped_abs_rel_error": 0.42341291491724176, + "mean_abs_rel_error": 0.42341291491724176, + "median_abs_rel_error": 0.2857443076502946, + "max_abs_rel_error": 0.9875536544765108, + "share_within_5pct": 0.18181818181818182, + "share_within_10pct": 0.18181818181818182 + }, + "a_no_fsa": { + "targets": 11, + "mean_capped_abs_rel_error": 0.35342414072350636, + "mean_abs_rel_error": 0.35342414072350636, + "median_abs_rel_error": 0.2233080614650183, + "max_abs_rel_error": 0.9851062346652032, + "share_within_5pct": 0.18181818181818182, + "share_within_10pct": 0.18181818181818182 + }, + "b_with_fsa": { + "targets": 11, + "mean_capped_abs_rel_error": 0.37059879736157997, + "mean_abs_rel_error": 0.37059879736157997, + "median_abs_rel_error": 0.29105517691437327, + "max_abs_rel_error": 0.9852218073808154, + "share_within_5pct": 0.18181818181818182, + "share_within_10pct": 0.18181818181818182 + }, + "a_no_fsa_l2": { + "targets": 11, + "mean_capped_abs_rel_error": 0.399370259646669, + "mean_abs_rel_error": 0.399370259646669, + "median_abs_rel_error": 0.2786286584614955, + "max_abs_rel_error": 0.9871458987924335, + "share_within_5pct": 0.18181818181818182, + "share_within_10pct": 0.18181818181818182 + }, + "b_with_fsa_l2": { + "targets": 11, + "mean_capped_abs_rel_error": 0.395465125473867, + "mean_abs_rel_error": 0.395465125473867, + "median_abs_rel_error": 0.29684037252180884, + "max_abs_rel_error": 0.9864107613017746, + "share_within_5pct": 0.18181818181818182, + "share_within_10pct": 0.18181818181818182 + } + }, + "ssa/ssa.ssa": { + "release": { + "targets": 6, + "mean_capped_abs_rel_error": 0.0370357134139729, + "mean_abs_rel_error": 0.0370357134139729, + "median_abs_rel_error": 0.0025621271077189076, + "max_abs_rel_error": 0.11069228911324024, + "share_within_5pct": 0.6666666666666666, + "share_within_10pct": 0.6666666666666666 + }, + "a_no_fsa": { + "targets": 6, + "mean_capped_abs_rel_error": 0.0012941915791558967, + "mean_abs_rel_error": 0.0012941915791558967, + "median_abs_rel_error": 0.0002865183255248981, + "max_abs_rel_error": 0.00664828122309669, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 6, + "mean_capped_abs_rel_error": 0.0010460386853023674, + "mean_abs_rel_error": 0.0010460386853023674, + "median_abs_rel_error": 0.0003024384337507281, + "max_abs_rel_error": 0.004797406177845936, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 6, + "mean_capped_abs_rel_error": 0.01441884234732778, + "mean_abs_rel_error": 0.01441884234732778, + "median_abs_rel_error": 0.0014730490770498417, + "max_abs_rel_error": 0.07792793781866521, + "share_within_5pct": 0.8333333333333334, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 6, + "mean_capped_abs_rel_error": 0.013448456185682245, + "mean_abs_rel_error": 0.013448456185682245, + "median_abs_rel_error": 0.0007061472649063775, + "max_abs_rel_error": 0.07676604316413718, + "share_within_5pct": 0.8333333333333334, + "share_within_10pct": 1.0 + } + }, + "ssa/ssa.ssi_federal_payment_recipients": { + "release": { + "targets": 3, + "mean_capped_abs_rel_error": 0.2846428972877239, + "mean_abs_rel_error": 0.2846428972877239, + "median_abs_rel_error": 0.030328275970065644, + "max_abs_rel_error": 0.823348908055483, + "share_within_5pct": 0.6666666666666666, + "share_within_10pct": 0.6666666666666666 + }, + "a_no_fsa": { + "targets": 3, + "mean_capped_abs_rel_error": 0.1563820459217022, + "mean_abs_rel_error": 0.1563820459217022, + "median_abs_rel_error": 0.09899314636699057, + "max_abs_rel_error": 0.3693999247880837, + "share_within_5pct": 0.3333333333333333, + "share_within_10pct": 0.6666666666666666 + }, + "b_with_fsa": { + "targets": 3, + "mean_capped_abs_rel_error": 0.17472961959413977, + "mean_abs_rel_error": 0.17472961959413977, + "median_abs_rel_error": 0.10994109619409498, + "max_abs_rel_error": 0.41396174998780266, + "share_within_5pct": 0.3333333333333333, + "share_within_10pct": 0.3333333333333333 + }, + "a_no_fsa_l2": { + "targets": 3, + "mean_capped_abs_rel_error": 0.24329500380815094, + "mean_abs_rel_error": 0.24329500380815094, + "median_abs_rel_error": 0.1285893328132574, + "max_abs_rel_error": 0.6002182237686193, + "share_within_5pct": 0.3333333333333333, + "share_within_10pct": 0.3333333333333333 + }, + "b_with_fsa_l2": { + "targets": 3, + "mean_capped_abs_rel_error": 0.2307956389283372, + "mean_abs_rel_error": 0.2307956389283372, + "median_abs_rel_error": 0.12824130514234397, + "max_abs_rel_error": 0.5638665903843211, + "share_within_5pct": 0.3333333333333333, + "share_within_10pct": 0.3333333333333333 + } + }, + "ssa/ssa.ssi_payments": { + "release": { + "targets": 51, + "mean_capped_abs_rel_error": 0.03742067946016383, + "mean_abs_rel_error": 0.03742067946016383, + "median_abs_rel_error": 0.0008407150618108651, + "max_abs_rel_error": 0.4642138796401504, + "share_within_5pct": 0.8431372549019608, + "share_within_10pct": 0.8823529411764706 + }, + "a_no_fsa": { + "targets": 51, + "mean_capped_abs_rel_error": 0.004137128260528899, + "mean_abs_rel_error": 0.004137128260528899, + "median_abs_rel_error": 0.0014296317702531217, + "max_abs_rel_error": 0.041593060756080394, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 51, + "mean_capped_abs_rel_error": 0.004862481410245844, + "mean_abs_rel_error": 0.004862481410245844, + "median_abs_rel_error": 0.001859045982017068, + "max_abs_rel_error": 0.039543337137987654, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 51, + "mean_capped_abs_rel_error": 0.005446286615921841, + "mean_abs_rel_error": 0.005446286615921841, + "median_abs_rel_error": 0.0011806351556604261, + "max_abs_rel_error": 0.09209266618972992, + "share_within_5pct": 0.9803921568627451, + "share_within_10pct": 1.0 + }, + "b_with_fsa_l2": { + "targets": 51, + "mean_capped_abs_rel_error": 0.009986175814523308, + "mean_abs_rel_error": 0.009986175814523308, + "median_abs_rel_error": 0.002128603989170507, + "max_abs_rel_error": 0.20590318868760393, + "share_within_5pct": 0.9411764705882353, + "share_within_10pct": 0.9803921568627451 + } + }, + "ssa/ssa.ssi_recipients": { + "release": { + "targets": 51, + "mean_capped_abs_rel_error": 0.047648715574581536, + "mean_abs_rel_error": 0.047648715574581536, + "median_abs_rel_error": 0.0011530111958323558, + "max_abs_rel_error": 0.41677830833980467, + "share_within_5pct": 0.8627450980392157, + "share_within_10pct": 0.8627450980392157 + }, + "a_no_fsa": { + "targets": 51, + "mean_capped_abs_rel_error": 0.006750443130807028, + "mean_abs_rel_error": 0.006750443130807028, + "median_abs_rel_error": 0.0010537814801668786, + "max_abs_rel_error": 0.12089023405432996, + "share_within_5pct": 0.9411764705882353, + "share_within_10pct": 0.9803921568627451 + }, + "b_with_fsa": { + "targets": 51, + "mean_capped_abs_rel_error": 0.0075157476131071325, + "mean_abs_rel_error": 0.0075157476131071325, + "median_abs_rel_error": 0.0013143411030510869, + "max_abs_rel_error": 0.11651946375749414, + "share_within_5pct": 0.9411764705882353, + "share_within_10pct": 0.9607843137254902 + }, + "a_no_fsa_l2": { + "targets": 51, + "mean_capped_abs_rel_error": 0.01958193532774297, + "mean_abs_rel_error": 0.01958193532774297, + "median_abs_rel_error": 0.0013722368018263319, + "max_abs_rel_error": 0.22710707330828744, + "share_within_5pct": 0.8823529411764706, + "share_within_10pct": 0.9019607843137255 + }, + "b_with_fsa_l2": { + "targets": 51, + "mean_capped_abs_rel_error": 0.014847141211575057, + "mean_abs_rel_error": 0.014847141211575057, + "median_abs_rel_error": 0.001727654400499628, + "max_abs_rel_error": 0.20130109720584488, + "share_within_5pct": 0.9215686274509803, + "share_within_10pct": 0.9607843137254902 + } + }, + "usda_snap/usda_snap.usda_snap": { + "release": { + "targets": 104, + "mean_capped_abs_rel_error": 0.0790716446736785, + "mean_abs_rel_error": 0.0790716446736785, + "median_abs_rel_error": 0.07382797185805293, + "max_abs_rel_error": 0.2735196192840119, + "share_within_5pct": 0.33653846153846156, + "share_within_10pct": 0.6923076923076923 + }, + "a_no_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.0011522985653391056, + "mean_abs_rel_error": 0.0011522985653391056, + "median_abs_rel_error": 0.001003735688955348, + "max_abs_rel_error": 0.0036165984263715517, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "b_with_fsa": { + "targets": 104, + "mean_capped_abs_rel_error": 0.0016954531883470229, + "mean_abs_rel_error": 0.0016954531883470229, + "median_abs_rel_error": 0.001013748047395984, + "max_abs_rel_error": 0.022970948543976445, + "share_within_5pct": 1.0, + "share_within_10pct": 1.0 + }, + "a_no_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.0064553251606772905, + "mean_abs_rel_error": 0.0064553251606772905, + "median_abs_rel_error": 0.0009322100733563707, + "max_abs_rel_error": 0.12274476114262184, + "share_within_5pct": 0.9615384615384616, + "share_within_10pct": 0.9807692307692307 + }, + "b_with_fsa_l2": { + "targets": 104, + "mean_capped_abs_rel_error": 0.007195575669485662, + "mean_abs_rel_error": 0.007195575669485662, + "median_abs_rel_error": 0.0010392136198712778, + "max_abs_rel_error": 0.10964947177182012, + "share_within_5pct": 0.9519230769230769, + "share_within_10pct": 0.9903846153846154 + } + } + }, + "fit_overall": { + "fsa": { + "release": { + "targets": 132, + "mean_capped_abs_rel_error": 0.4833694552147605, + "mean_abs_rel_error": 0.4833694552147605, + "median_abs_rel_error": 0.49690467224685514, + "max_abs_rel_error": 0.7656073975800927, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "a_no_fsa": { + "targets": 132, + "mean_capped_abs_rel_error": 0.48083126456504544, + "mean_abs_rel_error": 0.48083126456504544, + "median_abs_rel_error": 0.5106527185986347, + "max_abs_rel_error": 0.7908842397953412, + "share_within_5pct": 0.007575757575757576, + "share_within_10pct": 0.015151515151515152 + }, + "b_with_fsa": { + "targets": 132, + "mean_capped_abs_rel_error": 0.007425808689396977, + "mean_abs_rel_error": 0.007425808689396977, + "median_abs_rel_error": 0.0008426317888582139, + "max_abs_rel_error": 0.14264923040127336, + "share_within_5pct": 0.9545454545454546, + "share_within_10pct": 0.9696969696969697 + }, + "a_no_fsa_l2": { + "targets": 132, + "mean_capped_abs_rel_error": 0.48227857779804323, + "mean_abs_rel_error": 0.48227857779804323, + "median_abs_rel_error": 0.4969760375745721, + "max_abs_rel_error": 0.7444172537466162, + "share_within_5pct": 0.0, + "share_within_10pct": 0.0 + }, + "b_with_fsa_l2": { + "targets": 132, + "mean_capped_abs_rel_error": 0.036232548889898734, + "mean_abs_rel_error": 0.036232548889898734, + "median_abs_rel_error": 0.0018792706842900696, + "max_abs_rel_error": 0.3139045998065022, + "share_within_5pct": 0.7803030303030303, + "share_within_10pct": 0.8484848484848485 + } + }, + "non_fsa": { + "release": { + "targets": 6102, + "mean_capped_abs_rel_error": 0.05303823079681869, + "mean_abs_rel_error": 19008.25634962768, + "median_abs_rel_error": 0.0009052117938450134, + "max_abs_rel_error": 112185089.03921935, + "share_within_5pct": 0.8521796132415601, + "share_within_10pct": 0.8897082923631596 + }, + "a_no_fsa": { + "targets": 6102, + "mean_capped_abs_rel_error": 0.03301639302929685, + "mean_abs_rel_error": 2290.3744221021716, + "median_abs_rel_error": 0.001316099434042245, + "max_abs_rel_error": 7327317.240634516, + "share_within_5pct": 0.9200262209111767, + "share_within_10pct": 0.9396919042936742 + }, + "b_with_fsa": { + "targets": 6102, + "mean_capped_abs_rel_error": 0.0361566212336172, + "mean_abs_rel_error": 1131.4554335098455, + "median_abs_rel_error": 0.0015093544537426909, + "max_abs_rel_error": 5656263.079775462, + "share_within_5pct": 0.909210095050803, + "share_within_10pct": 0.9347754834480498 + }, + "a_no_fsa_l2": { + "targets": 6102, + "mean_capped_abs_rel_error": 0.03849863610403729, + "mean_abs_rel_error": 8650.90354190468, + "median_abs_rel_error": 0.0015066302785964449, + "max_abs_rel_error": 48105138.60023324, + "share_within_5pct": 0.9041297935103245, + "share_within_10pct": 0.9334644378892166 + }, + "b_with_fsa_l2": { + "targets": 6102, + "mean_capped_abs_rel_error": 0.03853532531745583, + "mean_abs_rel_error": 2825.0197939553364, + "median_abs_rel_error": 0.0015422785494759086, + "max_abs_rel_error": 13148881.339845233, + "share_within_5pct": 0.9005244182235332, + "share_within_10pct": 0.9311701081612586 + } + } + }, + "fsa_targets": [ + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.al.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 26825497232.528435, + "release": 8305673853.103367, + "release_error": -0.6903813643747876, + "a_no_fsa": 7319973386.135882, + "a_no_fsa_error": -0.727126273832504, + "b_with_fsa": 26808967189.14933, + "b_with_fsa_error": -0.0006162064112295516, + "a_no_fsa_l2": 7861824948.321693, + "a_no_fsa_l2_error": -0.7069271491904168, + "b_with_fsa_l2": 26353710219.39588, + "b_with_fsa_l2_error": -0.017587260696158395, + "label": "Federal student loan balance, Alabama", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ak.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 2476199744.541086, + "release": 1148878706.6359432, + "release_error": -0.5360314897177794, + "a_no_fsa": 1426704301.678284, + "a_no_fsa_error": -0.4238331116770651, + "b_with_fsa": 2471464575.901251, + "b_with_fsa_error": -0.0019122724853979523, + "a_no_fsa_l2": 1170441303.297184, + "a_no_fsa_l2_error": -0.5273235505829108, + "b_with_fsa_l2": 2193760665.995848, + "b_with_fsa_l2_error": -0.11406150863551696, + "label": "Federal student loan balance, Alaska", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.az.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 35079496380.99872, + "release": 24321650675.30658, + "release_error": -0.30667047180070894, + "a_no_fsa": 14374524481.523855, + "a_no_fsa_error": -0.5902300213947765, + "b_with_fsa": 35066330519.24732, + "b_with_fsa_error": -0.0003753150161678959, + "a_no_fsa_l2": 18549672333.952885, + "a_no_fsa_l2_error": -0.471210414981882, + "b_with_fsa_l2": 34993185254.43467, + "b_with_fsa_l2_error": -0.0024604437197906968, + "label": "Federal student loan balance, Arizona", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ar.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 14960373456.602396, + "release": 5993258429.895809, + "release_error": -0.5993911216667636, + "a_no_fsa": 6094478515.672241, + "a_no_fsa_error": -0.592625242053527, + "b_with_fsa": 14959718370.46382, + "b_with_fsa_error": -4.378808727447918e-05, + "a_no_fsa_l2": 6339643300.495238, + "a_no_fsa_l2_error": -0.576237630772687, + "b_with_fsa_l2": 14962322112.92789, + "b_with_fsa_l2_error": 0.00013025452413654648, + "label": "Federal student loan balance, Arkansas", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ca.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 161675208320.66174, + "release": 91288748679.2521, + "release_error": -0.4353571606464688, + "a_no_fsa": 99222917648.94727, + "a_no_fsa_error": -0.3862824196759251, + "b_with_fsa": 161788395432.2775, + "b_with_fsa_error": 0.000700089474394004, + "a_no_fsa_l2": 96827940890.14378, + "a_no_fsa_l2_error": -0.40109592623441587, + "b_with_fsa_l2": 161410968339.90344, + "b_with_fsa_l2_error": -0.001634387754950129, + "label": "Federal student loan balance, California", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.co.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 30642971838.695942, + "release": 12246615950.529167, + "release_error": -0.6003450313176171, + "a_no_fsa": 6407928350.978854, + "a_no_fsa_error": -0.7908842397953412, + "b_with_fsa": 30589718126.402794, + "b_with_fsa_error": -0.0017378768800061116, + "a_no_fsa_l2": 9048426195.06542, + "a_no_fsa_l2_error": -0.7047144695137217, + "b_with_fsa_l2": 30581391897.20246, + "b_with_fsa_l2_error": -0.0020095942984132346, + "label": "Federal student loan balance, Colorado", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ct.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 20428647892.46396, + "release": 8221406294.5546875, + "release_error": -0.5975550443753289, + "a_no_fsa": 8137232154.214884, + "a_no_fsa_error": -0.6016754414169195, + "b_with_fsa": 20456257970.291992, + "b_with_fsa_error": 0.0013515372125151115, + "a_no_fsa_l2": 7949052509.370267, + "a_no_fsa_l2_error": -0.6108869979445563, + "b_with_fsa_l2": 20335708773.23733, + "b_with_fsa_l2_error": -0.004549450346193112, + "label": "Federal student loan balance, Connecticut", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.de.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 5777799403.929201, + "release": 2617801463.3130417, + "release_error": -0.5469206733738797, + "a_no_fsa": 3314536735.821482, + "a_no_fsa_error": -0.426332327569658, + "b_with_fsa": 5784345717.216734, + "b_with_fsa_error": 0.0011330115204555174, + "a_no_fsa_l2": 2922375039.2808175, + "a_no_fsa_l2_error": -0.49420621330441966, + "b_with_fsa_l2": 5549913630.703793, + "b_with_fsa_l2_error": -0.039441620813355775, + "label": "Federal student loan balance, Delaware", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.dc.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 6603199318.77623, + "release": 2599656531.2344103, + "release_error": -0.6063034893036965, + "a_no_fsa": 1487987972.7952225, + "a_no_fsa_error": -0.7746565110394107, + "b_with_fsa": 6612600807.761501, + "b_with_fsa_error": 0.0014237778584902433, + "a_no_fsa_l2": 2503021020.292594, + "a_no_fsa_l2_error": -0.6209381393084348, + "b_with_fsa_l2": 6591845017.209323, + "b_with_fsa_l2_error": -0.0017195151954024644, + "label": "Federal student loan balance, District of Columbia", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.fl.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 116690912961.49869, + "release": 42937210291.70776, + "release_error": -0.6320432396833283, + "a_no_fsa": 43915654739.38336, + "a_no_fsa_error": -0.6236583155890381, + "b_with_fsa": 116736175665.97353, + "b_with_fsa_error": 0.0003878854259180606, + "a_no_fsa_l2": 42752312555.74102, + "a_no_fsa_l2_error": -0.6336277481191116, + "b_with_fsa_l2": 116748160709.34915, + "b_with_fsa_l2_error": 0.0004905930238916919, + "label": "Federal student loan balance, Florida", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ga.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 76968542059.48543, + "release": 38439192429.426, + "release_error": -0.5005856756424186, + "a_no_fsa": 51937197599.45988, + "a_no_fsa_error": -0.32521526054995276, + "b_with_fsa": 76973691089.3685, + "b_with_fsa_error": 6.689784872230596e-05, + "a_no_fsa_l2": 33255276564.375557, + "a_no_fsa_l2_error": -0.5679367742385703, + "b_with_fsa_l2": 76919467646.1718, + "b_with_fsa_l2_error": -0.0006375905272533525, + "label": "Federal student loan balance, Georgia", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.hi.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 5055574478.438051, + "release": 3255533576.0909986, + "release_error": -0.356050713924639, + "a_no_fsa": 3234391887.406846, + "a_no_fsa_error": -0.36023257075897536, + "b_with_fsa": 5047210422.285864, + "b_with_fsa_error": -0.0016544224969605177, + "a_no_fsa_l2": 3200088692.978441, + "a_no_fsa_l2_error": -0.36701779261154766, + "b_with_fsa_l2": 5060810899.190743, + "b_with_fsa_l2_error": 0.0010357716566189417, + "label": "Federal student loan balance, Hawaii", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.id.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 7738124201.690894, + "release": 6151169637.166891, + "release_error": -0.2050825914860904, + "a_no_fsa": 6406156014.0019655, + "a_no_fsa_error": -0.17213062920311797, + "b_with_fsa": 7730724748.640401, + "b_with_fsa_error": -0.0009562334304321907, + "a_no_fsa_l2": 6497881632.612452, + "a_no_fsa_l2_error": -0.16027690132027492, + "b_with_fsa_l2": 7725209256.315255, + "b_with_fsa_l2_error": -0.0016690020784128608, + "label": "Federal student loan balance, Idaho", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.il.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 67373268049.38872, + "release": 34143177599.567707, + "release_error": -0.49322366885129165, + "a_no_fsa": 50419679882.95749, + "a_no_fsa_error": -0.2516367196853686, + "b_with_fsa": 67191288568.98292, + "b_with_fsa_error": -0.002701063577209848, + "a_no_fsa_l2": 47726306623.922005, + "a_no_fsa_l2_error": -0.29161360275805964, + "b_with_fsa_l2": 67488438950.88707, + "b_with_fsa_l2_error": 0.001709445078631554, + "label": "Federal student loan balance, Illinois", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.in.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 31984246700.32236, + "release": 25340483538.178738, + "release_error": -0.20771985735329707, + "a_no_fsa": 26440079147.926167, + "a_no_fsa_error": -0.1733405699481525, + "b_with_fsa": 32011624817.368282, + "b_with_fsa_error": 0.000855987552323544, + "a_no_fsa_l2": 28219572157.449123, + "a_no_fsa_l2_error": -0.11770402405116812, + "b_with_fsa_l2": 32007473057.553585, + "b_with_fsa_l2_error": 0.0007261811556434114, + "label": "Federal student loan balance, Indiana", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ia.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 13928623563.04361, + "release": 5484448371.887898, + "release_error": -0.6062462060903406, + "a_no_fsa": 6530755163.710199, + "a_no_fsa_error": -0.5311270252835282, + "b_with_fsa": 13935031027.771067, + "b_with_fsa_error": 0.000460021386783528, + "a_no_fsa_l2": 6063778210.086546, + "a_no_fsa_l2_error": -0.5646534503111001, + "b_with_fsa_l2": 13915981654.154667, + "b_with_fsa_l2_error": -0.0009076208307104449, + "label": "Federal student loan balance, Iowa", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ks.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 13515923605.620094, + "release": 6467831591.838855, + "release_error": -0.5214658072534941, + "a_no_fsa": 6474851658.732163, + "a_no_fsa_error": -0.5209464149353554, + "b_with_fsa": 13543824212.236744, + "b_with_fsa_error": 0.0020642767324497305, + "a_no_fsa_l2": 6860563485.1034975, + "a_no_fsa_l2_error": -0.49240882937139513, + "b_with_fsa_l2": 13493450407.894234, + "b_with_fsa_l2_error": -0.0016627200908797643, + "label": "Federal student loan balance, Kansas", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ky.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 22285797700.869774, + "release": 12794424525.133045, + "release_error": -0.42589335607970175, + "a_no_fsa": 20165450643.839813, + "a_no_fsa_error": -0.09514342207939935, + "b_with_fsa": 22314459080.32409, + "b_with_fsa_error": 0.0012860827258248237, + "a_no_fsa_l2": 13234531030.02615, + "a_no_fsa_l2_error": -0.4061450611880215, + "b_with_fsa_l2": 22306388021.44704, + "b_with_fsa_l2_error": 0.0009239211830619413, + "label": "Federal student loan balance, Kentucky", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.la.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 25896922328.325527, + "release": 6070047019.202428, + "release_error": -0.7656073975800927, + "a_no_fsa": 8958222549.400795, + "a_no_fsa_error": -0.6540815763422794, + "b_with_fsa": 23994270877.394115, + "b_with_fsa_error": -0.07347017637112539, + "a_no_fsa_l2": 6618806528.184014, + "a_no_fsa_l2_error": -0.7444172537466162, + "b_with_fsa_l2": 20361072374.099495, + "b_with_fsa_l2_error": -0.21376478193206117, + "label": "Federal student loan balance, Louisiana", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.me.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 6912724286.843865, + "release": 4008420739.073031, + "release_error": -0.4201387799160798, + "a_no_fsa": 2704436959.992352, + "a_no_fsa_error": -0.6087740740449648, + "b_with_fsa": 6909087919.380033, + "b_with_fsa_error": -0.0005260397077825749, + "a_no_fsa_l2": 3561968557.6793094, + "a_no_fsa_l2_error": -0.48472289507360156, + "b_with_fsa_l2": 6895979624.073615, + "b_with_fsa_l2_error": -0.002422295765812383, + "label": "Federal student loan balance, Maine", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.md.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 39619195912.65738, + "release": 14358911296.270561, + "release_error": -0.6375769127691147, + "a_no_fsa": 15245264206.901213, + "a_no_fsa_error": -0.615205108137222, + "b_with_fsa": 39619892919.91679, + "b_with_fsa_error": 1.7592665458017697e-05, + "a_no_fsa_l2": 14409817959.407259, + "a_no_fsa_l2_error": -0.6362920138214196, + "b_with_fsa_l2": 39622977525.34854, + "b_with_fsa_l2_error": 9.54490015269082e-05, + "label": "Federal student loan balance, Maryland", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ma.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 34460446444.86345, + "release": 19283679885.624725, + "release_error": -0.44041119964947284, + "a_no_fsa": 16452461292.345823, + "a_no_fsa_error": -0.5225696997666677, + "b_with_fsa": 34446011780.137344, + "b_with_fsa_error": -0.0004188763122729745, + "a_no_fsa_l2": 18678869072.789906, + "a_no_fsa_l2_error": -0.45796206956645186, + "b_with_fsa_l2": 34444639896.7352, + "b_with_fsa_l2_error": -0.0004586866903637051, + "label": "Federal student loan balance, Massachusetts", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.mi.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 54889094337.32741, + "release": 33956792514.97786, + "release_error": -0.38135629809644184, + "a_no_fsa": 39511709623.778305, + "a_no_fsa_error": -0.28015373361865964, + "b_with_fsa": 54914105943.04848, + "b_with_fsa_error": 0.00045567532171978574, + "a_no_fsa_l2": 34510018844.80482, + "a_no_fsa_l2_error": -0.3712773136186321, + "b_with_fsa_l2": 54900432574.57148, + "b_with_fsa_l2_error": 0.00020656630212171994, + "label": "Federal student loan balance, Michigan", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.mn.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 28373122072.86661, + "release": 20891193585.03671, + "release_error": -0.2636977512948748, + "a_no_fsa": 21535103447.70586, + "a_no_fsa_error": -0.2410033907301301, + "b_with_fsa": 28405829193.08943, + "b_with_fsa_error": 0.0011527501322844658, + "a_no_fsa_l2": 22322137912.622112, + "a_no_fsa_l2_error": -0.21326465747070858, + "b_with_fsa_l2": 28385924880.019043, + "b_with_fsa_l2_error": 0.00045123011558445623, + "label": "Federal student loan balance, Minnesota", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ms.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 18365148105.34639, + "release": 7875869255.9178505, + "release_error": -0.5711513345419165, + "a_no_fsa": 6281546984.528941, + "a_no_fsa_error": -0.6579637175536699, + "b_with_fsa": 18371620725.737057, + "b_with_fsa_error": 0.00035244041341450866, + "a_no_fsa_l2": 7908243445.634271, + "a_no_fsa_l2_error": -0.5693885287354664, + "b_with_fsa_l2": 18373143044.25435, + "b_with_fsa_l2_error": 0.0004353321226759685, + "label": "Federal student loan balance, Mississippi", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.mo.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 31571546742.89885, + "release": 15712567803.619015, + "release_error": -0.502318719713879, + "a_no_fsa": 24720784969.34739, + "a_no_fsa_error": -0.21699164216882566, + "b_with_fsa": 31603786446.852547, + "b_with_fsa_error": 0.0010211632713544084, + "a_no_fsa_l2": 18404881623.790264, + "a_no_fsa_l2_error": -0.4170421305718911, + "b_with_fsa_l2": 31631620273.969486, + "b_with_fsa_l2_error": 0.0019027744050629587, + "label": "Federal student loan balance, Missouri", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.mt.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 4642874521.014537, + "release": 3551105188.0317473, + "release_error": -0.23514943771175228, + "a_no_fsa": 3475871560.07846, + "a_no_fsa_error": -0.2513535430806924, + "b_with_fsa": 4650965679.018977, + "b_with_fsa_error": 0.0017427044318811937, + "a_no_fsa_l2": 3585865186.445833, + "a_no_fsa_l2_error": -0.22766269684534388, + "b_with_fsa_l2": 4639144960.137013, + "b_with_fsa_l2_error": -0.0008032870284653866, + "label": "Federal student loan balance, Montana", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ne.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 8460349127.182044, + "release": 3864699647.1679335, + "release_error": -0.5431985620131046, + "a_no_fsa": 4310346668.579988, + "a_no_fsa_error": -0.4905237829096931, + "b_with_fsa": 8452616131.9912815, + "b_with_fsa_error": -0.0009140279052926283, + "a_no_fsa_l2": 3667358079.716547, + "a_no_fsa_l2_error": -0.5665240258308273, + "b_with_fsa_l2": 8457702479.336823, + "b_with_fsa_l2_error": -0.0003128296250467037, + "label": "Federal student loan balance, Nebraska", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nv.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 13619098594.975973, + "release": 5392235864.376257, + "release_error": -0.6040680793393015, + "a_no_fsa": 6785694659.741217, + "a_no_fsa_error": -0.5017515577540183, + "b_with_fsa": 13612057110.47988, + "b_with_fsa_error": -0.0005170301431470159, + "a_no_fsa_l2": 5999569692.54428, + "a_no_fsa_l2_error": -0.5594738043267052, + "b_with_fsa_l2": 13418323624.602032, + "b_with_fsa_l2_error": -0.014742162924645134, + "label": "Federal student loan balance, Nevada", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nh.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 7015899276.199744, + "release": 3619803965.920487, + "release_error": -0.4840570219985823, + "a_no_fsa": 2886306850.698022, + "a_no_fsa_error": -0.5886048620325364, + "b_with_fsa": 7014849769.041722, + "b_with_fsa_error": -0.00014958982686399204, + "a_no_fsa_l2": 3093540109.8373485, + "a_no_fsa_l2_error": -0.559067200361376, + "b_with_fsa_l2": 7006948933.132424, + "b_with_fsa_l2_error": -0.0012757228567522913, + "label": "Federal student loan balance, New Hampshire", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nj.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 49936694848.24524, + "release": 22920481793.537766, + "release_error": -0.5410092345279999, + "a_no_fsa": 27529968923.680637, + "a_no_fsa_error": -0.4487026222431693, + "b_with_fsa": 49946310516.94556, + "b_with_fsa_error": 0.00019255717122526532, + "a_no_fsa_l2": 24229367136.491558, + "a_no_fsa_l2_error": -0.5147983419783143, + "b_with_fsa_l2": 50020774343.13383, + "b_with_fsa_l2_error": 0.0016837216628793861, + "label": "Federal student loan balance, New Jersey", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nm.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 8253999148.470287, + "release": 9559916075.590015, + "release_error": 0.1582162662764211, + "a_no_fsa": 4613235872.029221, + "a_no_fsa_error": -0.4410908228789688, + "b_with_fsa": 8262377704.333782, + "b_with_fsa_error": 0.001015090468606078, + "a_no_fsa_l2": 7389040123.042681, + "a_no_fsa_l2_error": -0.10479272045816837, + "b_with_fsa_l2": 8264644910.2367735, + "b_with_fsa_l2_error": 0.0012897701556534745, + "label": "Federal student loan balance, New Mexico", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ny.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 103071814366.5227, + "release": 59048689439.81896, + "release_error": -0.42711118647972757, + "a_no_fsa": 52124200861.321884, + "a_no_fsa_error": -0.4942923903913386, + "b_with_fsa": 103017536248.83508, + "b_with_fsa_error": -0.0005266048533366206, + "a_no_fsa_l2": 54547866012.753494, + "a_no_fsa_l2_error": -0.4707780555915933, + "b_with_fsa_l2": 103282353514.36382, + "b_with_fsa_l2_error": 0.0020426452094113178, + "label": "Federal student loan balance, New York", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nc.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 57571644060.58025, + "release": 30687722220.27408, + "release_error": -0.46696463648002373, + "a_no_fsa": 48480122368.47173, + "a_no_fsa_error": -0.15791665915501543, + "b_with_fsa": 57671195685.94808, + "b_with_fsa_error": 0.0017291780874465618, + "a_no_fsa_l2": 34429068207.71228, + "a_no_fsa_l2_error": -0.40197872113077054, + "b_with_fsa_l2": 57612832761.76091, + "b_with_fsa_l2_error": 0.0007154338190744608, + "label": "Federal student loan balance, North Carolina", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nd.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 2785724712.6087217, + "release": 1474008198.7061641, + "release_error": -0.4708708322704962, + "a_no_fsa": 1597687235.5602472, + "a_no_fsa_error": -0.4264733954762975, + "b_with_fsa": 2788981149.9050393, + "b_with_fsa_error": 0.00116897311553375, + "a_no_fsa_l2": 1551154935.7272978, + "a_no_fsa_l2_error": -0.4431772354581648, + "b_with_fsa_l2": 2773979205.15262, + "b_with_fsa_l2_error": -0.004216320228247783, + "label": "Federal student loan balance, North Dakota", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.oh.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 66341518155.82993, + "release": 24944215874.46098, + "release_error": -0.6240029386142569, + "a_no_fsa": 17470121320.51231, + "a_no_fsa_error": -0.7366638297381641, + "b_with_fsa": 66331341091.249405, + "b_with_fsa_error": -0.00015340415569965252, + "a_no_fsa_l2": 22728687525.118156, + "a_no_fsa_l2_error": -0.6573987427943595, + "b_with_fsa_l2": 66180873311.48443, + "b_with_fsa_l2_error": -0.0024214827880206973, + "label": "Federal student loan balance, Ohio", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ok.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 17642923179.85524, + "release": 12680909295.635565, + "release_error": -0.281246697819629, + "a_no_fsa": 10383253867.42241, + "a_no_fsa_error": -0.4114776921276827, + "b_with_fsa": 17674474115.221878, + "b_with_fsa_error": 0.001788305432438949, + "a_no_fsa_l2": 11886606854.101768, + "a_no_fsa_l2_error": -0.3262677203246034, + "b_with_fsa_l2": 17679924781.40679, + "b_with_fsa_l2_error": 0.00209724891812715, + "label": "Federal student loan balance, Oklahoma", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.or.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 21460397786.022747, + "release": 9759168192.994923, + "release_error": -0.545247562962178, + "a_no_fsa": 10179588405.868055, + "a_no_fsa_error": -0.525657049446769, + "b_with_fsa": 21436642432.949627, + "b_with_fsa_error": -0.001106939084260222, + "a_no_fsa_l2": 9771374949.369776, + "a_no_fsa_l2_error": -0.5446787591358667, + "b_with_fsa_l2": 20871817608.87927, + "b_with_fsa_l2_error": -0.02742634050925297, + "label": "Federal student loan balance, Oregon", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.pa.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 71809792591.6915, + "release": 27902007994.1302, + "release_error": -0.6114456401123416, + "a_no_fsa": 19465896307.067608, + "a_no_fsa_error": -0.7289242092962145, + "b_with_fsa": 71906924907.07704, + "b_with_fsa_error": 0.001352633281338598, + "a_no_fsa_l2": 24605726535.140766, + "a_no_fsa_l2_error": -0.657348592063923, + "b_with_fsa_l2": 71929208123.99995, + "b_with_fsa_l2_error": 0.0016629421698437406, + "label": "Federal student loan balance, Pennsylvania", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ri.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 5261924457.149808, + "release": 2796053711.7570615, + "release_error": -0.4686252654277782, + "a_no_fsa": 2176596415.4936485, + "a_no_fsa_error": -0.5863497408184702, + "b_with_fsa": 5257512643.705235, + "b_with_fsa_error": -0.000838441045762014, + "a_no_fsa_l2": 2691609349.0524583, + "a_no_fsa_l2_error": -0.48847434603604994, + "b_with_fsa_l2": 5250623074.7391815, + "b_with_fsa_l2_error": -0.0021477659937269335, + "label": "Federal student loan balance, Rhode Island", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.sc.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 32396946657.745876, + "release": 17451435371.19304, + "release_error": -0.461324687305971, + "a_no_fsa": 14410561698.18005, + "a_no_fsa_error": -0.5551876585648978, + "b_with_fsa": 32428590461.096027, + "b_with_fsa_error": 0.0009767526453788589, + "a_no_fsa_l2": 13308970803.318764, + "a_no_fsa_l2_error": -0.5891905819421818, + "b_with_fsa_l2": 32368038792.552895, + "b_with_fsa_l2_error": -0.0008923021511371368, + "label": "Federal student loan balance, South Carolina", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.sd.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 3817474606.1675076, + "release": 2544913149.0658116, + "release_error": -0.3333516495553755, + "a_no_fsa": 1234170472.0986664, + "a_no_fsa_error": -0.6767049949448931, + "b_with_fsa": 3811497142.4410176, + "b_with_fsa_error": -0.001565816238000074, + "a_no_fsa_l2": 1812007295.3077776, + "a_no_fsa_l2_error": -0.5253387429531815, + "b_with_fsa_l2": 3817731449.3101583, + "b_with_fsa_l2_error": 6.728090403945288e-05, + "label": "Federal student loan balance, South Dakota", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.tn.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 35698546317.133995, + "release": 30689349951.29, + "release_error": -0.1403193374134611, + "a_no_fsa": 34769605752.49541, + "a_no_fsa_error": -0.026021803699965523, + "b_with_fsa": 35692589708.45849, + "b_with_fsa_error": -0.0001668585780101538, + "a_no_fsa_l2": 30871050133.13504, + "a_no_fsa_l2_error": -0.13522948920981506, + "b_with_fsa_l2": 35653549416.682495, + "b_with_fsa_l2_error": -0.0012604687051333257, + "label": "Federal student loan balance, Tennessee", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.tx.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 142691010279.18008, + "release": 69020094508.7879, + "release_error": -0.5162968264521527, + "a_no_fsa": 44790056660.23969, + "a_no_fsa_error": -0.6861045655741989, + "b_with_fsa": 142643010143.84976, + "b_with_fsa_error": -0.00033639214717457166, + "a_no_fsa_l2": 58261434459.065056, + "a_no_fsa_l2_error": -0.5916951296015462, + "b_with_fsa_l2": 142349128171.56534, + "b_with_fsa_l2_error": -0.0023959610836438924, + "label": "Federal student loan balance, Texas", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ut.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 11452423818.502523, + "release": 7082955146.543638, + "release_error": -0.38153221896133255, + "a_no_fsa": 9180081155.553913, + "a_no_fsa_error": -0.19841587239178277, + "b_with_fsa": 11449743822.685226, + "b_with_fsa_error": -0.00023401123288566944, + "a_no_fsa_l2": 8635123417.70071, + "a_no_fsa_l2_error": -0.24600036162215597, + "b_with_fsa_l2": 11454315620.398739, + "b_with_fsa_l2_error": 0.0001651879048659591, + "label": "Federal student loan balance, Utah", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.vt.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 2992074691.320479, + "release": 1522891012.1873512, + "release_error": -0.49102506812246033, + "a_no_fsa": 1440344540.0485878, + "a_no_fsa_error": -0.5186134409589465, + "b_with_fsa": 2985727800.6757474, + "b_with_fsa_error": -0.002121234026390724, + "a_no_fsa_l2": 1557131860.7308598, + "a_no_fsa_l2_error": -0.4795812199314925, + "b_with_fsa_l2": 2985063414.2230296, + "b_with_fsa_l2_error": -0.0023432827789319145, + "label": "Federal student loan balance, Vermont", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.va.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 46944620156.92476, + "release": 23891264239.204063, + "release_error": -0.49107556607463815, + "a_no_fsa": 37926938076.681, + "a_no_fsa_error": -0.1920919170311695, + "b_with_fsa": 46864783860.98283, + "b_with_fsa_error": -0.001700648459292222, + "a_no_fsa_l2": 30991561331.07694, + "a_no_fsa_l2_error": -0.3398272000608487, + "b_with_fsa_l2": 46963712141.06357, + "b_with_fsa_l2_error": 0.00040669163101094905, + "label": "Federal student loan balance, Virginia", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.wa.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 30539796849.34006, + "release": 16049838285.016233, + "release_error": -0.47446152427948923, + "a_no_fsa": 13418678233.62334, + "a_no_fsa_error": -0.5606166504701781, + "b_with_fsa": 30573816068.2637, + "b_with_fsa_error": 0.0011139307537460753, + "a_no_fsa_l2": 15409555058.632631, + "a_no_fsa_l2_error": -0.49542706080686916, + "b_with_fsa_l2": 30405225413.811913, + "b_with_fsa_l2_error": -0.004406428641029307, + "label": "Federal student loan balance, Washington", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.wv.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 7944474180.402651, + "release": 5630654714.986314, + "release_error": -0.29124891249870805, + "a_no_fsa": 6418732596.49032, + "a_no_fsa_error": -0.1920506693414669, + "b_with_fsa": 7939686656.872319, + "b_with_fsa_error": -0.0006026230838714822, + "a_no_fsa_l2": 5568720614.76688, + "a_no_fsa_l2_error": -0.2990447840457781, + "b_with_fsa_l2": 7934008237.551141, + "b_with_fsa_l2_error": -0.0013173864769209435, + "label": "Federal student loan balance, West Virginia", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.wi.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 24761997445.410862, + "release": 11622497858.766003, + "release_error": -0.5306316510051979, + "a_no_fsa": 11762946240.28573, + "a_no_fsa_error": -0.5249597183661063, + "b_with_fsa": 24771289952.861736, + "b_with_fsa_error": 0.00037527293472023633, + "a_no_fsa_l2": 11028002346.020483, + "a_no_fsa_l2_error": -0.5546400337722229, + "b_with_fsa_l2": 24732468542.733322, + "b_with_fsa_l2_error": -0.0011925089138159334, + "label": "Federal student loan balance, Wisconsin", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.wy.dollars_outstanding", + "family": "ed_fsa/fsa_state_balance", + "is_fsa": true, + "target": 1857149808.4058146, + "release": 799653010.9431404, + "release_error": -0.5694192211507342, + "a_no_fsa": 494870181.73740697, + "a_no_fsa_error": -0.7335324379877541, + "b_with_fsa": 1861315482.7524452, + "b_with_fsa_error": 0.002243047021718946, + "a_no_fsa_l2": 732630963.4736071, + "a_no_fsa_l2_error": -0.6055078808626103, + "b_with_fsa_l2": 1860688766.491437, + "b_with_fsa_l2_error": 0.0019055856827512301, + "label": "Federal student loan balance, Wyoming", + "measure_mode": "sum", + "target_role": "fsa_state_balance" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.al.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 694296.9494946192, + "release": 299660.64127607393, + "release_error": -0.5683970072255138, + "a_no_fsa": 250982.05458416019, + "a_no_fsa_error": -0.6385090633527184, + "b_with_fsa": 693709.0031939199, + "b_with_fsa_error": -0.0008468225319544138, + "a_no_fsa_l2": 306410.7511279846, + "a_no_fsa_l2_error": -0.558674784109275, + "b_with_fsa_l2": 693173.0057164396, + "b_with_fsa_l2_error": -0.0016188228667830212, + "label": "Federal student loan borrowers, Alabama", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ak.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 67443.00187108875, + "release": 42677.70625471767, + "release_error": -0.3672033410331842, + "a_no_fsa": 43210.73486786064, + "a_no_fsa_error": -0.3592999470804386, + "b_with_fsa": 67353.68128777898, + "b_with_fsa_error": -0.0013243862347720346, + "a_no_fsa_l2": 41673.647670228405, + "a_no_fsa_l2_error": -0.38209085429080036, + "b_with_fsa_l2": 67484.5392917599, + "b_with_fsa_l2_error": 0.000615889262321645, + "label": "Federal student loan borrowers, Alaska", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.az.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 957899.7521566575, + "release": 581654.414915702, + "release_error": -0.39278153730999543, + "a_no_fsa": 478956.37498008594, + "a_no_fsa_error": -0.49999321546775377, + "b_with_fsa": 956836.4002164718, + "b_with_fsa_error": -0.0011100868726520554, + "a_no_fsa_l2": 553297.2019080565, + "a_no_fsa_l2_error": -0.4223850662218683, + "b_with_fsa_l2": 957195.2962106836, + "b_with_fsa_l2_error": -0.0007354171920264345, + "label": "Federal student loan borrowers, Arizona", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ar.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 427034.4490566302, + "release": 178289.27660903882, + "release_error": -0.582494393595409, + "a_no_fsa": 163755.74244653623, + "a_no_fsa_error": -0.6165280276373671, + "b_with_fsa": 426374.9395311766, + "b_with_fsa_error": -0.001544394197963533, + "a_no_fsa_l2": 178797.31678355482, + "a_no_fsa_l2_error": -0.5813046999403928, + "b_with_fsa_l2": 380809.2839234371, + "b_with_fsa_l2_error": -0.10824692301829503, + "label": "Federal student loan borrowers, Arkansas", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ca.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 4098338.6950966264, + "release": 2277884.264727672, + "release_error": -0.4441932611736067, + "a_no_fsa": 2437748.7945147986, + "a_no_fsa_error": -0.4051861068897519, + "b_with_fsa": 4232292.789984276, + "b_with_fsa_error": 0.032684974291635735, + "a_no_fsa_l2": 2278339.2428186936, + "a_no_fsa_l2_error": -0.44408224592453377, + "b_with_fsa_l2": 4100983.927414996, + "b_with_fsa_l2_error": 0.00064544014420636, + "label": "Federal student loan borrowers, California", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.co.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 799487.119854798, + "release": 334925.6516082026, + "release_error": -0.5810743621873089, + "a_no_fsa": 239763.35545284307, + "a_no_fsa_error": -0.7001035420102969, + "b_with_fsa": 798939.3602070913, + "b_with_fsa_error": -0.0006851388022437729, + "a_no_fsa_l2": 263858.74193744484, + "a_no_fsa_l2_error": -0.6699649870715032, + "b_with_fsa_l2": 750790.6724185708, + "b_with_fsa_l2_error": -0.06090960845632049, + "label": "Federal student loan borrowers, Colorado", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ct.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 538916.6382071185, + "release": 209988.21377416077, + "release_error": -0.6103512141084475, + "a_no_fsa": 227777.42947049078, + "a_no_fsa_error": -0.5773419981460092, + "b_with_fsa": 483745.09216988576, + "b_with_fsa_error": -0.10237491687170548, + "a_no_fsa_l2": 221601.9564159015, + "a_no_fsa_l2_error": -0.5888010487983215, + "b_with_fsa_l2": 389147.53606122656, + "b_with_fsa_l2_error": -0.27790773475494757, + "label": "Federal student loan borrowers, Connecticut", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.de.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 144087.5295788532, + "release": 59671.684939128034, + "release_error": -0.585865028614623, + "a_no_fsa": 65530.429421826695, + "a_no_fsa_error": -0.5452040186033963, + "b_with_fsa": 125863.84569109904, + "b_with_fsa_error": -0.12647648232306657, + "a_no_fsa_l2": 61574.655783796465, + "a_no_fsa_l2_error": -0.5726579811329253, + "b_with_fsa_l2": 113234.4637678388, + "b_with_fsa_l2_error": -0.2141272454402779, + "label": "Federal student loan borrowers, Delaware", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.dc.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 119828.96146398096, + "release": 54420.929383690665, + "release_error": -0.5458449383286286, + "a_no_fsa": 42780.832924046605, + "a_no_fsa_error": -0.6429841967969824, + "b_with_fsa": 119567.18203007248, + "b_with_fsa_error": -0.002184609052020925, + "a_no_fsa_l2": 52681.97575140314, + "a_no_fsa_l2_error": -0.5603569028073513, + "b_with_fsa_l2": 98909.04836098025, + "b_with_fsa_l2_error": -0.1745814438130549, + "label": "Federal student loan borrowers, District of Columbia", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.fl.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 2873071.879708381, + "release": 987744.0907100096, + "release_error": -0.6562062725662589, + "a_no_fsa": 1164590.8908740266, + "a_no_fsa_error": -0.5946530613803392, + "b_with_fsa": 2872497.143069222, + "b_with_fsa_error": -0.00020004255487584129, + "a_no_fsa_l2": 1045248.8027810063, + "a_no_fsa_l2_error": -0.6361912104729173, + "b_with_fsa_l2": 2868153.6444381108, + "b_with_fsa_l2_error": -0.0017118385742473491, + "label": "Federal student loan borrowers, Florida", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ga.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 1780390.6866031447, + "release": 917964.2046790165, + "release_error": -0.4844029394298703, + "a_no_fsa": 963914.0926440267, + "a_no_fsa_error": -0.4585940603390235, + "b_with_fsa": 1780834.4401829597, + "b_with_fsa_error": 0.0002492450579269024, + "a_no_fsa_l2": 823647.3652123755, + "a_no_fsa_l2_error": -0.5373783004988447, + "b_with_fsa_l2": 1780071.9035046534, + "b_with_fsa_l2_error": -0.00017905232873330137, + "label": "Federal student loan borrowers, Georgia", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.hi.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 126520.98025429054, + "release": 67915.06417929725, + "release_error": -0.4632110497184191, + "a_no_fsa": 69764.40658714753, + "a_no_fsa_error": -0.44859416638307537, + "b_with_fsa": 126285.89632417394, + "b_with_fsa_error": -0.0018580628259764517, + "a_no_fsa_l2": 64639.29631500766, + "a_no_fsa_l2_error": -0.48910215376855937, + "b_with_fsa_l2": 108157.30000517103, + "b_with_fsa_l2_error": -0.14514336050994017, + "label": "Federal student loan borrowers, Hawaii", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.id.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 226378.44814094133, + "release": 167324.7579832254, + "release_error": -0.26086268654403705, + "a_no_fsa": 169172.3709292193, + "a_no_fsa_error": -0.25270107504273553, + "b_with_fsa": 226231.21690869075, + "b_with_fsa_error": -0.0006503765418469078, + "a_no_fsa_l2": 181779.86312882614, + "a_no_fsa_l2_error": -0.19700897050212343, + "b_with_fsa_l2": 226157.62599715297, + "b_with_fsa_l2_error": -0.0009754556831791697, + "label": "Federal student loan borrowers, Idaho", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.il.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 1674573.1394813743, + "release": 832380.2833203801, + "release_error": -0.5029298728760372, + "a_no_fsa": 1021910.9786881235, + "a_no_fsa_error": -0.3897483755146009, + "b_with_fsa": 1673352.8668219256, + "b_with_fsa_error": -0.0007287066958607732, + "a_no_fsa_l2": 966613.6534238599, + "a_no_fsa_l2_error": -0.4227701193611489, + "b_with_fsa_l2": 1676404.375512981, + "b_with_fsa_l2_error": 0.0010935539263301085, + "label": "Federal student loan borrowers, Illinois", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.in.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 939496.7004833062, + "release": 516324.2498256706, + "release_error": -0.4504246267602032, + "a_no_fsa": 518545.3688982778, + "a_no_fsa_error": -0.44806046830018453, + "b_with_fsa": 939740.9813176465, + "b_with_fsa_error": 0.0002600124451896339, + "a_no_fsa_l2": 554967.514634506, + "a_no_fsa_l2_error": -0.409292747543431, + "b_with_fsa_l2": 921590.4708778339, + "b_with_fsa_l2_error": -0.019059385303067885, + "label": "Federal student loan borrowers, Indiana", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ia.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 442718.8680964183, + "release": 212727.3081598001, + "release_error": -0.5194979850882007, + "a_no_fsa": 250949.0594575115, + "a_no_fsa_error": -0.43316384834346355, + "b_with_fsa": 442913.8595813111, + "b_with_fsa_error": 0.0004404408733046794, + "a_no_fsa_l2": 250320.72003549684, + "a_no_fsa_l2_error": -0.43458312244107855, + "b_with_fsa_l2": 443023.81875494606, + "b_with_fsa_l2_error": 0.0006888133316725294, + "label": "Federal student loan borrowers, Iowa", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ks.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 396606.67611944134, + "release": 215827.92380567404, + "release_error": -0.45581368947839973, + "a_no_fsa": 218049.09400753595, + "a_no_fsa_error": -0.4502132537429383, + "b_with_fsa": 397535.9239759612, + "b_with_fsa_error": 0.002342996002013927, + "a_no_fsa_l2": 208432.05794180025, + "a_no_fsa_l2_error": -0.4744615497117118, + "b_with_fsa_l2": 396130.97749439033, + "b_with_fsa_l2_error": -0.0011994216277583499, + "label": "Federal student loan borrowers, Kansas", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ky.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 643688.5573929029, + "release": 292354.8541871355, + "release_error": -0.5458131874034787, + "a_no_fsa": 324504.32223128254, + "a_no_fsa_error": -0.495867499112296, + "b_with_fsa": 612160.1736984606, + "b_with_fsa_error": -0.048980804975219776, + "a_no_fsa_l2": 301880.3890553895, + "a_no_fsa_l2_error": -0.5310148276084332, + "b_with_fsa_l2": 497613.0939798198, + "b_with_fsa_l2_error": -0.2269350009960169, + "label": "Federal student loan borrowers, Kentucky", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.la.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 725665.7875741953, + "release": 235996.30097340568, + "release_error": -0.674786513275884, + "a_no_fsa": 283225.0747135389, + "a_no_fsa_error": -0.6097031449418018, + "b_with_fsa": 726299.4927637369, + "b_with_fsa_error": 0.0008732741716540846, + "a_no_fsa_l2": 256063.0052924232, + "a_no_fsa_l2_error": -0.6471336947709663, + "b_with_fsa_l2": 713960.6628359382, + "b_with_fsa_l2_error": -0.01613018684177716, + "label": "Federal student loan borrowers, Louisiana", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.me.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 195114.17285496375, + "release": 118655.57825833226, + "release_error": -0.3918659186970813, + "a_no_fsa": 99175.02384050503, + "a_no_fsa_error": -0.49170774019463037, + "b_with_fsa": 172282.76233563243, + "b_with_fsa_error": -0.11701564363703515, + "a_no_fsa_l2": 111982.83873640902, + "a_no_fsa_l2_error": -0.42606507206603395, + "b_with_fsa_l2": 154282.30177404144, + "b_with_fsa_l2_error": -0.20927168172080607, + "label": "Federal student loan borrowers, Maine", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.md.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 880732.4104809002, + "release": 395479.93680944823, + "release_error": -0.5509647060751324, + "a_no_fsa": 371602.51136750274, + "a_no_fsa_error": -0.578075580113375, + "b_with_fsa": 880547.3761768811, + "b_with_fsa_error": -0.00021009139872351322, + "a_no_fsa_l2": 358897.6696648419, + "a_no_fsa_l2_error": -0.592500894262679, + "b_with_fsa_l2": 848621.9960669217, + "b_with_fsa_l2_error": -0.0364587632200857, + "label": "Federal student loan borrowers, Maryland", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ma.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 941692.5191488765, + "release": 463105.9838920997, + "release_error": -0.5082195361277102, + "a_no_fsa": 403616.63225615665, + "a_no_fsa_error": -0.5713923344947514, + "b_with_fsa": 941438.1084340219, + "b_with_fsa_error": -0.00027016325358997754, + "a_no_fsa_l2": 436880.7444723716, + "a_no_fsa_l2_error": -0.5360685833341498, + "b_with_fsa_l2": 940062.6926380761, + "b_with_fsa_l2_error": -0.00173074169928999, + "label": "Federal student loan borrowers, Massachusetts", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.mi.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 1440143.3562333419, + "release": 799646.8920924211, + "release_error": -0.4447449355431691, + "a_no_fsa": 832618.072858017, + "a_no_fsa_error": -0.42185056143597516, + "b_with_fsa": 1441530.8788826521, + "b_with_fsa_error": 0.0009634614799316413, + "a_no_fsa_l2": 832371.4172312273, + "a_no_fsa_l2_error": -0.42202183301510104, + "b_with_fsa_l2": 1440443.418412031, + "b_with_fsa_l2_error": 0.00020835577054902375, + "label": "Federal student loan borrowers, Michigan", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.mn.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 807852.1433426848, + "release": 479453.95315025107, + "release_error": -0.40650779093511635, + "a_no_fsa": 503733.00094023114, + "a_no_fsa_error": -0.3764539648853152, + "b_with_fsa": 809206.1325902689, + "b_with_fsa_error": 0.0016760359661627646, + "a_no_fsa_l2": 505119.2336902238, + "a_no_fsa_l2_error": -0.374738016290741, + "b_with_fsa_l2": 806647.7374346799, + "b_with_fsa_l2_error": -0.0014908741877213327, + "label": "Federal student loan borrowers, Minnesota", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ms.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 477120.0271903535, + "release": 213184.86340196797, + "release_error": -0.553183997206399, + "a_no_fsa": 208576.32997598476, + "a_no_fsa_error": -0.562843062354265, + "b_with_fsa": 477628.8449341006, + "b_with_fsa_error": 0.0010664355188429093, + "a_no_fsa_l2": 228614.74849744348, + "a_no_fsa_l2_error": -0.5208443673100427, + "b_with_fsa_l2": 476146.89045343356, + "b_with_fsa_l2_error": -0.002039605720704075, + "label": "Federal student loan borrowers, Mississippi", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.mo.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 864211.4890923233, + "release": 472395.4279904787, + "release_error": -0.4533798335791242, + "a_no_fsa": 567762.6380810993, + "a_no_fsa_error": -0.3430281299807559, + "b_with_fsa": 865294.1581226342, + "b_with_fsa_error": 0.001252782500551966, + "a_no_fsa_l2": 479060.16898250865, + "a_no_fsa_l2_error": -0.4456679007060379, + "b_with_fsa_l2": 836071.273417047, + "b_with_fsa_l2_error": -0.03256172364108682, + "label": "Federal student loan borrowers, Missouri", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.mt.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 132167.37110861426, + "release": 88576.2355027902, + "release_error": -0.32981767920617233, + "a_no_fsa": 81204.4951772178, + "a_no_fsa_error": -0.3855934751816733, + "b_with_fsa": 132440.56308882727, + "b_with_fsa_error": 0.0020670153149108706, + "a_no_fsa_l2": 88555.432440822, + "a_no_fsa_l2_error": -0.32997507858389846, + "b_with_fsa_l2": 129928.2703811863, + "b_with_fsa_l2_error": -0.01694140322718439, + "label": "Federal student loan borrowers, Montana", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ne.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 254610.4024125599, + "release": 123018.40957040986, + "release_error": -0.5168366712249406, + "a_no_fsa": 144097.4680489754, + "a_no_fsa_error": -0.4340472082696528, + "b_with_fsa": 254409.29194099287, + "b_with_fsa_error": -0.0007898753140539471, + "a_no_fsa_l2": 118509.36669427638, + "a_no_fsa_l2_error": -0.5345462495980473, + "b_with_fsa_l2": 246521.32790952566, + "b_with_fsa_l2_error": -0.031770400684285646, + "label": "Federal student loan borrowers, Nebraska", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nv.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 384686.5176492024, + "release": 176511.93952379236, + "release_error": -0.5411538189525152, + "a_no_fsa": 215536.58815229477, + "a_no_fsa_error": -0.4397084944140317, + "b_with_fsa": 384459.04303150147, + "b_with_fsa_error": -0.0005913246429612142, + "a_no_fsa_l2": 196478.84747527208, + "a_no_fsa_l2_error": -0.4892494577768328, + "b_with_fsa_l2": 358893.58799715026, + "b_with_fsa_l2_error": -0.06704921661843326, + "label": "Federal student loan borrowers, Nevada", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nh.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 196264.3635845482, + "release": 104937.6029087654, + "release_error": -0.465325232802339, + "a_no_fsa": 96431.86279789588, + "a_no_fsa_error": -0.5086634117540434, + "b_with_fsa": 196351.78983107032, + "b_with_fsa_error": 0.00044545145601253673, + "a_no_fsa_l2": 104240.58703961143, + "a_no_fsa_l2_error": -0.4688766460921679, + "b_with_fsa_l2": 190749.64602120363, + "b_with_fsa_l2_error": -0.0280984151306149, + "label": "Federal student loan borrowers, New Hampshire", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nj.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 1291873.3149105452, + "release": 450355.9164135196, + "release_error": -0.6513931271622372, + "a_no_fsa": 629604.7621387488, + "a_no_fsa_error": -0.512642025443226, + "b_with_fsa": 1308724.524122396, + "b_with_fsa_error": 0.013044010598684454, + "a_no_fsa_l2": 519951.8635219385, + "a_no_fsa_l2_error": -0.5975210126869583, + "b_with_fsa_l2": 1217375.8839798425, + "b_with_fsa_l2_error": -0.05766620462770471, + "label": "Federal student loan borrowers, New Jersey", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nm.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 236311.9135328071, + "release": 153771.50269997696, + "release_error": -0.34928586375045834, + "a_no_fsa": 88407.74323607699, + "a_no_fsa_error": -0.6258853736385857, + "b_with_fsa": 236428.14745450986, + "b_with_fsa_error": 0.0004918665333671835, + "a_no_fsa_l2": 130651.11037340286, + "a_no_fsa_l2_error": -0.4471243179397953, + "b_with_fsa_l2": 233313.52656264952, + "b_with_fsa_l2_error": -0.012688259873708502, + "label": "Federal student loan borrowers, New Mexico", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ny.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 2568689.587542894, + "release": 1218896.422932909, + "release_error": -0.5254792837390457, + "a_no_fsa": 1190028.7824702621, + "a_no_fsa_error": -0.5367175589291051, + "b_with_fsa": 2569075.85121198, + "b_with_fsa_error": 0.000150373821328734, + "a_no_fsa_l2": 1252071.5644215113, + "a_no_fsa_l2_error": -0.5125640830664974, + "b_with_fsa_l2": 2571667.2342337165, + "b_with_fsa_l2_error": 0.0011592084560404087, + "label": "Federal student loan borrowers, New York", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nc.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 1442234.6121053135, + "release": 732860.7559010923, + "release_error": -0.4918574621979894, + "a_no_fsa": 950046.3765895162, + "a_no_fsa_error": -0.3412678016354923, + "b_with_fsa": 1444188.4760409745, + "b_with_fsa_error": 0.0013547476390189167, + "a_no_fsa_l2": 789713.1773550404, + "a_no_fsa_l2_error": -0.45243778597003, + "b_with_fsa_l2": 1441384.317157992, + "b_with_fsa_l2_error": -0.0005895677029136763, + "label": "Federal student loan borrowers, North Carolina", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.nd.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 92433.5095411511, + "release": 52350.8952984563, + "release_error": -0.43363726468538066, + "a_no_fsa": 64873.14637728784, + "a_no_fsa_error": -0.2981641971691389, + "b_with_fsa": 92390.57551640531, + "b_with_fsa_error": -0.0004644854983751701, + "a_no_fsa_l2": 56985.539826573906, + "a_no_fsa_l2_error": -0.3834969578732253, + "b_with_fsa_l2": 86386.39187795504, + "b_with_fsa_l2_error": -0.06542127084879211, + "label": "Federal student loan borrowers, North Dakota", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.oh.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 1851597.9490437824, + "release": 699900.1151267327, + "release_error": -0.6220021114798809, + "a_no_fsa": 507458.0975874492, + "a_no_fsa_error": -0.7259350509382909, + "b_with_fsa": 1754220.3502949593, + "b_with_fsa_error": -0.052591113961382226, + "a_no_fsa_l2": 613615.6535971871, + "a_no_fsa_l2_error": -0.6686021099158833, + "b_with_fsa_l2": 1569951.7287603493, + "b_with_fsa_l2_error": -0.15210981435191326, + "label": "Federal student loan borrowers, Ohio", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ok.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 534002.1869079849, + "release": 315479.7158029133, + "release_error": -0.40921643480596026, + "a_no_fsa": 256420.86088079162, + "a_no_fsa_error": -0.5198130884715345, + "b_with_fsa": 534087.7838574765, + "b_with_fsa_error": 0.00016029325645139963, + "a_no_fsa_l2": 278947.38529185636, + "a_no_fsa_l2_error": -0.4776287585879823, + "b_with_fsa_l2": 485430.2466151658, + "b_with_fsa_l2_error": -0.09095831718230145, + "label": "Federal student loan borrowers, Oklahoma", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.or.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 550627.6710901603, + "release": 312082.1217905176, + "release_error": -0.43322477569526835, + "a_no_fsa": 348077.4974950408, + "a_no_fsa_error": -0.3678532413638066, + "b_with_fsa": 551112.3638620565, + "b_with_fsa_error": 0.0008802550204871383, + "a_no_fsa_l2": 332063.10531135707, + "a_no_fsa_l2_error": -0.3969371269447431, + "b_with_fsa_l2": 550032.7004637301, + "b_with_fsa_l2_error": -0.0010805316508198139, + "label": "Federal student loan borrowers, Oregon", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.pa.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 1938489.6305242085, + "release": 633413.2224533451, + "release_error": -0.6732439459673267, + "a_no_fsa": 491519.81022400304, + "a_no_fsa_error": -0.7464418676869138, + "b_with_fsa": 1962094.9843020402, + "b_with_fsa_error": 0.012177188573068749, + "a_no_fsa_l2": 596122.0124541493, + "a_no_fsa_l2_error": -0.6924811961501464, + "b_with_fsa_l2": 1751886.1017661775, + "b_with_fsa_l2_error": -0.09626233012532007, + "label": "Federal student loan borrowers, Pennsylvania", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ri.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 156530.50201708506, + "release": 91242.25816610051, + "release_error": -0.41709598455040053, + "a_no_fsa": 70033.98409757929, + "a_no_fsa_error": -0.5525857056924587, + "b_with_fsa": 156520.36278757596, + "b_with_fsa_error": -6.47747843292529e-05, + "a_no_fsa_l2": 85690.9845588893, + "a_no_fsa_l2_error": -0.4525604693356426, + "b_with_fsa_l2": 146908.43408377256, + "b_with_fsa_l2_error": -0.061470881453266325, + "label": "Federal student loan borrowers, Rhode Island", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.sc.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 817994.7343217478, + "release": 307173.6792835799, + "release_error": -0.6244796373435368, + "a_no_fsa": 272650.71166897507, + "a_no_fsa_error": -0.6666840259124072, + "b_with_fsa": 819067.3598882724, + "b_with_fsa_error": 0.0013112866397776422, + "a_no_fsa_l2": 268405.89401339646, + "a_no_fsa_l2_error": -0.6718733229548854, + "b_with_fsa_l2": 667052.5589610499, + "b_with_fsa_l2_error": -0.18452707459767917, + "label": "Federal student loan borrowers, South Carolina", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.sd.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 122024.78012955129, + "release": 49540.153662184995, + "release_error": -0.5940156285502896, + "a_no_fsa": 35771.798877450055, + "a_no_fsa_error": -0.7068480775833249, + "b_with_fsa": 121938.80396197141, + "b_with_fsa_error": -0.000704579573825913, + "a_no_fsa_l2": 44992.553603884146, + "a_no_fsa_l2_error": -0.6312834691763719, + "b_with_fsa_l2": 83720.64035650807, + "b_with_fsa_l2_error": -0.3139045998065022, + "label": "Federal student loan borrowers, South Dakota", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.tn.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 935732.439913757, + "release": 645573.8122887461, + "release_error": -0.3100871736922509, + "a_no_fsa": 728891.3907266264, + "a_no_fsa_error": -0.22104721431501767, + "b_with_fsa": 935830.8960656659, + "b_with_fsa_error": 0.00010521827363163767, + "a_no_fsa_l2": 686034.6483909406, + "a_no_fsa_l2_error": -0.2668474244045981, + "b_with_fsa_l2": 935468.3979634753, + "b_with_fsa_l2_error": -0.0002821767623082996, + "label": "Federal student loan borrowers, Tennessee", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.tx.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 4130021.2215569983, + "release": 1799115.9671694795, + "release_error": -0.5643809388245173, + "a_no_fsa": 1741322.477649456, + "a_no_fsa_error": -0.5783744479179732, + "b_with_fsa": 4130654.202216061, + "b_with_fsa_error": 0.00015326329457064576, + "a_no_fsa_l2": 1899360.1455814794, + "a_no_fsa_l2_error": -0.5401088653812219, + "b_with_fsa_l2": 4124040.786020423, + "b_with_fsa_l2_error": -0.0014480399048218226, + "label": "Federal student loan borrowers, Texas", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.ut.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 327595.23234437377, + "release": 239327.1041554662, + "release_error": -0.26944265201063305, + "a_no_fsa": 276269.96170826943, + "a_no_fsa_error": -0.1566728253912753, + "b_with_fsa": 327596.74386875663, + "b_with_fsa_error": 4.6139999414683845e-06, + "a_no_fsa_l2": 277588.3219229197, + "a_no_fsa_l2_error": -0.15264846824414688, + "b_with_fsa_l2": 328132.9212201755, + "b_with_fsa_l2_error": 0.0016413208212887453, + "label": "Federal student loan borrowers, Utah", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.vt.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 78212.96961174325, + "release": 50912.25411705035, + "release_error": -0.3490561172937979, + "a_no_fsa": 53366.81503613847, + "a_no_fsa_error": -0.31767307518105364, + "b_with_fsa": 78213.34278720869, + "b_with_fsa_error": 4.771273451143926e-06, + "a_no_fsa_l2": 52194.206952528504, + "a_no_fsa_l2_error": -0.3326655769289211, + "b_with_fsa_l2": 78166.88342238525, + "b_with_fsa_l2_error": -0.0005892397333431619, + "label": "Federal student loan borrowers, Vermont", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.va.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 1135029.1245126643, + "release": 542755.0749534387, + "release_error": -0.5218139665037442, + "a_no_fsa": 569479.9936513162, + "a_no_fsa_error": -0.49826838681709784, + "b_with_fsa": 1134849.7671768656, + "b_with_fsa_error": -0.00015802002955270773, + "a_no_fsa_l2": 542429.336726996, + "a_no_fsa_l2_error": -0.5221009531716702, + "b_with_fsa_l2": 1018857.8548157496, + "b_with_fsa_l2_error": -0.10235091522148734, + "label": "Federal student loan borrowers, Virginia", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.wa.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 811511.8411186354, + "release": 507889.2370290313, + "release_error": -0.3741443916222749, + "a_no_fsa": 394762.047958978, + "a_no_fsa_error": -0.5135473964066687, + "b_with_fsa": 811796.2032889295, + "b_with_fsa_error": 0.00035041037713285685, + "a_no_fsa_l2": 465432.98256615526, + "a_no_fsa_l2_error": -0.4264618715549791, + "b_with_fsa_l2": 809697.7502269795, + "b_with_fsa_l2_error": -0.0022354459907266847, + "label": "Federal student loan borrowers, Washington", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.wv.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 238716.85778557463, + "release": 97732.96010272118, + "release_error": -0.5905904551135263, + "a_no_fsa": 110575.54385047755, + "a_no_fsa_error": -0.5367920603671774, + "b_with_fsa": 234182.8693783432, + "b_with_fsa_error": -0.018993163906773802, + "a_no_fsa_l2": 104566.58420353933, + "a_no_fsa_l2_error": -0.561963971989505, + "b_with_fsa_l2": 165128.69949564617, + "b_with_fsa_l2_error": -0.30826544456289884, + "label": "Federal student loan borrowers, West Virginia", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.wi.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 741454.769407582, + "release": 322917.9462745847, + "release_error": -0.5644805865466423, + "a_no_fsa": 325050.34774435166, + "a_no_fsa_error": -0.5616046168209762, + "b_with_fsa": 741855.6392019944, + "b_with_fsa_error": 0.0005406530660429796, + "a_no_fsa_l2": 320358.33044854907, + "a_no_fsa_l2_error": -0.5679327402472393, + "b_with_fsa_l2": 740078.8021415732, + "b_with_fsa_l2_error": -0.0018557669635171808, + "label": "Federal student loan borrowers, Wisconsin", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_location.2026_03_31.wy.borrowers", + "family": "ed_fsa/fsa_state_borrowers", + "is_fsa": true, + "target": 57300.4108920258, + "release": 33514.1781105738, + "release_error": -0.4151145238081043, + "a_no_fsa": 25898.06076214302, + "a_no_fsa_error": -0.5480301038164611, + "b_with_fsa": 57400.11392044902, + "b_with_fsa_error": 0.0017400054706604563, + "a_no_fsa_l2": 30505.306398660698, + "a_no_fsa_l2_error": -0.4676249973818955, + "b_with_fsa_l2": 56979.63773040034, + "b_with_fsa_l2_error": -0.005598095312613209, + "label": "Federal student loan borrowers, Wyoming", + "measure_mode": "indicator_sum", + "target_role": "fsa_state_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_24_and_younger.dollars_outstanding", + "family": "ed_fsa/fsa_age_band_balance", + "is_fsa": true, + "target": 84895672115.86523, + "release": 52137719851.71084, + "release_error": -0.3858612747590536, + "a_no_fsa": 49206544277.22551, + "a_no_fsa_error": -0.4203880710188779, + "b_with_fsa": 84882138103.32043, + "b_with_fsa_error": -0.00015941934621035387, + "a_no_fsa_l2": 51889788626.98698, + "a_no_fsa_l2_error": -0.3887816971851283, + "b_with_fsa_l2": 84815498325.316, + "b_with_fsa_l2_error": -0.0009443801851267433, + "label": "Federal student loan balance, borrower age 24 and Younger", + "measure_mode": "sum", + "target_role": "fsa_age_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_25_to_34.dollars_outstanding", + "family": "ed_fsa/fsa_age_band_balance", + "is_fsa": true, + "target": 461967337284.6965, + "release": 216227118967.37558, + "release_error": -0.5319428420236529, + "a_no_fsa": 206275290709.3648, + "a_no_fsa_error": -0.5534851188359154, + "b_with_fsa": 461883537967.0942, + "b_with_fsa_error": -0.00018139662880679364, + "a_no_fsa_l2": 212518802627.94098, + "a_no_fsa_l2_error": -0.5399700682800176, + "b_with_fsa_l2": 460842333166.1418, + "b_with_fsa_l2_error": -0.0024352460179698407, + "label": "Federal student loan balance, borrower age 25 to 34", + "measure_mode": "sum", + "target_role": "fsa_age_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_35_to_49.dollars_outstanding", + "family": "ed_fsa/fsa_age_band_balance", + "is_fsa": true, + "target": 679462908488.0756, + "release": 353428881766.99976, + "release_error": -0.4798408016804903, + "a_no_fsa": 349592947265.7628, + "a_no_fsa_error": -0.48548634090465864, + "b_with_fsa": 677890984314.0103, + "b_with_fsa_error": -0.002313480477636543, + "a_no_fsa_l2": 340733652289.01373, + "a_no_fsa_l2_error": -0.4985250143422751, + "b_with_fsa_l2": 672923535215.3201, + "b_with_fsa_l2_error": -0.009624327084029868, + "label": "Federal student loan balance, borrower age 35 to 49", + "measure_mode": "sum", + "target_role": "fsa_age_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_50_to_61.dollars_outstanding", + "family": "ed_fsa/fsa_age_band_balance", + "is_fsa": true, + "target": 310226241096.29254, + "release": 168531843341.06357, + "release_error": -0.4567453651067764, + "a_no_fsa": 200962213904.79062, + "a_no_fsa_error": -0.35220755924895136, + "b_with_fsa": 310222466064.4977, + "b_with_fsa_error": -1.2168641123073436e-05, + "a_no_fsa_l2": 180271208948.90756, + "a_no_fsa_l2_error": -0.41890406075302844, + "b_with_fsa_l2": 310072124373.68195, + "b_with_fsa_l2_error": -0.000496788157139675, + "label": "Federal student loan balance, borrower age 50 to 61", + "measure_mode": "sum", + "target_role": "fsa_age_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.dollars_outstanding.age_62_and_older.dollars_outstanding", + "family": "ed_fsa/fsa_age_band_balance", + "is_fsa": true, + "target": 142517617792.63824, + "release": 68095645027.780594, + "release_error": -0.5221948971469682, + "a_no_fsa": 80008911086.00209, + "a_no_fsa_error": -0.43860336479652445, + "b_with_fsa": 142453143985.93988, + "b_with_fsa_error": -0.0004523918354583573, + "a_no_fsa_l2": 70337022924.8587, + "a_no_fsa_l2_error": -0.5064678738371954, + "b_with_fsa_l2": 142513567225.33383, + "b_with_fsa_l2_error": -2.842151985943505e-05, + "label": "Federal student loan balance, borrower age 62 and Older", + "measure_mode": "sum", + "target_role": "fsa_age_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_24_and_younger.borrowers", + "family": "ed_fsa/fsa_age_band_borrowers", + "is_fsa": true, + "target": 6132107.903700248, + "release": 2581827.639193066, + "release_error": -0.5789657194983254, + "a_no_fsa": 2565588.0258634584, + "a_no_fsa_error": -0.581614011665495, + "b_with_fsa": 6133783.137043165, + "b_with_fsa_error": 0.0002731904541186942, + "a_no_fsa_l2": 2649019.2144049457, + "a_no_fsa_l2_error": -0.5680083821084639, + "b_with_fsa_l2": 5519333.9267054815, + "b_with_fsa_l2_error": -0.09992876619555334, + "label": "Federal student loan borrowers, borrower age 24 and Younger", + "measure_mode": "indicator_sum", + "target_role": "fsa_age_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_25_to_34.borrowers", + "family": "ed_fsa/fsa_age_band_borrowers", + "is_fsa": true, + "target": 13846695.266419914, + "release": 6589408.84575269, + "release_error": -0.5241168582851038, + "a_no_fsa": 6715548.973986622, + "a_no_fsa_error": -0.5150070941278873, + "b_with_fsa": 13835281.428205932, + "b_with_fsa_error": -0.0008243005276256887, + "a_no_fsa_l2": 6663171.40447008, + "a_no_fsa_l2_error": -0.5187897706805782, + "b_with_fsa_l2": 13834689.4261224, + "b_with_fsa_l2_error": -0.0008670545618656372, + "label": "Federal student loan borrowers, borrower age 25 to 34", + "measure_mode": "indicator_sum", + "target_role": "fsa_age_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_35_to_49.borrowers", + "family": "ed_fsa/fsa_age_band_borrowers", + "is_fsa": true, + "target": 14835744.92830705, + "release": 7872017.318872907, + "release_error": -0.46938846974560344, + "a_no_fsa": 8082447.8682561545, + "a_no_fsa_error": -0.45520444660418774, + "b_with_fsa": 14830932.289964661, + "b_with_fsa_error": -0.00032439478877849785, + "a_no_fsa_l2": 7998011.953633308, + "a_no_fsa_l2_error": -0.46089583015323626, + "b_with_fsa_l2": 14838354.995697506, + "b_with_fsa_l2_error": 0.00017593099659423542, + "label": "Federal student loan borrowers, borrower age 35 to 49", + "measure_mode": "indicator_sum", + "target_role": "fsa_age_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_50_to_61.borrowers", + "family": "ed_fsa/fsa_age_band_borrowers", + "is_fsa": true, + "target": 6329917.836077675, + "release": 2905496.92771755, + "release_error": -0.5409897880257578, + "a_no_fsa": 2981510.527065997, + "a_no_fsa_error": -0.5289811646412323, + "b_with_fsa": 6330080.809990909, + "b_with_fsa_error": 2.574660800569155e-05, + "a_no_fsa_l2": 2876944.882751477, + "a_no_fsa_l2_error": -0.5455004381961818, + "b_with_fsa_l2": 5733548.7767398665, + "b_with_fsa_l2_error": -0.09421434444832352, + "label": "Federal student loan borrowers, borrower age 50 to 61", + "measure_mode": "indicator_sum", + "target_role": "fsa_age_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_age.fy2026_q2.borrowers.age_62_and_older.borrowers", + "family": "ed_fsa/fsa_age_band_borrowers", + "is_fsa": true, + "target": 3164958.9180388376, + "release": 1228753.2066090046, + "release_error": -0.6117632997996701, + "a_no_fsa": 1244900.8467479001, + "a_no_fsa_error": -0.6066612935629189, + "b_with_fsa": 3130274.9343246636, + "b_with_fsa_error": -0.010958746894467084, + "a_no_fsa_l2": 1233072.4652039236, + "a_no_fsa_l2_error": -0.6103985874268487, + "b_with_fsa_l2": 2747095.1616626983, + "b_with_fsa_l2_error": -0.1320281770466291, + "label": "Federal student loan borrowers, borrower age 62 and Older", + "measure_mode": "indicator_sum", + "target_role": "fsa_age_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_less_than_5k.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 18708022626.360928, + "release": 7194840956.187957, + "release_error": -0.6154141407734927, + "a_no_fsa": 7254421633.332421, + "a_no_fsa_error": -0.6122293746261336, + "b_with_fsa": 18457971834.568336, + "b_with_fsa_error": -0.013365965863236226, + "a_no_fsa_l2": 7443170469.984908, + "a_no_fsa_l2_error": -0.6021401823890807, + "b_with_fsa_l2": 15849255926.38819, + "b_with_fsa_l2_error": -0.1528096665836043, + "label": "Federal student loan balance, borrower debt size Less than 5K", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_5k_to_10k.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 51966729517.669235, + "release": 20403100746.587627, + "release_error": -0.6073814739553629, + "a_no_fsa": 18516269030.30718, + "a_no_fsa_error": -0.6436899300347263, + "b_with_fsa": 50843611427.35877, + "b_with_fsa_error": -0.021612252699654517, + "a_no_fsa_l2": 19454958091.2698, + "a_no_fsa_l2_error": -0.6256266601373306, + "b_with_fsa_l2": 43898568931.174416, + "b_with_fsa_l2_error": -0.15525626995155736, + "label": "Federal student loan balance, borrower debt size 5K to 10K", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_10k_to_20k.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 131154126877.92712, + "release": 55243407927.39507, + "release_error": -0.5787901666349137, + "a_no_fsa": 56145830948.5496, + "a_no_fsa_error": -0.571909536626264, + "b_with_fsa": 131105275530.378, + "b_with_fsa_error": -0.0003724728204289513, + "a_no_fsa_l2": 57006306444.05176, + "a_no_fsa_l2_error": -0.5653487404394764, + "b_with_fsa_l2": 131107639328.0345, + "b_with_fsa_l2_error": -0.00035444976836979445, + "label": "Federal student loan balance, borrower debt size 10K to 20K", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_20k_to_40k.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 268049340064.47293, + "release": 139894702305.24088, + "release_error": -0.4781009262265204, + "a_no_fsa": 155373084025.33463, + "a_no_fsa_error": -0.42035640159396287, + "b_with_fsa": 268003551717.58005, + "b_with_fsa_error": -0.00017082059176817967, + "a_no_fsa_l2": 145472996944.85562, + "a_no_fsa_l2_error": -0.45729022533737435, + "b_with_fsa_l2": 267806944899.71188, + "b_with_fsa_l2_error": -0.0009042930853802697, + "label": "Federal student loan balance, borrower debt size 20K to 40K", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_40k_to_60k.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 204303485189.46533, + "release": 110356140311.40195, + "release_error": -0.4598421059285369, + "a_no_fsa": 108801895979.57436, + "a_no_fsa_error": -0.4674496331833276, + "b_with_fsa": 204219392263.77588, + "b_with_fsa_error": -0.0004116078862358501, + "a_no_fsa_l2": 110871096565.19757, + "a_no_fsa_l2_error": -0.457321560313184, + "b_with_fsa_l2": 204319841790.97797, + "b_with_fsa_l2_error": 8.006031564985601e-05, + "label": "Federal student loan balance, borrower debt size 40K to 60K", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_60k_to_80k.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 175598053646.37186, + "release": 131469954513.0081, + "release_error": -0.2513017554410434, + "a_no_fsa": 144569920228.53723, + "a_no_fsa_error": -0.1766997570503864, + "b_with_fsa": 175669534805.00638, + "b_with_fsa_error": 0.00040707261356366637, + "a_no_fsa_l2": 137122964828.82472, + "a_no_fsa_l2_error": -0.21910885695253884, + "b_with_fsa_l2": 178318680400.69867, + "b_with_fsa_l2_error": 0.015493490376640204, + "label": "Federal student loan balance, borrower debt size 60K to 80K", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_80k_to_100k.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 126402883036.31165, + "release": 62852695832.42822, + "release_error": -0.5027590010397739, + "a_no_fsa": 55843840578.66671, + "a_no_fsa_error": -0.5582075405461717, + "b_with_fsa": 126371680355.4723, + "b_with_fsa_error": -0.0002468510218265879, + "a_no_fsa_l2": 59579154191.4333, + "a_no_fsa_l2_error": -0.5286566828201376, + "b_with_fsa_l2": 126405731462.39493, + "b_with_fsa_l2_error": 2.2534502495992957e-05, + "label": "Federal student loan balance, borrower debt size 80K to 100K", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_100k_to_200k.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 350701186059.2421, + "release": 140740402028.01462, + "release_error": -0.5986885484777343, + "a_no_fsa": 144961029078.46237, + "a_no_fsa_error": -0.5866537244787793, + "b_with_fsa": 350642680671.3064, + "b_with_fsa_error": -0.0001668240378458457, + "a_no_fsa_l2": 136229937048.33438, + "a_no_fsa_l2_error": -0.6115498251399647, + "b_with_fsa_l2": 351259895910.7162, + "b_with_fsa_l2_error": 0.0015931222182398897, + "label": "Federal student loan balance, borrower debt size 100K to 200K", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.dollars_outstanding.debt_200k_plus.dollars_outstanding", + "family": "ed_fsa/fsa_debt_size_band_balance", + "is_fsa": true, + "target": 352185949759.74695, + "release": 190265964334.6665, + "release_error": -0.4597570843911817, + "a_no_fsa": 194579615740.381, + "a_no_fsa_error": -0.44750886322092437, + "b_with_fsa": 352018571829.4148, + "b_with_fsa_error": -0.0004752544229726786, + "a_no_fsa_l2": 182569890833.75714, + "a_no_fsa_l2_error": -0.4816093857284708, + "b_with_fsa_l2": 352200499655.69806, + "b_with_fsa_l2_error": 4.1313107354329266e-05, + "label": "Federal student loan balance, borrower debt size 200K+", + "measure_mode": "sum", + "target_role": "fsa_debt_size_band_balance" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_less_than_5k.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 6824442.667021244, + "release": 2701286.054707425, + "release_error": -0.6041748481877873, + "a_no_fsa": 2807981.302908785, + "a_no_fsa_error": -0.5885405680850386, + "b_with_fsa": 6647229.630419818, + "b_with_fsa_error": -0.025967400599289765, + "a_no_fsa_l2": 2867027.2572995597, + "a_no_fsa_l2_error": -0.5798884396590631, + "b_with_fsa_l2": 5958931.572075626, + "b_with_fsa_l2_error": -0.12682516905419314, + "label": "Federal student loan borrowers, borrower debt size Less than 5K", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_5k_to_10k.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 7121157.565587386, + "release": 2892278.969669795, + "release_error": -0.5938470756992403, + "a_no_fsa": 2639085.5879658996, + "a_no_fsa_error": -0.6294021633899607, + "b_with_fsa": 7120831.972355158, + "b_with_fsa_error": -4.5721953099437275e-05, + "a_no_fsa_l2": 2758970.991089851, + "a_no_fsa_l2_error": -0.6125670629136993, + "b_with_fsa_l2": 6160291.932698301, + "b_with_fsa_l2_error": -0.13493110130471153, + "label": "Federal student loan borrowers, borrower debt size 5K to 10K", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_10k_to_20k.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 9099256.889361657, + "release": 3824581.1286443486, + "release_error": -0.5796820361104613, + "a_no_fsa": 3864999.6984308925, + "a_no_fsa_error": -0.5752400723019884, + "b_with_fsa": 8972005.04345278, + "b_with_fsa_error": -0.013984861341551117, + "a_no_fsa_l2": 3915637.43367675, + "a_no_fsa_l2_error": -0.5696750315671718, + "b_with_fsa_l2": 8975868.394923609, + "b_with_fsa_l2_error": -0.013560282552557383, + "label": "Federal student loan borrowers, borrower debt size 10K to 20K", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_20k_to_40k.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 9395971.787927799, + "release": 5062327.412636923, + "release_error": -0.46122364701635876, + "a_no_fsa": 5563714.383109939, + "a_no_fsa_error": -0.40786174025571775, + "b_with_fsa": 9389378.449373392, + "b_with_fsa_error": -0.0007017197053398819, + "a_no_fsa_l2": 5238521.933234368, + "a_no_fsa_l2_error": -0.44247151316855116, + "b_with_fsa_l2": 9392531.393397568, + "b_with_fsa_l2_error": -0.0003661563282524375, + "label": "Federal student loan borrowers, borrower debt size 20K to 40K", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_40k_to_60k.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 4154008.5799259744, + "release": 2270434.8601837642, + "release_error": -0.45343520204663995, + "a_no_fsa": 2236093.6142775794, + "a_no_fsa_error": -0.4617022157625329, + "b_with_fsa": 4192792.6117491154, + "b_with_fsa_error": 0.009336531467595615, + "a_no_fsa_l2": 2281052.0086418344, + "a_no_fsa_l2_error": -0.45087932180378804, + "b_with_fsa_l2": 4201394.038443646, + "b_with_fsa_l2_error": 0.01140716433438769, + "label": "Federal student loan borrowers, borrower debt size 40K to 60K", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_60k_to_80k.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 2571529.1209065556, + "release": 1906859.772196471, + "release_error": -0.25847241756133216, + "a_no_fsa": 2094535.1090107264, + "a_no_fsa_error": -0.1854904181398777, + "b_with_fsa": 2555630.679479067, + "b_with_fsa_error": -0.006182485470700631, + "a_no_fsa_l2": 1979989.1588382083, + "a_no_fsa_l2_error": -0.23003432364779458, + "b_with_fsa_l2": 2570939.677319141, + "b_with_fsa_l2_error": -0.00022921909871534134, + "label": "Federal student loan borrowers, borrower debt size 60K to 80K", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_80k_to_100k.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 1384669.5266419915, + "release": 728545.0784757418, + "release_error": -0.47384912828798875, + "a_no_fsa": 640771.0483646113, + "a_no_fsa_error": -0.537239004660869, + "b_with_fsa": 1446972.7292447137, + "b_with_fsa_error": 0.04499499801502515, + "a_no_fsa_l2": 688165.2388905862, + "a_no_fsa_l2_error": -0.5030112054538538, + "b_with_fsa_l2": 1452604.9256615886, + "b_with_fsa_l2_error": 0.04906253637598967, + "label": "Federal student loan borrowers, borrower debt size 80K to 100K", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_100k_to_200k.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 2571529.1209065556, + "release": 1091197.0412239158, + "release_error": -0.5756621877806191, + "a_no_fsa": 1086340.1832909817, + "a_no_fsa_error": -0.5775508920124505, + "b_with_fsa": 2579347.281474521, + "b_with_fsa_error": 0.0030402768937764077, + "a_no_fsa_l2": 1046767.9308337058, + "a_no_fsa_l2_error": -0.5929394995672136, + "b_with_fsa_l2": 2639977.063330595, + "b_with_fsa_l2_error": 0.0266176034591858, + "label": "Federal student loan borrowers, borrower debt size 100K to 200K", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_debt_size.fy2026_q2.borrowers.debt_200k_plus.borrowers", + "family": "ed_fsa/fsa_debt_size_band_borrowers", + "is_fsa": true, + "target": 1186859.594264564, + "release": 699993.6204068068, + "release_error": -0.41021362274906925, + "a_no_fsa": 656475.314560746, + "a_no_fsa_error": -0.4468803911320867, + "b_with_fsa": 1356164.2019807717, + "b_with_fsa_error": 0.14264923040127336, + "a_no_fsa_l2": 644087.9679588642, + "a_no_fsa_l2_error": -0.45731746950407187, + "b_with_fsa_l2": 1320483.2890778477, + "b_with_fsa_l2_error": 0.11258593304466091, + "label": "Federal student loan borrowers, borrower debt size 200K+", + "measure_mode": "indicator_sum", + "target_role": "fsa_debt_size_band_borrowers" + }, + { + "name": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.parent_plus.dollars_outstanding", + "family": "ed_fsa/fsa_parent_plus_balance", + "is_fsa": true, + "target": 114840658244.6196, + "release": 91774549445.12498, + "release_error": -0.2008531573405126, + "a_no_fsa": 102454167482.18758, + "a_no_fsa_error": -0.10785806135008236, + "b_with_fsa": 114846618687.4453, + "b_with_fsa_error": 5.190185180759451e-05, + "a_no_fsa_l2": 93165691088.92987, + "a_no_fsa_l2_error": -0.1887394890189531, + "b_with_fsa_l2": 114810235390.82646, + "b_with_fsa_l2_error": -0.00026491361385558705, + "label": "Parent PLUS loan balance", + "measure_mode": "sum", + "target_role": "fsa_parent_plus_balance" + }, + { + "name": "ed_fsa.portfolio_by_loan_type.fy2026_q2.dollars_outstanding.excluding_parent_plus.dollars_outstanding", + "family": "ed_fsa/fsa_balance_excluding_parent_plus", + "is_fsa": true, + "target": 1564229118532.9485, + "release": 766646659509.804, + "release_error": -0.5098885128613239, + "a_no_fsa": 783591739760.9545, + "a_no_fsa_error": -0.499055649535622, + "b_with_fsa": 1562485651747.415, + "b_with_fsa_error": -0.0011145853026752253, + "a_no_fsa_l2": 762584784328.7798, + "a_no_fsa_l2_error": -0.5124852393465293, + "b_with_fsa_l2": 1556356822914.9683, + "b_with_fsa_l2_error": -0.005032699829398045, + "label": "Federal student loan balance excluding Parent PLUS", + "measure_mode": "sum", + "target_role": "fsa_balance_excluding_parent_plus" + } + ], + "race": { + "households": { + "scf_2025": { + "white_non_hispanic": 0.5758379227655301, + "black_non_hispanic": 0.18584398244937056, + "hispanic": 0.09175505946273715, + "other_or_multiple": 0.14656303532236203 + }, + "release": { + "white_non_hispanic": 0.6075123718771999, + "black_non_hispanic": 0.1735163433550579, + "hispanic": 0.1292075127477179, + "other_or_multiple": 0.08976377202002432 + }, + "a_no_fsa": { + "white_non_hispanic": 0.6003164863520385, + "black_non_hispanic": 0.1638603897490698, + "hispanic": 0.13818749481107956, + "other_or_multiple": 0.09763562908781218 + }, + "b_with_fsa": { + "white_non_hispanic": 0.5756802954013409, + "black_non_hispanic": 0.18825388229277845, + "hispanic": 0.1443853499362584, + "other_or_multiple": 0.09168047236962222 + }, + "a_no_fsa_l2": { + "white_non_hispanic": 0.6207868469201013, + "black_non_hispanic": 0.16785682012915737, + "hispanic": 0.12405637066506622, + "other_or_multiple": 0.08729996228567515 + }, + "b_with_fsa_l2": { + "white_non_hispanic": 0.5990341566934774, + "black_non_hispanic": 0.19215923207947666, + "hispanic": 0.12359991141666021, + "other_or_multiple": 0.08520669981038569 + } + }, + "people": { + "release": { + "borrowers": { + "white_non_hispanic": 0.6024446842882388, + "black_non_hispanic": 0.16604397388821024, + "hispanic": 0.13503772953249454, + "other_or_multiple": 0.09647361229105646 + }, + "balance": { + "white_non_hispanic": 0.5891875758483623, + "black_non_hispanic": 0.17815405372334245, + "hispanic": 0.12436741146546251, + "other_or_multiple": 0.10829095896283272 + }, + "adults": { + "white_non_hispanic": 0.6298230145750681, + "black_non_hispanic": 0.10376617272276237, + "hispanic": 0.17037462685213, + "other_or_multiple": 0.0960361858500396 + }, + "borrower_share_of_adults_by_race": { + "white_non_hispanic": 0.07690720274916459, + "black_non_hispanic": 0.12865767250540616, + "hispanic": 0.06372626194559652, + "other_or_multiple": 0.08076847627552444 + } + }, + "a_no_fsa": { + "borrowers": { + "white_non_hispanic": 0.5928697150190028, + "black_non_hispanic": 0.16188633976571526, + "hispanic": 0.1390614019168493, + "other_or_multiple": 0.1061825432984327 + }, + "balance": { + "white_non_hispanic": 0.5940032003684192, + "black_non_hispanic": 0.20788645902194117, + "hispanic": 0.09866219129880544, + "other_or_multiple": 0.0994481493108341 + }, + "adults": { + "white_non_hispanic": 0.6168043156555436, + "black_non_hispanic": 0.10721981094395315, + "hispanic": 0.17379960783262757, + "other_or_multiple": 0.10217626556787562 + }, + "borrower_share_of_adults_by_race": { + "white_non_hispanic": 0.07871411164924272, + "black_non_hispanic": 0.12364481318592514, + "hispanic": 0.06552371974756858, + "other_or_multiple": 0.08510279651662007 + } + }, + "b_with_fsa": { + "borrowers": { + "white_non_hispanic": 0.5722250524603602, + "black_non_hispanic": 0.18370445754116826, + "hispanic": 0.1468628772780964, + "other_or_multiple": 0.09720761272037508 + }, + "balance": { + "white_non_hispanic": 0.5542220247836326, + "black_non_hispanic": 0.20214557869122174, + "hispanic": 0.14222924512798896, + "other_or_multiple": 0.10140315139715672 + }, + "adults": { + "white_non_hispanic": 0.6114840740447182, + "black_non_hispanic": 0.11517842893957711, + "hispanic": 0.16716408082854894, + "other_or_multiple": 0.10617341618715578 + }, + "borrower_share_of_adults_by_race": { + "white_non_hispanic": 0.15734619508370437, + "black_non_hispanic": 0.2681779534753427, + "hispanic": 0.147721461558332, + "other_or_multiple": 0.15394266989878125 + } + }, + "a_no_fsa_l2": { + "borrowers": { + "white_non_hispanic": 0.6140017335731585, + "black_non_hispanic": 0.16420051098668248, + "hispanic": 0.12562002014064638, + "other_or_multiple": 0.09617773529951264 + }, + "balance": { + "white_non_hispanic": 0.6044350970274939, + "black_non_hispanic": 0.19698401198319707, + "hispanic": 0.09904508600912193, + "other_or_multiple": 0.09953580498018708 + }, + "adults": { + "white_non_hispanic": 0.6475133294176726, + "black_non_hispanic": 0.10389398500485929, + "hispanic": 0.15270146082119862, + "other_or_multiple": 0.09589122475626961 + }, + "borrower_share_of_adults_by_race": { + "white_non_hispanic": 0.0770780849568202, + "black_non_hispanic": 0.12846775415704056, + "hispanic": 0.06686913109817934, + "other_or_multiple": 0.08152779519871957 + } + }, + "b_with_fsa_l2": { + "borrowers": { + "white_non_hispanic": 0.5944690600561665, + "black_non_hispanic": 0.18419234434779, + "hispanic": 0.12742621446706232, + "other_or_multiple": 0.09391238112898115 + }, + "balance": { + "white_non_hispanic": 0.5746507517286273, + "black_non_hispanic": 0.20948387976863445, + "hispanic": 0.11270971732797055, + "other_or_multiple": 0.10315565117476758 + }, + "adults": { + "white_non_hispanic": 0.647148242100287, + "black_non_hispanic": 0.11275054983909459, + "hispanic": 0.1418376208920364, + "other_or_multiple": 0.09826358716858194 + }, + "borrower_share_of_adults_by_race": { + "white_non_hispanic": 0.1488846622969502, + "black_non_hispanic": 0.2647752501322496, + "hispanic": 0.14561020809771355, + "other_or_multiple": 0.15490117679651583 + } + } + } + }, + "support": { + "borrower_records": 10008, + "people": 166321, + "borrower_records_by_age_band": { + "24_and_younger": 1246, + "25_to_34": 3064, + "35_to_49": 3972, + "50_to_61": 1217, + "62_and_older": 509 + }, + "people_by_age_band": { + "24_and_younger": 59179, + "25_to_34": 21318, + "35_to_49": 33016, + "50_to_61": 21932, + "62_and_older": 30876 + } + }, + "scf_fit_tables": { + "scf_2025": { + "households": { + "household_weight": 134963690.69015205, + "share_with_federal_education_debt": 0.18154956812200357, + "mean_among_borrowers": 41052.27209260245, + "median_among_borrowers": 25000.0, + "total_household_weight": 134963690.69015205, + "federal_education_debt_total": 1005887392198.3959, + "parent_plus_share_of_total": 0.09068330207742185 + }, + "household_balance_bands": { + "under_5k": 0.09639294713632403, + "5k_to_10k": 0.14003280730185305, + "10k_to_20k": 0.1763887243762958, + "20k_to_40k": 0.23167145676213327, + "40k_to_60k": 0.13228448002879964, + "60k_to_80k": 0.09356242722856564, + "80k_to_100k": 0.04781176224843039, + "100k_to_200k": 0.05847272768581226, + "200k_plus": 0.023382667231785843 + }, + "by_head_age_band": { + "24_and_younger": { + "household_weight": 5853521.0, + "share_with_federal_education_debt": 0.22183897089190358, + "mean_among_borrowers": 23531.319738797185, + "median_among_borrowers": 10000.0 + }, + "25_to_34": { + "household_weight": 20594001.0, + "share_with_federal_education_debt": 0.3615365625657711, + "mean_among_borrowers": 36363.72833498089, + "median_among_borrowers": 24900.0 + }, + "35_to_49": { + "household_weight": 34447794.528511114, + "share_with_federal_education_debt": 0.27186430754586627, + "mean_among_borrowers": 45297.2739464529, + "median_among_borrowers": 25000.0 + }, + "50_to_61": { + "household_weight": 26383416.705058806, + "share_with_federal_education_debt": 0.1666515695303606, + "mean_among_borrowers": 44901.11056030461, + "median_among_borrowers": 28000.0 + }, + "62_and_older": { + "household_weight": 47684957.45658214, + "share_with_federal_education_debt": 0.041870913769168856, + "mean_among_borrowers": 41544.318165395336, + "median_among_borrowers": 26000.0 + } + }, + "by_race": { + "white_non_hispanic": { + "household_weight": 81838505.71507175, + "share_with_federal_education_debt": 0.17240693757923897, + "mean_among_borrowers": 41150.07823437558, + "median_among_borrowers": 23000.0 + }, + "black_non_hispanic": { + "household_weight": 18706038.359267425, + "share_with_federal_education_debt": 0.24343266231667623, + "mean_among_borrowers": 47375.69026752636, + "median_among_borrowers": 30000.0 + }, + "hispanic": { + "household_weight": 15955872.224651583, + "share_with_federal_education_debt": 0.1409034533516125, + "mean_among_borrowers": 33382.63507234893, + "median_among_borrowers": 23000.0 + }, + "other_or_multiple": { + "household_weight": 18463274.3911613, + "share_with_federal_education_debt": 0.19450371139945485, + "mean_among_borrowers": 37451.352530441625, + "median_among_borrowers": 20000.0 + } + }, + "by_income_quintile": { + "1": { + "household_weight": 26990442.923403554, + "share_with_federal_education_debt": 0.1144757325207629, + "mean_among_borrowers": 30747.429065421915, + "median_among_borrowers": 19200.0 + }, + "2": { + "household_weight": 26994482.864333212, + "share_with_federal_education_debt": 0.1705804998024808, + "mean_among_borrowers": 41222.638862750704, + "median_among_borrowers": 22000.0 + }, + "3": { + "household_weight": 26997020.193277217, + "share_with_federal_education_debt": 0.17774016899539674, + "mean_among_borrowers": 38756.18543238133, + "median_among_borrowers": 21000.0 + }, + "4": { + "household_weight": 26985790.839470405, + "share_with_federal_education_debt": 0.26595688145561025, + "mean_among_borrowers": 40379.14671664771, + "median_among_borrowers": 28000.0 + }, + "5": { + "household_weight": 26995953.869667668, + "share_with_federal_education_debt": 0.1790121945626286, + "mean_among_borrowers": 50757.93410007803, + "median_among_borrowers": 28000.0 + } + }, + "borrowers": { + "borrower_weight": 27237098.830047637, + "mean_balance": 36930.783211342365, + "median_balance": 21000.0, + "balance_bands": { + "under_5k": 0.11858724248854419, + "5k_to_10k": 0.15545017628617694, + "10k_to_20k": 0.18221344662589709, + "20k_to_40k": 0.22815323048913974, + "40k_to_60k": 0.12964994896026388, + "60k_to_80k": 0.07784527443403214, + "80k_to_100k": 0.03718546813313425, + "100k_to_200k": 0.04901089121852003, + "200k_plus": 0.021904321364291858 + }, + "age_bands": { + "24_and_younger": 0.10943214673515073, + "25_to_34": 0.3533895334655874, + "35_to_49": 0.37160638234348325, + "50_to_61": 0.11180436490051585, + "62_and_older": 0.05376757255526285 + }, + "graduate_share_of_own_original_principal": 0.47206971539270537, + "ibr_new_borrower_share": 0.5952213780001776 + } + }, + "release": { + "households": { + "household_weight": 122537091.8856833, + "share_with_federal_education_debt": 0.16413671000206656, + "mean_among_borrowers": 42680.26879514089, + "median_among_borrowers": 23000.0, + "total_household_weight": 122537091.8856833, + "federal_education_debt_total": 858421208954.9309, + "parent_plus_share_of_total": 0.10691085971286082 + }, + "household_balance_bands": { + "under_5k": 0.1179407532730876, + "5k_to_10k": 0.1324473758996882, + "10k_to_20k": 0.1827494270561508, + "20k_to_40k": 0.23417620772637385, + "40k_to_60k": 0.10433535383061796, + "60k_to_80k": 0.0976346772652531, + "80k_to_100k": 0.0379014108379451, + "100k_to_200k": 0.05781213394341271, + "200k_plus": 0.03500266016747067 + }, + "by_head_age_band": { + "24_and_younger": { + "household_weight": 4363759.075237429, + "share_with_federal_education_debt": 0.21797195752357604, + "mean_among_borrowers": 20475.641978208863, + "median_among_borrowers": 12662.0 + }, + "25_to_34": { + "household_weight": 19671660.332724698, + "share_with_federal_education_debt": 0.28107974022687005, + "mean_among_borrowers": 34573.95711939027, + "median_among_borrowers": 20100.0 + }, + "35_to_49": { + "household_weight": 32403635.225158654, + "share_with_federal_education_debt": 0.24429588401566177, + "mean_among_borrowers": 44478.05328490035, + "median_among_borrowers": 23000.0 + }, + "50_to_61": { + "household_weight": 25738755.87416564, + "share_with_federal_education_debt": 0.16352578267462928, + "mean_among_borrowers": 48394.24067058906, + "median_among_borrowers": 28742.0 + }, + "62_and_older": { + "household_weight": 40359281.378396876, + "share_with_federal_education_debt": 0.037347739302272136, + "mean_among_borrowers": 61031.6733341336, + "median_among_borrowers": 34000.0 + } + }, + "by_race": { + "white_non_hispanic": { + "household_weight": 79908332.17160814, + "share_with_federal_education_debt": 0.15291016385941802, + "mean_among_borrowers": 42266.19101485241, + "median_among_borrowers": 23000.0 + }, + "black_non_hispanic": { + "household_weight": 14037284.65604804, + "share_with_federal_education_debt": 0.24861685783459786, + "mean_among_borrowers": 45500.64480289935, + "median_among_borrowers": 28000.0 + }, + "hispanic": { + "household_weight": 18783518.810774647, + "share_with_federal_education_debt": 0.13835157436352993, + "mean_among_borrowers": 37031.934121143146, + "median_among_borrowers": 19200.0 + }, + "other_or_multiple": { + "household_weight": 9807956.247252459, + "share_with_federal_education_debt": 0.18407544859054642, + "mean_among_borrowers": 48161.13603160578, + "median_among_borrowers": 18000.0 + } + }, + "by_income_quintile": { + "1": { + "household_weight": 24515062.61657284, + "share_with_federal_education_debt": 0.14257834053880739, + "mean_among_borrowers": 43328.84042017116, + "median_among_borrowers": 20000.0 + }, + "2": { + "household_weight": 24494456.917873796, + "share_with_federal_education_debt": 0.15791199105287693, + "mean_among_borrowers": 39522.35712436794, + "median_among_borrowers": 20000.0 + }, + "3": { + "household_weight": 24510469.334416572, + "share_with_federal_education_debt": 0.14719109419650156, + "mean_among_borrowers": 38670.33311547162, + "median_among_borrowers": 23000.0 + }, + "4": { + "household_weight": 24509847.230985664, + "share_with_federal_education_debt": 0.23072142160681058, + "mean_among_borrowers": 41126.05793612391, + "median_among_borrowers": 26000.0 + }, + "5": { + "household_weight": 24507255.785834424, + "share_with_federal_education_debt": 0.1422795004455311, + "mean_among_borrowers": 52202.66543686702, + "median_among_borrowers": 23000.0 + } + }, + "borrowers": { + "borrower_weight": 21177503.938145176, + "mean_balance": 40534.57912047568, + "median_balance": 22224.0, + "balance_bands": { + "under_5k": 0.12755450607386423, + "5k_to_10k": 0.13657317586234458, + "10k_to_20k": 0.18059640738658841, + "20k_to_40k": 0.2390426854563625, + "40k_to_60k": 0.10720974798612737, + "60k_to_80k": 0.09004176213429058, + "80k_to_100k": 0.034401838885435285, + "100k_to_200k": 0.051526234839151065, + "200k_plus": 0.03305364137583606 + }, + "age_bands": { + "24_and_younger": 0.12191368948550384, + "25_to_34": 0.3111513455503956, + "35_to_49": 0.37171601251334024, + "50_to_61": 0.13719732675785898, + "62_and_older": 0.05802162569290144 + }, + "graduate_share_of_own_original_principal": 0.4995084468534534, + "ibr_new_borrower_share": 0.6132625665271612 + } + }, + "a_no_fsa": { + "households": { + "household_weight": 122537091.8856833, + "share_with_federal_education_debt": 0.1662222969167077, + "mean_among_borrowers": 43501.01349980745, + "median_among_borrowers": 24105.0, + "total_household_weight": 122537091.8856833, + "federal_education_debt_total": 886045907243.1461, + "parent_plus_share_of_total": 0.11563076658292412 + }, + "household_balance_bands": { + "under_5k": 0.11841969068975977, + "5k_to_10k": 0.12061799917651367, + "10k_to_20k": 0.18275573731202388, + "20k_to_40k": 0.24657242476854863, + "40k_to_60k": 0.09754696416735667, + "60k_to_80k": 0.10896577846277462, + "80k_to_100k": 0.0324338533289015, + "100k_to_200k": 0.06030004073479197, + "200k_plus": 0.032387511359329366 + }, + "by_head_age_band": { + "24_and_younger": { + "household_weight": 3635151.701101098, + "share_with_federal_education_debt": 0.20043023866536372, + "mean_among_borrowers": 21760.449372183906, + "median_among_borrowers": 16000.0 + }, + "25_to_34": { + "household_weight": 20129824.156942412, + "share_with_federal_education_debt": 0.2824461015587112, + "mean_among_borrowers": 33796.12572962709, + "median_among_borrowers": 21619.0 + }, + "35_to_49": { + "household_weight": 32722379.390550684, + "share_with_federal_education_debt": 0.24388267605585381, + "mean_among_borrowers": 43463.91455155131, + "median_among_borrowers": 22000.0 + }, + "50_to_61": { + "household_weight": 25133581.13988513, + "share_with_federal_education_debt": 0.17014380471932578, + "mean_among_borrowers": 56508.98868823854, + "median_among_borrowers": 29000.0 + }, + "62_and_older": { + "household_weight": 40916155.49720397, + "share_with_federal_education_debt": 0.04148648852349596, + "mean_among_borrowers": 52742.91477422361, + "median_among_borrowers": 34000.0 + } + }, + "by_race": { + "white_non_hispanic": { + "household_weight": 78968318.58011529, + "share_with_federal_education_debt": 0.1548403798120201, + "mean_among_borrowers": 44140.37454733786, + "median_among_borrowers": 25000.0 + }, + "black_non_hispanic": { + "household_weight": 14565930.804472141, + "share_with_federal_education_debt": 0.22913561066603055, + "mean_among_borrowers": 54636.83577767072, + "median_among_borrowers": 30000.0 + }, + "hispanic": { + "household_weight": 18710333.49436463, + "share_with_federal_education_debt": 0.15043332807146526, + "mean_among_borrowers": 27916.18079888531, + "median_among_borrowers": 17000.0 + }, + "other_or_multiple": { + "household_weight": 10292509.006731233, + "share_with_federal_education_debt": 0.193216371312724, + "mean_among_borrowers": 42938.61462233152, + "median_among_borrowers": 16000.0 + } + }, + "by_income_quintile": { + "1": { + "household_weight": 24509830.709962953, + "share_with_federal_education_debt": 0.15713814350382035, + "mean_among_borrowers": 42800.44936701379, + "median_among_borrowers": 21000.0 + }, + "2": { + "household_weight": 24512390.04446271, + "share_with_federal_education_debt": 0.15676908851029417, + "mean_among_borrowers": 40155.276139348534, + "median_among_borrowers": 22224.0 + }, + "3": { + "household_weight": 24503618.53101112, + "share_with_federal_education_debt": 0.1582885566256086, + "mean_among_borrowers": 37731.592645025084, + "median_among_borrowers": 20000.0 + }, + "4": { + "household_weight": 24506035.805938605, + "share_with_federal_education_debt": 0.220142400639105, + "mean_among_borrowers": 42061.95878397995, + "median_among_borrowers": 28000.0 + }, + "5": { + "household_weight": 24505216.79430791, + "share_with_federal_education_debt": 0.13877545330840255, + "mean_among_borrowers": 56938.18158182969, + "median_among_borrowers": 22000.0 + } + }, + "borrowers": { + "borrower_weight": 21589996.24192015, + "mean_balance": 41039.65083248869, + "median_balance": 24000.0, + "balance_bands": { + "under_5k": 0.13005936969348214, + "5k_to_10k": 0.12223650057158077, + "10k_to_20k": 0.17901808111140036, + "20k_to_40k": 0.2576987193868597, + "40k_to_60k": 0.1035708199863358, + "60k_to_80k": 0.09701414884657916, + "80k_to_100k": 0.029679071787907987, + "100k_to_200k": 0.0503168305875706, + "200k_plus": 0.030406458028283605 + }, + "age_bands": { + "24_and_younger": 0.11883225902939219, + "25_to_34": 0.31104910342445596, + "35_to_49": 0.37436078161805786, + "50_to_61": 0.1380968525264009, + "62_and_older": 0.057661003401693146 + }, + "graduate_share_of_own_original_principal": 0.49676322471095574, + "ibr_new_borrower_share": 0.6042552792434042 + } + }, + "b_with_fsa": { + "households": { + "household_weight": 122537091.8856833, + "share_with_federal_education_debt": 0.33694036417552564, + "mean_among_borrowers": 40625.478789361725, + "median_among_borrowers": 19300.0, + "total_household_weight": 122537091.8856833, + "federal_education_debt_total": 1677332270434.8613, + "parent_plus_share_of_total": 0.06846980810645852 + }, + "household_balance_bands": { + "under_5k": 0.13955161180928513, + "5k_to_10k": 0.15826542147244488, + "10k_to_20k": 0.20707794934003546, + "20k_to_40k": 0.19547236113209127, + "40k_to_60k": 0.09529393843931358, + "60k_to_80k": 0.06672533541244413, + "80k_to_100k": 0.03654771290584069, + "100k_to_200k": 0.06804129066645687, + "200k_plus": 0.033024378822087974 + }, + "by_head_age_band": { + "24_and_younger": { + "household_weight": 3847176.057577575, + "share_with_federal_education_debt": 0.5767111055129247, + "mean_among_borrowers": 15664.324914787016, + "median_among_borrowers": 6000.0 + }, + "25_to_34": { + "household_weight": 20479157.367551968, + "share_with_federal_education_debt": 0.5670384500305262, + "mean_among_borrowers": 33595.451331272445, + "median_among_borrowers": 18000.0 + }, + "35_to_49": { + "household_weight": 32991356.470968604, + "share_with_federal_education_debt": 0.4513258179323375, + "mean_among_borrowers": 45142.324926269954, + "median_among_borrowers": 19073.0 + }, + "50_to_61": { + "household_weight": 24910795.424953073, + "share_with_federal_education_debt": 0.35283441796727216, + "mean_among_borrowers": 41714.95752585544, + "median_among_borrowers": 23000.0 + }, + "62_and_older": { + "household_weight": 40308606.56463207, + "share_with_federal_education_debt": 0.09370893536586869, + "mean_among_borrowers": 56559.314875026146, + "median_among_borrowers": 27000.0 + } + }, + "by_race": { + "white_non_hispanic": { + "household_weight": 78624715.69281693, + "share_with_federal_education_debt": 0.3023032990029397, + "mean_among_borrowers": 39933.94147052817, + "median_among_borrowers": 21000.0 + }, + "black_non_hispanic": { + "household_weight": 15990487.204444192, + "share_with_federal_education_debt": 0.48607451913383065, + "mean_among_borrowers": 43263.47914032129, + "median_among_borrowers": 24800.0 + }, + "hispanic": { + "household_weight": 17446132.321052335, + "share_with_federal_education_debt": 0.34169968451881383, + "mean_among_borrowers": 37037.78907722883, + "median_among_borrowers": 15200.0 + }, + "other_or_multiple": { + "household_weight": 10475756.66736983, + "share_with_federal_education_debt": 0.36133668041973077, + "mean_among_borrowers": 45201.158038559435, + "median_among_borrowers": 15800.0 + } + }, + "by_income_quintile": { + "1": { + "household_weight": 24519312.930006135, + "share_with_federal_education_debt": 0.37160119581737394, + "mean_among_borrowers": 41520.510029656325, + "median_among_borrowers": 19300.0 + }, + "2": { + "household_weight": 24488609.03927902, + "share_with_federal_education_debt": 0.3644520881120006, + "mean_among_borrowers": 36447.034230393336, + "median_among_borrowers": 17000.0 + }, + "3": { + "household_weight": 24515013.423280142, + "share_with_federal_education_debt": 0.2795901654964384, + "mean_among_borrowers": 32106.89164645145, + "median_among_borrowers": 16000.0 + }, + "4": { + "household_weight": 24505919.600144904, + "share_with_federal_education_debt": 0.4073163476136399, + "mean_among_borrowers": 42277.80653946196, + "median_among_borrowers": 25000.0 + }, + "5": { + "household_weight": 24508236.89297309, + "share_with_federal_education_debt": 0.2617709042738302, + "mean_among_borrowers": 51697.3491788981, + "median_among_borrowers": 20000.0 + } + }, + "borrowers": { + "borrower_weight": 44260352.59952934, + "mean_balance": 37896.947762966935, + "median_balance": 19000.0, + "balance_bands": { + "under_5k": 0.1501847418741644, + "5k_to_10k": 0.1608851162299797, + "10k_to_20k": 0.2027097507476295, + "20k_to_40k": 0.21213971190715802, + "40k_to_60k": 0.09473021260552951, + "60k_to_80k": 0.05774085675734634, + "80k_to_100k": 0.03269230008936035, + "100k_to_200k": 0.05827669979976499, + "200k_plus": 0.03064060998906712 + }, + "age_bands": { + "24_and_younger": 0.1385841453307442, + "25_to_34": 0.3125885948850993, + "35_to_49": 0.33508391639253193, + "50_to_61": 0.14301921331865375, + "62_and_older": 0.07072413007297072 + }, + "graduate_share_of_own_original_principal": 0.508285507012338, + "ibr_new_borrower_share": 0.6105831277596138 + } + }, + "a_no_fsa_l2": { + "households": { + "household_weight": 122537091.88568327, + "share_with_federal_education_debt": 0.16563645838046798, + "mean_among_borrowers": 42162.23688501788, + "median_among_borrowers": 23000.0, + "total_household_weight": 122537091.88568327, + "federal_education_debt_total": 855750475417.7095, + "parent_plus_share_of_total": 0.10887015989497843 + }, + "household_balance_bands": { + "under_5k": 0.12261795764358152, + "5k_to_10k": 0.12560119592428387, + "10k_to_20k": 0.1861204725711393, + "20k_to_40k": 0.23801668825522546, + "40k_to_60k": 0.10225754716136082, + "60k_to_80k": 0.10176719684669226, + "80k_to_100k": 0.03572951107099876, + "100k_to_200k": 0.05602102279560625, + "200k_plus": 0.031868407731111735 + }, + "by_head_age_band": { + "24_and_younger": { + "household_weight": 4100474.1851678477, + "share_with_federal_education_debt": 0.20215649870740063, + "mean_among_borrowers": 21919.233422005138, + "median_among_borrowers": 14010.0 + }, + "25_to_34": { + "household_weight": 20004682.19138664, + "share_with_federal_education_debt": 0.2798219378696274, + "mean_among_borrowers": 34031.58155408465, + "median_among_borrowers": 21128.0 + }, + "35_to_49": { + "household_weight": 32659776.029665, + "share_with_federal_education_debt": 0.24833863788543387, + "mean_among_borrowers": 42695.94041080717, + "median_among_borrowers": 21000.0 + }, + "50_to_61": { + "household_weight": 25590562.704523593, + "share_with_federal_education_debt": 0.16554845166192733, + "mean_among_borrowers": 50596.32209593981, + "median_among_borrowers": 28742.0 + }, + "62_and_older": { + "household_weight": 40181596.77494021, + "share_with_federal_education_debt": 0.037896979589947685, + "mean_among_borrowers": 56763.36749516682, + "median_among_borrowers": 30000.0 + } + }, + "by_race": { + "white_non_hispanic": { + "household_weight": 82380202.74787456, + "share_with_federal_education_debt": 0.15294777210104576, + "mean_among_borrowers": 41812.70340643178, + "median_among_borrowers": 24000.0 + }, + "black_non_hispanic": { + "household_weight": 14048364.94189728, + "share_with_federal_education_debt": 0.2425139448394988, + "mean_among_borrowers": 49957.15583164976, + "median_among_borrowers": 30000.0 + }, + "hispanic": { + "household_weight": 16605141.446937382, + "share_with_federal_education_debt": 0.1516351891098961, + "mean_among_borrowers": 30960.749830908077, + "median_among_borrowers": 17000.0 + }, + "other_or_multiple": { + "household_weight": 9503382.748974059, + "share_with_federal_education_debt": 0.18644869173038747, + "mean_among_borrowers": 45577.717266638196, + "median_among_borrowers": 17055.0 + } + }, + "by_income_quintile": { + "1": { + "household_weight": 24510291.26347278, + "share_with_federal_education_debt": 0.14873055869877072, + "mean_among_borrowers": 40970.24844805359, + "median_among_borrowers": 20200.0 + }, + "2": { + "household_weight": 24516810.65758673, + "share_with_federal_education_debt": 0.15808689215171848, + "mean_among_borrowers": 40062.008810140185, + "median_among_borrowers": 22000.0 + }, + "3": { + "household_weight": 24492991.83745575, + "share_with_federal_education_debt": 0.15103865042359083, + "mean_among_borrowers": 36573.180954063544, + "median_among_borrowers": 20000.0 + }, + "4": { + "household_weight": 24514296.116864473, + "share_with_federal_education_debt": 0.22358362017490513, + "mean_among_borrowers": 40447.22960054789, + "median_among_borrowers": 26000.0 + }, + "5": { + "household_weight": 24502702.010303557, + "share_with_federal_education_debt": 0.14671894956912873, + "mean_among_borrowers": 54001.25041791122, + "median_among_borrowers": 22000.0 + } + }, + "borrowers": { + "borrower_weight": 21420219.92046372, + "mean_balance": 39950.592411993486, + "median_balance": 22000.0, + "balance_bands": { + "under_5k": 0.13384677038542236, + "5k_to_10k": 0.12880217856465984, + "10k_to_20k": 0.1828009912230621, + "20k_to_40k": 0.2445596708477191, + "40k_to_60k": 0.10649059706724294, + "60k_to_80k": 0.0924355196253908, + "80k_to_100k": 0.032126898857520625, + "100k_to_200k": 0.048868215859617724, + "200k_plus": 0.03006915756936449 + }, + "age_bands": { + "24_and_younger": 0.12366909509991612, + "25_to_34": 0.31106923407935827, + "35_to_49": 0.3733860802237818, + "50_to_61": 0.13430977335592123, + "62_and_older": 0.05756581724102254 + }, + "graduate_share_of_own_original_principal": 0.49174957523668006, + "ibr_new_borrower_share": 0.6080491171993825 + } + }, + "b_with_fsa_l2": { + "households": { + "household_weight": 122537091.8856833, + "share_with_federal_education_debt": 0.323233835865687, + "mean_among_borrowers": 42192.52156450831, + "median_among_borrowers": 20000.0, + "total_household_weight": 122537091.8856833, + "federal_education_debt_total": 1671167058305.7954, + "parent_plus_share_of_total": 0.06870063338085393 + }, + "household_balance_bands": { + "under_5k": 0.12687176397711675, + "5k_to_10k": 0.14015253320577614, + "10k_to_20k": 0.21290206834104333, + "20k_to_40k": 0.20773188931543504, + "40k_to_60k": 0.09868406383570383, + "60k_to_80k": 0.07056651342100889, + "80k_to_100k": 0.03743463303429598, + "100k_to_200k": 0.07217233754549668, + "200k_plus": 0.03348419732412317 + }, + "by_head_age_band": { + "24_and_younger": { + "household_weight": 4020461.628401902, + "share_with_federal_education_debt": 0.480939342799211, + "mean_among_borrowers": 16453.978132854223, + "median_among_borrowers": 7940.0 + }, + "25_to_34": { + "household_weight": 20518271.01844301, + "share_with_federal_education_debt": 0.5525159821592887, + "mean_among_borrowers": 35083.592475100166, + "median_among_borrowers": 19224.0 + }, + "35_to_49": { + "household_weight": 33023047.529334612, + "share_with_federal_education_debt": 0.45133617587243646, + "mean_among_borrowers": 44694.318601981875, + "median_among_borrowers": 20000.0 + }, + "50_to_61": { + "household_weight": 25489591.57285554, + "share_with_federal_education_debt": 0.32013000884432247, + "mean_among_borrowers": 45240.13907667991, + "median_among_borrowers": 24831.0 + }, + "62_and_older": { + "household_weight": 39485720.13664824, + "share_with_federal_education_debt": 0.08290045703177726, + "mean_among_borrowers": 63028.16626521563, + "median_among_borrowers": 28000.0 + } + }, + "by_race": { + "white_non_hispanic": { + "household_weight": 82602036.26210862, + "share_with_federal_education_debt": 0.28724019854653243, + "mean_among_borrowers": 41559.885843689495, + "median_among_borrowers": 22000.0 + }, + "black_non_hispanic": { + "household_weight": 15572373.555481266, + "share_with_federal_education_debt": 0.4887545648518058, + "mean_among_borrowers": 47047.79247612714, + "median_among_borrowers": 25500.0 + }, + "hispanic": { + "household_weight": 14817586.472054191, + "share_with_federal_education_debt": 0.330388615812849, + "mean_among_borrowers": 33831.14213368209, + "median_among_borrowers": 16000.0 + }, + "other_or_multiple": { + "household_weight": 9545095.596039219, + "share_with_federal_education_debt": 0.35357198582189475, + "mean_among_borrowers": 47819.43862195242, + "median_among_borrowers": 16000.0 + } + }, + "by_income_quintile": { + "1": { + "household_weight": 24507462.887031876, + "share_with_federal_education_debt": 0.3292505672134323, + "mean_among_borrowers": 42300.941960541815, + "median_among_borrowers": 19716.0 + }, + "2": { + "household_weight": 24506590.787594683, + "share_with_federal_education_debt": 0.33916996611938816, + "mean_among_borrowers": 40663.62325966678, + "median_among_borrowers": 18000.0 + }, + "3": { + "household_weight": 24510366.85735613, + "share_with_federal_education_debt": 0.2702289062515029, + "mean_among_borrowers": 32955.67888464545, + "median_among_borrowers": 19073.0 + }, + "4": { + "household_weight": 24509151.04761634, + "share_with_federal_education_debt": 0.4127223962067935, + "mean_among_borrowers": 42712.965436412225, + "median_among_borrowers": 25500.0 + }, + "5": { + "household_weight": 24503520.306084275, + "share_with_federal_education_debt": 0.2647886248297161, + "mean_among_borrowers": 52634.16824386155, + "median_among_borrowers": 20000.0 + } + }, + "borrowers": { + "borrower_weight": 42673022.28692794, + "mean_balance": 39162.14434190018, + "median_balance": 20000.0, + "balance_bands": { + "under_5k": 0.1396416577201527, + "5k_to_10k": 0.14436033827829883, + "10k_to_20k": 0.21034058320432564, + "20k_to_40k": 0.22010466777448748, + "40k_to_60k": 0.0984555068585021, + "60k_to_80k": 0.06024742423989721, + "80k_to_100k": 0.03404035729868063, + "100k_to_200k": 0.0618652469839077, + "200k_plus": 0.030944217641747686 + }, + "age_bands": { + "24_and_younger": 0.12934012242194104, + "25_to_34": 0.32420224030769845, + "35_to_49": 0.3477221485726113, + "50_to_61": 0.13436003520416762, + "62_and_older": 0.06437545349358148 + }, + "graduate_share_of_own_original_principal": 0.510849288503444, + "ibr_new_borrower_share": 0.6107068389047522 + } + } + }, + "weights": { + "a_no_fsa": { + "ratio_quantiles": { + "0.01": 0.021093872217825906, + "0.05": 0.02130755277192934, + "0.25": 0.021324127151351926, + "0.5": 0.02142283140750434, + "0.75": 0.04578317512756532, + "0.95": 1.6918602913398573, + "0.99": 4.7574832912510265 + }, + "share_at_cap": 0.0, + "borrower_households_weighted_mean_ratio": 1.0127064013566183, + "other_households_weighted_mean_ratio": 0.9975048707849745, + "borrower_household_weight_share": { + "initial": 0.16413671000206656, + "final": 0.1662222969167077 + }, + "effective_sample_size": { + "initial": 9174.432030037513, + "final": 4149.419863864658 + }, + "total_weight": { + "initial": 122537091.8856833, + "final": 122537091.8856833 + } + }, + "b_with_fsa": { + "ratio_quantiles": { + "0.01": 0.0006926508102690254, + "0.05": 0.0006928080625896851, + "0.25": 0.0006935190900865327, + "0.5": 0.0006978842619729753, + "0.75": 0.0029336623841658997, + "0.95": 1.9553618488896691, + "0.99": 4.976988051897074 + }, + "share_at_cap": 0.0, + "borrower_households_weighted_mean_ratio": 2.0528032039345945, + "other_households_weighted_mean_ratio": 0.7932632569927957, + "borrower_household_weight_share": { + "initial": 0.16413671000206656, + "final": 0.33694036417552564 + }, + "effective_sample_size": { + "initial": 9174.432030037513, + "final": 3045.454372921042 + }, + "total_weight": { + "initial": 122537091.8856833, + "final": 122537091.8856833 + } + }, + "a_no_fsa_l2": { + "ratio_quantiles": { + "0.01": 0.13174878481408442, + "0.05": 0.13309886315863573, + "0.25": 0.13318075990218325, + "0.5": 0.13318284968948124, + "0.75": 0.1332263926427999, + "0.95": 1.2628518482058102, + "0.99": 1.9667972474133708 + }, + "share_at_cap": 5.241090146750524e-05, + "borrower_households_weighted_mean_ratio": 1.0091371904455895, + "other_households_weighted_mean_ratio": 0.9982057491980475, + "borrower_household_weight_share": { + "initial": 0.16413671000206656, + "final": 0.16563645838046798 + }, + "effective_sample_size": { + "initial": 9174.432030037513, + "final": 6434.762084227589 + }, + "total_weight": { + "initial": 122537091.8856833, + "final": 122537091.88568327 + } + }, + "b_with_fsa_l2": { + "ratio_quantiles": { + "0.01": 0.010930534745920758, + "0.05": 0.010934835994047536, + "0.25": 0.010934947606906435, + "0.5": 0.010935395003846847, + "0.75": 0.011280074666995056, + "0.95": 1.453114417894372, + "0.99": 2.770508569166096 + }, + "share_at_cap": 0.0003843466107617051, + "borrower_households_weighted_mean_ratio": 1.96929642285152, + "other_households_weighted_mean_ratio": 0.809661307336498, + "borrower_household_weight_share": { + "initial": 0.16413671000206656, + "final": 0.323233835865687 + }, + "effective_sample_size": { + "initial": 9174.432030037513, + "final": 4424.347224536957 + }, + "total_weight": { + "initial": 122537091.8856833, + "final": 122537091.8856833 + } + } + }, + "seconds": 775.1628392 +} diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/fiscal_targets.py b/packages/microcosm-build/src/microcosm/build/us_runtime/fiscal_targets.py index 8ad5c1983..9b07ef991 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/fiscal_targets.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/fiscal_targets.py @@ -29,6 +29,11 @@ from microcosm.build.us_runtime.congressional_district_vintage import ( translate_congressional_district_facts_to_current_vintage, ) +from microcosm.build.us_runtime.fsa_student_loan_targets import ( + FSA_SOURCE_NAME, + apply_fsa_student_loan_plan, + plan_fsa_student_loan_targets, +) from microcosm.build.us_runtime.target_aging import ( age_us_dollar_targets, enforce_period_contract, @@ -1011,6 +1016,7 @@ def compile_us_fiscal_target_registry( congressional_district_vintage_crosswalk: object | None = None, age_targets: bool = False, allow_unaged_dollar_targets: bool = False, + student_loan_targets: bool = False, ) -> TargetRegistry: """Resolve US fiscal targets from an external Ledger fact feed. @@ -1032,6 +1038,13 @@ def compile_us_fiscal_target_registry( unless aging transformed it. Set this to record an explicit, auditable waiver instead of raising; every waived target carries ``period_contract_waiver`` metadata in diagnostics. + student_loan_targets: Bind Federal Student Aid's portfolio facts + (``ed_fsa``) to the SCF education-debt stage's person balances + (microcosm#1074; see + :mod:`microcosm.build.us_runtime.fsa_student_loan_targets`). Only + a build that carries those columns can materialize the targets, + so the release tool sets this with ``--scf-education-debt``; + otherwise the facts are inert. """ materialized_facts = tuple(facts) if congressional_district_vintage_crosswalk is not None: @@ -1039,6 +1052,11 @@ def compile_us_fiscal_target_registry( materialized_facts, congressional_district_vintage_crosswalk, ) + student_loan_plan = ( + plan_fsa_student_loan_targets(materialized_facts, target_period=target_period) + if student_loan_targets + else None + ) references = ( *_dynamic_us_fiscal_target_references( materialized_facts, @@ -1048,12 +1066,20 @@ def compile_us_fiscal_target_registry( US_JCT_TAX_EXPENDITURE_TARGET_REFERENCES, target_period=target_period, ), + *(student_loan_plan.references if student_loan_plan is not None else ()), ) registry = compile_ledger_target_references( materialized_facts, references, country="us", ) + if student_loan_plan is not None: + # FSA references resolve at their own reference quarter; the plan + # moves them to the build period at their reconciled values + # (microcosm#1074), before any pass that reads periods or ages. + registry = apply_fsa_student_loan_plan( + registry, student_loan_plan, target_period=target_period + ) registry = _uprate_cross_period_eitc_decompositions(registry) registry = _with_derived_chip_enrollment_targets(registry) registry = _without_m_chip_state_chip_enrollment_targets(registry) @@ -3118,6 +3144,11 @@ def _reference_from_ledger_fact( return _ssa_ssi_reference_from_fact(fact, target_period=target_period) if source_name == "bea": return _bea_reference_from_fact(fact, target_period=target_period) + if source_name == FSA_SOURCE_NAME: + # Federal Student Aid portfolio facts bind only through + # plan_fsa_student_loan_targets, which reconciles the tables to one + # in-scope control at one reference quarter (microcosm#1074). + return None if source_name == "jct": # JCT facts never bind through dynamic dispatch: tax-expenditure rows # compile only as declared SimpleTaxExpenditureReform references diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/fsa_student_loan_targets.py b/packages/microcosm-build/src/microcosm/build/us_runtime/fsa_student_loan_targets.py new file mode 100644 index 000000000..c685cac60 --- /dev/null +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/fsa_student_loan_targets.py @@ -0,0 +1,1054 @@ +"""Federal Student Aid portfolio targets for federal student loan balances. + +microcosm#1074 calibrates the person balances the SCF education-debt stage +imputes (``federal_student_loan_balance`` and +``federal_parent_plus_loan_balance``, microcosm#1073) to Federal Student Aid's +federal student loan portfolio tables, which Chronicle stores as published +(PolicyEngine/chronicle#310). Chronicle keeps each table's own level; the +alignment across tables, the treatment of FSA's "Not Reported" and "Other" +rows and the reference period are Microcosm's, and live here. + +What binds. One person's federal balance is ``own + Parent PLUS``; a borrower +is a person whose federal balance is positive. FSA's borrower tables count a +Parent PLUS borrower as the parent, so the person holding the loan is the one +counted, which is how the stage assigns those balances. + +- **By state** (``portfolio_by_location``): the balance and the borrower count + of each of the 50 states and DC. +- **By borrower age** (``portfolio_by_age``): balance and borrowers in each + age band, on the person's age. +- **By debt size** (``portfolio_by_debt_size``): balance and borrowers in each + band of the person's federal balance (lower edge inclusive, upper exclusive, + as FSA's Definitions sheet states). +- **By loan type** (``portfolio_by_loan_type``): the Parent PLUS balance, and + the balance of every other loan type, against the two person columns. FSA + files a consolidated Parent PLUS loan under "Consolidation", so its Parent + PLUS row is a lower bound on the stage's concept (every loan for a child's + education, consolidated or not). + +Repayment plans, the portfolio summary and the loan-type recipient counts stay +diagnostic only: :data:`FSA_DIAGNOSTIC_TABLES` and the row rules in +:func:`plan_fsa_student_loan_targets` give each reason. + +Reference period. The build's period is the H5's (2024), but the balances are +stocks that the student-debt analysis reads as they stand (its reference year +is 2026), and the stage's SCF draws are 2025 survey-date dollars. So the +targets are FSA's levels at one reference date, unaged: +``period_alignment = stock_at_source_reference_date``, which +:mod:`microcosm.build.us_runtime.target_aging` recognises as a declared +alignment. The reference date is the latest quarter that every bound table +publishes (FY2026 Q2, 31 March 2026, at chronicle#347): the location workbook +publishes only that date, and holding the other tables to it keeps every family +a statement about one portfolio on one day. Later quarters of the age, +debt-size and loan-type tables stay in the receipt. + +One control total. FSA's borrower tables do not agree exactly with one another +or with its recipient tables, and the location table holds rows the host +cannot carry: + +- "Not Reported" (FFEL and Perkins loans whose commercial lenders need not + report an address) is allocated to every reported location in proportion to + its reported balance, or its reported borrowers for the count. +- Puerto Rico and "Other" (an address outside the states and territories the + table lists) are outside the host's universe, which is the 50 states and DC + that the CPS samples. They leave, with their share of "Not Reported". + +The 51 allocated state levels sum to the in-scope control. The age and +debt-size bands, and the two loan-type rows, bind as their table's shares of +that control (``control x row / partition``, the microcosm#940 pattern), so all +four families describe one in-scope total. A table's own "not reported" age row +is in no partition, which allocates it across the reported bands the same way. +""" + +from __future__ import annotations + +import math +from collections.abc import Iterable, Mapping +from dataclasses import dataclass, field, replace +from typing import Any + +import numpy as np +import pandas as pd + +from microcosm.build.ledger_targets import LedgerTargetReference +from microcosm.calibrate import ( + CalibrationHierarchySeed, + HierarchyCategory, + HierarchyNode, + TargetRegistry, + TargetSpec, + calibration_provider_label, + calibration_variable_label, +) +from microcosm.calibrate.geography_constants import US_STATE_FIPS_TO_POSTAL + +__all__ = [ + "FSA_BALANCE_COLUMNS", + "FSA_BALANCE_LOWER_BOUND_KEY", + "FSA_BALANCE_UPPER_BOUND_KEY", + "FSA_BOUND_TABLES", + "FSA_CATEGORY_BY_MEASURE", + "FSA_DIAGNOSTIC_TABLES", + "FSA_MATERIALIZER", + "FSA_MEASURE_KEY", + "FSA_MEASURES", + "FSA_PERIOD_ALIGNMENT", + "FSA_SOURCE_NAME", + "FSA_TARGET_FAMILY", + "FsaTargetPlan", + "apply_fsa_student_loan_plan", + "fsa_student_loan_household_values", + "fsa_student_loan_target_receipt", + "plan_fsa_student_loan_targets", +] + +FSA_SOURCE_NAME = "ed_fsa" +FSA_TARGET_FAMILY = "ed_fsa" +#: The release materializer that reads the stage's stored person columns. +FSA_MATERIALIZER = "fsa_stored_student_loan_balances" +#: Declared in :mod:`microcosm.build.us_runtime.target_aging`: the value is a +#: stock at its source reference date, consumed unaged at the build period. +FSA_PERIOD_ALIGNMENT = "stock_at_source_reference_date" +FSA_OWN_BALANCE_COLUMN = "federal_student_loan_balance" +FSA_PARENT_PLUS_BALANCE_COLUMN = "federal_parent_plus_loan_balance" +FSA_BALANCE_COLUMNS: tuple[str, str] = ( + FSA_OWN_BALANCE_COLUMN, + FSA_PARENT_PLUS_BALANCE_COLUMN, +) + +#: Spec metadata naming what the materializer sums. +FSA_MEASURE_KEY = "fsa_measure" +FSA_TOTAL_BALANCE = "total_balance" +FSA_BORROWERS = "borrowers" +FSA_PARENT_PLUS_BALANCE = "parent_plus_balance" +FSA_BALANCE_EXCLUDING_PARENT_PLUS = "balance_excluding_parent_plus" +#: measure -> (person columns summed, positive-indicator count). +FSA_MEASURES: Mapping[str, tuple[tuple[str, ...], bool]] = { + FSA_TOTAL_BALANCE: (FSA_BALANCE_COLUMNS, False), + FSA_BORROWERS: (FSA_BALANCE_COLUMNS, True), + FSA_PARENT_PLUS_BALANCE: ((FSA_PARENT_PLUS_BALANCE_COLUMN,), False), + FSA_BALANCE_EXCLUDING_PARENT_PLUS: ((FSA_OWN_BALANCE_COLUMN,), False), +} +#: Hierarchy category (under provider ``ed_fsa``) of each measure. +FSA_CATEGORY_BY_MEASURE: Mapping[str, str] = { + FSA_TOTAL_BALANCE: "federal_student_loan_balance", + FSA_BORROWERS: "federal_student_loan_borrowers", + FSA_PARENT_PLUS_BALANCE: "parent_plus_loan_balance", + FSA_BALANCE_EXCLUDING_PARENT_PLUS: "loan_balance_excluding_parent_plus", +} +#: Compiled edges of a debt-size band, on the person's federal balance. +FSA_BALANCE_LOWER_BOUND_KEY = "fsa_balance_lower_bound" +FSA_BALANCE_UPPER_BOUND_KEY = "fsa_balance_upper_bound" +#: Compiled edges of an age band; the names the release's restated-age guard +#: reads (``RESTATED_AGE_BAND_COMPILED_KEYS``), with the same attestation. +_AGE_LOWER_BOUND_KEY = "age_lower_bound" +_AGE_UPPER_BOUND_KEY = "age_upper_bound" +_AGE_BOUND_STAMP_SOURCE_KEY = "age_bound_stamp_source" +_AGE_BOUND_STAMP_FROM_CONSTRAINT_ROWS = "constraint_rows" + +_LOCATION = "portfolio_by_location" +_AGE = "portfolio_by_age" +_DEBT_SIZE = "portfolio_by_debt_size" +_LOAN_TYPE = "portfolio_by_loan_type" +FSA_BOUND_TABLES: tuple[str, ...] = (_LOCATION, _AGE, _DEBT_SIZE, _LOAN_TYPE) +_DOLLARS = "dollars_outstanding" +_BORROWER_COUNT = "borrowers" +_MEASURE_BY_SOURCE_MEASURE = { + _DOLLARS: FSA_TOTAL_BALANCE, + _BORROWER_COUNT: FSA_BORROWERS, +} +_PARENT_PLUS_LOAN_TYPE = "parent_plus" +_NOT_REPORTED_LOCATION = "not_reported" +_OTHER_LOCATION = "other" +_PUERTO_RICO_FIPS = "72" +_AGE_VARIABLE = "age" +_BALANCE_VARIABLE = "federal_student_loan_balance" + +#: Every other FSA record-set table, with why it stays diagnostic only. +FSA_DIAGNOSTIC_TABLES: Mapping[str, str] = { + "portfolio_summary": ( + "Recipient-based totals by loan program (Direct Loan, FFEL, Perkins). " + "The stage's balances do not record the program, and FSA counts the " + "student, not the parent, as the recipient of a Parent PLUS loan; the " + "borrower-based location table sets the level instead." + ), + "dl_by_repayment_plan": ( + "Repayment plan: diagnostic only. The SCF records only an " + "income-driven yes/no, the build carries no plan column, and FSA's " + "recipient counts are loan-level (microcosm#1074)." + ), + "dl_idr_by_partial_financial_hardship": ( + "Income-driven plans by partial financial hardship: no plan or " + "hardship column in the build; diagnostic only." + ), + "ed_held_ffel_by_repayment_plan": ( + "ED-held FFEL by repayment plan: no plan column in the build; diagnostic only." + ), + "ed_held_ffel_idr_by_partial_financial_hardship": ( + "ED-held FFEL IBR by partial financial hardship: no plan or hardship " + "column in the build; diagnostic only." + ), + "federally_managed_by_repayment_plan": ( + "Federally managed portfolio by repayment plan: no plan column in the " + "build; diagnostic only." + ), + "federally_managed_idr_by_partial_financial_hardship": ( + "Federally managed IBR/PAYE by partial financial hardship: no plan or " + "hardship column in the build; diagnostic only." + ), +} + +_REASON_OTHER_QUARTER = ( + "Not the reference quarter: every bound table binds at the latest quarter " + "all four publish ({reference})." +) +_REASON_PUERTO_RICO = ( + "Puerto Rico is outside the host universe (the CPS samples the 50 states " + "and DC). Its rows, with their pro-rata share of Not Reported, leave the " + "in-scope control." +) +_REASON_OTHER_LOCATION = ( + "'Other' is a borrower address outside the states and territories the " + "table lists, outside the host universe; it leaves the in-scope control " + "with its pro-rata share of Not Reported." +) +_REASON_NOT_REPORTED_LOCATION = ( + "'Not Reported' (FFEL and Perkins loans whose commercial lenders need not " + "report an address) has no state; it is allocated to every reported " + "location in proportion to that location's reported value." +) +_REASON_NOT_REPORTED_AGE = ( + "Age not reported: in no partition, so the reported bands, which bind as " + "shares of the in-scope control, absorb it pro rata." +) +_REASON_LOAN_TYPE_RECIPIENTS = ( + "Loan-type recipient counts are loan-level (a borrower with two loan types " + "counts twice), so they are not counts of people." +) +_REASON_LOAN_TYPE_MEMBER = ( + "A member of the balance-excluding-Parent-PLUS target: the build records " + "own and Parent PLUS balances, not loan types." +) +_REASON_STAFFORD_SUBTOTAL = ( + "Stafford (Combined) is a subtotal of rows the loan-type targets already count." +) +_REASON_UNREVIEWED_TABLE = ( + "An FSA table with no reviewed binding: inert until one is added." +) + + +@dataclass(frozen=True) +class FsaTargetPlan: + """The FSA references a feed yields, their reconciled values and receipt. + + ``references`` compile through + :func:`microcosm.build.ledger_targets.compile_ledger_target_references`; + :func:`apply_fsa_student_loan_plan` then sets each compiled spec's value to + ``values[name]`` and stamps ``metadata[name]``. ``dispositions`` names + every FSA fact in the feed once, with what the plan did with it. + """ + + reference_period: str | None + reference_label: str | None + references: tuple[LedgerTargetReference, ...] = () + values: Mapping[str, float] = field(default_factory=dict) + metadata: Mapping[str, Mapping[str, str]] = field(default_factory=dict) + labels: Mapping[str, str] = field(default_factory=dict) + dispositions: tuple[Mapping[str, str], ...] = () + controls: Mapping[str, Mapping[str, float]] = field(default_factory=dict) + status: str = "no_fsa_facts" + + +def plan_fsa_student_loan_targets( + facts: Iterable[object], + *, + target_period: int | str, +) -> FsaTargetPlan: + """Plan the FSA target references and their reconciled values. + + Raises when the feed carries some bound tables but not all of them, when + they share no quarter, or when a reference-quarter table is malformed (a + band partition that is not contiguous, a duplicate row, a state twice), so + a partial or changed FSA table cannot bind silently. + """ + + fsa_facts = tuple(fact for fact in facts if _source_name(fact) == FSA_SOURCE_NAME) + if not fsa_facts: + return FsaTargetPlan(reference_period=None, reference_label=None) + by_table: dict[str, list[object]] = {} + for fact in fsa_facts: + by_table.setdefault(_table(fact), []).append(fact) + missing = [table for table in FSA_BOUND_TABLES if table not in by_table] + if missing: + raise ValueError( + "FSA student loan targets need every bound table; the feed carries " + f"ed_fsa facts but not {missing!r} (microcosm#1074)." + ) + periods = [ + { + _period(fact) + for fact in by_table[table] + if _measure_id(fact) in _MEASURE_BY_SOURCE_MEASURE + } + for table in FSA_BOUND_TABLES + ] + common = set.intersection(*periods) + if not common: + raise ValueError( + "FSA bound tables share no quarter: " + + "; ".join( + f"{table}={sorted(table_periods)}" + for table, table_periods in zip(FSA_BOUND_TABLES, periods, strict=True) + ) + ) + reference = max(common, key=_month_key) + at_reference = { + table: [fact for fact in by_table[table] if _period(fact) == reference] + for table in FSA_BOUND_TABLES + } + reference_label = _location_reference_label(at_reference[_LOCATION]) + dispositions: dict[int, dict[str, str]] = {} + + def dispose(fact: object, disposition: str, reason: str, **extra: str) -> None: + dispositions[id(fact)] = { + "source_record_id": _source_record_id(fact), + "table": _table(fact), + "period": _period(fact), + "measure": _measure_id(fact), + "disposition": disposition, + "reason": reason, + **extra, + } + + for table, table_facts in by_table.items(): + if table not in FSA_BOUND_TABLES: + reason = FSA_DIAGNOSTIC_TABLES.get(table, _REASON_UNREVIEWED_TABLE) + kind = "diagnostic" if table in FSA_DIAGNOSTIC_TABLES else "unreviewed" + for fact in table_facts: + dispose(fact, kind, reason) + continue + for fact in table_facts: + if _period(fact) != reference: + dispose( + fact, + "other_quarter", + _REASON_OTHER_QUARTER.format(reference=reference), + ) + + builder = _PlanBuilder( + target_period=target_period, + reference_period=reference, + reference_label=reference_label, + ) + controls = _plan_locations(at_reference[_LOCATION], builder, dispose) + for table in (_AGE, _DEBT_SIZE): + _plan_bands(table, at_reference[table], controls, builder, dispose) + _plan_loan_types(at_reference[_LOAN_TYPE], controls, builder, dispose) + for fact in fsa_facts: + if id(fact) not in dispositions: + raise AssertionError( + f"FSA fact {_source_record_id(fact)!r} has no disposition." + ) + return FsaTargetPlan( + reference_period=reference, + reference_label=reference_label, + references=tuple(builder.references), + values=dict(builder.values), + metadata={name: dict(meta) for name, meta in builder.metadata.items()}, + labels=dict(builder.labels), + dispositions=tuple(dispositions[id(fact)] for fact in fsa_facts), + controls={ + measure: dict(control) for measure, control in sorted(controls.items()) + }, + status="bound", + ) + + +def apply_fsa_student_loan_plan( + registry: TargetRegistry, + plan: FsaTargetPlan, + *, + target_period: int | str, +) -> TargetRegistry: + """Set each compiled FSA spec to its reconciled value at the build period. + + The compile resolved each reference at its fact's own period (exact); the + spec then moves to the build period, keeps the published value in + metadata, and takes the Microcosm target label, because its value is no + longer the published cell. + """ + + if not plan.values: + return registry + specs: list[TargetSpec] = [] + seen: set[str] = set() + for spec in registry.specs: + if spec.name not in plan.values: + specs.append(spec) + continue + seen.add(spec.name) + hierarchy = spec.hierarchy + if hierarchy is not None: + hierarchy = replace( + hierarchy, + target=HierarchyNode(id=spec.name, label=plan.labels[spec.name]), + ) + # The Chronicle cell's own label describes the published value at its + # own period, which this spec no longer carries. + metadata = { + key: value + for key, value in spec.metadata.items() + if key != "diagnostic_target_label" + } + specs.append( + replace( + spec, + value=float(plan.values[spec.name]), + period=target_period, + metadata={ + **metadata, + **dict(plan.metadata[spec.name]), + "fsa_published_value": _format_float(spec.value), + "target_period": str(target_period), + }, + hierarchy=hierarchy, + ) + ) + missing = sorted(set(plan.values) - seen) + if missing: + raise ValueError( + f"FSA plan references did not compile: {missing[:5]!r} " + f"({len(missing)} in all)." + ) + return TargetRegistry(specs, country=registry.country) + + +def fsa_student_loan_target_receipt( + facts: Iterable[object], + *, + target_period: int | str, + plan: FsaTargetPlan | None = None, +) -> dict[str, Any]: + """Every FSA fact's disposition, the controls and each target's value.""" + + plan = plan or plan_fsa_student_loan_targets(facts, target_period=target_period) + counts: dict[str, int] = {} + for disposition in plan.dispositions: + counts[disposition["disposition"]] = ( + counts.get(disposition["disposition"], 0) + 1 + ) + return { + "schema_version": 1, + "issue": "PolicyEngine/microcosm#1074", + "status": plan.status, + "target_period": str(target_period), + "reference_period": plan.reference_period, + "reference_label": plan.reference_label, + "period_alignment": FSA_PERIOD_ALIGNMENT, + "controls": { + measure: dict(control) for measure, control in plan.controls.items() + }, + "targets": [ + { + "name": name, + "label": plan.labels[name], + "value": plan.values[name], + **dict(plan.metadata[name]), + } + for name in sorted(plan.values) + ], + "disposition_counts": dict(sorted(counts.items())), + "dispositions": [dict(item) for item in plan.dispositions], + } + + +def fsa_student_loan_household_values( + frame: Any, + metadata: Mapping[str, str], +) -> np.ndarray | None: + """One FSA target's household column, from the stage's stored balances. + + Sums ``FSA_MEASURES[metadata["fsa_measure"]]`` over each household's + people (a positive-balance indicator for borrower counts), within the + person's age band and balance band when the spec compiles them, and + zeroes households outside the spec's state. Returns ``None`` when the + frame does not carry both balance columns, so the target is not + materialized and the release reports it dropped. + """ + + person = frame.table("person") + if any(column not in person.columns for column in FSA_BALANCE_COLUMNS): + return None + measure = metadata.get(FSA_MEASURE_KEY, "") + if measure not in FSA_MEASURES: + raise ValueError(f"Unknown FSA measure {measure!r}.") + columns, indicator = FSA_MEASURES[measure] + balances = { + column: pd.to_numeric(person[column], errors="coerce") + .fillna(0.0) + .to_numpy(dtype=np.float64) + for column in FSA_BALANCE_COLUMNS + } + total = balances[FSA_OWN_BALANCE_COLUMN] + balances[FSA_PARENT_PLUS_BALANCE_COLUMN] + values = np.zeros(len(person), dtype=np.float64) + for column in columns: + values = values + balances[column] + if indicator: + values = (values > 0.0).astype(np.float64) + mask = np.ones(len(person), dtype=bool) + if _AGE_LOWER_BOUND_KEY in metadata or _AGE_UPPER_BOUND_KEY in metadata: + age = ( + pd.to_numeric(person[_AGE_VARIABLE], errors="coerce") + .fillna(-1.0) + .to_numpy(dtype=np.float64) + ) + mask &= _band_mask(age, metadata, _AGE_LOWER_BOUND_KEY, _AGE_UPPER_BOUND_KEY) + if ( + FSA_BALANCE_LOWER_BOUND_KEY in metadata + or FSA_BALANCE_UPPER_BOUND_KEY in metadata + ): + mask &= _band_mask( + total, + metadata, + FSA_BALANCE_LOWER_BOUND_KEY, + FSA_BALANCE_UPPER_BOUND_KEY, + ) + household = frame.table("household") + household_ids = household["household_id"].to_numpy() + positions = ( + pd.Series(np.arange(len(household_ids), dtype=np.int64), index=household_ids) + .reindex(person["person_household_id"].to_numpy()) + .to_numpy() + ) + if np.isnan(positions.astype(np.float64)).any(): + raise ValueError("A person's household is missing from the household table.") + out = np.zeros(len(household_ids), dtype=np.float64) + np.add.at(out, positions.astype(np.int64), values * mask) + state_fips = metadata.get("state_fips") + if state_fips: + out = np.where( + household["state_fips"].to_numpy().astype(np.int64) == int(state_fips), + out, + 0.0, + ) + return out + + +class _PlanBuilder: + def __init__( + self, + *, + target_period: int | str, + reference_period: str, + reference_label: str | None, + ) -> None: + self.target_period = target_period + self.reference_period = reference_period + self.reference_label = reference_label + self.references: list[LedgerTargetReference] = [] + self.values: dict[str, float] = {} + self.metadata: dict[str, dict[str, str]] = {} + self.labels: dict[str, str] = {} + + def add( + self, + *, + name: str, + measure: str, + target_role: str, + source_measure_id: str, + value: float, + label: str, + compiled: Mapping[str, str], + reconciliation: Mapping[str, str], + facts: tuple[object, ...], + ) -> None: + if name in self.values: + raise ValueError(f"FSA target {name!r} planned twice.") + if not math.isfinite(value) or value < 0: + raise ValueError(f"FSA target {name!r} reconciled to {value!r}.") + category = FSA_CATEGORY_BY_MEASURE[measure] + _, indicator = FSA_MEASURES[measure] + metadata = { + "materializer": FSA_MATERIALIZER, + FSA_MEASURE_KEY: measure, + "measure_mode": "indicator_sum" if indicator else "sum", + "fsa_columns": ",".join(FSA_MEASURES[measure][0]), + "target_role": target_role, + "source_measure_id": source_measure_id, + "source_period": self.reference_period, + "target_period": str(self.target_period), + "period_alignment": FSA_PERIOD_ALIGNMENT, + "fsa_reference_period": self.reference_period, + **compiled, + } + if self.reference_label: + metadata["fsa_reference_label"] = self.reference_label + hierarchy = _hierarchy_seed(category, target_label=label) + if len(facts) == 1: + reference = LedgerTargetReference( + name=name, + ledger_source_record_id=_source_record_id(facts[0]), + entity="household", + measure=name, + period=self.reference_period, + period_match_policy="exact", + family=FSA_TARGET_FAMILY, + metadata=metadata, + hierarchy=hierarchy, + ) + else: + reference = LedgerTargetReference( + name=name, + ledger_selector={"source_name": FSA_SOURCE_NAME}, + value_operation="linear_combination", + value_operands=tuple( + {"source_record_id": _source_record_id(fact), "weight": 1.0} + for fact in facts + ), + expected_member_count=len(facts), + entity="household", + measure=name, + period=self.reference_period, + period_match_policy="exact", + family=FSA_TARGET_FAMILY, + metadata=metadata, + hierarchy=hierarchy, + ) + self.references.append(reference) + self.values[name] = float(value) + self.metadata[name] = dict(reconciliation) + self.labels[name] = label + + +def _plan_locations( + facts: list[object], + builder: _PlanBuilder, + dispose: Any, +) -> dict[str, dict[str, float]]: + """State targets with Not Reported allocated; returns the in-scope controls.""" + + controls: dict[str, dict[str, float]] = {} + for source_measure, measure in _MEASURE_BY_SOURCE_MEASURE.items(): + rows = [fact for fact in facts if _measure_id(fact) == source_measure] + states: dict[str, object] = {} + out_of_scope: list[tuple[object, str]] = [] + not_reported: list[object] = [] + for fact in rows: + value_id = _str_at(fact, "layout", "groupby_value_id") + fips = _state_fips(fact) + if value_id == _NOT_REPORTED_LOCATION: + not_reported.append(fact) + elif fips is not None and fips != _PUERTO_RICO_FIPS: + if fips in states: + raise ValueError(f"FSA location table repeats state {fips}.") + states[fips] = fact + elif fips == _PUERTO_RICO_FIPS or _geography_id(fact).endswith("US72"): + out_of_scope.append((fact, _REASON_PUERTO_RICO)) + elif value_id == _OTHER_LOCATION: + out_of_scope.append((fact, _REASON_OTHER_LOCATION)) + else: + raise ValueError( + f"FSA location row {_source_record_id(fact)!r} is neither a " + "state nor a reviewed statistical-scope row." + ) + if sorted(states) != sorted(US_STATE_FIPS_TO_POSTAL): + missing = sorted(set(US_STATE_FIPS_TO_POSTAL) - set(states)) + raise ValueError( + f"FSA location table ({source_measure}) is missing states {missing}." + ) + if len(not_reported) > 1: + raise ValueError("FSA location table has more than one Not Reported row.") + state_sum = math.fsum(_value(fact) for fact in states.values()) + out_of_scope_sum = math.fsum(_value(fact) for fact, _ in out_of_scope) + not_reported_value = math.fsum(_value(fact) for fact in not_reported) + reported = state_sum + out_of_scope_sum + if reported <= 0: + raise ValueError("FSA location table reports no positive balance.") + published_total = reported + not_reported_value + allocation = published_total / reported + in_scope = state_sum * allocation + controls[measure] = { + "published_states_and_dc": state_sum, + "published_out_of_scope": out_of_scope_sum, + "published_not_reported": not_reported_value, + "published_total": published_total, + "not_reported_allocation_factor": allocation, + "in_scope_control": in_scope, + "in_scope_share_of_total": in_scope / published_total, + } + for fact in not_reported: + dispose(fact, "allocated", _REASON_NOT_REPORTED_LOCATION) + for fact, reason in out_of_scope: + dispose(fact, "out_of_scope", reason) + for fips, fact in sorted(states.items()): + name = _source_record_id(fact) + state = _str_at(fact, "geography", "name") or US_STATE_FIPS_TO_POSTAL[fips] + builder.add( + name=name, + measure=measure, + target_role=f"fsa_state_{_role_suffix(measure)}", + source_measure_id=source_measure, + value=_value(fact) * allocation, + label=f"{_measure_label(measure)}, {state}", + compiled={"state_fips": fips}, + reconciliation={ + "fsa_reconciliation": "not_reported_allocated_pro_rata", + "fsa_reconciliation_factor": _format_float(allocation), + "fsa_control_value": _format_float(in_scope), + }, + facts=(fact,), + ) + dispose( + fact, + "bound", + "State level, Not Reported allocated pro rata.", + target=name, + ) + if set(controls) != set(_MEASURE_BY_SOURCE_MEASURE.values()): + raise ValueError("FSA location table lacks a balance or a borrower count.") + return controls + + +def _band_lower_bound(band: tuple[float, float, object]) -> float: + """A (lower, upper, fact) band's lower edge, its sort key.""" + + lower, _, _ = band + return lower + + +def _plan_bands( + table: str, + facts: list[object], + controls: Mapping[str, Mapping[str, float]], + builder: _PlanBuilder, + dispose: Any, +) -> None: + variable = _AGE_VARIABLE if table == _AGE else _BALANCE_VARIABLE + for source_measure, measure in _MEASURE_BY_SOURCE_MEASURE.items(): + rows = [fact for fact in facts if _measure_id(fact) == source_measure] + bands: list[tuple[float, float, object]] = [] + for fact in rows: + bounds = _constraint_bounds(fact, variable) + if bounds is None: + if table == _AGE and _has_constraint(fact, "age_reporting_status"): + dispose(fact, "allocated", _REASON_NOT_REPORTED_AGE) + continue + raise ValueError( + f"FSA {table} row {_source_record_id(fact)!r} carries no " + f"{variable} band." + ) + bands.append((*bounds, fact)) + bands.sort(key=_band_lower_bound) + if not bands: + raise ValueError(f"FSA {table} has no {source_measure} bands.") + if bands[0][0] != -math.inf or bands[-1][1] != math.inf: + raise ValueError(f"FSA {table} bands do not cover every {variable}.") + for (_, upper, _), (lower, _, _) in zip(bands, bands[1:], strict=False): + if upper != lower: + raise ValueError( + f"FSA {table} {source_measure} bands are not contiguous at " + f"{upper!r} / {lower!r}." + ) + partition = math.fsum(_value(fact) for _, _, fact in bands) + if partition <= 0: + raise ValueError(f"FSA {table} {source_measure} partition is empty.") + control = controls[measure]["in_scope_control"] + for lower, upper, fact in bands: + name = _source_record_id(fact) + share = _value(fact) / partition + compiled = ( + _age_band_metadata(lower, upper) + if table == _AGE + else _balance_band_metadata(lower, upper) + ) + builder.add( + name=name, + measure=measure, + target_role=( + f"fsa_{'age' if table == _AGE else 'debt_size'}_band_" + f"{_role_suffix(measure)}" + ), + source_measure_id=source_measure, + value=control * share, + label=( + f"{_measure_label(measure)}, " + f"{_str_at(fact, 'layout', 'groupby_dimension_label').lower()} " + f"{_str_at(fact, 'layout', 'groupby_value_label')}" + ), + compiled=compiled, + reconciliation={ + "fsa_reconciliation": "share_of_in_scope_location_control", + "fsa_share": _format_float(share), + "fsa_partition_value": _format_float(partition), + "fsa_control_value": _format_float(control), + }, + facts=(fact,), + ) + dispose(fact, "bound", "Band share of the in-scope control.", target=name) + + +def _plan_loan_types( + facts: list[object], + controls: Mapping[str, Mapping[str, float]], + builder: _PlanBuilder, + dispose: Any, +) -> None: + rows = [] + for fact in facts: + measure = _measure_id(fact) + kind = _str_at(fact, "layout", "table_record_kind") + if measure == _DOLLARS and kind in {"detail", ""}: + rows.append(fact) + elif kind == "subtotal" or measure.startswith("stafford_combined"): + dispose(fact, "excluded", _REASON_STAFFORD_SUBTOTAL) + elif "recipients" in measure: + dispose(fact, "excluded", _REASON_LOAN_TYPE_RECIPIENTS) + else: + raise ValueError( + f"FSA loan-type row {_source_record_id(fact)!r} has no reviewed " + "disposition." + ) + parent_plus = [ + fact + for fact in rows + if _str_at(fact, "layout", "groupby_value_id") == _PARENT_PLUS_LOAN_TYPE + ] + if len(parent_plus) != 1: + raise ValueError("FSA loan-type table needs exactly one Parent PLUS row.") + others = tuple( + sorted( + (fact for fact in rows if fact is not parent_plus[0]), + key=_source_record_id, + ) + ) + if not others: + raise ValueError("FSA loan-type table has no loan type besides Parent PLUS.") + keys = [_str_at(fact, "layout", "groupby_value_id") for fact in rows] + if len(keys) != len(set(keys)): + raise ValueError("FSA loan-type table repeats a loan type.") + partition = math.fsum(_value(fact) for fact in rows) + control = controls[FSA_TOTAL_BALANCE]["in_scope_control"] + record_set = _str_at(parent_plus[0], "layout", "record_set_id") + for measure, members, name in ( + ( + FSA_PARENT_PLUS_BALANCE, + (parent_plus[0],), + _source_record_id(parent_plus[0]), + ), + ( + FSA_BALANCE_EXCLUDING_PARENT_PLUS, + others, + f"{record_set}.excluding_parent_plus.{_DOLLARS}", + ), + ): + published = math.fsum(_value(fact) for fact in members) + share = published / partition + builder.add( + name=name, + measure=measure, + target_role=f"fsa_{measure}", + source_measure_id=_DOLLARS, + value=control * share, + label=_measure_label(measure), + compiled={}, + reconciliation={ + "fsa_reconciliation": "share_of_in_scope_location_control", + "fsa_share": _format_float(share), + "fsa_partition_value": _format_float(partition), + "fsa_control_value": _format_float(control), + }, + facts=members, + ) + for fact in members: + if measure == FSA_PARENT_PLUS_BALANCE: + dispose( + fact, + "bound", + "Parent PLUS share of the in-scope control.", + target=name, + ) + else: + dispose(fact, "bound", _REASON_LOAN_TYPE_MEMBER, target=name) + + +def _hierarchy_seed(category_id: str, *, target_label: str) -> CalibrationHierarchySeed: + provider_label = calibration_provider_label("us", FSA_SOURCE_NAME) + category_label = calibration_variable_label("us", FSA_SOURCE_NAME, category_id) + if provider_label is None or not category_label: + raise ValueError( + f"FSA calibration category {category_id!r} has no declared label." + ) + return CalibrationHierarchySeed( + provider=HierarchyNode(FSA_SOURCE_NAME, provider_label), + category=HierarchyCategory( + f"{FSA_SOURCE_NAME}.{category_id}", category_label, FSA_SOURCE_NAME + ), + target_label=target_label, + ) + + +def _measure_label(measure: str) -> str: + return calibration_variable_label( + "us", FSA_SOURCE_NAME, FSA_CATEGORY_BY_MEASURE[measure] + ) + + +def _role_suffix(measure: str) -> str: + return "borrowers" if measure == FSA_BORROWERS else "balance" + + +def _age_band_metadata(lower: float, upper: float) -> dict[str, str]: + metadata = {_AGE_BOUND_STAMP_SOURCE_KEY: _AGE_BOUND_STAMP_FROM_CONSTRAINT_ROWS} + if lower != -math.inf: + metadata[_AGE_LOWER_BOUND_KEY] = _format_bound(lower) + if upper != math.inf: + metadata[_AGE_UPPER_BOUND_KEY] = _format_bound(upper) + return metadata + + +def _balance_band_metadata(lower: float, upper: float) -> dict[str, str]: + metadata: dict[str, str] = {} + if lower != -math.inf: + metadata[FSA_BALANCE_LOWER_BOUND_KEY] = _format_bound(lower) + if upper != math.inf: + metadata[FSA_BALANCE_UPPER_BOUND_KEY] = _format_bound(upper) + return metadata + + +def _band_mask( + values: np.ndarray, + metadata: Mapping[str, str], + lower_key: str, + upper_key: str, +) -> np.ndarray: + lower = float(metadata[lower_key]) if lower_key in metadata else -math.inf + upper = float(metadata[upper_key]) if upper_key in metadata else math.inf + return (values >= lower) & (values < upper) + + +def _constraint_bounds(fact: object, variable: str) -> tuple[float, float] | None: + """``[lower, upper)`` from a fact's ``>=`` / ``<`` constraints on variable.""" + + lower, upper = -math.inf, math.inf + found = False + for row in _constraint_rows(fact): + if _str_at(row, "variable") != variable: + continue + operator = _str_at(row, "operator") + value = _at(row, "value") + if isinstance(value, bool) or not isinstance(value, int | float): + raise ValueError( + f"FSA fact {_source_record_id(fact)!r} has a non-numeric " + f"{variable} bound {value!r}." + ) + if operator == ">=": + lower = float(value) + elif operator == "<": + upper = float(value) + else: + raise ValueError( + f"FSA fact {_source_record_id(fact)!r} bounds {variable} with " + f"{operator!r}; only >= and < are reviewed." + ) + found = True + return (lower, upper) if found else None + + +def _has_constraint(fact: object, variable: str) -> bool: + return any(_str_at(row, "variable") == variable for row in _constraint_rows(fact)) + + +def _location_reference_label(facts: list[object]) -> str | None: + labels = { + _str_at(fact, "period_coverage", "source_period_label") for fact in facts + } - {""} + return next(iter(labels)) if len(labels) == 1 else None + + +def _table(fact: object) -> str: + parts = _str_at(fact, "layout", "record_set_id").split(".") + return parts[1] if len(parts) > 1 else "" + + +def _month_key(period: str) -> tuple[int, int]: + year, _, month = period.partition("-") + try: + return (int(year), int(month or 0)) + except ValueError: + return (0, 0) + + +def _state_fips(fact: object) -> str | None: + geography = _geography_id(fact) + if _str_at(fact, "geography", "level") != "state": + return None + if not geography.startswith("0400000US"): + return None + return geography.removeprefix("0400000US") + + +def _value(fact: object) -> float: + value = _at(fact, "value") + if isinstance(value, bool) or not isinstance(value, int | float): + raise ValueError( + f"FSA fact {_source_record_id(fact)!r} has a non-numeric value {value!r}." + ) + value = float(value) + if not math.isfinite(value) or value < 0: + raise ValueError(f"FSA fact {_source_record_id(fact)!r} value {value!r}.") + return value + + +def _format_float(value: float) -> str: + return repr(float(value)) + + +def _format_bound(value: float) -> str: + return str(int(value)) if float(value).is_integer() else repr(float(value)) + + +def _source_name(fact: object) -> str: + return _str_at(fact, "observed_measure", "source_name") or _str_at( + fact, "source", "source_name" + ) + + +def _measure_id(fact: object) -> str: + return _str_at(fact, "observed_measure", "source_measure_id") or _str_at( + fact, "layout", "measure_id" + ) + + +def _source_record_id(fact: object) -> str: + return _str_at(fact, "lineage", "source_record_id") + + +def _period(fact: object) -> str: + return _str_at(fact, "period", "value") + + +def _geography_id(fact: object) -> str: + return _str_at(fact, "geography", "id") + + +def _constraint_rows(fact: object) -> tuple[object, ...]: + constraints = _at(fact, "universe_constraints", "constraints") + return tuple(constraints) if isinstance(constraints, list | tuple) else () + + +def _at(obj: object, *path: str) -> Any: + current = obj + for key in path: + if current is None: + return None + if isinstance(current, Mapping): + current = current.get(key) + else: + current = getattr(current, key, None) + return current + + +def _str_at(obj: object, *path: str) -> str: + value = _at(obj, *path) + return "" if value is None else str(value) diff --git a/packages/microcosm-build/src/microcosm/build/us_runtime/target_aging.py b/packages/microcosm-build/src/microcosm/build/us_runtime/target_aging.py index a8296fa47..4625f82a3 100644 --- a/packages/microcosm-build/src/microcosm/build/us_runtime/target_aging.py +++ b/packages/microcosm-build/src/microcosm/build/us_runtime/target_aging.py @@ -46,6 +46,13 @@ 4. **Counts stay raw.** Return/claim counts (``measure_mode == "indicator_sum"``) and population counts are never aged here; a growing nominal aggregate does not imply a growing return count. +5. **Declared stocks stay raw.** A target whose metadata declares + ``period_alignment`` as one of :data:`DECLARED_UNAGED_PERIOD_ALIGNMENTS` + is a stock the build carries at its source reference date (Federal Student + Aid's loan portfolio, microcosm#1074): no income-growth series describes + it, so it is neither aged nor a period-contract violation, and the + declaration is recorded as its ``aging_factor_source``. Only targets that + declare it are affected, so the policy for every other target is unchanged. A target is only aged when both the build-year and the source-year projection facts of the chosen series are present in the feed. Otherwise it is left at @@ -62,6 +69,7 @@ __all__ = [ "AGING_MODEL_ID", "AGING_MODEL_VERSION", + "DECLARED_UNAGED_PERIOD_ALIGNMENTS", "PeriodContractError", "PeriodContractViolation", "age_us_dollar_targets", @@ -75,6 +83,13 @@ AGING_MODEL_ID = "cbo_growth_factor_aging" AGING_MODEL_VERSION = "1.2.0" +#: ``period_alignment`` declarations that keep a dollar target at its source +#: reference date by design (factor policy 5). Each names a stock whose level +#: the build carries as of that date; none is a silent cross-period read. +DECLARED_UNAGED_PERIOD_ALIGNMENTS: frozenset[str] = frozenset( + {"stock_at_source_reference_date"} +) + # CBO income-by-source ``groupby_value_id`` for the AGI projection series. This # is the priority-(b) default growth index for dollar amounts with no @@ -454,6 +469,9 @@ def _not_ageable_reason(spec: TargetSpec) -> str | None: metadata = spec.metadata if metadata.get("measure_mode") != "sum": return "not_dollar_amount" + alignment = metadata.get("period_alignment", "") + if alignment in DECLARED_UNAGED_PERIOD_ALIGNMENTS: + return alignment unit = metadata.get("ledger_measure_unit", "") if unit and unit != "usd": return "not_usd_unit" diff --git a/packages/microcosm-build/tests/engine_free/us/test_us_fiscal_refresh_builder.py b/packages/microcosm-build/tests/engine_free/us/test_us_fiscal_refresh_builder.py index bb7885d11..c56771717 100644 --- a/packages/microcosm-build/tests/engine_free/us/test_us_fiscal_refresh_builder.py +++ b/packages/microcosm-build/tests/engine_free/us/test_us_fiscal_refresh_builder.py @@ -4125,7 +4125,7 @@ def test_restated_concept_rules_all_have_a_comparison() -> None: Adding a concept to ``RESTATED_LEDGER_FILTER_CONCEPTS`` without a rule would raise at compile time on the first spec carrying it; this pins the - three rules that exist instead. + four rules that exist instead. """ builder = _load_builder_module() @@ -4134,7 +4134,12 @@ def test_restated_concept_rules_all_have_a_comparison() -> None: "agi_band", "eitc_child_count", "age_band", + "student_loan_balance_band", } + # The FSA debt-size band (microcosm#1074) reads the person's federal balance. + assert builder._restated_ledger_filter_concept( + "ledger_filter_federal_student_loan_balance_lower_bound" + ) == ("federal_student_loan_balance", "lower") assert builder._restated_ledger_filter_concept(_RESTATED_AGE_UPPER) == ( "age", "upper", diff --git a/packages/microcosm-build/tests/engine_free/us/test_us_fiscal_targets.py b/packages/microcosm-build/tests/engine_free/us/test_us_fiscal_targets.py index a83cee7a9..9a78a7cb3 100644 --- a/packages/microcosm-build/tests/engine_free/us/test_us_fiscal_targets.py +++ b/packages/microcosm-build/tests/engine_free/us/test_us_fiscal_targets.py @@ -1081,12 +1081,16 @@ def test_target_registry_is_identical_across_artifact_record_counts() -> None: spec.metadata.get("ledger_geography_level") == "congressional_district" for spec in registries["sparse"].specs ) + # No knob reads the artifact's record count. student_loan_targets says + # whether the build carries the SCF education-debt columns the FSA + # family binds (microcosm#1074), which is the same at every scale. assert set(inspect.signature(compile_us_fiscal_target_registry).parameters) == { "facts", "target_period", "congressional_district_vintage_crosswalk", "age_targets", "allow_unaged_dollar_targets", + "student_loan_targets", } diff --git a/packages/microcosm-build/tests/engine_free/us/test_us_fsa_student_loan_targets.py b/packages/microcosm-build/tests/engine_free/us/test_us_fsa_student_loan_targets.py new file mode 100644 index 000000000..4662add56 --- /dev/null +++ b/packages/microcosm-build/tests/engine_free/us/test_us_fsa_student_loan_targets.py @@ -0,0 +1,544 @@ +"""Federal Student Aid portfolio targets for federal student loan balances. + +The fixture ``us_fsa_portfolio_chronicle_347_facts.jsonl.gz`` holds, byte for +byte, 244 of the 461 rows ``chronicle build-bundle --year 2026`` writes for the +six ``packages/ed_fsa`` source packages of PolicyEngine/chronicle#347 (first +drafted at ``4448a7c``; the exports at the PR head ``81e3f98``, which reads +the raw files from R2, and at its merge commit ``acbedb5`` on Chronicle main +are byte-identical): every +portfolio-summary, location, age, debt-size and loan-type row, and the FY2026 +Q2 Direct Loan repayment-plan dollars. The tests pin the plan's reference quarter, its one in-scope control, +each family's reconciled values, every fact's disposition, the release +materializer and the release's restated-filter guard (microcosm#1074). +""" + +from __future__ import annotations + +import dataclasses +import gzip +import importlib.util +import json +import math +from collections import Counter + +import numpy as np +import pandas as pd +import pytest + +from microcosm.build.us_runtime import compile_us_fiscal_target_registry +from microcosm.build.us_runtime.fsa_student_loan_targets import ( + FSA_MATERIALIZER, + FSA_PERIOD_ALIGNMENT, + FSA_TARGET_FAMILY, + fsa_student_loan_household_values, + fsa_student_loan_target_receipt, + plan_fsa_student_loan_targets, +) +from microcosm.build.us_runtime.target_aging import find_period_contract_violations +from microcosm.calibrate import TargetRegistry +from microcosm.calibrate.geography_constants import US_STATE_FIPS_TO_POSTAL +from microcosm.frame import US_SCHEMA, Frame, WeightKind, Weights +from test_support.microcosm_build.us_fiscal_targets import packaged_reference_facts +from test_support.paths import paths_for + +_TEST_PATHS = paths_for("microcosm-build") +_FIXTURE = ( + _TEST_PATHS.tests / "fixtures" / "us_fsa_portfolio_chronicle_347_facts.jsonl.gz" +) +_BILLION = 1e9 +# Published FY2026 Q2 (31 March 2026) levels in the fixture, from the FSA +# workbooks: location rows in $ billions and thousands of borrowers. +_STATES_AND_DC_DOLLARS = 1_627.4 * _BILLION +_PUERTO_RICO_AND_OTHER_DOLLARS = (11.7 + 5.0) * _BILLION +_NOT_REPORTED_DOLLARS = 52.2 * _BILLION +_STATES_AND_DC_BORROWERS = 42_375_900.0 +_PUERTO_RICO_AND_OTHER_BORROWERS = 336_900.0 + 96_500.0 +_NOT_REPORTED_BORROWERS = 1_953_300.0 + + +def _facts() -> list[dict]: + with gzip.open(_FIXTURE, "rt", encoding="utf-8") as handle: + return [json.loads(line) for line in handle if line.strip()] + + +def _plan(facts: list[dict] | None = None): + return plan_fsa_student_loan_targets( + _facts() if facts is None else facts, target_period=2024 + ) + + +def _registry() -> TargetRegistry: + registry = compile_us_fiscal_target_registry( + [*packaged_reference_facts(), *_facts()], + target_period=2024, + allow_unaged_dollar_targets=True, + student_loan_targets=True, + ) + return TargetRegistry( + tuple(spec for spec in registry.specs if spec.family == FSA_TARGET_FAMILY), + country="us", + ) + + +def _by_role(registry: TargetRegistry) -> dict[str, list]: + roles: dict[str, list] = {} + for spec in registry.specs: + roles.setdefault(spec.metadata["target_role"], []).append(spec) + return roles + + +def _control(dollars: bool) -> float: + if dollars: + states, out, not_reported = ( + _STATES_AND_DC_DOLLARS, + _PUERTO_RICO_AND_OTHER_DOLLARS, + _NOT_REPORTED_DOLLARS, + ) + else: + states, out, not_reported = ( + _STATES_AND_DC_BORROWERS, + _PUERTO_RICO_AND_OTHER_BORROWERS, + _NOT_REPORTED_BORROWERS, + ) + return states * (states + out + not_reported) / (states + out) + + +def test_plan_binds_the_latest_quarter_every_table_publishes() -> None: + plan = _plan() + + assert plan.status == "bound" + assert plan.reference_period == "2026-03" + assert plan.reference_label == "Data as of Mar. 31, 2026" + # 51 states x 2 measures, 5 age and 9 debt-size bands x 2, 2 loan types. + assert len(plan.references) == 51 * 2 + 5 * 2 + 9 * 2 + 2 + for measure, dollars in (("total_balance", True), ("borrowers", False)): + control = plan.controls[measure] + assert control["in_scope_control"] == pytest.approx(_control(dollars)) + assert control["published_total"] == pytest.approx( + (_STATES_AND_DC_DOLLARS + _PUERTO_RICO_AND_OTHER_DOLLARS) + + _NOT_REPORTED_DOLLARS + if dollars + else _STATES_AND_DC_BORROWERS + + _PUERTO_RICO_AND_OTHER_BORROWERS + + _NOT_REPORTED_BORROWERS + ) + assert plan.controls["total_balance"]["in_scope_control"] == pytest.approx( + 1_679.07e9, rel=1e-5 + ) + assert plan.controls["borrowers"]["in_scope_control"] == pytest.approx( + 44_309_425, rel=1e-6 + ) + + +def test_registry_compiles_every_family_onto_one_in_scope_control() -> None: + registry = _registry() + roles = _by_role(registry) + balance = _control(dollars=True) + borrowers = _control(dollars=False) + + assert len(registry) == 132 + assert {role: len(specs) for role, specs in roles.items()} == { + "fsa_state_balance": 51, + "fsa_state_borrowers": 51, + "fsa_age_band_balance": 5, + "fsa_age_band_borrowers": 5, + "fsa_debt_size_band_balance": 9, + "fsa_debt_size_band_borrowers": 9, + "fsa_parent_plus_balance": 1, + "fsa_balance_excluding_parent_plus": 1, + } + for role, total in ( + ("fsa_state_balance", balance), + ("fsa_age_band_balance", balance), + ("fsa_debt_size_band_balance", balance), + ("fsa_state_borrowers", borrowers), + ("fsa_age_band_borrowers", borrowers), + ("fsa_debt_size_band_borrowers", borrowers), + ): + assert math.fsum(spec.value for spec in roles[role]) == pytest.approx(total) + loan_types = ( + roles["fsa_parent_plus_balance"] + roles["fsa_balance_excluding_parent_plus"] + ) + assert math.fsum(spec.value for spec in loan_types) == pytest.approx(balance) + # Parent PLUS is $117.9B of the $1,723.8B the six loan-type rows publish. + assert roles["fsa_parent_plus_balance"][0].value == pytest.approx( + balance * 117.9 / 1_723.8, rel=1e-6 + ) + + +def test_state_rows_allocate_not_reported_pro_rata() -> None: + registry = _registry() + states = { + spec.metadata["state_fips"] + for spec in registry.specs + if "state_fips" in spec.metadata + } + (california,) = ( + spec + for spec in registry.specs + if spec.metadata.get("state_fips") == "06" + and spec.metadata["fsa_measure"] == "total_balance" + ) + factor = ( + _STATES_AND_DC_DOLLARS + _PUERTO_RICO_AND_OTHER_DOLLARS + _NOT_REPORTED_DOLLARS + ) / (_STATES_AND_DC_DOLLARS + _PUERTO_RICO_AND_OTHER_DOLLARS) + + assert states == set(US_STATE_FIPS_TO_POSTAL) + assert "72" not in states + assert california.value == pytest.approx(156.7e9 * factor) + assert float(california.metadata["fsa_published_value"]) == 156.7e9 + assert california.metadata["fsa_reconciliation"] == ( + "not_reported_allocated_pro_rata" + ) + assert float(california.metadata["fsa_reconciliation_factor"]) == pytest.approx( + factor + ) + assert california.hierarchy.geography.label == "California" + assert california.hierarchy.target.label == ( + "Federal student loan balance, California" + ) + + +def test_bands_bind_as_shares_and_compile_their_edges() -> None: + roles = _by_role(_registry()) + age = { + spec.metadata["ledger_layout_groupby_value_id"]: spec + for spec in roles["fsa_age_band_borrowers"] + } + debt = { + spec.metadata["ledger_layout_groupby_value_id"]: spec + for spec in roles["fsa_debt_size_band_balance"] + } + + # Reported age bands publish 44.8M borrowers; "not reported" is 0.1M. + assert age["age_25_to_34"].value == pytest.approx( + _control(dollars=False) * 14.0 / 44.8, rel=1e-9 + ) + assert age["age_25_to_34"].metadata["age_lower_bound"] == "25" + assert age["age_25_to_34"].metadata["age_upper_bound"] == "35" + assert "age_lower_bound" not in age["age_24_and_younger"].metadata + assert age["age_62_and_older"].metadata["age_lower_bound"] == "62" + assert "age_upper_bound" not in age["age_62_and_older"].metadata + assert age["age_25_to_34"].metadata["age_bound_stamp_source"] == ("constraint_rows") + assert debt["debt_80k_to_100k"].metadata["fsa_balance_lower_bound"] == "80000" + assert debt["debt_80k_to_100k"].metadata["fsa_balance_upper_bound"] == "100000" + assert "fsa_balance_lower_bound" not in debt["debt_less_than_5k"].metadata + assert "fsa_balance_upper_bound" not in debt["debt_200k_plus"].metadata + assert debt["debt_200k_plus"].hierarchy.dimensions[0].value_label == "200K+" + + +def test_specs_sit_at_the_build_period_with_a_declared_alignment() -> None: + registry = _registry() + + assert {spec.period for spec in registry.specs} == {2024} + for spec in registry.specs: + metadata = spec.metadata + assert metadata["materializer"] == FSA_MATERIALIZER + assert metadata["source_period"] == "2026-03" + assert metadata["target_period"] == "2024" + assert metadata["period_alignment"] == FSA_PERIOD_ALIGNMENT + assert "period_contract_waiver" not in metadata + assert "diagnostic_target_label" not in metadata + assert spec.hierarchy.provider.id == "ed_fsa" + assert spec.hierarchy.provider.label == "ED · Federal Student Aid" + assert spec.hierarchy.target.id == spec.name + assert find_period_contract_violations(registry, target_period=2024) == () + + +def test_aged_compile_keeps_fsa_dollars_at_the_reference_date() -> None: + from microcosm.build.us_runtime.target_aging import age_us_dollar_targets + + registry = age_us_dollar_targets(_registry(), _facts(), target_period=2024) + + for spec in registry.specs: + if spec.metadata["measure_mode"] == "sum": + assert spec.metadata["aging_factor_source"] == FSA_PERIOD_ALIGNMENT + assert float(spec.metadata["aging_factor"]) == 1.0 + + +def test_compile_without_the_flag_ignores_fsa_facts() -> None: + registry = compile_us_fiscal_target_registry( + [*packaged_reference_facts(), *_facts()], + target_period=2024, + allow_unaged_dollar_targets=True, + ) + + assert not [spec for spec in registry.specs if spec.family == FSA_TARGET_FAMILY] + + +def test_every_fsa_fact_has_one_disposition() -> None: + facts = _facts() + receipt = fsa_student_loan_target_receipt(facts, target_period=2024) + by_id = {item["source_record_id"]: item for item in receipt["dispositions"]} + + assert len(receipt["dispositions"]) == len(facts) == 244 + assert len(by_id) == len(facts) + assert receipt["disposition_counts"] == { + "allocated": 4, + "bound": 136, + "diagnostic": 34, + "excluded": 8, + "other_quarter": 58, + "out_of_scope": 4, + } + location = "ed_fsa.portfolio_by_location.2026_03_31" + assert by_id[f"{location}.pr.dollars_outstanding"]["disposition"] == ( + "out_of_scope" + ) + assert by_id[f"{location}.other.borrowers"]["disposition"] == "out_of_scope" + assert by_id[f"{location}.not_reported.dollars_outstanding"]["disposition"] == ( + "allocated" + ) + loan_type = "ed_fsa.portfolio_by_loan_type.fy2026_q2" + assert by_id[f"{loan_type}.recipients.parent_plus.recipients"]["disposition"] == ( + "excluded" + ) + assert by_id[f"{loan_type}.dollars_outstanding.consolidation.dollars_outstanding"][ + "target" + ] == (f"{loan_type}.dollars_outstanding.excluding_parent_plus.dollars_outstanding") + assert { + item["disposition"] + for item in receipt["dispositions"] + if item["table"] in {"portfolio_summary", "dl_by_repayment_plan"} + } == {"diagnostic"} + assert { + item["period"] + for item in receipt["dispositions"] + if item["disposition"] == "other_quarter" + } == {"2025-12", "2026-06"} + assert len(receipt["targets"]) == 132 + + +def test_a_partial_feed_refuses() -> None: + facts = _facts() + without_age = [ + fact + for fact in facts + if ".portfolio_by_age." not in fact["layout"]["record_set_id"] + ] + with pytest.raises(ValueError, match="portfolio_by_age"): + _plan(without_age) + + only_q1_age = [ + fact + for fact in facts + if not ( + ".portfolio_by_age." in fact["layout"]["record_set_id"] + and fact["period"]["value"] == "2026-03" + ) + ] + with pytest.raises(ValueError, match="share no quarter"): + _plan(only_q1_age) + + without_texas = [fact for fact in facts if fact["geography"]["id"] != "0400000US48"] + with pytest.raises(ValueError, match="missing states"): + _plan(without_texas) + + +def test_a_gapped_band_partition_refuses() -> None: + facts = _facts() + gapped = [ + fact + for fact in facts + if not fact["lineage"]["source_record_id"].endswith( + "fy2026_q2.borrowers.debt_40k_to_60k.borrowers" + ) + ] + with pytest.raises(ValueError, match="not contiguous"): + _plan(gapped) + + +def test_no_fsa_facts_plans_nothing() -> None: + plan = _plan(packaged_reference_facts()) + + assert plan.status == "no_fsa_facts" + assert plan.references == () + + +def _frame() -> Frame: + person = pd.DataFrame( + { + "person_id": [1, 2, 3, 4, 5, 6], + "person_household_id": [10, 10, 20, 20, 30, 30], + "age": [24.0, 52.0, 30.0, 61.0, 40.0, 70.0], + "federal_student_loan_balance": [3_000.0, 0.0, 85_000.0, 0.0, 0.0, 0.0], + "federal_parent_plus_loan_balance": [0.0, 40_000.0, 0.0, 0.0, 0.0, 0.0], + } + ) + household_ids = np.array([10, 20, 30]) + person["person_tax_unit_id"] = person["person_household_id"] + 1_000 + person["person_spm_unit_id"] = person["person_household_id"] + 2_000 + person["person_family_id"] = person["person_household_id"] + 3_000 + person["person_marital_unit_id"] = np.arange(len(person)) + 4_000 + tables = { + "person": person, + "household": pd.DataFrame( + {"household_id": household_ids, "state_fips": [6, 48, 6]} + ), + "tax_unit": pd.DataFrame({"tax_unit_id": household_ids + 1_000}), + "spm_unit": pd.DataFrame({"spm_unit_id": household_ids + 2_000}), + "family": pd.DataFrame({"family_id": household_ids + 3_000}), + "marital_unit": pd.DataFrame( + {"marital_unit_id": np.arange(len(person)) + 4_000} + ), + } + return Frame( + tables, + US_SCHEMA, + { + "household": Weights( + values=np.full(len(household_ids), 1_000.0), kind=WeightKind.DESIGN + ) + }, + ) + + +@pytest.mark.parametrize( + ("metadata", "expected"), + [ + ({"fsa_measure": "total_balance"}, [43_000.0, 85_000.0, 0.0]), + ({"fsa_measure": "borrowers"}, [2.0, 1.0, 0.0]), + ({"fsa_measure": "parent_plus_balance"}, [40_000.0, 0.0, 0.0]), + ({"fsa_measure": "balance_excluding_parent_plus"}, [3_000.0, 85_000.0, 0.0]), + ( + {"fsa_measure": "total_balance", "state_fips": "06"}, + [43_000.0, 0.0, 0.0], + ), + ( + {"fsa_measure": "borrowers", "age_upper_bound": "25"}, + [1.0, 0.0, 0.0], + ), + ( + {"fsa_measure": "total_balance", "age_lower_bound": "50"}, + [40_000.0, 0.0, 0.0], + ), + ( + { + "fsa_measure": "borrowers", + "fsa_balance_lower_bound": "80000", + "fsa_balance_upper_bound": "100000", + }, + [0.0, 1.0, 0.0], + ), + ( + {"fsa_measure": "borrowers", "fsa_balance_upper_bound": "5000"}, + [1.0, 0.0, 0.0], + ), + ], +) +def test_household_values_sum_the_stored_balances( + metadata: dict[str, str], expected: list[float] +) -> None: + np.testing.assert_array_equal( + fsa_student_loan_household_values(_frame(), metadata), expected + ) + + +def test_household_values_need_both_balance_columns() -> None: + frame = _frame() + person = frame.table("person").drop(columns=["federal_parent_plus_loan_balance"]) + tables = {entity: frame.table(entity) for entity in frame.entities} + tables["person"] = person + stripped = Frame(tables, US_SCHEMA, {"household": frame.weights_for("household")}) + + assert ( + fsa_student_loan_household_values(stripped, {"fsa_measure": "borrowers"}) + is None + ) + with pytest.raises(ValueError, match="Unknown FSA measure"): + fsa_student_loan_household_values(frame, {"fsa_measure": "recipients"}) + + +def test_compiled_fsa_targets_round_trip_through_the_materializer() -> None: + registry = _registry() + frame = _frame() + columns = { + spec.measure: fsa_student_loan_household_values(frame, spec.metadata) + for spec in registry.specs + } + weights = frame.weights_for("household").values + total = { + role: math.fsum(float(np.dot(columns[spec.measure], weights)) for spec in specs) + for role, specs in _by_role(registry).items() + } + + # Every family partitions the same people, so each sums to the same level. + assert total["fsa_state_balance"] == total["fsa_age_band_balance"] + assert total["fsa_age_band_balance"] == total["fsa_debt_size_band_balance"] + assert total["fsa_debt_size_band_balance"] == pytest.approx(128_000.0 * 1_000.0) + assert total["fsa_state_borrowers"] == total["fsa_age_band_borrowers"] == 3_000.0 + assert total["fsa_debt_size_band_borrowers"] == 3_000.0 + assert ( + total["fsa_parent_plus_balance"] + total["fsa_balance_excluding_parent_plus"] + == total["fsa_state_balance"] + ) + + +def _load_builder_module(): + path = _TEST_PATHS.repository / "tools" / "build_us_fiscal_refresh_release.py" + spec = importlib.util.spec_from_file_location( + "build_us_fiscal_refresh_release", path + ) + module = importlib.util.module_from_spec(spec) + assert spec.loader is not None + spec.loader.exec_module(module) + return module + + +def test_release_filter_guard_accepts_the_compiled_fsa_bands() -> None: + builder = _load_builder_module() + registry = _registry() + restated = Counter( + key + for spec in registry.specs + for key in spec.metadata + if key.startswith("ledger_filter_") + ) + + assert restated == { + "ledger_filter_age_lower_bound": 8, + "ledger_filter_age_upper_bound": 8, + "ledger_filter_federal_student_loan_balance_lower_bound": 16, + "ledger_filter_federal_student_loan_balance_upper_bound": 16, + } + assert builder._unsupported_ledger_filter_metadata(registry.specs) == {} + + +def test_release_filter_guard_refuses_a_balance_band_it_would_ignore() -> None: + builder = _load_builder_module() + spec = next( + spec + for spec in _registry().specs + if spec.metadata.get("fsa_balance_lower_bound") == "80000" + ) + other_materializer = dataclasses.replace( + spec, metadata={**spec.metadata, "materializer": "policyengine_variable"} + ) + disagreeing = dataclasses.replace( + spec, + name=f"{spec.name}.disagreeing", + hierarchy=None, + metadata={**spec.metadata, "fsa_balance_lower_bound": "60000"}, + ) + + refused = builder._unsupported_ledger_filter_metadata( + (other_materializer, disagreeing) + ) + assert any( + "applies no balance band" in entry for entry in refused[other_materializer.name] + ) + assert any("disagrees with" in entry for entry in refused[disagreeing.name]) + + +def test_release_parity_contract_reads_the_registry_without_fsa_rows() -> None: + builder = _load_builder_module() + registry = compile_us_fiscal_target_registry( + [*packaged_reference_facts(), *_facts()], + target_period=2024, + allow_unaged_dollar_targets=True, + student_loan_targets=True, + ) + + parity = builder._without_opt_in_student_loan_targets(registry) + assert len(parity) == len(registry) - 132 + assert not [spec for spec in parity.specs if spec.family == FSA_TARGET_FAMILY] diff --git a/packages/microcosm-build/tests/engine_free/us/test_us_spine_blindness.py b/packages/microcosm-build/tests/engine_free/us/test_us_spine_blindness.py index 6c2da362e..0205835c2 100644 --- a/packages/microcosm-build/tests/engine_free/us/test_us_spine_blindness.py +++ b/packages/microcosm-build/tests/engine_free/us/test_us_spine_blindness.py @@ -268,6 +268,10 @@ "engine_lifecycle.py", "exact_k_ladder.py", # Calibration/selection seam; no source treatment. "fiscal_targets.py", + # Federal Student Aid portfolio targets (microcosm#1074): compiles FSA + # facts into target specs and sums the stored person balances for + # them; no population treatment. + "fsa_student_loan_targets.py", "geography_ladder.py", "hours_worked.py", "h5_io.py", # US artifact I/O; no population treatment. diff --git a/packages/microcosm-build/tests/fixtures/us_fsa_portfolio_chronicle_347_facts.jsonl.gz b/packages/microcosm-build/tests/fixtures/us_fsa_portfolio_chronicle_347_facts.jsonl.gz new file mode 100644 index 000000000..63a720d11 Binary files /dev/null and b/packages/microcosm-build/tests/fixtures/us_fsa_portfolio_chronicle_347_facts.jsonl.gz differ diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/provider_labels.py b/packages/microcosm-calibrate/src/microcosm/calibrate/provider_labels.py index 6c2190f17..25a1fdaf1 100644 --- a/packages/microcosm-calibrate/src/microcosm/calibrate/provider_labels.py +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/provider_labels.py @@ -32,6 +32,7 @@ "cms_medicaid": "CMS · Medicaid / CHIP", "cms_medicare": "CMS · Medicare", "cms_nhe": "CMS · National Health Expenditure Accounts", + "ed_fsa": "ED · Federal Student Aid", "federal_reserve": "Federal Reserve", "federal_reserve_z1": "Federal Reserve · Financial Accounts (Z.1)", "hhs_acf_liheap": "HHS · LIHEAP", diff --git a/packages/microcosm-calibrate/src/microcosm/calibrate/variable_labels.py b/packages/microcosm-calibrate/src/microcosm/calibrate/variable_labels.py index 32a1425bd..07b2be939 100644 --- a/packages/microcosm-calibrate/src/microcosm/calibrate/variable_labels.py +++ b/packages/microcosm-calibrate/src/microcosm/calibrate/variable_labels.py @@ -74,6 +74,14 @@ def _immutable_registry( "cms_medicare": "Medicare", "part_b_premium_income": "Part B premium income", }, + "ed_fsa": { + "federal_student_loan_balance": "Federal student loan balance", + "federal_student_loan_borrowers": "Federal student loan borrowers", + "loan_balance_excluding_parent_plus": ( + "Federal student loan balance excluding Parent PLUS" + ), + "parent_plus_loan_balance": "Parent PLUS loan balance", + }, "federal_reserve_z1": { "federal_reserve.z1.households_nonprofits_net_worth": ( "Households and nonprofit organizations net worth" diff --git a/packages/microcosm-calibrate/tests/engine_free/shared/test_provider_labels.py b/packages/microcosm-calibrate/tests/engine_free/shared/test_provider_labels.py index 5aafb56d0..06593e9b8 100644 --- a/packages/microcosm-calibrate/tests/engine_free/shared/test_provider_labels.py +++ b/packages/microcosm-calibrate/tests/engine_free/shared/test_provider_labels.py @@ -23,6 +23,7 @@ def test_current_us_providers_have_labels() -> None: "cms_medicaid", "cms_medicare", "cms_nhe", + "ed_fsa", "federal_reserve", "federal_reserve_z1", "hhs_acf_liheap", diff --git a/packages/microcosm-calibrate/tests/engine_free/shared/test_variable_labels.py b/packages/microcosm-calibrate/tests/engine_free/shared/test_variable_labels.py index 41654f183..b639eccc1 100644 --- a/packages/microcosm-calibrate/tests/engine_free/shared/test_variable_labels.py +++ b/packages/microcosm-calibrate/tests/engine_free/shared/test_variable_labels.py @@ -38,6 +38,10 @@ def _pairs(value: str) -> set[tuple[str, str]]: cms_medicaid|total_medicaid_enrollment cms_medicare|cms_medicare cms_medicare|part_b_premium_income +ed_fsa|federal_student_loan_balance +ed_fsa|federal_student_loan_borrowers +ed_fsa|loan_balance_excluding_parent_plus +ed_fsa|parent_plus_loan_balance federal_reserve|federal_reserve federal_reserve_z1|federal_reserve.z1.households_nonprofits_net_worth hhs_acf_liheap|hhs_acf_liheap diff --git a/tools/build_us_fiscal_refresh_release.py b/tools/build_us_fiscal_refresh_release.py index 3dd560c3c..fd7f78bd3 100644 --- a/tools/build_us_fiscal_refresh_release.py +++ b/tools/build_us_fiscal_refresh_release.py @@ -258,6 +258,14 @@ AGE_BOUND_STAMP_SOURCE_KEY, SSA_SSI_AGE_BAND_RECIPIENTS_TARGET_ROLE, ) +from microcosm.build.us_runtime.fsa_student_loan_targets import ( + FSA_BALANCE_LOWER_BOUND_KEY, + FSA_BALANCE_UPPER_BOUND_KEY, + FSA_MATERIALIZER, + FSA_TARGET_FAMILY, + fsa_student_loan_household_values, + fsa_student_loan_target_receipt, +) from microcosm.build.us_runtime.h5_io import ( AuthenticatedPoolH5, assert_h5_unchanged, @@ -794,6 +802,7 @@ def _automatic_gc_suspended(): "us:statutes/26/62#adjusted_gross_income": "agi_band", "us.tax.earned_income_credit_qualifying_children": "eitc_child_count", "age": "age_band", + "federal_student_loan_balance": "student_loan_balance_band", } #: Bound-side suffixes a restated constraint key may carry. A key with no @@ -876,7 +885,20 @@ def _automatic_gc_suspended(): #: household-variable measures) never reads an age bound, so a restated age #: bound there would be silently ignored however well it agreed with metadata #: the materializer also ignores; it is refused instead. -RESTATED_AGE_BAND_MATERIALIZERS = frozenset({"population_age", "policyengine_variable"}) +RESTATED_AGE_BAND_MATERIALIZERS = frozenset( + {"population_age", "policyengine_variable", FSA_MATERIALIZER} +) + +#: Compiled edges of a Federal Student Aid debt-size band, by bound side, and +#: the one materializer that slices on them +#: (:func:`microcosm.build.us_runtime.fsa_student_loan_targets.fsa_student_loan_household_values`, +#: ``lower <= balance < upper`` on the person's own plus Parent PLUS balance, +#: microcosm#1074). A restated ``federal_student_loan_balance`` bound on any +#: other materializer would be ignored, so it refuses. +RESTATED_STUDENT_LOAN_BALANCE_BAND_COMPILED_KEYS = { + "lower": FSA_BALANCE_LOWER_BOUND_KEY, + "upper": FSA_BALANCE_UPPER_BOUND_KEY, +} #: The exact-value age key the dimension stamp writes when ``age`` is itself #: a dimension of the fact. @@ -899,6 +921,7 @@ def _automatic_gc_suspended(): "cms_aca": "CMS ACA marketplace enrollment public use files", "cms_medicaid": "CMS Medicaid enrollment and expenditure sources", "cms_medicare": "CMS Medicare Trustees Report Part B premium income", + "ed_fsa": "Federal Student Aid federal student loan portfolio", "hhs_acf_tanf": "HHS ACF TANF administrative data", "irs_soi": "IRS Statistics of Income public tables", "jct": "Joint Committee on Taxation tax expenditure estimates", @@ -5905,6 +5928,32 @@ def _restated_age_band_refusal( ) +def _restated_student_loan_balance_band_refusal( + key: str, + value: str, + metadata: Mapping[str, str], + *, + side: str | None, +) -> str | None: + if side is None: + return ( + f"{key}={value} restates an exact federal student loan balance, but " + "the materializer slices a half-open balance band" + ) + materializer = metadata.get("materializer") + if materializer != FSA_MATERIALIZER: + return ( + f"{key}={value} restates a federal student loan balance bound on a " + f"spec whose materializer ({materializer!r}) applies no balance band" + ) + return _restated_band_edge_refusal( + key, + value, + metadata, + compiled_key=RESTATED_STUDENT_LOAN_BALANCE_BAND_COMPILED_KEYS[side], + ) + + def _restated_eitc_child_count_refusal( key: str, value: str, @@ -6006,6 +6055,10 @@ def _restated_ledger_filter_refusal( return _restated_eitc_child_count_refusal(key, value, metadata, side=side) if rule == "age_band": return _restated_age_band_refusal(key, value, metadata, side=side) + if rule == "student_loan_balance_band": + return _restated_student_loan_balance_band_refusal( + key, value, metadata, side=side + ) raise ValueError( f"RESTATED_LEDGER_FILTER_CONCEPTS maps {concept!r} to rule {rule!r}, " "which has no comparison implemented." @@ -6294,6 +6347,17 @@ def _base_simulation_household_columns( variable="state_income_tax", tax_unit_positions=tax_unit_positions, ) + # Federal Student Aid portfolio targets (microcosm#1074) read the SCF + # education-debt stage's stored person balances, not an engine variable: + # the pinned engine does not define them yet, and a stored input is what + # the engine would read anyway. A frame without the columns materializes + # nothing, so the targets report as dropped. + for spec in target_specs: + if spec.metadata.get("materializer") != FSA_MATERIALIZER: + continue + fsa_values = fsa_student_loan_household_values(frame, spec.metadata) + if fsa_values is not None: + columns[spec.measure] = fsa_values population_age_target_specs = [ spec for spec in target_specs @@ -10081,6 +10145,9 @@ def _artifact_entry(path: str, sha: str, *, kind: str, revision: str) -> dict[st #: reference it by file sha and key; ``present`` stays false until the #: compiler writes the receipt. US_FISCAL_TARGET_EXCLUSION_RECEIPT_KEY = "fiscal_target_exclusion_receipt" +#: us_source_coverage.json key of the FSA portfolio receipt, written only by a +#: build that compiles those targets (``--scf-education-debt``, microcosm#1074). +US_FSA_STUDENT_LOAN_TARGET_RECEIPT_KEY = "fsa_student_loan_target_receipt" def _gate_evidence_artifacts(release_dir: Path, *, revision: str) -> dict[str, dict]: @@ -12483,6 +12550,22 @@ def main(argv: Sequence[str] | None = None) -> None: _ACTIVE_EMITTER.complete() +def _without_opt_in_student_loan_targets(registry: TargetRegistry) -> TargetRegistry: + """The registry the target-parity contract reads: no FSA portfolio rows. + + The parity manifest describes one target surface for every build, but the + FSA family compiles only with ``--scf-education-debt`` (microcosm#1074): + the rows bind columns a default build does not carry. Until that stage is + default the family is outside the contract, and the manifest may declare + it a reviewed exclusion without either build failing the other. + """ + + return TargetRegistry( + tuple(spec for spec in registry.specs if spec.family != FSA_TARGET_FAMILY), + country=registry.country, + ) + + def _check_committed_us_ledger_feed_pin( facts_sha256: str, *, @@ -12822,6 +12905,16 @@ def _main(argv: Sequence[str] | None = None) -> int | None: ), age_targets=args.age_targets, allow_unaged_dollar_targets=args.allow_unaged_dollar_targets, + # FSA's portfolio binds the stage's balances, so only a build that + # imputes them compiles the targets (microcosm#1074). + student_loan_targets=args.scf_education_debt, + ) + # Every FSA fact's disposition (bound, allocated, out of scope, + # diagnostic) and the in-scope controls, for us_source_coverage.json. + fsa_target_receipt = ( + fsa_student_loan_target_receipt(ledger_artifact.facts, target_period=PERIOD) + if args.scf_education_debt + else None ) # The exclusion register's keys do not say which feed facts a compile # dropped or let through by vintage (microcosm#956), so record the concrete @@ -12853,8 +12946,12 @@ def _main(argv: Sequence[str] | None = None) -> int | None: # diagnostic JCT skip — so the gate sees the true family surface, and # hard-fails the build on a silently dropped family or a rotted manifest, # exactly like the release input-coverage gate on the export frame. - assert_target_parity_manifest_current(registry=target_registry) - target_parity_gate = us_release_target_parity_gate(target_registry) + # The FSA portfolio family is opt-in (it binds only the + # --scf-education-debt stage's balances, microcosm#1074), so it stays off + # the one-surface parity contract until that stage is default. + parity_registry = _without_opt_in_student_loan_targets(target_registry) + assert_target_parity_manifest_current(registry=parity_registry) + target_parity_gate = us_release_target_parity_gate(parity_registry) if not target_parity_gate.passed: raise RuntimeError( "Release gates failed: " @@ -16088,6 +16185,8 @@ def _main(argv: Sequence[str] | None = None) -> int | None: ) ] coverage[US_FISCAL_TARGET_EXCLUSION_RECEIPT_KEY] = fiscal_target_exclusion_receipt + if fsa_target_receipt is not None: + coverage[US_FSA_STUDENT_LOAN_TARGET_RECEIPT_KEY] = fsa_target_receipt write_us_source_coverage_diagnostics( coverage, release_dir / "us_source_coverage.json" )