Skip to content

Rerun on Microcosm a133f37a, policyengine-uk 2.148.4 and policyengine.py 6.10.1 - #12

Draft
vahid-ahmadi wants to merge 16 commits into
mainfrom
rerun-microcosm-a133f37a
Draft

vahid-ahmadi wants to merge 16 commits into
mainfrom
rerun-microcosm-a133f37a

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

What changed and why

GGF's costing ran on Enhanced FRS 1.57.2 and policyengine-uk 2.94.0. This PR moves it to Microcosm's 23 October national release and the latest engine, then applies María's review of 24 October.

  • Data: microcosm_uk_2024_25.h5, a133f37a, policyengine/populace-uk-private at c3a751d9, sha256 64f83900…914aa. This is still the latest national release.
  • Engine: policyengine==6.10.2 and policyengine-uk==2.153.4, the latest on PyPI. Between 2.148.4 and 2.153.4 the only childcare change is the 2-year-old offer's Pension Credit test, so no override needed re-porting. The release manifest pins 2.147.2, and an attribution run on that version is reported.
  • Take-up of the new hours: families outside the working-parent hours now take up the new under-3 hours on the 2-year-old offer's flag. Before, they read Microcosm's universal flag, which is nested under the working-parent flag. Low and high cases are reported alongside.
  • Ranges: the free-hours leg is shown with a take-up range, and the subsidy leg runs from current behaviour to as coded.
  • Comparators: taken from DfE's 2024-25 technical note.
  • Household effects: by income decile, with quintiles folded from the deciles.

Results, £bn (static unless stated)

2027-28 2028-29 2029-30
Free hours, central (take-up range) 2.80 (2.07–3.44) 2.81 (2.17–3.47) 2.88 (2.26–3.54)
Subsidy, as coded (current behaviour – CMA fee base – as coded) 5.55 (3.05 – 4.40 – 5.55) 5.67 (3.12 – 4.42 – 5.67) 5.81 (3.20 – 4.46 – 5.81)
Both legs, static 7.98 8.11 8.31
Both legs, both margins summed (central) 7.08 7.19 7.36
Net entrants (central) −3,589 −4,310 −4,390
Published (Enhanced FRS, 2.94.0): both legs static / dynamic / entrants 6.64 / 5.95 / +2,804 6.80 / 6.06 / +2,842 6.98 / 6.22 / +2,863

Attribution for 2027-28, both legs static:

  1. Published: £6.64bn.
  2. Enhanced FRS on 2.153.4 with this code: £6.92bn, +5,363 entrants.
  3. Microcosm on 2.147.2: £7.89bn, −3,301.
  4. Microcosm on 2.153.4: £7.98bn, −3,589.

The data step adds £0.97bn and flips the sign of net entrants. The engine's stricter 2-year-old test (from 2.148.1) adds about £0.12bn to the free-hours leg. The previous version of this PR had £8.56bn; the central take-up of the new hours accounts for the difference (£3.44bn → £2.80bn on the free-hours leg).

The subsidy leg's response implies a childcare price elasticity of employment of about −0.006 (implied_price_elasticity). The central run applies the OBR elasticities unscaled; −0.15 only sets the width of the low/high band.

María's review, point by point

