Release process
LLenergyMeasure uses semantic versioning in the 0.x range while the project
is pre-1.0. This page documents the versioning scheme, the two files that must
stay in sync, and the step-by-step release procedure.
Versioning scheme
- Pre-1.0: minor version bumps (
0.1.0,0.2.0, ...,0.N.0) mark significant capability milestones. Patch versions (0.N.1) are reserved for hotfixes. 1.0.0is reserved for the production-ready release. It is not tied to a calendar date and will be cut when the project meets the production-readiness bar.- Version management is manual - no automated bump tooling is used.
Feature work lands on main at the current version. Version numbers do not
change on feature PRs - only on release commits.
Version sources
Two files hold the version and must stay in sync:
| File | Field | Example |
|---|---|---|
pyproject.toml | [project] version = "..." | version = "0.9.0" |
src/llenergymeasure/__init__.py | __version__ = "..." | __version__ = "0.9.0" |
A mismatch between these two files is a bug. The build system reads
pyproject.toml; the runtime API (llem --version, llenergymeasure.__version__)
reads __init__.py.
Release steps
-
Bump the version in
pyproject.tomlUpdate the
versionfield under[project]:[project]name = "llenergymeasure"version = "0.10.0" -
Bump the version in
__init__.pyUpdate
__version__insrc/llenergymeasure/__init__.py:__version__ = "0.10.0"Both files must show the same version string.
-
Update
CHANGELOG.mdAdd an entry for the new version at the top of the changelog. Note key changes shipped since the previous release. The format is free-form but should be scannable.
-
Commit
Commit the three changed files with the message:
chore: release 0.10.0This commit goes directly to
mainvia the normal PR flow. -
Create and push the git tag
git tag v0.10.0git push origin v0.10.0The tag must use the
vprefix and match the version string exactly. Pushing the tag triggers the CI publication workflow. -
CI publishes to PyPI
The
release.ymlworkflow (.github/workflows/release.yml) triggers onpush: tags: ["v*"]. It runs lint, tests, and then publishes the package to PyPI usinguv build+uv publish. No manual upload is required.
Verifying a release
After CI completes:
pip install --upgrade llenergymeasure
llem --version # should show the new version
Check the GitHub Releases page - the tag should appear there automatically once the workflow completes.
Pre-1.0 vs post-1.0 policy
The current 0.x scheme treats every release as potentially breaking. The
stability contract documented in src/llenergymeasure/__init__.py applies:
names in __all__ follow semver, internal names may change without notice.
When the project reaches 1.0.0, the guarantee tightens: breaking changes to
public API require a major version bump. Until then, 0.x minor bumps may
include breaking changes with a one-release deprecation window where practical.
See also
- Contributing: development - local dev setup
- Reference: CLI - verifying installed version with
llem --version