Repository navigation
Build the national + local-area pair on policyengine-uk 2.151.0, and drop UK model-figure withholding - #1396
juaristi22 wants to merge 15 commits into
Conversation
The first national on policyengine-uk 2.151.0 failed release-cut certification on uk_take_up_signal alone: the under-2 usage share (max_free_entitlement_hours_used, over the children of DfE age 0 or 1 in units that claim the working-parent hours) sat just past 0.05 from its ages' weighted contract rate. On the spine's own weights the draw meets its rates. DfE's working-parent row at 9 to 11 months binds a thin cell of that draw's children, and the calibrated weights that fit the row move the share further from its rates than they move any other flag's. By María's ruling of 2026-10-25 the row stays bound and this one share takes its own bound (under_two_usage_maximum_share_deviation 0.10); every other flag keeps 0.05. The gate report records each flag's bound, and the binding routes the new parameter. The battery and release-cut gate digests are re-pinned; the spine, calibration-seam and dense local-gate digests do not move. The battery-bindings fixture's take-up stub takes the real binding's parameter keys. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1383 moved the engine to 2.151.0 without refitting the six childcare rates, which were fitted on 2.147.2. The tool-version-7 fitter, run on the release-candidate spine built at fe1e2ad (feed abf0921), gives Tax-Free Childcare 0.9134 (was 0.9697), working-parent hours 0.8217 (0.8262), targeted hours for 2-year-olds 0.8687 (0.6551) and under-2 usage at DfE age 0 0.7000 (0.6962); age-1 usage stays at its upper bound and the conditional universal rate at its lower bound, with their reasons restated on the new fit. The targeted rate rises because 2.148.1 reads Universal Credit earnings before the work allowance, so fewer families qualify for the targeted two-year-old offer against the same DfE count; on the old rate the national calibration fitted that row by reweighting. Folded into the pair's rebuild by María's ruling of 2026-10-25. The fit overrides the take-up columns and reads only the stored ages and months, so the spine the rebuild draws on this contract leaves it valid. The H2 spine fixture's stage-contract digest moves; the coverage manifest does not. The contract test's rate pins follow the refit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@juaristi22, a heads-up before I touch anything near this PR. Max ruled on 25 October (d2013, d2014) that CenTax's HMRC tabulations of parents' incomes become Microcosm UK calibration targets before the £100k childcare dashboard is republished, so I'm adding them. The work goes on a new branch stacked on this one (head 67ee2dd). I won't push here. What I'm adding:
The design calls go in the PR body for your sign-off: the bands, ageing the 2021-22 figures to 2025, CenTax's parent identification against the FRS, and its child definition against For numbers, I'll rebuild the spine at 67ee2dd on our side and check it against your a6299504 input ( |
|
@juaristi22, a question about the pair's certification, from the UK hub (25 Oct, 23:30Z). Max ruled on d2011 (option A): certify your 2.151.0 national and its local-area cut together, by Tue 27 Oct 18:00Z. If that misses, the fallback is a133 with #699's area routing (policyengine.py#715). Your national is now a Hugging Face tag: Two questions:
For whoever writes it, the triple-lock repo (uk-triple-lock#39) checks two things in the bundle:
It also asks whether the bundle can declare the calibration year. The build's |
The first dense build on policyengine-uk 2.151.0 produced no gate report: the differencing check behind the model-figure withholding, which since #1383 runs over each region's rows of every grain and each local family with its parents, ran for hours on the dense surface and then failed to converge in an eigendecomposition. By María's ruling of 2026-10-26, --withhold-thin-rows-only keeps the withholding of the rows resting on fewer than ten source households and skips that check, in the calibrated gates, the diagnostics writer and the run's evidence summaries, so each BRMA row's carrier verdict stays true to its count. The gate code it would otherwise change is shared with the source preflight, which keys the solve, so the build command arms the switch at run time and records it on the calibrated gates node and in the build request: only that node and what follows it re-key, and a retry with --require-solve-reuse replays the stored solve. It needs --no-publish-orrery, and the national role refuses it; a default request is unchanged byte for byte. Tests cover the refusals and that only the calibrated gates node is marked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since María's rule of 2026-10-21 a thin national or regional row is withheld as a local cell is, so targets.csv leaves its figures blank. The drafter refused any such row ("targets.csv withholds a national row"), and it held the national fit gate's withheld count to the national rows alone, where the gate counts the surface's whole withheld set (its parity evidence carries it). It now splits withheld national rows out beside the local ones, signs none of them, matches each gate's count and compares both sets between the builds. The test fixture's national gate counts the whole set, as the binding does, and a new test withholds a national row.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Drafted by tools/draft_uk_dense_signoff.py from the dense build-1 attempt uk-local-candidate-f100-s42-20261026T091056Z-824870f6 (the retry at 7dac4c3 with --withhold-thin-rows-only), approved on 2026-10-26 by juaristi22 under her standing instruction for this release: one national target-fit row and six local target-fit cells added, the entries still earned kept, and ten national and fourteen local entries the build no longer earns retired. Every entry is scoped to the local line and suppresses only its release fence; the rows stay bound in the solve. The reuse build runs at this commit with gate clock 2026-10-26. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The national (a6299504, built at 67ee2dd) and the local-area release (c9df4b86, built at ee178eb) are published, so the branch takes main by a merge, keeping both build commits in its history. Main and the branch had each re-pinned the gate-battery and release-cut digests and regenerated the H2 spine fixture: the digests are re-pinned on the merged gates.json (the spine, calibration-seam and dense local-gate digests do not move) and the fixture is regenerated on the merged stages; the coverage manifest is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A UK build that staged to Hugging Face submitted its saved graph to the public Orrery by default, and --no-publish-orrery turned that off. By María's ruling of 2026-10-26 the submission now happens only on --publish-orrery, whatever the staging; --no-publish-orrery states the default. Staging to the private repositories is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
By María's ruling of 2026-10-26 the UK releases go only to the licensed private repository, whose users need the full diagnostics, so a build no longer withholds model figures (microcosm#1262, #1383): - A target row resting on fewer than ten source households, and a row that would give one back by difference, keep their estimates and errors in the calibration diagnostics, targets.csv, the dense and national gate reports, the national calibration evidence and the run's evidence summaries. - The fit gates judge every row; no binding counts withheld rows, and no report guard looks for one. - Totals, losses and the size receipt are the solve's own, and staged epochs carry their loss again. - BRMA rows carry no carrier verdict, and the release contract no longer warns about one. This removes the thin-row count, the differencing check (its block spans, residual search and eigendecompositions, which ran for hours on the dense surface and then failed to converge) and --withhold-thin-rows-only. The withholding code is gone from the gate modules, so the next dense build re-solves. Release certification refuses a run built while rows were withheld, rather than judging it without them; the release contract still checks the withheld rows of earlier releases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
By María's ruling of 2026-10-26 the dense releases ship per-area support figures again (microcosm#1301), since they go only to the licensed private repository: - The area-support gate states an area's rows, Kish ESS and distinct sources beside the floors it misses, in its failures and its reviewed exclusions, and reports each level's minima beside its counts. - The diagnostics' weakest-area and support-limited rows carry the figures beside support_below_floor. - The candidate manifest's support block states the minima. The release contract no longer walks a release directory for these figures, and neither does the candidate pre-flight or the sign-off drafter's verify over the signed report, so no dense release raises a contract warning. The walk itself stays for the drafter, whose drafted entries go into a public pull request. --publish-orrery's help says the gate summaries now carry the figures too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@juaristi22 round 1, at Verdict: nothing record-level is newly published, and the default path is safer than before. One must: Privacy and disclosure What I checked:
Must
Should
Childcare refit
What I ran
Aggregates only. 🤖 Generated with Claude Code |
By María's ruling of 2026-10-26 a small-cell rule may only flag. Two stages refused, and several spine gates failed, on a figure a receipt prints "<10". - The gambling top-up refused a key whose donor recorded stakes on fewer than ten households, or left fewer than ten without. It now refuses only below the two a side its stratified fit needs. - The annual-income stage refused a pay ratio fewer than ten households report. It now refuses only when none does, and its receipt prints the ratio "<10". - The gambling gate failed a key whose national shares the receipt withholds. The property-purchase gate errored on a kind's banded figures, and the UC take-up gate failed a banded caseload. The annual-income gate failed a banded ratio, and the regional home-value gate errored on a banded region count. Each now passes on what it cannot read and names it in its details. The excise and legacy-closure gates already passed on their banded figures and now name them too. Counts a gate requires to be zero, and the declared donor-support floors, fail as before. A band in either still tells a failure apart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The summaries are what --publish-orrery submits to the public Orrery. Since the build stopped withholding thin rows, nothing marks the rows resting on fewer than ten source households, so the summaries could publish their figures (Vahid's review of #1396, M1): - a calibration summary keeps each target row's target, tolerance and source, but no row's estimates or errors; - the size summary keeps the losses over every row, but not the largest change in one row; - a gate summary keeps each gate's verdict and its count of failure lines, but not the lines, which can state a row's figures or an area's support. The build's private diagnostics and gate reports keep all of them. The export checks the summaries before it preserves anything for publication, and stops with the unpublishable_summary error code if one carries either. With no preserved inventory, neither the build nor the emitter's retry command can submit them. The --publish-orrery opt-in stays, as María chose. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The staged bundle carries the build's full diagnostics, and its repository id can come from POPULACE_UK_STAGED_DATASET_REPO_ID or --staged-dataset-repo-id (Vahid's review of #1396, S1): - the pre-flight refuses to start a remote dataset stage when the Hub does not report the repository as private, before the spine is read; - the upload itself, shared by the build, the failure-evidence bundle and the manual stage tool, refuses with REPOSITORY_UNAVAILABLE before anything is read or written. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@vahid-ahmadi Thanks for round 1. M1 and S1 are fixed on this branch (0862fc5, eddb636), and the body is updated for S2 and S3. S4 is below. M1.
The guard. Tests:
S1. Staging checks that the repository is private.
S2. Disclosure. The body's Disclosure section now covers commits 8 to 12. Only people with a UKDS licence can read S3. The under-2 usage signal. The measured absolute deviation from the rates' expectation:
By María's ruling the bound stays at 0.10. The body's commit 1 now states both deviations. S4. Engine against spine. I ran the same fitter (tool version 7) on the old spine (6aea1ec) under 2.151.0, and compared it with the two committed fits. The pools are the fitter's ceilings at a take-up rate of 1, on the spine's own weights, to the nearest 1,000.
The fitted counts barely move, as you noted, so these pools are what the rates moved against. Downstream. Agreed: the £100k dashboard reruns once this lands. Aggregates only. |
|
@juaristi22 round 2, at Verdict: M1 and S1 are fixed in code and tested, S2 and S3 are in the body, and the S4 answer settles it. Nothing here blocks. Three shoulds and a nit below. One of them is a gap I left in round 1: S1 named only the dataset repository, not the telemetry one. Round 1 status
New
Childcare effects: unchanged. What I ran
Aggregates only. 🤖 Generated with Claude Code |
The ratio's bounds are a plausibility check on the two pay concepts, but on one to nine reporting households a ratio past them is noise, and it could still stop a sample build (Vahid's second review of #1396). Such a ratio is now held to the bounds; the receipt still prints it "<10" and the gate reads it unmeasured. On ten or more households a ratio past the bounds still refuses, since there it means the concepts do not line up. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This reverts commit eddb636. By María's ruling of 2026-10-26 the build's publishing behaviour stays as it was: a build must not be kept from staging by a new Hugging Face request, and disclosure is handled with the outputs' consumers. The dataset pre-flight and stage_bundle no longer ask the Hub whether the repository is private. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@vahid-ahmadi Thanks for round 2. The nit is fixed (93694c6) and S7 needs no deletion. S5 and S6 are not taken, and S1's check is reverted (2e01592), by María's ruling: the build's publishing behaviour stays as it was, and she handles disclosure with the outputs' consumers. The body is updated. S5. Not taken. A new Hugging Face request must not keep a build from staging. For the same reason S1's check is reverted: the dataset pre-flight and the upload no longer ask the Hub whether the repository is private, and behave as before. The body's Disclosure section now names S6. Not taken, on the same ruling. The M1 guard stays as it is. The providers still strip the figures at source. S7. No preserved directory from commits 8 to 10 exists.
Nit. On one to nine reporting households, a pay-concept ratio past its plausibility bounds is now held to them rather than stopping the build. The receipt still prints it "<10", and the gate reads it as unmeasured. On ten or more households it still refuses, since a ratio past the bounds there means the two pay concepts don't line up. Aggregates only. |
|
@juaristi22 round 3, at Verdict: one must, S6. We have raised it since round 2, for the reason below. The nit and S7 are closed. S1 is reopened by the revert and, with S5, stays a should. I won't press either if you keep your ruling, but the reason given doesn't hold for the pre-flight. CI has not run at this head. Status
New since No new findings. The revert is clean: no CI No workflow has run at What I ran
Aggregates only. 🤖 Generated with Claude Code |
The branch takes main by a merge, keeping both published builds' commits in its history. Main and the branch had each re-pinned the gate-battery digests and regenerated the H2 spine fixture: the policy, gates-manifest and spec-fingerprint digests are re-pinned on the merged gates.json (the under-2 usage bound and #1400's gambling stake scale both in it), and the fixture is regenerated on the merged stages. The certification part and dense local-gate digests do not move. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@vahid-ahmadi Thanks for round 3. Main is merged in (d8ed5a2), so the PR no longer conflicts and CI can run. S6, S1 and S5 are not taken, by María's ruling: the build's publishing behaviour stays as it was, and she handles disclosure with the outputs' consumers. S6. The guard stays as M1 left it. The providers still strip the figures at source. S1 and S5. Reading CI. The conflict was main's #1400 (policyengine-uk 2.162.3). Both sides had re-pinned the gate-battery digests and regenerated the H2 spine fixture.
Aggregates only. |
Summary
The UK national + local-area (dense) pair on policyengine-uk 2.151.0, built after #1383 merged (main at fe1e2ad), and the fixes it needed. Both releases are published to the inspect lane in
policyengine/populace-uk-private:microcosm-uk-2024-25-national-20261025T091414Z-a6299504microcosm-uk-2024-25-dense-20261026T105309Z-c9df4b86Both stand on one release-candidate spine. The national is promoted (
latest-national.json); the dense release moves no pointer. Merge with a merge commit, so both build commits stay in main's history.The last eight commits change the next build, not these releases. By María's rulings of 2026-10-26:
After Vahid's review, the Orrery summaries carry no row's figures or failure lines. Publishing to Hugging Face is otherwise unchanged: a check that refused to stage to a repository not reported as private was reverted (María's ruling of 2026-10-26).
Commits
802c9c2: the under-2 usage signal takes its own bound of 0.10. The first national at fe1e2ad failed release-cut certification on
uk_take_up_signalalone. The under-2 usage share sat 0.0516 from its rates' expectation, just past ±0.05. On the spine's own weights the draw meets its rates; DfE's working-parent row at 9 to 11 months binds a thin cell of that draw's children, and the calibrated weights move the share. By María's ruling of 2026-10-25 the row stays bound and this one share takes ±0.10; every other flag keeps ±0.05. The battery and release-cut digests are re-pinned. The national rebuilt at 67ee2dd sits 0.0521 away and passes. After Vahid's review María kept the bound at 0.10.67ee2dd: the childcare take-up rates are refitted on 2.151.0 (María's ruling of 2026-10-25):
Age-1 usage and universal hours stay at their bounds. The national was rebuilt here and certified, 19 of 19 release-cut gates.
7dac4c3:
--withhold-thin-rows-onlyfor the dense build (María's ruling of 2026-10-26). The first dense build's calibrated gates ran the model-figure withholding for hours, then failed in an eigendecomposition that did not converge: the differencing check, which since Lock policyengine-uk 2.151.0 and write the UK inputs it reads (#1095, #1278) #1383 runs over each region's rows of every grain and each local family with its parents. The switch kept the thin rows' withholding and skipped the differencing check, so the retry reused the stored solve. Commit 8 removes the switch with the rest of the withholding.d6449fc: the sign-off drafter reads withheld national rows. It refused any (thin national rows were withheld from María's rule of 2026-10-21), and held the national fit gate's withheld count to national rows, where the gate counts the surface's whole set. It still reads the builds made while rows were withheld.
ee178eb: the gate-only sign-off of the retried dense build 1:
Entries are local-line only. The assembly deadline is 2026-11-16, when the earliest of the kept entries expires.
9b71d42: main merged in after both releases were published. The gate digests are re-pinned on the merged
gates.jsonand the H2 fixture is regenerated.5ff449d: UK graph evidence stays off the public Orrery unless asked. A build that staged to Hugging Face published its graph by default. It now publishes only on
--publish-orrery, and--no-publish-orrerystates the default. Its help warned that, after commits 8 and 9, the summaries would carry every row's model figures and the gates' failure lines; commit 11 takes them out.58560fd: UK builds no longer withhold model figures (UK private rent at the assigned area (#1123 item 4, "PR B"): what is in place and the pieces still missing #1262, Lock policyengine-uk 2.151.0 and write the UK inputs it reads (#1095, #1278) #1383):
targets.csv, the dense and national gate reports, the national evidence and, until commit 11, the evidence summaries.This removes the thin-row count, the differencing check and
--withhold-thin-rows-only. Release certification refuses a run built while rows were withheld, rather than judging it without them. The release contract still checks the withheld rows of earlier releases.6ed063a: dense releases ship per-area support figures (UK local-area release: publish a K=15, 150,000-household dense dataset in at most two builds #1301):
dc50c4b: a stage receipt's small-cell rule flags, never fails.
0862fc5: the graph summaries carry no row's figures or failure lines (Vahid's review, M1).
--publish-orrerystays opt-in, and the summaries are what it submits.unpublishable_summaryand writes no inventory, so neither the build nor the emitter's retry can submit it.targets.csvand the gate reports keep everything.eddb636: dataset staging refuses a repository that is not private (Vahid's review, S1). Reverted by commit 14.
93694c6: a thin pay-concept ratio is held to its bounds (Vahid's second review). On one to nine reporting households, a ratio past its plausibility bounds is held to them and flagged, rather than stopping the build. On ten or more it still refuses.
2e01592: commit 12 is reverted. By María's ruling of 2026-10-26, a new Hugging Face request must not keep a build from staging, and disclosure is handled with the outputs' consumers. The dataset pre-flight and upload behave as before commit 12.
Builds
All local and licensed; the outputs stay with the runs.
--require-solve-reuse) and blocked only by gate-only fit failures. The reuse build at ee178eb passed every release-blocking gate. Verify found the solve reused and no row differing, the pre-flights and assembly passed, and it was published 2026-10-26.The next build
--withhold-thin-rows-onlymust drop it; the flag is gone.Tests
Run locally on the touched surfaces:
--publish-orrery, and a build whose summary provider regresses), the calibration graph's summaries, dataset staging, the rowwise candidate and national role, and the build CLI;The withholding tests are replaced by ones that a thin row keeps its figures and is judged, through the real bindings and the gate kernels. CI runs the full suites.
Replays on real data. The merge stops the stored solves from being reused at this head. So the gates were replayed with commits 7 to 9 applied on each published build's own commit, on its stored solve: the solve came from the graph store and the gates ran on the new code. All the outputs stayed local.
uk_target_fitjudged every row, the 69 that were withheld included, and passed. No gate changed.Disclosure
No figure in this description rests on fewer than ten source households or names a record. The rates are the contract's, the under-2 deviations are aggregate shares, and the sign-off counts are register entries.
From commit 8 on, the builds' private outputs carry figures for rows and areas resting on fewer than ten source households. They go to
policyengine/populace-uk-private, which only people with a UKDS licence can read; the telemetry's fit summary goes topolicyengine/populace-uk-staging. María handles disclosure with the outputs' consumers, the calibration-diagnostics dashboard included, separately.Public outputs keep their checks: the Orrery is opt-in and its summaries carry no row's figures or failure lines (commit 11), and the drafter refuses a figure in a public register entry.
🤖 Generated with Claude Code