Item Done Commit
Take-up of new hours outside the working-parent hours on would_claim_targeted_childcare, fixed from the baseline; leavers unchanged Yes, with tests 2a61452
Show the free-hours leg as a take-up range Low (60% of DfE working-family rates by age) / central / high (universal flag) 2a61452, be1afb6
Subsidy leg as £3.05bn / £4.40bn / £5.55bn subsidy_range 2a61452, be1afb6
Universal comparator £2.6bn from DfE's technical note Confirmed against the note (784,144 PTE); now 1.02× b824b49
Working-parent comparator about £2.7bn Derived from the same note: £2.69bn b824b49
Drop "universal is £0.96bn high" and the universal gap as an uncertainty README and sources b824b49, 4b685d8
2-year-old row: analysis engine against the release's fit pin Note added; attribution run on 2.147.2 (90,446 against 64,222 children) b824b49, 4b685d8
Labels: DfE targets are January 2025 counts Done b824b49, 4b685d8
NEF described as a whole-system package Done from NEF's page. I could not confirm that the "11%" comes from an assumed 10% earnings rise: NEF's summary attributes it to more hours worked, so the note quotes NEF b824b49
Add BCG/Sutton Trust 2024, Sutton Trust/IFS 2021, EECC/LSE 2026, DfE 2023 take-up, IPPR 2022 Added. Fair Start's take-up range (£115m–£560m) is folded into its existing row. EECC's page does not state that take-up doubles the cost, so the note does not say so b824b49
Relabel "Central: … (−0.15)"; report the implied elasticity Key emitted and README updated. The dashboard label is in the dashboard commit be1afb6, 4b685d8
Methodology: entry/exit rule against the OBR's, 1–4 window, Brewer overlap, average against marginal price fall README 4b685d8
Engine version: run on 2.147.2 or report what 2.148.4 changes Results on 2.153.4, plus a 2.147.2 attribution column 4b685d8
"What moved": dynamic figures for the middle column Enhanced FRS on the new engine, rerun with dynamics 4b685d8
Microcosm items (2-year-old refit, fee-base target, under-2 fit, universal rate outside the working-parent scheme, January 2026 refit) Out of scope for this repo —

The dashboard copy fixes from the 24 October dashboard review are in a separate commit.

Checks

  • pytest: 80 passed, including provenance. The results were run at 34320f7; quintiles were folded afterwards with --fold-quintiles, which records its digest under provenance.postprocess.
  • ruff passes.
  • The Microcosm under-2 age fix (a12885f9) is not in a133f37a, so the age 0/1 split may move on the next release.

🤖 Generated with Claude Code

…e.py 6.10.1

- Data: microcosm_uk_2024_25.h5 from policyengine/populace-uk-private, pinned
  to the a133f37a cut tag commit (c3a751d9) and checked against the release
  manifest's sha256. Replaces Enhanced FRS 1.57.2.
- Simulations are built through policyengine.py's managed_microsimulation,
  passing the verified file as an unmanaged dataset.
- The universal-eligibility override is rebuilt on the 2.147+ formula: it
  keeps the reception term (early_years_term_share_before_school) and no
  longer excludes working-parent families, whose hours now stack on the
  universal hours. The one added term, no universal hours on top of the
  2-year-old targeted offer, is unchanged.

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

vercel Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
free-childcare-reform Ready Ready Preview Oct 24, 2026 11:28pm UTC

Request Review

…urs where targeted is not claimed

- _new_free_hours_value now diffs universal + extended per-child + targeted.
  Since policyengine-uk 2.147 the working-parent hours top up the universal
  hours, so universal hours granted to a working-parent child are not new
  hours; counting them overstated displacement and understated the combined
  cost.
- The targeted-offer exclusion in the universal override now requires the
  family to claim the targeted offer, since the engine's targeted
  eligibility no longer includes take-up.
- The override drops defined_for, matching the engine: universal eligibility
  is legal eligibility, with take-up handled in the amount.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…osm a133f37a

