Release Process#
This document describes how to prepare, publish, and follow up on a Newton release. It is intended for release engineers and maintainers.
Overview#
Newton follows PEP 440 versioning; see Versioning in the compatibility guide for details.
Releases are published to PyPI and documentation is deployed to GitHub Pages.
Version source of truth#
The version string lives in the [project] table of pyproject.toml.
All other version references (PyPI metadata, documentation) are derived from
this file. At runtime, newton/_version.py reads the version from
installed package metadata via importlib.metadata.
Dependency versioning strategy#
pyproject.toml specifies minimum compatible versions
(e.g. warp-lang>=1.12.0). uv.lock pins the latest known-good
versions for reproducible installs.
Exception: on the release branch, mujoco and mujoco-warp use
compatible-release pins (e.g. mujoco~=3.5.0) to allow 3.5.x
updates while excluding 3.6.0 and later. MuJoCo follows custom
versioning from 3.5.0 onward; its third component is MINOR_OR_PATCH
and guarantees API backward compatibility. main uses a version floor
like other dependencies.
Deprecation and removal timeline#
The user-facing deprecation and removal policy lives in
Deprecation Policy. Release engineers should ensure that every
deprecation, removal, or other breaking change in a minor release is
reflected in CHANGELOG.md and the API documentation, and that
deprecations emit a runtime DeprecationWarning where applicable.
Pre-release planning#
☐ |
Determine target version ( |
☐ |
Confirm dependency versions and availability: warp-lang, mujoco, mujoco-warp, newton-usd-schemas. |
☐ |
Set timeline: code freeze → RC1 → testing window → GA. |
☐ |
Conduct public API audit:
Run the |
Code freeze and release branch creation#
☐ |
Create |
☐ |
On main: bump the version in |
☐ |
On release-X.Y: bump the version in |
☐ |
On release-X.Y: update dependencies in |
☐ |
Run the |
☐ |
Manually trigger the minimum-dependency and multi-GPU CI
workflows on the # Minimum-dependency tests (lowest compatible PyPI versions)
gh workflow run minimum_deps_tests.yml --ref release-X.Y
# Multi-GPU tests (g7e.12xlarge = 4× L40S GPUs)
gh workflow run aws_gpu_tests.yml --ref release-X.Y \
-f instance-type=g7e.12xlarge
|
☐ |
Push tag |
☐ |
RC1 published to PyPI (approve in GitHub environment). |
Release candidate stabilization#
Bug fixes merge to main first, then are cherry-picked to
release-X.Y. Cherry-pick relevant commits from main onto a feature
branch and open a pull request targeting release-X.Y — never push
directly to the release branch.
For each new RC (rc2, rc3, …) bump the version in
pyproject.toml and run uv run docs/generate_api.py, then tag and push.
Resolve any cherry-pick conflicts or missing dependent cherry-picks that
cause CI failures before tagging.
Testing criteria#
The release engineer and maintainers decide which issues must be fixed before GA and which can ship as known issues documented in the release materials. Features marked experimental have a lower bar — regressions in experimental APIs do not necessarily block a release.
As a guideline, an RC is typically ready for GA when:
All examples run without crashes, excessive warnings, or visual artifacts (
uv run -m newton.examples <name>).Testing covers Windows and Linux, all supported Python versions, and both latest and minimum-spec CUDA drivers (see system requirements in the installation guide).
PyPI installation of the RC works in a clean environment:
pip installsucceeds,import newtonworks, and examples and tests can be run from the installed wheel (pip install newton==X.Y.ZrcN).No unexpected regressions compared to the previous release have been identified.
☐ |
All release-targeted fixes cherry-picked from |
☐ |
Re-run the |
☐ |
Prepare draft GitHub Release notes: summary, a few highlights, link
to |
☐ |
Testing criteria satisfied. |
☐ |
No outstanding release-blocking issues. |
Final GA release#
Before proceeding, obtain explicit go/no-go approval from the maintainers. Do not start the final release steps until sign-off is confirmed.
All steps below are performed on the release-X.Y branch unless noted otherwise.
☐ |
Go/no-go approval obtained from maintainers. |
☐ |
Finalize
The |
☐ |
Update |
☐ |
Verify all dependency pins in |
☐ |
Regenerate |
☐ |
Bump the version in |
☐ |
Commit and push tag
|
☐ |
PyPI publish approved and verified: |
☐ |
Review the draft GitHub Release notes before publishing. Keep them
concise: summary, a few highlights, link to |
☐ |
GitHub Release un-drafted and published. |
☐ |
Docs live at |
☐ |
Release announcement posted. |
Post-release#
☐ |
Merge back the changelog from |
☐ |
Verify PyPI installation works in a clean environment. |
☐ |
Verify published docs render correctly. |
Micro releases#
Micro releases continue cherry-picking fixes to the existing
release-X.Y branch. For example, 1.0.1 follows 1.0.0.
Follow the same Final GA release flow — bump version, update changelog,
tag, and push. There is no need to create a new branch or bump main.