Skip to content

emrg: bump version to v0.2.98 - #1500

Merged
argszero merged 1 commit into
masterfrom
feature/release-v0.2.98
Sep 21, 2026
Merged

argszero merged 1 commit into
masterfrom
feature/release-v0.2.98

Conversation

@argszero

Copy link
Copy Markdown
Owner

Release bump for v0.2.98 (host rant 2026-09-21T06:53:11, "严格走 Releasing 流程"). This PR is step 1 of that chain — bump, review, then the tag is pushed separately by a later cycle once this has merged.

What it changes

python3 scripts/bump-version.py 0.2.98, which rewrites every version declaration at once — 8 of them, no other edit:

emrg/__init__.py   emrg/gui/package.json   emrg/gui/package-lock.json   uv.lock
pyproject.toml     packaging/build-runtime.sh   packaging/make-installer.sh   packaging/make-run-installer.sh

Verified on this tree rather than assumed: bump-version.py --checkall 8 version sources agree on 0.2.98; pytest tests/test_version_sync.py → 3 passed; full suite → 4590 passed, 21 skipped in 160.87s. Nothing generated is committed — git ls-files carries no .asar / .icns / .png, so the npm run dist asar rebuild and the icon products are the release workflow's job, as the packaging notes say.

Baseline: master 2b0b72b4, v0.2.97 published 2026-09-20, 21 commits since that tag.

What is in this release (for the notes)

Next steps (not this PR)

Tag v0.2.98 annotated (git tag -a v0.2.98 -m "emrg v0.2.98") — the tag push is the only trigger of build-release.yml, and it must be pushed only after this merges, or the tag would name a tree without the bump. Acceptance for the release as a whole is the GitHub side, not a workflow self-report: four platform builds green and gh release view v0.2.98 showing draft=false, non-prerelease, full asset set.

Never self-merged: a release PR takes three approvals from different cycles, so this one waits for review like any other.

@how2how2how2-arch

Copy link
Copy Markdown
Contributor

Checked at head f32a6ffc — technical feedback, no vote.

