---
myst:
html_meta:
"description": "The eOn release workflow: cog-driven version bump, towncrier changelog, downstream cookbook gate, GitHub release, and conda-forge feedstock update."
"keywords": "eOn release, cocogitto, towncrier, conventional commits, conda-forge feedstock, atomistic-cookbook"
---
# Release workflow
eOn releases use [cocogitto (`cog`)](https://docs.cocogitto.io/) to derive the
next semver tag from the conventional-commit log, run the mechanical bump
steps, create an atomic signed tag, and emit the source tarball. The
`cog.toml` at the repo root wires this up; the hand checklist below documents
what it automates and the manual steps that precede and follow it.
## 1. Pre-release checklist
Before invoking `cog bump`, verify:
- [ ] Every PR intended for the release is merged into `main`.
- [ ] `CHANGELOG.md` is up to date *through the previous release only* --
towncrier will prepend the new section from `docs/newsfragments/*`. If
fragments are missing for user-facing changes, add them first.
- [ ] `docs/source/releases/v/release-notes.md` and `index.md` exist
and are linked from `docs/source/releases/index.md` (cog cannot generate
these -- they are curated).
- [ ] CI is green on `main`.
- [ ] `pixi install --locked` succeeds cleanly (so the lockfile regeneration
hook has something stable to work from).
- [ ] **Downstream integration test passes.** The
[lab-cosmo/atomistic-cookbook](https://github.com/lab-cosmo/atomistic-cookbook)
example `eon-pet-neb` exercises eOn + PET-MAD on the oxadiazole NEB and
is the canonical smoke gate for metatomic consumers. Point a cookbook
checkout at the prospective release commit of eOn (edit its
`environment.yml` to override the `eon` dependency, or
`pip install -e` the eOn source tree into the nox-managed env) and run:
``` bash
nox -e eon-pet-neb
```
A pass means the nox session exits 0, the generated gallery artefacts
regenerate, and `client_traceback.log` inside the example directory is
empty. A regression here blocks the release.
## 2. Running `cog bump`
The one-command happy path on `main`:
``` bash
cog bump --auto --annotated 'Release v
See CHANGELOG.md.'
```
Override cog's commit-log inference with `--minor`, `--major`, or
`--version X.Y.Z` when needed (e.g. the only `feat:` commits since the
last tag are `feat(docs)` and a patch bump is incorrect).
### What `cog bump` does
Defined in `cog.toml`:
1. Picks the next version (semver increment inferred from conventional
commit types since the last tag, or taken from the flag).
2. Runs `pre_bump_hooks`:
- `sed` the new version into `pyproject.toml` and `pixi.toml`. All
other consumers (`docs/source/conf.py`, `client/get_version.py`,
the meson and CMake builds) read from `pyproject.toml`.
- `uvx pixi-to-conda-lock pixi.lock --output condaEnvs` regenerates
every `condaEnvs/*.conda-lock.yml`.
- `pixi r -e dev towncrier build --version {{version}} --date
$(date +%Y-%m-%d) --yes` consumes every file in
`docs/newsfragments/` and prepends the new section to
`CHANGELOG.md`.
3. Stages the resulting diff and writes the atomic release commit
(`chore(version): ` by default; override via the
`--annotated` body if you want custom wording).
4. Creates the signed annotated tag `v`.
5. Runs `post_bump_hooks`:
- `git archive --format=tar v | xz -9 > eon-v.tar.xz`
produces the source tarball. Automatic GitHub tag archives are
avoided because their contents have a
[documented stability caveat](https://github.blog/open-source/git/update-on-the-future-stability-of-source-code-archives-and-hashes/).
- Prints a reminder for the remaining manual steps.
`cog.toml` sets `disable_changelog = true` so cog stays out of
`CHANGELOG.md` (towncrier owns it) and `branch_whitelist = ["main"]`
so `cog bump` refuses to run on a PR branch.
## 3. Post-bump actions
1. Inspect the release commit:
``` bash
git show HEAD
```
The diff should look like `1edaf4d8` from v2.12.0 -- version bumps
in `pyproject.toml`/`pixi.toml`, regenerated `condaEnvs/*.conda-lock.yml`,
an appended block in `CHANGELOG.md`, every
`docs/newsfragments/*` file deleted, and the new release-notes page.
2. Push the commit and tag together:
``` bash
git push origin main --follow-tags
```
3. Create the GitHub release with the tarball attached:
``` bash
gh release create v eon-v.tar.xz \
--title v \
--notes-file docs/source/releases/v/release-notes.md
```
The feedstock URL assumes this exact tarball filename; do not rename
the asset.
## 4. conda-forge feedstock bump
Once the GitHub release is published (so the asset URL resolves), update
the feedstock at
[conda-forge/eon-feedstock](https://github.com/conda-forge/eon-feedstock):
1. Branch `release-` off `main`.
2. In `recipe/recipe.yaml`, bump `context.version` to `""`.
3. Compute the tarball sha256 and replace the first `source[].sha256`:
``` bash
curl -sSL "https://github.com/TheochemUI/eOn/releases/download/v/eon-v.tar.xz" \
| sha256sum
```
4. Reset `build.number: 0`.
5. Verify `fix_vesin_const.patch` and `fix_capnpc.patch` still apply
cleanly; if not, regenerate them against the new source tree.
6. Commit, push, `gh pr create` against `conda-forge/eon-feedstock`.
7. Watch the Azure Pipelines matrix (linux-64, osx-64, osx-arm64, win-64)
via `cf-ci watch conda-forge/eon-feedstock#`.
## 5. Manual fallback
When `cog bump` fails mid-run (hook script error, unexpected prompt, etc.)
the state is recoverable: no commit has been written yet. Fix the root
cause and re-run. If you must cut by hand, this is the equivalent
sequence; `1edaf4d8 chore: release v2.12.0` is the canonical reference.
``` bash
# Version
sed -i 's/^version = "[^"]*"/version = ""/' pyproject.toml pixi.toml
# Lockfiles
uvx pixi-to-conda-lock pixi.lock --output condaEnvs
# Changelog
pixi r -e dev towncrier build --version \
--date "$(date +%Y-%m-%d)" --yes
# Release notes page (manual)
# Create docs/source/releases/v/{index.md,release-notes.md} and
# add to docs/source/releases/index.md toctree.
# Atomic commit + signed tag
git add -A
git commit -m "chore: release v"
git tag -s -a v -m "Release v
"
# Tarball
git archive --format=tar v | xz -9 > eon-v.tar.xz
```
Then continue from [ยง3 post-bump actions](#post-bump-actions).
## 6. Paper tags
Preprints and other paper-related tags do not need the release
machinery; just a lightweight annotated tag:
``` bash
git tag -a arXiv_2510.06030v3 45c077cb
# feat(arxiv): descriptive one-line summary
#
# body, including the arXiv link
```