Release prep 1.1.1 — the bump, and the release guard made live in CI - #275
Merged
Conversation
…ve in CI THE VERSION. 1.1.1, a patch, measured rather than assumed. The only external imports of this package anywhere in the org are UNFAOPostProcessorManager and CRAFDPostProcessorManager, from views-models' un_fao/main.py and un_crafd/main.py, and both paths are unchanged. Nothing outside this repo imports track_a_source, frames_for_target, store_port or _ContractStorePort — so #269's frames_for_target signature change breaks no consumer. No new capability; two bug fixes and an internal refactor. It is earned this time: three merged stories changed code under views_postprocessing/ for the first time since 1.1.0. On 2026-08-13 the trees were byte-identical and no tag was cut, which is why that release did not happen. The version still has exactly one home, pyproject.toml:3 — no __version__, no CHANGELOG. Re-checked rather than remembered, because C-80 and C-82 were both a version declared twice with a guard on one copy. THE GUARD WAS INERT WHERE IT MATTERED. tests/test_release_version.py exists because tag 1.1.0 was cut at main while pyproject.toml still said 1.0.0. But run_pytest.yml checks out with actions/checkout@v3 and no fetch-depth, so CI fetches NO TAGS and both of its tests skip there. It has only ever run on a laptop — a guard against mis-cutting a release that is absent from the one place a release is verified. Demonstrated, not asserted. A shallow --no-tags clone (CI's default shape) skips both with "no release tags in this checkout (a shallow clone, or none cut yet)". A full clone runs them, and setting pyproject back to 1.0.0 against the 1.1.0 tag fails with "the newest release tag is 1.1.0 but pyproject.toml declares 1.0.0" — the original defect, caught. fetch-depth: 0 is for the tags, not the history; the comment says so, because the next person to see a full fetch in a small repo's CI will reasonably wonder. Suite 457 passed / 1 skipped / 39 xfailed, ruff clean. The release guard locally: the newest-tag check passes (1.1.0 <= 1.1.1), the tagged-commit check skips because HEAD is not tagged yet — which is the correct state before S3. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…laims Review of the release prep. Making the guard live in CI was right; it would have made it fire on branches that had done nothing wrong. THE GUARD ASKED THE WRONG QUESTION. `git tag -l` lists tags on every branch, so the check was "has a release been cut anywhere", not "has one been cut from THIS line of history without the bump". Invisible while CI fetched no tags; a false alarm the moment it started. Reproduced in a clone: with 1.1.1 tagged on the release line, a branch still declaring 1.1.0 — an honest feature branch, or a hotfix cut from 1.1.0 — fails with "the newest release tag is 1.1.1 but pyproject.toml declares 1.1.0". It has done nothing wrong; the tag simply is not on its history. `git tag --merged HEAD` asks the right question. Same clone, same branch: tags anywhere are 1.0.0 1.1.0 1.1.1, tags reachable are 1.0.0 1.1.0, and it passes. On the tagged line it still bites both ways — setting pyproject back to 1.1.0 with 1.1.1 reachable fails both guards with their own messages. ADR-014 §3 prefers a false negative to a false alarm. I was about to activate a guard whose first act would have been to redden unrelated work, and a guard that does that is one someone deletes. "C-80 AND C-82 WERE BOTH A VERSION DECLARED TWICE WITH A GUARD ON ONE COPY" IS FALSE. C-80 is the doc-accuracy scan exempting ADRs and CICs; C-82 is governance prose carrying numbers nothing checks — the same class as this, a number with no guard, but about the register and CIC front matter, not a version declared twice. The claim originated in this test's own docstring on 2026-08-13 and I repeated it into a release PR without reading either entry. Corrected at the source, with a note saying so, since the docstring is where the next person will read it. "THREE MERGED STORIES CHANGED CODE UNDER views_postprocessing/" IS FALSE. Two did — #268 (ff0278b) and #269 (70f25f0). #265 (0d38a71) touched tests and the register only. Three stories merged; two changed package code. The version conclusion is unaffected: a patch was earned by those two. Suite 458 passed / 1 skipped / 39 xfailed, ruff clean. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
Two changes, no package code. Step 1 of Bump → Merge → Tag → Release → Verify.
The version: 1.1.1, a patch
Measured rather than assumed. The only external imports of this package anywhere in the org are
UNFAOPostProcessorManagerandCRAFDPostProcessorManager, from views-models'un_fao/main.pyandun_crafd/main.py— both paths unchanged. Nothing outside this repo importstrack_a_source,frames_for_target,store_portor_ContractStorePort, so #269'sframes_for_targetsignature change breaks no consumer.Review independently re-ran that search across every sibling repo on disk and confirmed it, adding one fact that lowers the stakes further: consumers pin this package by git tag in shell launchers, not by a semver range in a lockfile — so no resolver acts on this number at all.
No new capability; two bug fixes (#268, #269) and an internal refactor. That is a patch. There is no stated versioning policy to violate:
docs/ADRs/004explicitly defers the question.The version has exactly one home,
pyproject.toml:3— no__version__, no CHANGELOG.The guard was inert exactly where it mattered
tests/test_release_version.pyexists because tag1.1.0was cut atmainwhilepyproject.tomlstill said1.0.0. Butrun_pytest.ymlchecked out with nofetch-depth, so CI fetched no tags and both of its tests skipped there — verified against a real CI log (run31844578627, the lastdevelopmentpush before this branch, showstests/test_release_version.py ss).fetch-depth: 0fixes it. Confirmed fromactions/checkout@v3's own source rather than its README: on thefetchDepth <= 0path it fetches+refs/tags/*:refs/tags/*unconditionally, and--no-tagsis only appended when the refspec lacks that.fetch-tagsis irrelevant here — it only applies when depth > 0. This branch's own CI run now showss.instead ofss.What review caught, and it was worth catching
The guard asked the wrong question.
git tag -llists tags on every branch, so the check was "has a release been cut anywhere", not "has one been cut from this line of history without the bump". That was invisible while CI fetched no tags — and would have become a false alarm the instant it stopped being. Reproduced in a clone: with1.1.1tagged on the release line, an honest branch still declaring1.1.0fails with "the newest release tag is 1.1.1 but pyproject.toml declares 1.1.0". It has done nothing wrong; the tag is simply not on its history.Now
git tag --merged HEAD. Same clone, same branch: tags anywhere are1.0.0 1.1.0 1.1.1, tags reachable are1.0.0 1.1.0, and it passes — while on the tagged line it still bites both ways. ADR-014 §3 prefers a false negative to a false alarm, and I was about to switch on a guard whose first act would have been to redden unrelated work.Two false claims of mine, both corrected:
views_postprocessing/" — two did (_ContractStorePort.download fails open where upload refuses — C-79's untreated sibling #268, _ShardLease.load holds every shard of a target in memory at once — the forecast leg's #126 #269). C-89's two orphaned deferrals: relocate the leak guards, and point the rename proof at its subject #265 touched tests and the register only. Three stories merged; two changed package code. The patch conclusion is unaffected.And one in the second commit message itself: it says "Suite 458 passed". The run in that same turn printed 457, and that commit adds no test. 457 is correct — recorded here because the commit message cannot be corrected without a force-push, and because a PR about false numbers should not quietly carry one.
Verification
ruffclean; 457 passed, 1 skipped, 39 xfailed.The release guard locally: the newest-tag check passes (
1.1.0 <= 1.1.1), the tagged-commit check skips because HEAD is not tagged yet — the correct state before the tag is cut.Refs #125.