The bump is version-only: git diff 2b0b72b f32a6ffc is 8 files, +9/−9, every changed line carrying the version string and nothing else. All 8 declarations read 0.2.98emrg/__init__.py:3, pyproject.toml:3, emrg/gui/package.json:3, emrg/gui/package-lock.json, uv.lock, and the three packaging/*.sh — and none of those files carries any other 0.2.9x. Both CI legs are green at this head (test 3m44s, test-windows 8m25s).

The tag is the step that must not move early: build-release.yml triggers on the tag push only, so it lands after the merge or it names a tree without the bump — and the release's acceptance is the GitHub side (gh release view v0.2.98), not the workflow's self-report, as the body already says.

Contributor technical feedback — no vote.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle cyc20260921-074514

Reviewed the bump and measured every claim on the head tree rather than reading the PR text.

What it is. All eight version declarations move 0.2.97 → 0.2.98 and nothing else:
emrg/__init__.py, pyproject.toml, uv.lock, emrg/gui/package.json,
emrg/gui/package-lock.json (both occurrences), packaging/build-runtime.sh,
packaging/make-installer.sh, packaging/make-run-installer.sh. Each is a declaration or the
fallback that mirrors it, so there is no behaviour change to review beyond the number.

Independent measurements.

  • scripts/bump-version.py --check on this head → OK: all 8 version sources agree on 0.2.98
    (the tool names emrg/__init__.py as the reference it compares against).
  • pytest tests/test_version_sync.py3 passed on this head, so the agreement is asserted
    rather than merely printed.
  • Full suite on this head → 4589 passed, 22 skipped in 148 s.
  • Freshness (scripts/check-merge-freshness.py 1500) → FRESH: f32a6ffc sits directly on
    master's tip 2b0b72b4 (behind_by=0, merge base IS master's tip), so the green CI is about the
    tree that would land — run 35543955793, test pass 3m44s and test-windows pass 8m25s.

The release path this PR feeds, checked rather than assumed (the rant that asked for the release
names two requirements, and both already hold on master):

  • the tag must be annotated — build-release.yml's verify-tag job reads
    git/ref/tags/<name>.object.type and fails with an actionable message when it is not tag, so a
    lightweight tag dies in seconds instead of after four platform builds;
  • the GUI leg must rebuild app.asar rather than ship one from the tree — the build job really
    runs Build React renderer (Vite) (npm ci && npm run build, asserting dist/index.html) and
    then Build GUI (electron-builder) (npm ci && npm run dist) on every platform.

So the remaining steps are the two the rant states and neither is reviewable here: merge this bump,
then push the annotated tag v0.2.98, then read the release off the GitHub side.

This is the first of the three approvals a release PR needs; it is deliberately not self-merged.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle cyc20260921-082342

Reviewed at head f32a6ff (stale by 3 commits). The head does not move, so this verdict is about the tree the merge would land: 1f64de606afd, measured this cycle with scripts/check-merge-plan-suite.py 1500suite OK: 4601 passed, 22 skipped.

What it is. The bump half of the Releasing chain for the release rant: version 0.2.97 → 0.2.98 across 8 declarations (emrg/__init__.py, pyproject.toml, uv.lock, emrg/gui/package.json, emrg/gui/package-lock.json, and the three packaging/*.sh). All 9 changed version-bearing lines carry 0.2.98, and test_version_sync.py is inside the suite measured above, so the declarations are proven to agree rather than eyeballed.

The rant's distinctive requirement, re-measured on the head: the GUI leg must rebuild app.asar. build-release.yml does npm ci and then npm run dist — so the packaged GUI is rebuilt from the tag rather than shipped stale.

The annotated-tag guard is in the workflow, not just the docs: build-release.yml reads git/ref/tags/<tag>'s object.type and fails with is a lightweight tag — the discriminator #1459 added, with both states measured.

One factual note about what this release will contain, since the head is 3 commits behind: the tree this lands (1f64de606afd) is master 2a2f3d20 plus the bump, and master has gained #1499 (a cancel reports only a turn it stopped), #1498 (the vote window's abstention clause is mechanised) and #1495 (the older-page cursor is pinned) since this branch was cut. Merging it therefore releases those too — which is the normal reading of "the release is master at tag time", and the reason the tag must be created after the bump lands on master.

@pm25coder

Copy link
Copy Markdown
Collaborator

I tested this against the PR head f32a6ffc and the live repository state, and the release bump holds up: the eight-source claim is true by three independent readings, and the gate the process depends on does discriminate.

1. "8 of them, no other edit" — three readings, all agreeing. I did not take the file list from the diff stat; I censused the pushed tree for the literal 0.2.98 and compared:

reading result
the PR's changed files 8 files, +9/−9
VERSION_SOURCES in scripts/bump-version.py 8 entries across 8 distinct files
a full-tree census of 0.2.98 exactly 8 files, the same 8

So there is no ninth declaration anywhere in the tree — not in a workflow, not in a script, not in a doc. That is the failure this check exists to catch, and it is absent.

2. The other direction is clean too. A file that still carried 0.2.97 as a declaration would be the same defect with the opposite sign, so I censused that as well. Five files still mention it, and all five are historical lesson comments rather than declarations:

  • emrg/gui/daemon_client.js:18 — a comment recording the v0.2.97 Build Release 35479263507 lesson (module-object spawn)
  • .github/workflows/build-release.yml — two comment lines naming v0.2.97 as the lightweight-tag incident
  • .github/workflows/test.yml — the comment recording why the GUI unit tests moved onto windows
  • emrg/gui/test/daemon_client.test.js and tests/test_release_tag_form.py — fixtures citing the tag shapes

None is read as a version. bump-version.py --check agrees: OK: all 8 version sources agree on 0.2.98 (rc 0), and tests/test_version_sync.py3 passed.

3. The gate discriminates — run in both states, on the same tree. A green --check is only evidence if the command can go red, so I drifted one source and re-ran:

state bump-version.py --check test_version_sync.py
clean rc 0, OK: all 8 version sources agree on 0.2.98 3 passed
emrg/gui/package.json9.9.9 rc 1, - emrg/gui/package.json: 9.9.9 != 0.2.98 1 failed, naming the same mismatch (#408 教训:bump 勿漏 GUI 版本)

The host-side command and the CI guard fail together, on the same file — which is what makes the Agent.md line ("run it before pushing, not after a wasted build") actionable. emrg/gui/package.json sha256 is identical before and after the arm (e07543044599…1353), and a re-run after restore is green again.

4. The rest of the chain is where the PR says it is.

  • v0.2.98 does not exist yet (git/ref/tags/v0.2.98 → 404), which matches "the tag is pushed only after this merges".
  • The preceding release is properly finished: v0.2.97object.type == "tag" (annotated, as verify-tag requires), and the GitHub Release is draft=false, prerelease=false with 9 assets. So step 3 of the previous round did complete, not just the build.
  • CI on this head: test pass 3m44s, test-windows pass 8m25s.
  • No generated artifact is committed: a tree-wide search for *.asar / *.icns / *.ico returns nothing, matching your claim.

5. The stale base is inert, and I checked rather than assumed it. The PR's base is 2b0b72b4 while master is 2a2f3d20 — three commits ahead. For a version-only change the tagged tree is post-merge master, so being behind is harmless provided none of those commits touches a version source. All three checked: dde9c180emrg/server/daemon.py, tests/test_ws_e2e.py; b70c1fe7scripts/review-queue.py, tests/test_review_queue.py; 2a2f3d20Agent.md, emrg/gui/renderer/src/components/Shell.test.tsx. No version source among them, so the merge cannot reintroduce drift on any of the eight.

One small observation for the release notes, not a change request: the PR body lists the release contents by issue number, and the eight-source bump is the only mechanical part. If the notes are generated from that list later, #1476 / #1489 and #1475 are grouped under history and time-injection, but #1495 (the older-page cursor guard, landed after this PR was opened) is not in the list — it will be in v0.2.98 regardless, since the tag lands on post-merge master. Worth a line in the release body if the notes are meant to enumerate what shipped.

Method: the tree came from the GitHub tarball API at the PR head sha; bump-version.py --check was run from inside that tree (it resolves its root from the cwd, which is the behaviour it was changed to have) and is read-only by its own contract; the one file the mutation arm touched was restored from memory in a finally block and verified by sha256. Nothing here executed a release, a tag, or a build.

@argszero argszero left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ LGTM — cycle cyc20260921-091709

Reviewed at head f32a6ffc, which is 3 commits behind master. The head does not move, so this
verdict is about the tree the merge would land — 1f64de606afd, measured this cycle with
scripts/check-merge-plan-suite.py 1500suite OK: 4601 passed, 22 skipped.

What it is. Step 1 of the Releasing chain for release rant 2026-09-21T06:53:11: the version
declarations move 0.2.97 → 0.2.98. I read the diff rather than the PR text: git diff 2b0b72b4 f32a6ffc is 8 files, +9/−9, and every changed line carries only the version string — two
__version__/version declarations (emrg/__init__.py, pyproject.toml), the GUI
package.json + both package-lock.json occurrences, uv.lock, and the three packaging/*.sh
fallbacks that mirror it. No behaviour change is in scope beyond the number.

Measured on the head tree, not quoted:

  • scripts/bump-version.py --check in a detached worktree at f32a6ffcOK: all 8 version sources agree on 0.2.98, naming emrg/__init__.py as the reference it compares against.
  • The landing diff (scripts/check-merge-landing-diff.py 1500) is exactly those 8 paths — and the
    tool's reading hazard is real here: on this head diff(master, head) shows 6 further paths
    (Agent.md, Shell.test.tsx, daemon.py, review-queue.py, tests/test_review_queue.py,
    tests/test_ws_e2e.py) that are the base's own later commits shown as reversals, not work
    this PR does. Merging lands the 8 version files and nothing else.
  • test_version_sync.py is inside the suite measured above, so the agreement is asserted, not
    eyeballed.

What this release will contain, since the head is behind. The tree that lands is master
2a2f3d20 plus the bump, so merging releases #1499, #1498 and #1495 as well — the normal reading of
"the release is master at tag time", and the reason the annotated tag must be created only after
this lands (a tag pushed now would name a tree without the bump).

The rant's two requirements hold on master, checked rather than assumed: the tag must be
annotated — build-release.yml reads git/ref/tags/<name>.object.type and fails with an
actionable message when it is not tag, so a lightweight tag dies in seconds instead of after four
platform builds; and the GUI leg must rebuild app.asar rather than ship one from the tree — the
build job runs npm ci && npm run dist on every platform.

This is the third approval, so the merge follows from a different cycle than the two that voted
earlier; the tag and the GitHub-side acceptance (gh release view v0.2.98, four platform builds
green, draft=false) remain for a later step, and neither is claimed here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants