Open the 2.3 cycle, and record the ledger roster AGENTS.md missed - #480
Merged
Conversation
…issed Release checklist steps 8 and 9, run after 2.2.0 went to PyPI. - expected_since_2.2.0.toml, opened empty. DEFAULT_BASELINE and the ledger are coupled: _allowlist_for treats a missing file as a hard error, so the baseline cannot advance without it. - compare.py DEFAULT_BASELINE 2.1.0 -> 2.2.0. - VERSION (2,3,0) with PRE_RELEASE 'dev', so an install from master normalizes to 2.3.0.dev0 -- above 2.2.0, below 2.3.0, and never able to masquerade as the release it precedes. The docstring's own example moved with it. CITATION.cff stays at 2.2.0 by design: it names the last citable RELEASED artifact and lags for the whole cycle. - "* 2.3.0 - Unreleased" opened at the top of the release log. AGENTS.md step 8 named four rosters to enrol a new ledger in and I hit a fifth, _CROSS_RULE_WINNERS, as a red run after the other registrations were already in. Measured which are mandatory rather than guessing: THREE are keyed by filename and asserted by EQUALITY, so every ledger must appear even while empty (_SPAN_BEARING_RULES, _CORPUS_CLAIMS, _CROSS_RULE_WINNERS), and TWO are keyed by rule content and genuinely conditional (_HONORIFIC_SOURCES, _LATIN_ALTERNATION_SOURCES). Step 8 said "_CORPUS_CLAIMS always, and the others where they apply", which is wrong for two of the five and had _HONORIFIC_SOURCES filed with the mandatory ones. Rewritten under Required/Conditional headings, with _CROSS_RULE_WINNERS added and #452's reason for its equality check. Also records, at _CORPUS_CLAIMS, what a pure corpus RENAME looks like there -- names unchanged, roles unchanged, digest moved -- since that came up renaming de Mesnil Juan to Jean and the guard's message explains a growing count but not a moving digest. Verified: 6198 tests, mypy and ruff clean, docs clean. The gate against the newly published 2.2.0 reports intentional diffs 0, unexplained 0 -- master is byte-identical to what shipped, which is the correct reading on day one. 1.4.0 and 2.1.0 exit 0 at 226 and 106. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #480 +/- ##
=======================================
Coverage 98.66% 98.66%
=======================================
Files 45 45
Lines 3218 3218
=======================================
Hits 3175 3175
Misses 43 43 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release checklist steps 8 and 9, run after 2.2.0 went to PyPI.
Opening the cycle
tools/differential/expected_since_2.2.0.toml, opened empty.DEFAULT_BASELINEand the ledger are coupled —_allowlist_fortreats a missing file as a hard error, on the reasoning that an absent ledger classifies nothing and would make every diff report as unexplained — so the baseline cannot advance without it.DEFAULT_BASELINE2.1.0 → 2.2.0 incompare.py.VERSION = (2, 3, 0),PRE_RELEASE = "dev", so an install from master normalizes to2.3.0.dev0— above 2.2.0, below 2.3.0, and never able to masquerade as the release it precedes. The docstring's own worked example moved with it.* 2.3.0 - Unreleasedopened at the top of the release log.CITATION.cffdeliberately stays at 2.2.0: it names the last citable released artifact and is meant to lag for the whole cycle.The roster AGENTS.md missed
Step 8 named four rosters to enrol a new ledger in. I hit a fifth —
_CROSS_RULE_WINNERS— as a red run after the other registrations were already in, which is the worst time to find it.Rather than just add the missing line, I measured which rosters are actually mandatory:
_SPAN_BEARING_RULES_CORPUS_CLAIMS_CROSS_RULE_WINNERS_HONORIFIC_SOURCES_LATIN_ALTERNATION_SOURCESStep 8 said "enrol in
_CORPUS_CLAIMSalways, and in the others where they apply", which is wrong for two of the five, and it had_HONORIFIC_SOURCESfiled among the mandatory ones. Rewritten under Required, by filename / Conditional, by rule content headings, with_CROSS_RULE_WINNERSadded and #452's reason for its equality check recorded — a ledger with no rows had been indistinguishable from one needing none.Each roster does fail loudly and name itself, so this is self-correcting; but it is three separate red runs if you add them one at a time, which is what the rewrite is meant to prevent.
Also records, at
_CORPUS_CLAIMS, what a pure corpus rename looks like there — names unchanged, roles unchanged, digest moved. That came up renamingde Mesnil Juan→Jeanduring the release, and the guard's own message explains a growing count but says nothing about a moving digest.Verification
intentional diffs: 0, unexplained: 0— master is byte-identical to what shipped, the correct reading on day one of a cycle🤖 Generated with Claude Code