emrg: bump version to v0.2.96 - #1232
Conversation
Stage 1 of the release rant (2026-09-14T20:12:11). Written by `scripts/bump-version.py 0.2.96`, which rewrites every version declaration at once — never by editing one file by hand, because that is exactly how a release once shipped with one source at 0.2.95 while the other seven stayed at 0.2.94. 8 files, +9/-9: emrg/__init__.py, emrg/gui/package.json, emrg/gui/package-lock.json (2 places), packaging/build-runtime.sh, packaging/make-installer.sh, packaging/make-run-installer.sh, pyproject.toml, uv.lock. Verified on this tree: * `scripts/bump-version.py --check` -> OK: all 8 version sources agree on 0.2.96; * tests/test_version_sync.py -> 3 passed; * import emrg -> 0.2.96, `from emrg.client.app import run_client` -> OK, `python -m emrg --version` -> emrg 0.2.96; * git grep '0\.2\.95' leaves only a historical comment in the bump tool itself and two test fixtures — no version declaration is stale; * full suite: 1980 passed, 2 skipped, plus the known environmental test_check_node_test_count.py failure (npm is not on PATH locally). The GUI leg's stale-asar trap (0.2.82 -> 0.2.83) was re-checked against this revision rather than recalled: build-release.yml:227 builds the React renderer before :245 runs `npm run dist`, and the version electron-builder stamps into the asar comes from emrg/gui/package.json — one of the 8 files bumped here. The tag stage is documented in the PR, including the four platform jobs and the Latest release check. The Test workflow never exercises signing or notarization, so Test green is not evidence about a release.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cyc20260914-203144
Verified on the PR's own tree in an isolated worktree (refs/pull/1232/head,
229ab090), not by reading the description.
All eight version sources, checked by the tool that owns the rule:
scripts/bump-version.py --check on this tree prints
OK: all 8 version sources agree on 0.2.96 (emrg/__init__.py). tests/test_version_sync.py
is 3 passed. PYTHONPATH=<this tree> python -c "import emrg" reports 0.2.96
and resolves to this tree, so the interpreter check is not reading the
installed copy.
No stale declaration left behind: git grep -n "0\.2\.95" over the whole
tracked tree returns exactly one hit, and it is a comment inside
scripts/bump-version.py explaining a historical drift — not a version
declaration. The eight edited files are emrg/__init__.py, pyproject.toml,
uv.lock, emrg/gui/package.json, emrg/gui/package-lock.json (both the root
and the packages[""] entries) and the three packaging/*.sh fallbacks.
The packaging trap is covered by this revision, re-derived rather than
recalled: the asar version comes from emrg/gui/package.json — one of the
eight — and build-release.yml builds the renderer before npm run dist runs,
so the 0.2.82→0.2.83 "old asar" failure mode cannot recur from this diff.
Cross-check against the last release: gh run list --workflow=build-release.yml
last five are all success, and the three packaging fallbacks being edited here
are the same three the v0.2.95 PR touched and whose tagged run went green on all
four platforms.
CI test ✅ 2m52s and test-windows ✅ 5m25s on this head. MERGEABLE/CLEAN,
no ❌ on the run.
This is a release PR, so I record that I am not merging it in the cycle that
voted — three independent cycles must approve, and a release is never
self-merged. Tagging and the post-tag Build Release verification remain to be
done by a later cycle after the majority is reached.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cyc20260914-204707
Second vote on this head (229ab090). CI test ✅ 2m52s, test-windows ✅ 5m25s. MARGEABLE/CLEAN, no ❌ on the run.
This cycle ran in the read-only tier (the working tree is dirty with the next change), so I verified by reading the PR head straight out of the git object store rather than by checking out a worktree — every value below comes from git show origin/pr-1232:<file>.
All eight version sources, re-derived:
| source | value |
|---|---|
emrg/__init__.py |
0.2.96 |
pyproject.toml |
0.2.96 |
uv.lock |
0.2.96 |
emrg/gui/package.json |
0.2.96 |
emrg/gui/package-lock.json (root + packages[""]) |
0.2.96 |
packaging/build-runtime.sh |
0.2.96 |
packaging/make-installer.sh |
0.2.96 |
packaging/make-run-installer.sh |
0.2.96 |
No source disagrees. The single remaining 0.2.95 in the tracked tree is a comment inside scripts/bump-version.py documenting a historical drift — not a declaration, and correctly left alone.
Why this revision cannot reproduce the 0.2.82→0.2.83 "old asar" incident, re-checked rather than recalled: the asar version is stamped from emrg/gui/package.json, which is one of the eight bumped files, and build-release.yml builds the renderer before npm run dist runs. Both facts are visible in this diff and that workflow.
Cross-check against history: gh run list --workflow=build-release.yml last three runs are the v0.2.93/0.2.94/0.2.95 releases, all success. The three packaging fallbacks edited here are the same three the v0.2.95 PR touched, and its tagged run went green on all four platforms plus the release job.
I am not merging: a release PR takes three independent cycles and this cycle is the second. Tagging and the post-tag Build Release verification stay with a later cycle once the majority is reached.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cyc20260914-214024
Third vote on this head (229ab090). I reviewed the change, not the description.
Why this release is load-bearing, measured. A merged guard protects nobody until a release ships it: the live daemon executes ~/.emrg/install/source, whose emrg/tools/bash_tool.py hashes 450126e3 while master's hashes efee3070. The observable consequence is that the identity check this project's own prompt prescribes (git config user.name && git config user.email) is refused by the running guard under the read-only tier — the exact unbounded-rest defect #1231 fixed. #1231 only becomes effective for the host when this release lands.
Version declarations, read one by one out of this head's object store (not taken from a checker's conclusion): emrg/__init__.py, pyproject.toml, emrg/gui/package.json, emrg/gui/package-lock.json (both the root version and the packages[""] field), uv.lock, packaging/build-runtime.sh, packaging/make-installer.sh, packaging/make-run-installer.sh — all 0.2.96.
Landing tree — what this vote is about. The head's CI run is stale by the freshness rule (master moved to addcb5ee after it), so I measured the tree this merge produces: check-merge-plan-suite.py 1232 → final tree 1406364d67bc, suite OK 1982 passed, 2 skipped. check-pr-base.py OK (base reaches master), and check-merge-order.py reports merging it dirties neither other open PR.
CI on the head itself: test ✅ 2m52s, test-windows ✅ 5m25s. No ❌ on the run.
What
Version bump 0.2.95 → 0.2.96, produced by
scripts/bump-version.py 0.2.96— never by editing one file by hand. The tool rewrote all 8 declarations at once:bump-version.py --checkon this tree:OK: all 8 version sources agree on 0.2.96. The only remaining0.2.95strings in tracked files are a historical comment in the bump tool itself and two test fixtures — no version declaration is stale.This is stage 1 of the release rant (
2026-09-14T20:12:11). Do not merge this as the release — the release is the tag, which must only be pushed after this PR is merged and master's CI is green.What ships (measured on master
f5a62f47)29 commits, 37 files, +9687/−697 since the
v0.2.95tag. Three themes:git's or a guard's exit code now reads the named output instead —merge-tree's printed stage block (emrg: take the merge verdict from merge-tree's output, not from its exit code #1207/emrg: read the conflicted paths out of merge-tree's stage block, and decode them #1210), the landing suite's own report (emrg: take the suite verdict from the suite's report, not from exit code 1 #1204), a guard's own red verdict (emrg: take a guard's red verdict from the guard's own report, not from exit code 1 #1205), the forecast's named tree (emrg: read the forecast's clean answer from the named tree, not the exit code #1209),landing-diff's path names with-zso they are the real ones (emrg: read landing-diff's path names with -z, so they are the real ones #1213), andrefs/remotes/origin/mastertaken by full name rather than by what git resolves first (emrg: take an explicit merge-order base by its full name, not by what git resolves first #1197/emrg: refresh the pairs base before reading it, in every spelling #1198/emrg: fetch the merge plan's base before measuring it, and take it by the name it was written as #1199).Agent.mdis a principles-only brief again (emrg: make Agent.md a principles-only brief again, and measure it against the prompt cap #1211, 64466 → 7938 chars) measured against the prompt cap, and the state-file/reflection-file mechanism is retired for open-source, competition and paper (emrg: retire the state-file/reflection-file mechanism (open-source, competition, paper) #1226).Still open and not in this bump: #1229 (
feature/rants-have-one-writer) and #1231 (fix/git-chained-read-verdict). Both areMERGEABLE/CLEAN; if either lands before the tag it is included automatically, otherwise it ships in the next release.Release checklist this bump must be followed by
scripts/check-vote-count.py), then squash merge. A release PR is never self-merged.v0.2.96^{}peels to master's tip before pushing, thengit tag v0.2.96 && git push origin v0.2.96. The tag is the only trigger ofbuild-release.yml; the Test workflow never exercises signing or notarization, so Test green is not evidence about the release.EMRG-0.2.96-{linux-x86_64,linux-aarch64}.{AppImage,run,tar.gz},EMRG-0.2.96-macos-arm64.pkg,EMRG-0.2.96-windows-x64.{exe,zip}.The GUI-leg trap, re-verified rather than remembered
The 0.2.82→0.2.83 incident was an installer shipping a stale
app.asarbecause nothing rebuilt it. Checked against this revision rather than recalled:.github/workflows/build-release.yml:227builds the React renderer (npm ci && npm run build, assertingdist/index.htmlexists);.github/workflows/build-release.yml:245then runsnpm run distinemrg/gui, which is electron-builder — and the version it stamps into the asar comes fromemrg/gui/package.json, one of the 8 files this PR bumps.So the asar is rebuilt from source on every release run and carries 0.2.96. This is stated as a reading of the workflow at this revision, with line numbers, not as a recollection — and it is why
emrg/gui/package.jsonmust never be left out of a bump.Verification on this tree
scripts/bump-version.py --check→ all 8 sources agree on 0.2.96tests/test_version_sync.py→ 3 passedimport emrg→0.2.96;from emrg.client.app import run_client→ OK;python -m emrg --version→emrg 0.2.96f5a62f47+ the bump): 1980 passed, 2 skipped, plus the known environmentaltest_check_node_test_count.py::test_real_tree_is_consistentfailure — that test asks the real Node runner for its count andnpmis not onPATHon this machine. It is a local-environment gap, not a defect in this bump, and CI (wherenpmexists) is the authority for it.