Repository navigation
Rerun on Microcosm a133f37a, policyengine-uk 2.148.4 and policyengine.py 6.10.1 - #12
vahid-ahmadi wants to merge 16 commits into
Conversation
…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>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…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>
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>
|
Review of 24 October 2026: external benchmarks, how Microcosm compares, and what the dashboard should change. Against Summary
How Microcosm compares on the baseline
How Microcosm compares on the reform
Labour supply against benchmarks
What to change Dashboard and README:
Analysis:
Microcosm, separately from this PR:
Sources
🤖 Generated with Claude Code |
Dashboard review: PR #12 at b2328b7Scope:
Checks that pass:
Must fix
Should fix
Nits
For the author
|
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>
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.
microcosm_uk_2024_25.h5, a133f37a,policyengine/populace-uk-privateatc3a751d9, sha25664f83900…914aa. This is still the latest national release.policyengine==6.10.2andpolicyengine-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.Results, £bn (static unless stated)
Attribution for 2027-28, both legs static:
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
would_claim_targeted_childcare, fixed from the baseline; leavers unchangedsubsidy_rangeThe 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 underprovenance.postprocess.🤖 Generated with Claude Code