Hold the version in one place and give the release run a tag to build [#53] - #150
Merged
Conversation
…#53] Nothing in this tree named the version it releases under, so the tag, the bundle and the bill of materials had nothing to agree with and no run existed to make any of them. A version copied into a second file is right on the day it is typed, and the copy that goes stale is the one a reader takes the version from rather than the one a release reads, which is a document announcing a release nobody tagged with nothing about the tag to say otherwise. The version is a constant in internal/version and is read from there by everything that states it: the build names it in its report, the bill of materials states it on the component the document is about, and the release run builds the tag from the verb that prints it. The prefix that makes a tag out of it sits beside the constant so two files cannot spell one release differently. The row version-lives-in-exactly-one-file refuses the version written into any tracked file outside the register that holds it. It compares whole version-shaped runs rather than searching for a substring, so a longer version spelled around this one stays a different version and a pinned tool is left alone. What it reaches is the copy at the moment it is written, which is stated at the operator rather than implied. The release run gates, packs and tags in three jobs, and the only job granted a write is the last one. It calls the same packing file a pull request runs, so the archive a release carries is packed by a definition that has already been exercised. It creates no deployment: tagging and publishing are separate acts, and joining them leaves a bad publish undoable without deleting a tag. The means is Go, in a package of its own, because both readers reach the value through compiled code already here and a bare file at the root would be parsed once by the build and once more by a shell step. decisions/0013-the-version-scheme.md carries what each part of the number moves for and what the alternatives cost. Signed-off-by: Nils Lehnen <[email protected]>
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.
Closes nothing on its own. It lands the version and the release run that #53
asks for, and the one clause of that issue it cannot meet is named at the
bottom rather than left for a reader to notice.
What was wrong
Nothing in this tree named the version it releases under, so a tag had nothing
to be built from and the bundle and the bill of materials had nothing to agree
with. There is no tag and no release behind this repository today:
Run 2026-08-12.
What the change does
The version is a constant in
internal/version, and everything that states itreads it from there. The build names it in its report, the bill of materials
states it on the component the document is about, and the release run builds
the tag out of the verb that prints it. The prefix that turns the version into
a tag sits beside the constant, so two files cannot spell one release
differently.
All run at
87f032d.decisions/0013-the-version-scheme.mdcarries what each part of the numbermoves for, why the words on the pages do not move it, and what the alternatives
cost.
The release run is three jobs. The first runs the whole gate verb. The second
calls the same packing file a pull request already runs, so a release carries an
archive packed by a definition that has been exercised on every change rather
than by a second one whose first real run is release day. The third is the only
job granted a write, and it creates the tag with the bundle and the bill of
materials attached. It creates no deployment: tagging and publishing are
separate acts, and joining them leaves a bad publish undoable without deleting a
tag.
Write access appears once in the file:
Run at
87f032d.The guard, and the proof that it bites
version-lives-in-exactly-one-filerefuses the version written into a trackedfile outside the register that holds it. With one sentence appended to
README.md:and with the sentence removed again:
Removing the row from the table reds the suite rather than passing quietly:
All three run at
87f032d.The row compares whole version-shaped runs rather than searching for a
substring, so a longer version spelled around this one and a pinned tool are
both left alone, and a version at the end of a sentence is still found with the
full stop after it.
TestTheReleaseVersionRowTellsAnotherVersionApartandTestTheReleaseVersionRowNamesWhereTheVersionBelongshold both halves.What the row reaches is the copy at the moment it is written. A copy made before
a version moved carries the old number and reads to the row as a different
version, so the row does not find a sentence that went stale yesterday. That
bound is written at the operator rather than implied here.
The means
Go, in a package of its own. Both readers of the value reach it through code
that is already compiled here, and the release run gets it from a verb rather
than from a second parser: a bare file at the root would be read once by the
build and once more by a shell step, which is where a trailing newline becomes a
tag nobody can resolve. The three rules survive it - the row refuses a second
copy, the suite proves the row bites, and every number above carries the command
that produced it.
The gate
Both run at
87f032d. The browser-backed and network-backed sets were notasked for and the run says so;
needs-networkwas not run here.What this does not do, and what #53 still waits on
The release run has never been dispatched, so no tag exists and nothing has been
attached to one. That is deliberate. Every other issue in the same milestone is
open, the output this would package is still the placeholder page, and a first
tag on a public repository is not a thing to create in order to tick a clause.
So #53's clause that the release run produces a tag with the bundle and the bill
of materials attached is unobserved, and the issue stays open holding exactly
that.
The other three clauses are readable off this branch and are quoted above: the
version appears in one file and a row refuses a second, the publish job needs
the gate job so a failing leg stops the tag existing, and write permission
appears on one job.
This change carries no second reader. The ruleset on the branch requires no
approving review, so the evidence above stands in place of one, and the merge is
made by the same account that opened this.