Repository navigation
Funded early-years hours continue after a child starts school (reception in England, P1 in Scotland) #2567
Description
England's universal 15 hours and working-parent hours test the child's age only, so a 4-year-old in reception keeps both: £7,535.40 in 2026-27 at 30 hours a week. DfE guidance gives no free hours on top of a state-funded reception place. Scotland's funded early learning and childcare (ELC) has the same age-only test, though starting P1 there is a legal bar.
The rule
- Law (England). Both duties last until compulsory school age (Childcare Act 2006 s.7, 2016 Act s.1(2)(a), Education Act 1996 s.8); the regulations (SI 2014/2147, SI 2022/1134) don't mention reception.
- Funding rule (England). A reception child is still entitled, but the council meets both duties through the reception place, funded from the schools block. The statutory guidance from April 2026 says children in state-funded or council-funded reception are "not entitled to any additional free hours outside their school reception class place" (footnotes 7 and 17; A4.8; C.6).
- Edge cases. Deferred entry keeps the hours until reception or compulsory school age (C.6); part-time and parent-paid reception are unclear. Tax-Free Childcare and the 2-year-old offer (ends at 3) are unaffected.
- Scotland. ELC is for children who have not started primary school (Education (Scotland) Act 1980 s.1(4B)); a deferred P1 year is funded (SSI 2021/67).
What the model does
On main (6c0feb3); the eligibility code is unchanged since 2.134.4:
universal_childcare_entitlement_eligible: England, age 3 to under 5, and notis_of_compulsory_school_age, which is age only.extended_childcare_entitlement_qualifying_child: age under 5, England, the minimum age, not looked after.scottish_funded_early_learning_childcare_eligible: age only, up to 5.- No childcare variable reads
current_education. The targeted offer (age 2) needs no change.
Reproducer
Two working parents in England, one child, 2026; take-up and hours used left at their defaults (True, 30).
from importlib.metadata import version
from policyengine_uk import Simulation
print("policyengine-uk", version("policyengine-uk"))
Y = 2026
for label, age, edu in [("A: age 4, PRIMARY (reception)", 4, "PRIMARY"),
("B: age 4, PRE_PRIMARY", 4, "PRE_PRIMARY"),
("C: age 4, no education input", 4, None)]:
child = {"age": {Y: age}}
if edu:
child["current_education"] = {Y: edu}
people = {"parent1": {"age": {Y: 35}, "employment_income": {Y: 40_000}},
"parent2": {"age": {Y: 35}, "employment_income": {Y: 30_000}},
"child": child}
sim = Simulation(situation={
"people": people,
"benunits": {"bu": {"members": list(people)}},
"households": {"hh": {"members": list(people), "country": {Y: "ENGLAND"}}},
})
print(label, "| current_education:", sim.calculate("current_education", Y)[2])
for v in ("universal_childcare_entitlement", "extended_childcare_entitlement_per_child"):
print(f" {v}: £{sim.calculate(v, Y)[2]:,.2f}")policyengine-uk 2.146.2
A: age 4, PRIMARY (reception) | current_education: PRIMARY
universal_childcare_entitlement: £3,767.70
extended_childcare_entitlement_per_child: £3,767.70
B: age 4, PRE_PRIMARY | current_education: PRE_PRIMARY
universal_childcare_entitlement: £3,767.70
extended_childcare_entitlement_per_child: £3,767.70
C: age 4, no education input | current_education: NOT_COMPLETED_PRIMARY
universal_childcare_entitlement: £3,767.70
extended_childcare_entitlement_per_child: £3,767.70
Each line is 570 hours × £6.61 (15 hours a week); A should get £0. C shows the age fallback with no input.
Proposed change
- A Person boolean such as
early_years_child_in_school(name open):current_educationisPRIMARYor later, and settable directly. - Add
& ~early_years_child_in_schooltouniversal_childcare_entitlement_eligibleandextended_childcare_entitlement_qualifying_child. Both need it, because Preserve universal and targeted hours alongside extended childcare #2177 splits a child's hours between them. Scotland's eligibility and the Wales PR Add the Childcare Offer for Wales #2535, which has the same gap, can reuse it. - Inputs without
current_educationstay unchanged, since the fallback gives 4-year-oldsNOT_COMPLETED_PRIMARY; a!= PRE_PRIMARYtest would drop every no-input 4-year-old. - Approximations: an annual model has no September switch, and
PRIMARYincludes fee-paying independent pupils, who can override the flag. - Tests: age 4 with
PRIMARY,PRE_PRIMARYand no input; a family whose only child is in reception, and one with a 2-year-old too;test_childcare_entitlement_floor_properties.py. Coordinate with Make current_education and maintenance loan evidence independent of calculation order #2403, which rewritescurrent_education.
Data notes
- policyengine-uk-data (
frs.py) and Microcosm setPRIMARYfrom FRSTYPEED2(code 2 is primary including reception), neverNOT_COMPLETED_PRIMARY. For a 4-year-old that means reception at interview, carried into projected years; code 8 (any private school) can include independent nurseries. - Two mapping problems, a branch that puts some 4- and 5-year-olds in
LOWER_SECONDARYand Microcosm's silent zero fill for a missingTYPEED2, will be raised in those repositories; they are why the variable countsPRIMARYor later. - policyengine-uk-data's take-up fit counts reception children (
takeup_rate.py) against a DfE figure that excludes them (targets.py), so its childcare take-up rates need a refit once this lands.
Evidence
- DfE (January 2026). The 1.13m 3- and 4-year-olds registered for universal hours include 375,700 in state-funded reception, where DfE treats the entitlement as met. Its count for early years entitlements only (751,000) excludes them. Working-parent registrations have no reception rows, and the methodology removes reception children before estimating working-parent eligibility.
- Vahid's rerun on Microcosm a858c100 with policyengine-uk 2.134.4: 515k 3- and 4-year-olds on working-parent hours with reception children counted and 379k without, against DfE's 388.7k. 2026-27 early-years spending was £10.72bn as shipped against DfE's £9.9bn, with the reception children and the then-lower funding rates working in opposite directions.
Related: 9-11-month-olds
Working-parent hours start at 9 months (SI 2022/1134 reg 13), from the next 1 January, 1 April or 1 September (reg 27). The engine's rule is right and works for fractional ages, but survey ages are whole years, so no child aged 0 qualifies. DfE counted 30,700 registered 9-11-month-olds in January 2026; in Vahid's rerun, under-3s on working-parent hours were 438k against DfE's 501.7k, about 31k of the gap at 9-11 months.
The FRS has no birth month, so this belongs in policyengine-uk. The engine already spreads whole-year ages over the year (months_since_last_birthday, exact_age_in_months). Exact age alone would overshoot, because funding starts only at the next term. The rule should credit the share of the year's terms that start after the child turns 9 months, which also corrects age 1. It is here because the age rules are best tracked together, as Vahid asked.
Already upstream
DfE funding rates (#2465, first in 2.137.1), pension relief in adjusted net income (#2440, 2.134.8), and salary sacrifice above the April 2029 NI cap no longer raising adjusted net income (#2462, 2.141.8).
Context
Found while reconciling the static cost of removing the £100,000 limit with CenTax's (PolicyEngine/uk-childcare-100k-threshold#8, PolicyEngine/microcosm#1339). PolicyEngine/microcosm#1338 leaves reception children out of Microcosm's DfE targets; the engine still funds them.
Related: #2079 (added the age-only qualifying-child test), #2177, #2403, #2535, #1644, #2183, #2243, PolicyEngine/policyengine-uk-data#474, PolicyEngine/policyengine-uk-data#547 (ages in months for children aged 0, on the data side).
@vahid-ahmadi, this is the issue you offered to open on PolicyEngine/uk-childcare-100k-threshold#8, with the 9-11-month-olds included.
Activity