Repository navigation
Conversation
towncrier writes a fragment to CHANGELOG.md only when its name carries a configured type; any other file in changelog.d is never read or deleted, and an empty fragment is left out. Add a Changelog fragments check that fails a PR adding or changing such a file, and make bump_version.py count only the fragments towncrier consumes, warning about the rest. Refs #2314 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each was added by a merged PR whose release is on PyPI (2.86.1 to 2.99.1), but towncrier never consumed it, so none of their notes reached CHANGELOG.md and every versioning run since counted them. Converting them to typed fragments now would file old notes under the next version. The PR lists each file with its PR, merge date, release and note. Refs #2314 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Property and differential tests: bump_version reads the same config and names as towncrier (parse_toml, parse_newfragment_basename, find_fragments) across six configurations; every name the check accepts towncrier consumes with that type; the real towncrier build renders exactly the fragments the check accepts; the check on a real git repository fails exactly the files towncrier would drop or that would stop the build; and the bump depends only on typed fragments. Also catch two fragments that share towncrier's key, which stops towncrier build and the release. Refs #2314 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #2314 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2324 makes bump_version.py count only the fragments towncrier consumes and exit when there are none. prepare_release.py now uses that script's own classification when it has one (so a commit with only untyped files releases nothing) and counts every file otherwise, as before. The tests pass with main's bump_version.py and with #2324's, so the two pull requests can land in either order. Based on the patch from #2324's session. Also merges #2303 (the stale #1968 xfail), which this pull request's own check rejects as an XPASS until it lands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rigger Sol's review of #2324 (~/reviews/uk-changelog-fragment-check-2026-10-11): - the test file tripped the cached-array scanner (.partition on a call result); parse annotations with a regex instead; - say a name has no towncrier type only when towncrier reads none; other forms it consumes (x.fixed.1.md, x.fixed) are named as such; - a non-UTF-8 fragment is written with replacement characters, not dropped; - reject symbolic links, submodule entries and non-UTF-8 file names; - a type called md no longer breaks 'accepted means consumed as shown'; - bump_version refuses towncrier.toml, sections and issue_pattern, follows the project-name package fallback, and stops where towncrier build is strict (ignore configured); its annotations are escaped; - fail a PR that starts the release workflow with no typed fragment left; - tests for each, and for the five mutants that survived. Refs #2314 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Infra backlog hand-off (23 October 2026).
|
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in Notes
Moves flagged for reviewNone. Spending by benefit and service
Caseloads
Standard reform costings (change in gov_balance)
Standard reforms: change in each reform's target
Household net income by decileNo household's net income changes in any year. No change in any year: receipts by tax head; government balance, each component counted once; model totals; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles. Checks failing on both base and head (1)
Counted-once checkEach of 85 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.
Provenance
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
Retain tomllib and dataclass imports. Supply Towncrier configuration to the newer-main version-bump fixture and require the intended lock failure diagnostics. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes #2314. Also fixes the fragment example from #2162 (item 3).
The Changelog fragments check rejects added/changed notes that towncrier drops or mishandles: missing/unknown types, blank or non-UTF-8 content, links/submodules, nested paths and duplicate towncrier keys.
bump_version.pycounts only typed fragments and warns about untyped files. The original 93 obsolete untyped files remain deleted; the independent infra3 review audited their notes and releases, and found no unreleased change requiring conversion.Merged current main first, preserving its release preparation and required
Test / Resultrouting. Addressed the independent review's P2: after a release consumes all fragments, a dependency-only manifest update can pass without a synthetic release note. The checker examines every changed path and compares parsed TOML. It permits onlyuv.lockand actual changes toproject.dependencies,project.optional-dependencies,build-system.requiresordependency-groups; all other TOML values and types must match. Deletions, renames, mode/type changes, mixed source/workflow changes and version/backend/Towncrier edits do not qualify. Added fragments still receive all existing validation.This is a semantic exception for every author, including Dependabot, and it works identically on pull-request and merge-group diffs. A PR-author-only workflow skip would fail again in a merge queue, which has no PR-author context. The Changelog workflow therefore remains active, with no bot/job exemption. Main's
prepare_release.pyalready returns a safe no-release result when no typed fragments remain; it does not call the bump script or publish an empty dependency release. AGENTS, the PR template and engineering guidance describe the same bounded exception.Validation: the independent
review_tests/test_2324_automation.pydependency-only reproducer failed before the fix and passed unchanged afterward (1 case each). The new focused coverage checks permitted dependency fields and lock-only updates, rejects mixed/configuration/version/mode/type/deletion/rename changes, preserves bad-fragment failures, and checks both workflow event types. 124 focused cases passed in 161.56s across changelog fragments, release preparation and theTest / Resultworkflow contract. After making dependency fixtures independent of current version pins, 27 final cases passed in 77.25s (all 26 new regressions plus the independent reproducer). There are 125 distinct passing cases and no skips. CI links are in the hand-off.Locked Python 3.13/core 3.33.2, foreground
pytest -n 2, BLAS/OpenMP 2 and required load/disk/compressor gates. Formatting, lint, F811/F821 and actionlint are checked before the single push. Documentation edits are contributor guidance; the full book build is not needed for this change. No model, simulation, Budget output or survey-data changes.Reproducer: policyengine_uk/tests/code_health/test_changelog_fragments.py::test_dependency_only_updates_pass_after_a_release
axiom: n/a: CI and changelog tooling
Independent review and landing remain with the hub. Repository administrators decide required-check settings; this job does not change them.