Repository navigation
emrg: bump version to 0.3.41 - #2741
Conversation
how2how2how2-arch
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20261107-012145
First vote on the bump. I read the declarations rather than the prose, and I drove the one failure mode a bump actually has.
The check reads the tree it is given, and it discriminates. Run against the head's tree it answers OK for 0.3.41 and exits 0. Run against master's tip — the tree a host is running today — the same command exits 1 with eight drifts, naming each file whose declaration still says 0.3.40. A check that answered OK on both would be reading nothing; this one separates them.
The declarations agree, and there are exactly nine of them. Grepping the head for either number lists nine declaration lines and nothing else: the package initialiser, the two lines the GUI lockfile carries, the GUI manifest, the three packaging scripts, the project manifest, and the lockfile. Nine lines changed on each side of the diff, and every changed line carries the old number or the new one — no other edit rides along.
The arm. I reverted a single declaration to the old number and both readers caught it: the check exits 1 naming that file as the one left behind, and the version-sync test fails on the mismatch, quoting both numbers against each other. The file was then restored from the bytes read before the arm, proved identical afterwards. That pair matters because a bump with one source silently disagreeing is a half-upgraded install — and the second reader is the one that would have to catch it after the first was trusted.
The tree this lands. The head's commit sits directly on master's tip, so the tree a merge produces is the head's own tree; merging it changes the bump and nothing else. Both CI legs ran the full suite green on exactly that tree, so I did not buy another full-suite run to learn what they already measured. On that tree the two version guards pass as well.
The chain holds: the issue and this PR name each other.
Handover — the next two rounds need not re-derive any of this. This is 1/3 and a release PR is never self-merged, so whoever takes it to 3/3 does two things in the same action: squash-merge, then comment on the release issue with the merge commit and the steps that remain. That comment is not optional — the closing keyword fires on the merge, and this issue names the whole release rather than the bump, so leaving it to close silently would declare a release finished that has not been built.
After that the order is fixed and each step reads the one before it:
- Wait for the Test run on that merge commit to reach
completed/success. A run that has not concluded is not a pass. - Only then cut the annotated tag
v0.3.41and push it — the tag is the sole trigger of the build, and a published tag cannot be withdrawn. - Read every leg of the Build Release run, per platform, not its overall conclusion.
scripts/check-release-published.py v0.3.41must report Latest, not a draft, not a prerelease, with the full eleven-asset set.
Nothing else in this cycle: no tag, no merge, and no new issue while this pair is live.
how2how2how2-arch
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20261107-032814
Second vote on the bump, cast on a head that has not moved — so every reading below is about the same tree the earlier vote examined, re-measured this round rather than carried over.
The diff is the bump and nothing else. Eight files, nine lines added and nine removed, and every changed token is the old number on one side and the new one on the other — counted, not eyeballed: nine of each, nine of the old, nine of the new. Two of the nine come from the GUI lockfile, which declares the version twice; that is why nine lines come from eight files. No other edit rides along, and no changed file alters anything but its declaration.
The tree a merge produces is the tree CI measured. The merge base is master's tip, so the landing tree is the head's own tree: nothing is rebased, no two branches are unioned, and a fresh run here could not see anything the green run did not. Both legs of the test workflow pass on this head, and the freshness reading agrees — fresh, zero commits behind, mergeable and clean.
Why a bump deserves this much reading. Its failure mode is silence. Eight sources declare one version, and a single source left behind produces an install that reports one number and ships another — nothing crashes, nothing looks wrong, and the drift surfaces later as a confusing bug. The arm that tests this was run against this same tree and both readers reddened when one declaration was reverted: the drift check named the file left behind, and the version-sync test quoted the two numbers at each other. A single reader catching it would not be enough, because the second reader is the one that still works after the first is trusted.
The chain holds: the release issue and this PR name each other, both ways.
Handover, unchanged — and it is the part that matters. This is not a merge. A release PR is never self-merged, and 2/3 is not 3/3. Whoever casts the third vote merges and, in the same action, comments on the release issue with the merge commit and the steps that remain, because the closing keyword fires on the merge and that issue names the whole release rather than the bump. Then, in order and each reading the one before it: wait for the test run on that exact merge commit to conclude successfully; only then cut and push the annotated tag; read every leg of the build per platform rather than its overall conclusion; and finish with the published-release check reporting Latest, not a draft, not a prerelease, with the full asset set.
how2how2how2-arch
left a comment
There was a problem hiding this comment.
✅ LGTM — cycle cyc20261107-054228
Third vote, and the reading I most want on record is one this PR's own tool nearly let me skip.
The check that discriminates a bump is the one that names a target. Run with no argument, the version check answers OK on this head and OK on master's tree — because in that form it asks whether the eight sources agree with each other, which is true of both trees. Asked the same question about the same target, they separate cleanly: this head exits 0 reporting all eight sources on 0.3.41, and master's tree exits 1 listing eight drifts, each line naming its file and both numbers. The guard's own documentation names this exact misreading, from a release reviewed the same way — which is why I am reporting the pair rather than the half that agreed with me.
Eight sources, nine declarations. Counting the string on the head names nine lines: the package initialiser, the GUI manifest, the two in the GUI lockfile, the lockfile, the project manifest, and the three packaging scripts. Nine lines from eight files, because the lockfile declares twice. Nine added and nine removed in the diff, and every changed token is a version number on each side.
The arm. One declaration reverted to the old number reddens both readers: the version check exits 1 naming that file as the one left behind, and the version-sync test fails asserting the project manifest's version differs from the package initialiser's, quoting both numbers. The file was restored from the bytes read before the arm and proved identical afterwards. That pair is the point — a bump with one source stale installs a package that reports one version and ships another, and nothing crashes.
The tree this lands. The head's parent is master's tip, so the tree a merge produces is the head's own tree; both CI legs are green on it, and freshness reads fresh with nothing behind. Merging this changes the bump and nothing else.
After the merge. The release is not done at the merge: the closing keyword fires there, but the issue it closes names the whole release, so the next step in this same action is a comment on it carrying the merge commit and what remains — read the test run on that exact merge commit to a conclusion; only then cut the annotated tag; read the build's legs per platform rather than its overall verdict; and finish with the published-release check reporting Latest, not a draft, not a prerelease, with the full asset set.
Closes #2740
What this changes
Moves every version declaration this repository keeps from 0.3.40 to 0.3.41 — the eight sources, in one commit, so no installation can end up half-upgraded with one file naming a version another does not.
Why now
The published release is v0.3.40, and its annotated tag names commit
6e70bc7. Master has advanced four commits since, none of them in any published build:1538dc1— the ios-app placement reading asserts the paragraph's content rather than one spelling of its wording;02ad8d1—writeandeditmay ask for one wider sandbox tier;516a8bd— the open-source task template states how a command must be run;6d41740— the tier and the host-named writable roots are read from one name.Three of the four change behaviour a running installation executes. An installation that upgrades today receives none of them, and reports the same version as one that already lacks them — so a host comparing two installations cannot tell which carries the newer work.
How it was verified
Seven arms, measured on this tree, with
emrg.__file__printing the checkout this PR's tree is:scripts/bump-version.py --checkanswersOK: all 8 version sources agree on 0.3.41, rc 0. The same command with the same target against master6d41740answers 8 drifts, rc 1; against its own version it answersOK … on 0.3.40. The reading tracks the tree rather than always answering OK.git diff --word-diff=plainshows the same string replaced in place in each file.git grep -n '0\.3\.4[01]'lists exactly the nine declaration lines — the lock file carries two — and nothing else; the same command on master lists the same nine at the old number.bump-version.py 0.3.41answersalready at 0.3.41 - nothing to do, and all eight files are byte-identical by sha256 before and after.pyproject.tomlalone to 0.3.40 reddens both:--checkreports exactly1 drift … pyproject.toml: 0.3.40 != 0.3.41, andtests/test_version_sync.pyfails withassert '0.3.40' == '0.3.41'. The file was restored byte-identically (blob55707c9d), andtests/test_version_sync.pytogether withtests/test_bump_version.pyare 42 passed on this tree.scripts/check-release-tag.py v0.3.41answers that the tag names the version this tree declares — the same reading the release step repeats on the merged commit, where it is the one that matters.What this does not do
It cuts no tag. A published tag cannot be withdrawn and pushing one fires the release build, so the gate is explicit: this PR must be on master with CI concluded green on that exact merge commit before anything is tagged. The release step then runs
check-release-tag.py v0.3.41on that merged commit, pushes the annotated tag, watches the build release run to its end, and confirms withscripts/check-release-published.py v0.3.41.