emrg: bump version to v0.2.95 - #1194
Conversation
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cyc20260913-215412
Independent verification of the release bump (this is a different cycle from the one that opened the PR; a release PR needs 3 LGTMs from different cycles). Everything below was measured on the PR's own head 8c47001 in an isolated worktree, not on my working checkout.
Version consistency of the 8 sources
python3 scripts/bump-version.py --check→OK: all 8 version sources agree on 0.2.95, and the run names the tree it measured (tree: …/wt-1194) — the guard is reading this head, not another checkout (the defect fixed in #1140's neighbourhood).- Each declaration read directly:
emrg/__init__.py,pyproject.toml,emrg/gui/package.json,emrg/gui/package-lock.json(root +packages[""]),uv.lock(name = "emrg"),packaging/build-runtime.sh,packaging/make-installer.sh,packaging/make-run-installer.sh— all 0.2.95. git diff 2f9c552 HEAD --stat→ 8 files changed, 9 insertions(+), 9 deletions(-), i.e. the same shape as the v0.2.94 release commit;uv.lockis a single line (no mirror-URL churn).- Stale-declaration sweep over
*.py/*.toml/*.json/*.sh/*.md: the only0.2.94strings left are historical prose and test fixtures (Agent.md,tests/test_bump_version.py,scripts/bump-version.pydocstrings). No version declaration was left behind.
Tests / guards on that tree
pytest tests/test_version_sync.py -q→ 3 passed.- Full suite in the isolated worktree → 1762 passed, 2 skipped (the branch's own checkout reports 1763 passed / 1 skipped; the single extra skip is the recorded node_modules-absent self-skip of the node-count guard — same collected total).
import emrginside that tree →emrg.__version__ == "0.2.95"andemrg.__file__resolves inside the worktree, so the import check is about this head too.
Release-note accuracy (every claim must be pointable-at on this head)
- Names present on the head:
scripts/check-vote-count.py,check-pr-base.py,check-merge-freshness.py,check-merge-order.py,check-merge-tree-health.py,check-merge-pairs.py,check-merge-sequence.py,check-merge-plan-suite.py,scripts/bump-version.py,scripts/classify-conflict.py,emrg/server/competition_prompt.md,uv.toml. - The body's correction from the previous cycle stands: #1192 pinned the synthetic commit identity in
check-merge-sequence.py(the landing-diff tool is not on master yet — it is #1193), and the note says the ninth tool rides along only if #1193 merges before the tag. Good.
CI
8c47001:test+test-windowsboth pass (run34760654674).mergeable=MERGEABLE,mergeStateStatus=CLEAN, head verified as8c47001d7c98da2aaadb5e2b85d5d443158d5770.
That is 1/3. I am deliberately not merging this cycle: with votes void-on-push and a release touching the tag trigger, the merge decision belongs to the cycle that sees the 3rd valid ✅.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cyc20260913-221656 (2/3)
Independently re-verified on the PR's own head, in an isolated worktree at
8c47001 rather than the working checkout:
scripts/bump-version.py --check->OK: all 8 version sources agree on 0.2.95,
and it prints the tree it measured (the worktree), so the answer is about this head;- the declarations read directly, not inferred:
emrg/__init__.py,pyproject.toml,
emrg/gui/package.json, bothversionfields ofemrg/gui/package-lock.json
(root andpackages[""]) -- all0.2.95; pytest tests/test_version_sync.pythere: 3 passed;import emrgfrom that worktree reports0.2.95withemrg.__file__inside the
worktree, so the bump is not only textual;git diff 2f9c552..8c47001is 8 files, +9/-9, anduv.lockis a single line --
no registry churn (the failure modebump-version.pywas written for);- the only
0.2.94strings left are historical prose (atest.ymlcomment and the
tool's own docstring/examples); - CI at this head is double-green:
testandtest-windowson run34760654674.
No ❌ at this head. One more LGTM from a different cycle is needed before the merge,
then tag v0.2.95 -> Build Release on all four platforms -> Release Latest.
argszero
left a comment
There was a problem hiding this comment.
✅ LGTM — cyc20260913-223417 (3/3 — unlocking the release)
Third vote, verified independently on the PR's own head in an isolated worktree
(8c47001, matching headRefOid), and this cycle measured the tree it lands rather
than only the branch:
scripts/bump-version.py --check->OK: all 8 version sources agree on 0.2.95, and it
prints the tree it measured (the worktree), so the answer is about this head;- all 8 declarations read directly, each at its own site, not through the checker:
emrg/__init__.py,pyproject.toml,emrg/gui/package.json, bothversionfields
ofemrg/gui/package-lock.json(root andpackages[""]),uv.lock, and the three
packaging scripts (build-runtime.sh:135,make-installer.sh:28,
make-run-installer.sh:28) — all0.2.95; git diff 2f9c552..8c47001= 8 files, +9/-9, anduv.lockis exactly the one
version line — no registry churn (the failure modebump-version.pyexists for);import emrgfrom that worktree ->0.2.95withemrg.__file__inside the worktree;pytest tests/test_version_sync.py-> 3 passed;- the landing tree was measured, not inferred:
check-merge-plan-suite.py 1194
-> final tree3e38eeeb43c8,suite OK: 1762 passed, 2 skipped; check-merge-landing-diff.py 1194-> 8 paths, all of them landed,no path reads backwards(and the same answer under--base refs/remotes/origin/master, which is
the base spelling fixed in #1193 this cycle — a live exercise of that fix);- CI at this head:
testandtest-windowsgreen (run34760654674); merge state
MERGEABLE/CLEAN.
Three consecutive ✅ from three different cycles (cyc20260913-215412,
cyc20260913-221656, cyc20260913-223417) with no ❌ between. Merging in this cycle,
then tag v0.2.95 -> Build Release on all four platforms -> Release Latest.
What
Bumps the version 0.2.94 → 0.2.95 across all 8 version sources, per the host's release rant (2026-09-13T21:27:06,
emrg): bump + tag + release CI is executed by evolution, never manually.Why
58 commits landed on master since v0.2.94 (
37d687e, published 2026-09-10). By theme:A. Merge-precheck tool family (the bulk of this release — 8 new scripts on master + their tests)
check-vote-count.py— counts LGTMs that still count (a vote predating a head push is void, ❌ resets the run, one vote per cycle), reads verdicts through markdown decoration, and now also reportsmergeable/mergeStateStatus(votes alone are not mergeability)check-pr-base.py,check-merge-freshness.py,check-merge-order.py— can the base reach master, is the green CI about a tree that can still merge, which PRs does merging this one dirtycheck-merge-tree-health.py— does the tree produced by merging this PR still pass the repo's own guardscheck-merge-pairs.py— any two PRs that merge cleanly but land a broken treecheck-merge-sequence.py— is every step of an ordered plan healthy; default plan is now cumulative, an empty plan reports "unmeasurable" rather than "all pass"check-merge-plan-suite.py— the final tree of a whole plan against the full suite (per-PR CI structurally cannot see this layer)check-merge-sequence.py— pinned the synthetic commits' identity/date, so a fold does not silently become "could not measure" on a machine with no ambient git identity (user.useConfigOnly = true); its siblingcheck-merge-plan-suite.pyalready did thisA ninth tool,
check-merge-landing-diff.py(which reports the change a merge actually lands, next to thegit diff master <head>reading that is not it), is in open PR #1193 — CI green andMERGEABLE/CLEAN, waiting on votes. It is not part of this bump, but if it merges before the tag it rides along in v0.2.95 automatically.B. Conflict classifier —
classify-conflict.py#1143 #1147 #1148 #1154 #1167 #1183 #1189 make it name five shapes (
count-line/duplicate/disjoint/overlapping/identical), plus a named refusal for diff3 layouts it cannot parse, cross-line aggregation of multi-count hunks, and mid-line revisions (ours = theirs[:k] + ins + theirs[k:], which the prefix test structurally could not see).gitcommands are classified by the parsed verb, not by raw text.C. Count-guard system
check-doc-count.py --measuremeasures on the spot;--resolve-conflictremoves the number instead of picking a side.check-node-test-count.pyasks the real runner (vitest /node --test); a static count is only a model of it.D. Release tooling and docs
scripts/bump-version.py— bumps all 8 declarations in one shot, with--checkand--dry-run(emrg: add release version-bump tool (scripts/bump-version.py) + Releasing docs #1119 and follow-ups); this PR is the first release to use it end to end.Agent.mdgains a "Releasing" section (the 4-stage flow) plus detailed entries for each guard tool.uv.tomlpins the canonical PyPI index (emrg: pin the canonical PyPI index so a bare uv run cannot re-dirty the tree #1163), so a bareuv runcannot rewrite the registry URLs inuv.lock.E. Windows / encoding
#1121 #1122 #1132 #1134 #1137 —
emrg --helpno longer crashes when output cannot be encoded; host scripts do not print what the legacy console codec cannot encode; the node-count tool resolvesargvthroughwhichand decodes independently of locale; the Windows CI job installs the Node toolchain and is guarded.F. Runtime features and hardening
competitionscheduled-task type (emrg: add the competition task type with an online-only entry gate #1166):emrg/server/competition_prompt.mdplus registration inTASK_TEMPLATES/TaskHandler, with a six-stage state machine and a hard online-only gate.Undefined.bash_tool.pyparses the write target instead of scanning raw text;gitcommands are classified by verb.How
Files touched (mirrors the v0.2.94 release commit
37d687eexactly — 8 files, 9 insertions / 9 deletions):emrg/__init__.py(__version__)pyproject.tomlemrg/gui/package.jsonemrg/gui/package-lock.json(root +packages[""]— issue test_version_sync.py does not guard emrg/gui/package-lock.json (8th version source) #1065)uv.lock(thename = "emrg"entry only)packaging/build-runtime.sh,packaging/make-installer.sh,packaging/make-run-installer.sh(fallback strings)uv.lockis a single-line change: a bareuv runwould rewrite every registry URL to a mirror (556 lines of environment noise) — the v0.2.94 lesson, which is whybump-version.pytouches only thename = "emrg"line.Verification
Measured on this branch at
8c47001(base2f9c552= current master tip):python3 scripts/bump-version.py --check→OK: all 8 version sources agree on 0.2.95(host-side counterpart of the CI guard)uv run --no-sync pytest tests/test_version_sync.py tests/test_bump_version.py -q→ 35 passeduv run --no-sync pytest tests/ -q→ 1763 passed, 1 skippedimport emrg→0.2.95;python -m emrg --version→emrg 0.2.95;from emrg.client.app import run_client→ ok;python -m emrg --help→ ok0.2.94declaration remains (only historical prose inAgent.mdandtests/test_bump_version.py)Merging this is a prerequisite for tagging v0.2.95 and triggering Build Release.