fix(release): derive the version from the tag, completing #93's rung 1 - #94
Merged
Conversation
dmarx
force-pushed
the
claude/version-from-release-tag
branch
from
August 16, 2026 14:51
5f17045 to
c0205e2
Compare
release tag. It deferred rung 1 — deriving the version — because switching to hatch-vcs without also fetching tags would have failed the release a second time by resolving to a `0.1.dev` fallback. This is rung 1, with the tag fetch that makes it safe. `pyproject.toml` declares `dynamic = ["version"]` with hatch-vcs reading `git describe`, so there is one source for the version rather than two that can disagree. The publish checkout takes `fetch-depth: 0`. No VCS version file is generated: nothing in the package reads its own version, and writing one out would reintroduce the hand-maintained copy this removes. a recurrence loud rather than a PyPI rejection reached after the environment gate. The two are complementary, and DP-5's own ladder puts derive above guard rather than instead of it. A downstream data point for why the quiet failure matters: an adopting project ran `pip install luria` (0.3.0) while its CI pinned `dmarx/luria/actions/generate@main`. Local lint and CI lint were executing different code with nothing reporting it, because `pip install --upgrade luria` is a no-op while the release is missing. Verified: a clean checkout on the 0.4.0 tag builds `luria-0.4.0-py3-none-any.whl` — no `.devN`, no `+g` local segment, which matters because PyPI rejects local segments outright. A working-tree build produces `0.4.1.dev3+g0a80de972`, correctly unuploadable. 425 tests pass and `pip install -e .` still works. The ADR keeps its temporary code, as #88 did — `luria concretize` assigns the real number where merges serialize. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpK3k2WhH9Pnc3i6TjLMVv
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpK3k2WhH9Pnc3i6TjLMVv
dmarx
force-pushed
the
claude/version-from-release-tag
branch
from
August 16, 2026 15:15
c0205e2 to
116496c
Compare
dmarx
pushed a commit
that referenced
this pull request
Aug 16, 2026
Merging #94 minted the fifty-third decision, and two acknowledgements that had been quoting `ADR-053` as a fixture immediately stopped applying: record/decisions.d/ADR-014.md:26: annotation names ADR-053, which does resolve tests/test_adr_index.py:17: annotation names ADR-053, which does resolve Self-inflicted, and worth more than a trim. ADR-014's own comment records that ADR-032 left the same list for the same reason — "when a real thirty-second decision arrived and that specimen began to resolve" — and line 89 anticipated this exact case, treating the annotation as the mitigation. The annotation is the thing that rots. So the list is trimmed, and ADR-014 now says why trimming is the symptom fix: specimens come from the real sequence at all, and `FX-` exists so they need not. Applying FX- across the remaining specimens is deliberately NOT bundled — several sit inside hand-written link targets that the FX remote would want to construct, which produces a new warning class and wants its own pass. The test's fixture moves to ADR-404, which is outside any plausible sequence, with a comment recording why 053 left. 428 tests pass; lint clean, no stale directives. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpK3k2WhH9Pnc3i6TjLMVv
dmarx
added a commit
that referenced
this pull request
Aug 16, 2026
* fix(record): ADR-053 is a real decision now, not a specimen Merging #94 minted the fifty-third decision, and two acknowledgements that had been quoting `ADR-053` as a fixture immediately stopped applying: record/decisions.d/ADR-014.md:26: annotation names ADR-053, which does resolve tests/test_adr_index.py:17: annotation names ADR-053, which does resolve Self-inflicted, and worth more than a trim. ADR-014's own comment records that ADR-032 left the same list for the same reason — "when a real thirty-second decision arrived and that specimen began to resolve" — and line 89 anticipated this exact case, treating the annotation as the mitigation. The annotation is the thing that rots. So the list is trimmed, and ADR-014 now says why trimming is the symptom fix: specimens come from the real sequence at all, and `FX-` exists so they need not. Applying FX- across the remaining specimens is deliberately NOT bundled — several sit inside hand-written link targets that the FX remote would want to construct, which produces a new warning class and wants its own pass. The test's fixture moves to ADR-404, which is outside any plausible sequence, with a comment recording why 053 left. 428 tests pass; lint clean, no stale directives. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpK3k2WhH9Pnc3i6TjLMVv * docs: regenerate views after rebase Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpK3k2WhH9Pnc3i6TjLMVv * fix: link the bare ADR-053 reference in the changelog fragment Surfaced by the rebase: ADR-053 did not exist when the fragment was written, so the reference was correctly bare. It resolves now, and both the docs lint and tests/test_doc_refs.py say so. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DpK3k2WhH9Pnc3i6TjLMVv --------- Co-authored-by: Claude <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.
Rebased onto #93. This PR originally carried both rungs; #93 has since landed rung 2, so this is now only what #93 explicitly deferred:
This is that PR, with the tag fetch that makes it safe. #93's assertion is kept untouched.
Why both rungs, not just #93's
DP-5's ladder puts derive the projection above guard the property, and rung 2 alone leaves two copies of one fact in place — it just makes their disagreement loud. Deriving removes the second copy; the guard then catches anything that could still go wrong (a shallow checkout, a build-backend change). They're complementary, not alternatives, and the workflow comment now says so.
The change
pyproject.toml:dynamic = ["version"],hatch-vcsin build requires,[tool.hatch.version] source = "vcs".publish.yml:fetch-depth: 0on the build checkout —git describeneeds tags, and without this the derived version silently becomes a0.1.dev…fallback, replacing a loud drift with a quiet one. This is precisely what fix(release): bump to 0.4.0, and make the tag and the version agree #93 flagged.[tool.hatch.build.hooks.vcs]version file: nothing in the package reads its own version, and writing one out would reintroduce exactly the hand-maintained copy this removes.Verification
0.4.0tagluria-0.4.0-py3-none-any.whl— no.devN, no local segment0.4.1.dev3+g0a80de972— correctly unuploadable, PyPI rejects local segmentspip install -e .luria lintA downstream data point
An adopting project was running
pip install luria(0.3.0) while its CI pinneddmarx/luria/actions/generate@main. Local lint and CI lint were executing different code, with nothing in either reporting it — becausepip install --upgrade luriais a no-op while the release is missing. That's the cost of the quiet failure mode, separate from the release itself being absent.Notes
luria concretizeassigns the real number where merges serialize. (docs: an ADR (Proposed) for the draft signal #88'sADR-tmp3l17dis also still awaiting concretization onmain.)pyproject.tomlcomment refers to the decision by title rather than by code, since that file isn't in[luria.code] globsand a temp code there would never be concretized. Possiblypyproject.tomlshould just be added to the globs — worth a second opinion.mainor cut 0.4.1. I haven't touched the tag.