- The universal tier starts in the first term after a child reaches 9
  months, read from the date of birth (the engine's working-parent rule),
  instead of a whole-year age gate that in effect started it at age 1. The
  reform's universal amount pays only those terms.
- README, sources.py notes, code comments and the dashboard's method copy
  describe Microcosm a133f37a and policyengine-uk 2.148.4: stacking of the
  universal and targeted hours under the working-parent hours, the reception
  term, Tax-Free Childcare on routed spend, recomputed baseline checks and
  take-up rates, and a "What moved" section against Enhanced FRS 1.57.2.
- The universal comparator is the 778,327 registered children excluding
  reception, as universal and working-parent hours now stack.
- The free-hours leg's small entry response is real: a parent of a
  2-year-old who would claim the disadvantaged offer only out of work gains
  universal hours only in work. The test now says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
vahid-ahmadi and others added 2 commits October 23, 2026 21:30
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Results rebuilt at da8d174 on policyengine-uk 2.148.4 and policyengine.py
6.10.1. README and dashboard copy: participation response no longer called a
floor, the revenue sign explained, margins labelled as summed, gains as a
share of income, scoped quintile caption, CMA fee base described as a
residual, displacement share read from the results.

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

Copy link
Copy Markdown
Collaborator

Review of 24 October 2026: external benchmarks, how Microcosm compares, and what the dashboard should change. Against b2328b7 (results built at da8d174). Sources are in the fold at the end.

Summary

  • No published costing matches this reform. The nearest ones cost parts of it, so the main evidence for the change is official take-up and caseload data.
  • Most of the rise in the free-hours leg is one take-up assumption. On Microcosm, 78% of 1-year-olds outside the working-parent hours take up universal hours; on the Enhanced FRS, 52%. About three quarters of the age-1 increase comes from that flag. Microcosm cannot calibrate it, because no 15-hour offer for under-3s outside work exists today, and the external analogues point lower.
  • The rest of the data step, fewer 1-year-olds on working-parent hours (224,000 against 298,000), matches DfE's January 2026 census (210,800). That part is an improvement.
  • On the baseline, Microcosm is close once the comparators are like for like. The universal row's 1.57× is a comparator problem: on DfE's own figure it is 1.02×. The real gaps are the 2-year-old offer, the fee base and the Tax-Free Childcare award per child.

How Microcosm compares on the baseline

  • Microcosm calibrates the four schemes on DfE's January 2025 counts and HMRC's 2025 figures, on policyengine-uk 2.147.2, and the README reports each within 0.2% after the weights. Its take-up fit, before the weights, cannot reach two targets. With age-1 usage at its ceiling of 1.0, it reaches 89% of DfE's working-parent count at age 1. With the conditional universal rate at its floor of 0, it leaves universal-only 3–4 year olds 6.5% over. The weights bring the universal-only count back within 0.2%; the README does not report the age-1 count after the weights.
  • Independent checks at 2024 on 2.148.4 (this PR's table), with the comparators corrected:
    • Universal, 3–4 year olds: 1.02×. The PR moved the caseload comparator to the stacked definition (416,537 → 778,327) but kept the £1.70bn spending comparator, which this review could not reproduce. DfE's 2024-25 technical note puts all universal hours at £2.6bn on 784,144 part-time equivalents; the model has £2.66bn. The 1.40× caseload gap is an annual count against a January snapshot.
    • Working-parent: about 0.83×. £2.23bn against about £2.7bn on the same note (£1.1bn of additional 3–4 hours, about £0.95bn of the £1.5bn for 2-year-olds by part-time equivalents, £0.65bn for under-2s), in a mid-rollout year.
    • 2-year-old offer: about 0.5× (£0.29bn against £0.57bn). PolicyEngine/policyengine-uk@e37efb746 (in 2.148.1) tests this offer on UC earnings before the work allowance. That test is stricter, and Microcosm fitted its take-up on 2.147.2. In 2027 the model has about 61,000 children, against DfE's 85,600 in January 2026.
    • Tax-Free Childcare: 0.92× on spend and 1.06× on children, so the award per child is low (£505 against £583).
    • UC childcare element: 1.10×. Fee base: 1.40× the CMA residual, which is itself all non-funded provider income, not only fees.
    • Total entitlements: 0.88× at 2024. In 2027, £10.40bn against DfE's £9.5bn for 2026-27: about 1.05× after a year's growth.
  • Against the Enhanced FRS run, Microcosm is better on the UC element (2.59× → 1.10×), on total entitlements and on working-parent 1-year-olds. It is worse on the 2-year-old offer (0.75× → 0.51×) and the fee base (1.25× → 1.40×).

How Microcosm compares on the reform

  • Take-up of the new universal hours. Microcosm draws universal take-up nested under the working-parent flag (PolicyEngine/microcosm@179e759c5) and fits the conditional rate to 0 (PolicyEngine/microcosm@b1501296c). So every family with the working-parent flag (about 0.84 of families) takes up universal hours, whatever its work status. The under-2 usage draw (PolicyEngine/microcosm@6aea1ec00, PolicyEngine/microcosm@eeee86598) splits by age, but age-1 usage is at its ceiling of 1.0. The PR's 78% is consistent with this.
  • The analogues point lower. DfE's 2026 take-up among working families: 46% at 9–11 months, 76% at age 1, 92% at age 2. The disadvantaged 2-year-old offer: 71.6%. Formal childcare use at ages 0–4: 40% for non-working lone parents, against 79% for working families. The Sutton Trust and IFS (2021) assumed newly eligible children take up at under half the existing rate. DfE's 2023 costing assumed 60% at age 1 and 35% at 9–12 months.
  • An age-only split does not fix it. Swapping in working families' DfE take-up by age moves the leg by about zero on this PR's figures (age 0 −£0.08bn, age 1 −£0.04bn, age 2 +£0.10–0.20bn). The missing dimension is work status.
  • The 2-year-old offer's drift adds roughly £0.1bn of "new" hours at age 2 for children who are already funded.
  • Subsidy leg. It pays 75% of all reported spend for 96% of eligible benefit units, which is the full-take-up end. The routed-share run (£3.05bn) is the current-behaviour end, and the CMA rebasing gives £4.40bn. EECC and LSE (October 2026) find that take-up alone doubles the cost of a merged subsidy.

Labour supply against benchmarks

  • Free-hours leg, −18,544. The direction matches SCP/CPB's estimate for dropping a work test in the Netherlands (−0.1% participation) and Brewer et al.'s null result for universal part-time hours. The size rests on valuing out-of-work free hours at the DfE rate.
  • Subsidy leg, +9,083. This is small. Rough arithmetic (a 55% fall in the price an entrant faces, and about 1.0–1.2m mothers in work in scope) gives an implied price elasticity of about −0.01 to −0.02. Compare −0.19 in the European meta-analysis and the README's own low bound of −0.05.
    • The −0.15 only sets the width of the band; the central run uses the OBR elasticities unscaled.
    • Only non-workers can enter. The OBR instead applies its elasticities to employees' change in the gain to work and reads the result as a change in the participation rate.
    • Only parents whose youngest child is 1–4 respond, although the subsidy pays from birth to age 11.
  • Hours, +2.5% for the subsidy leg. This is the low end of the international range (German fee abolition: +7.1% working time). The −0.042 comes from Brewer et al.'s +0.6 hours over all mothers, and their +3.5-point employment effect can account for all of it. The free-hours leg's gain in hours treats an average price fall as a marginal one.
  • Offset, 10.7% of the static cost. This is close to Norway's tax-only estimate (about 13%). For scale, the OBR expects the 2023 expansion to bring 60,000 people into work by 2027-28, with an equal effect on hours.

What to change

Dashboard and README:

  • Baseline tab, universal row (sources.BASELINE_PROGRAMMES): use about £2.6bn from DfE's 2024-25 technical note. Then drop "universal is £0.96bn high" from the README, and drop the universal gap as one of the "two uncertainties" for the free-hours leg (the fee-base paragraph on the Baseline tab and the README). Working-parent row: use about £2.7bn on the same note, or give a source for £2.50bn.
  • Baseline tab, 2-year-old row: say that the analysis runs on 2.148.4 while the release was fitted on 2.147.2, and that this lowers the offer's count.
  • Labels: Microcosm's DfE targets are January 2025 counts, not "DfE's 2026 census". Add the January 2026 census beside them.
  • Comparable costings (sources.COMPARABLE_COSTINGS):
    • NEF is a whole-system package: 15 universal hours plus a 5% cap on the cost of further hours, replacing funded hours, Tax-Free Childcare and UC support. It is "initially cost-neutral" at current usage. Its "as much as 11%" comes from an assumed 10% rise in all workers' earnings, not a labour supply estimate.
    • Add BCG for the Sutton Trust (2024), the Sutton Trust and IFS take-up anchor (2021), EECC and LSE (2026), DfE's 2023 take-up assumptions by age, and IPPR's 2022 childcare guarantee papers.
  • Cost tab:
    • Show the free-hours leg as a range driven by take-up of the new hours.
    • Show the subsidy leg as £3.05bn / £4.40bn / £5.55bn.
    • Relabel "Central: OBR elasticities as published (price elasticity −0.15)", because the central run does not use −0.15.
  • Methodology tab:
    • Make the same correction to −0.15, and report the implied price elasticity.
    • Describe the entry and exit rule and how it differs from the OBR's.
    • Note the 1–4 window on the subsidy leg and the Brewer overlap.
    • Note that the free-hours leg's hours response treats an average price fall as a marginal one.

Analysis:

  • Take-up of the new universal hours. Keep the nested flag for families on working-parent hours in the baseline, so the leavers do not change. For everyone else, claim on would_claim_targeted_childcare (0.655, close to DfE's 65.2% for January 2025). Keep the age-0 usage draw, and set the flag as an input from the baseline run. On this PR's figures that is roughly −£0.45bn to −£0.68bn, a leg of about £2.8–3.0bn. A low case at 60% of working families' rates gives about £2.3bn. Show the range.
  • Engine version: run on 2.147.2, the release's pin, or report what 2.148.4 changes.
  • "What moved": rerun the dynamic figures for the middle column, so the change in the participation sign can be split between engine and data.

Microcosm, separately from this PR:

  • Refit the 2-year-old offer on the engine the analysis uses.
  • Add a target or gate for the England under-5 fee base.
  • Let the under-2 take-up fit reach DfE's age-1 count without sitting at its ceiling.
  • Let families outside the working-parent scheme take up universal hours at their own rate. At its floor, the nested take-up fit still overshoots the universal-only count by 5–6.5% before the weights.
  • Refit on the January 2026 census.
Sources

🤖 Generated with Claude Code

@vahid-ahmadi

Copy link
Copy Markdown
Contributor Author

Dashboard review: PR #12 at b2328b7

Scope:

  • Built the dashboard and served it under its basePath. Rendered all three tabs.
  • Probed the cost chart's DOM. All 6 bars render with heights that match the per-leg dynamic costs (£3.30bn / £4.71bn in 2027-28).
  • Checked every figure against dashboard/public/data/free_childcare_reform_results.json, which is byte-identical to data/.
  • Ran a neutrality pass over all copy.

Checks that pass:

  • CI is green.
  • No old-run values (6.64, 5.95, 1.97, 4.84, +2,804) appear on the dashboard. They appear only in the README's "What moved" table.
  • The dataset label and package versions are read from the JSON and match pipeline.py and pyproject.toml.

Must fix

  1. Free-hours headline is £3.44bn, not £3.45bn. The JSON has static_cost_bn 3.445, and the 4dp static_cost_by_country_bn.uk is 3.4449. The card renders £3.44bn, which is correct. README:19, :25, :53 and the PR body table say £3.45bn. That comes from rounding twice: the pipeline rounds to 3dp, then the text rounds again.
    • Fix the README and the PR body.
    • Have pipeline.py (around :781 and :901) emit 4dp so this cannot recur.
  2. CostTab.jsx:193 states model mechanisms as facts about the world. It says "Unconditional hours remove a reason to work, so participation falls" and "Displaced paid care cuts the price…". Suggested wording: "In the model, the universal hours lower the gain to work for parents on the 30-hour offer, so modelled participation falls" and "In the model, displaced paid care lowers the price for working parents, so modelled hours rise."
  3. MethodologyTab.jsx:215-218 asserts an unmodelled take-up response and merges two figures. "That assumption drives the cost… pushes the cost the other way. The 2024-25 expansion came in 26-28% above forecast on take-up alone." In the source, take-up was 26% above the estimate and spending 28% above budget. Suggested wording: "Take-up is held at baseline rates. If unconditional hours draw in families who use no formal childcare today, the cost would be higher than shown; this is not modelled. For the 2024-25 expansion, take-up ran 26% above the December 2023 estimate and spending about 28% above budget."
  4. The free-hours card can carry two negatives that mean opposite things. The free-hours leg has −18.5k net entrants yet a positive net revenue of £0.01bn, because funded hours count in household_benefits. CostTab:432-434 prints that unsigned. CostTab:143/:219 print cost-signed "−£0.03bn" next to "−5.4k net entrants".
    • Add one sentence on the dashboard explaining why fewer workers can still raise revenue. Today that explanation is only at README:31.
    • Use one sign convention throughout. formatCount uses an ASCII "-" with no "+", while :219 uses "−"/"+", and the Math.abs at :224 hides the direction.

Should fix

  1. Displacement shows two values. MethodologyTab:81 renders the JSON's 0.9053 as 91%. CostTab:330 and README:25/:110 hardcode 90%. Read the JSON value in both places.

  2. Take-up rates disagree between tabs with no explanation. MethodologyTab:207-210 hardcodes 97/86/86/64%, and none of these are in the JSON. CostTab:307-308 shows 96% (TFC) and 85% (extended flag) from the JSON. Either emit the Methodology figures from the pipeline or name the population at each figure.

  3. The IFS source description is stale. sources.py:397 still says "163 extra hours of subsidisable care". The Methodology tab uses 54 per 570 from the same note, and sources.py:38 itself says 163 was the old figure.

  4. Numbers are hardcoded where the JSON has them.

    • "85%" UC coverage at CostTab:312 and DistributionTab:233.
    • "25%" and "£2,000" at CostTab:286-287. Methodology already reads params for these.
    • CostTab.jsx:64 assigns dynamic and never uses it. The tab instead rebuilds dynamic cost from unrounded offsets against the 3dp static figure.
  5. Further causal or predictive wording.

    • CostTab:204: "Cheaper childcare raises the gain to work, so this leg costs less." Prefix with "In the model".
    • MethodologyTab:222-223: "A subsidy that large would be expected to raise fees" is an unsourced prediction. Say that fees are held fixed and that a fee response is not estimated.
    • DistributionTab:233: "because lower-income households use fewer paid childcare hours" should be "in the data, lower-income households report fewer…".
  6. The Distribution tab says "gain" everywhere. Examples are "Who gains", "Average gain" and "Total gain" (DistributionTab:18-43, :115). With labour supply on, leavers can lose. Use "change in net income", or state whether any group loses.

  7. The bottom-quintile sentence only shows when Q1 leads (DistributionTab:99-108, :233). That makes it selective by construction. Show the top and bottom quintiles' shares every time, or drop it.

  8. The same fact appears in several places. Give each one home and link to it from elsewhere. The main repeats:

    Fact Where it appears
    UC 85% element kept Methodology:73-75, CostTab:312, Distribution:233, page.jsx:132
    Displacement 90% plus realised 20% Methodology:78-88, CostTab:327-334
    Universal gap £2.66bn/£1.70bn, 1.09m/0.78m Baseline table, then repeated at BaselineTab:189-191
    Margins overlap Methodology:172-178, CostTab:226 and :396-402
    Brewer +0.600/14.319 Methodology:166-170, CostTab:386-387 and :400-401
    England-only, UK-wide, Barnett CostTab:178-182, Methodology:226-228, Distribution:120-121
    26-28% above forecast Methodology:217-218, Baseline comparable-costings note
    Subsidy leg's 9.1k entrants subsidy card, Leg 2 box, "Upward" box

    Also, the "see Baseline" pointer at CostTab:203 is plain text and should be a link.

Nits

  1. Title vs intro: page.jsx:116 says "Two childcare reforms", while :126 says "a two-part childcare reform". Pick one.
  2. MethodologyTab:232-233 says "a family's true gain is larger than the model shows". Change "is" to "may be".
  3. MethodologyTab:203 says "negligible". Give a number.
  4. Year range, £15,400 and a12885f9 are hardcoded (page.jsx:127, Methodology:201, CostTab:416, BaselineTab:187).
  5. MethodologyTab:116/:127 mention 2.94 and "the Enhanced FRS" with no version, and nothing explains what the Enhanced FRS is.

For the author

  • Pre-existing, not from this PR. The Baseline "Comparable published costings" section names NEF, Pregnant Then Screwed, JRF, Sutton Trust/IFS and WBG next to our figures. "What other people have put on similar proposals" is also informal. Consider "Published costings of related proposals".
  • Combined totals. The dashboard never shows the combined £8.56bn static or £7.65bn dynamic figures quoted in the PR body. The default view shows per-leg dynamic figures (£3.30bn, £4.71bn) and a −£0.91bn labour supply card. If GGF will quote the combined figure, it needs a home on the page.

vahid-ahmadi and others added 10 commits October 24, 2026 19:36
The childcare surface is unchanged between 2.148.4 and 2.153.4 apart from
the 2-year-old offer's Pension Credit test, which now counts receipt of
guarantee credit; the reform overrides need no re-port.

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

Microcosm nests universal take-up under the working-parent flag, so 78% of
1-year-olds outside the working-parent hours took up the new hours. Families
outside those hours now claim on would_claim_targeted_childcare, fixed from
the baseline run; families on them keep the universal flag, so leavers are
unchanged. Low (60% of DfE working-family rates by age) and high (the
universal flag) cases bracket it. Also a routed-share option for the subsidy
leg at current claiming behaviour.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
free_hours_take_up and subsidy_range per year, the implied price elasticity
of the subsidy leg's central response, and under-5 take-up flag rates with
their population. Costs are emitted to 4dp so prose rounds once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Universal spending £2.6bn and working-parent about £2.69bn, both from DfE's
early years national funding formulae technical note, replacing £1.7bn and
£2.5bn that could not be reproduced. NEF described as the whole-system
package it is; DfE 2023 take-up assumptions, BCG for the Sutton Trust and
EECC/LSE added; Fair Start's take-up range; the 26% and 28% stated
separately; IFS note's 54-in-570 replaces the stale 163; the 2-year-old row
notes the engine against Microcosm's fit pin; DfE targets are January 2025
counts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
country is a household enum and cannot be mapped to the benefit unit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
by_income_decile and by_income_decile_families_with_under_5s, groups D1-D10,
read from household_income_decile directly, replace the quintile breakdowns
in every household_effects block. The _quintile helper is removed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every by_income_decile* list gets a by_income_quintile* list beside it at
write time, folded from the decile rows (Q1 = D1 + D2): totals summed, ratios
recomputed from summed numerators and denominators. Decile rows now carry the
unrounded sums so the fold is exact; older results are folded from their
rounded fields with --fold-quintiles, which records its own source digest
under provenance.postprocess. --parallel costs each year in its own process.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
policyengine 6.10.2 and policyengine-uk 2.153.4 on Microcosm a133f37a. Run at
34320f7; quintiles folded from the deciles afterwards.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comment-only source changes; the results are the run at 34320f7, refolded so
provenance.postprocess records the current source.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Headline legs with take-up and subsidy ranges; the central take-up case and
its anchors; the implied price elasticity and what -0.15 does; What moved
split into engine and code, data, and the release's own engine pin; DfE
technical-note comparators; household effects by decile; caveats reworded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Reform tab:
  - One control row with the view switch first.
  - Cards name each labour supply margin with its own unit and cost.
  - Free-hours take-up range and subsidy range under the cards.
  - Leg chooser on the cost chart, with both legs stacked in order.
- Household effects by income decile (default) or quintile.
- Baseline tab: modelled-against-official chart with the table folded
  inside it; costings without a figure show "Not costed".
- Methodology cut to the essentials. It describes the take-up of the new
  hours and drops the claim that -0.15 is the central elasticity.
- Every number reads from the results JSON. The footer shows the
  policyengine.py version from the run, and the page has a tighter footer.

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

This branch was successfully deployed

1 active deployment
Preview — 2480a311 Deployed Oct 24, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants