Open the 2.2 cycle's version: 2.2.0dev - #362
Merged
Merged
Conversation
The tree said 2.1.0 for the whole cycle, which had two costs. docs/conf.py reads __version__ directly and Read the Docs installs the default branch, so "latest" rendered 2.1.0 -- the release we shipped, not the one we are building. That is what prompted this. The second is the differential harness. Its version tell exists so a worker that silently resolved to the checkout cannot pass as the baseline, and with the tree and the 2.1.0 baseline wheel BOTH reporting 2.1.0 only the __file__ path told them apart -- the weak state test_tell_rejects_a_module_loaded_from_the_checkout documents in its own docstring, and the condition the worker_v1.py invocation trap exploited. A bare run now reads: tree: nameparser 2.2.0dev (.../nameparser/__init__.py) baseline: nameparser 2.1.0 (.../uv/environments-v2/...) Both halves discriminate again. PRE_RELEASE = 'dev' rather than a bare bump, because master must not claim to BE a release that does not exist. It normalizes to 2.2.0.dev0, which sorts above 2.1.0 and below 2.2.0, so an install from git can never masquerade as the release it precedes. The cost is on the tuple: VERSION is numeric by design, so it cannot carry the marker and `VERSION >= (2, 2, 0)` is already true here. It is public and its docstring invites that comparison, so the constant now says to use __version__ where the distinction matters. CITATION.cff deliberately stays at 2.1.0. It names the last citable released artifact, so it is the one version string that does not track the tree, and it lags on purpose until the next release. Nothing checks that -- no test, no CI -- so the checklist now says it outright rather than implying the two are kept equal. Release step 2 becomes "clear PRE_RELEASE" instead of "bump VERSION", and a new step 9 opens the next cycle's version alongside step 8's ledger. Both are cycle-open work; doing them together is what stops the tree and the docs drifting apart again.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #362 +/- ##
=======================================
Coverage 98.50% 98.50%
=======================================
Files 44 44
Lines 2883 2883
=======================================
Hits 2840 2840
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.
The tree has said
2.1.0all cycle. Two costs, one of which prompted this and one which is arguably the bigger.Read the Docs "latest" was stuck on the last release
docs/conf.py:66readsnameparser.__version__directly, and.readthedocs.yamlinstallspath: .from the default branch — so "latest" rendered the version we shipped rather than the one we are building.The differential harness's version tell was running on one cylinder
The tell exists so a worker that silently resolved to the checkout cannot pass as the baseline. With the tree and the 2.1.0 baseline wheel both reporting
2.1.0, only the__file__path told them apart — which is exactly the weak statetest_tell_rejects_a_module_loaded_from_the_checkoutrecords in its own docstring:That is the condition the
worker_v1.pyinvocation trap exploited. A bare run now reads:Both halves discriminate again.
dev, not a bare bumpPRE_RELEASE = "dev"rather thanVERSION = (2, 2, 0)withPRE_RELEASE = "", because master must not claim to be a release that does not exist on PyPI. Verified:So
pip install git+…gets something that sorts below any real 2.2.0.Known cost
VERSIONis a pure numeric tuple by design — its docstring invitesnameparser.VERSION >= (2, 0, 0)— so it cannot carry the dev marker, andVERSION >= (2, 2, 0)is now true while 2.2.0 is unreleased. The constant says so and points at__version__for callers who need the distinction. Nothing in-repo gates on the tuple.CITATION.cff deliberately holds at 2.1.0
It names the last citable released artifact, so it is the one version string that does not track the tree. It lags for the whole cycle and catches up at release. Nothing enforces that — no test, no CI — so the checklist now states it rather than implying the two are kept equal.
Checklist
Release step 2 becomes "clear
PRE_RELEASE" instead of "bumpVERSION", and a new step 9 opens the next cycle's version next to step 8's ledger. Both are cycle-open work, and pairing them is what stops the tree and the docs drifting apart again.Full suite 3096 passed; mypy and ruff clean; harness clean at 0 unexplained.
🤖 Generated with Claude Code