Release process#
A release is one run of .github/workflows/publish.yml, so that what was built, what was
checked and what was uploaded are in a public log rather than in someone's terminal. It
consists of a source tag, release notes, Python wheels, browser/Node Wasm assets, the npm
package, their checksums, and the same wheels and package on PyPI and npm. Versions with
a prerelease suffix are marked prerelease on GitHub and go to npm under the next tag.
Making a release#
- Land the version bump (below),
CHANGELOG.mdanddocs/releases/v<version>.mdonmain, and wait for theverifyworkflow to pass on that commit. - Run publish from the Actions tab (or
gh workflow run publish.yml -f source_commit=<40-character sha>). It:- builds and verifies the candidates with
release.yml(wheels on three platforms installed into clean environments; the Wasm bundles and the npm package installed into an empty project); - requires all four builds to report the same state and pixel hashes;
- refuses a version that is already tagged, then tags the commit and creates the
GitHub release with
SHA256SUMS; - downloads the wheels and the npm tarball back from that release, checks them
against
SHA256SUMS, and publishes them.
- builds and verifies the candidates with
- To publish a registry later, or again after a failure, run it with create_release off: it uses the release that exists and rebuilds nothing. A registry never accepts the same version twice, so a partly successful run is finished this way, not redone.
Credentials#
- PyPI holds no secret. The project trusts this repository's
publish.ymlin thepypienvironment as a trusted publisher. - npm holds no secret either. The
computerworldpackage trusts this repository'spublish.ymlin thenpmenvironment as a trusted publisher, with directnpm publishallowed (not only staging), and the package's publishing access is set to require two-factor authentication and disallow tokens. The 0.1.0 tarball was published once by hand from the GitHub release, because npm cannot trust a workflow for a package that does not exist yet; every later version is published by the workflow. To change the trust,npm trust github computerworld --repo JacobFV/computerworld --file publish.yml --environment npm --allow-publishfrom a logged-in npm 11.15+ with two-factor authentication. - crates.io is not published. The workspace is fifty-one crates joined by path
dependencies without versions, new crates are rate-limited to one every ten minutes
after the first five, and
cw-renderembeds about 38 MB of fonts and wallpapers against a 10 MB limit per crate. Publishing there means moving those assets out of the crate (or having the limit raised), giving every internal dependency a version, and publishing in dependency order. Until then Rust consumers pin the Git tag, and no document may tell them tocargo add computerworld.
Version identity#
The current release uses:
| Surface | Version |
|---|---|
| Git tag / Cargo / engine / npm | v0.2.0 / 0.2.0 |
| Python distribution | 0.2.0 |
A prerelease spells the two differently (0.1.0-alpha.3 and 0.1.0a3).
Update workspace/dependent Cargo versions, Cargo.lock, Python project metadata,
release packaging metadata and release notes together. Python exposes
computerworld.__version__ and computerworld.engine_version; JavaScript exposes
engineVersion(). Compare these with the release being installed. Keep the
resolved full source commit with experiment records, not just a moving branch.
Acceptance checklist#
Do not publish a release with unchecked failures. Record actual results in the release workflow/logs; the following list describes requirements, not past results.
- [ ] The source commit is clean and pushed; release notes and license notices are included.
- [ ] The complete verification workflow is green for that commit: Rust tests, formatting, strict Clippy, boundaries, host-adapter checks and Wasm build.
- [ ] Binding/browser verification is green: Python/Node execution and state/pixel parity, programmatic demos, offline browser checks and desktop interaction tests.
- [ ] Each advertised wheel builds on its target and installs into a clean Python environment. Import/version checks and a real terminal/world interaction pass.
- [ ] Unpacked browser/Node bundles load their included Wasm, report the expected engine version and run the included examples. The browser console runs from a static file server with no simulation backend.
- [ ] Asset names and supported platforms match what was actually built; failed or unavailable targets are omitted or explicitly documented rather than advertised.
- [ ] Release artifacts carry project/font/icon/wallpaper notices, checksums and source/version metadata. Verify SHA-256 after downloading staged artifacts.
- [ ] The version tag resolves to the verified source commit; a prerelease version is marked prerelease, and the downloadable assets match the verified checksums.
Verification commands#
From the tagged source checkout with Rust, Python, Node, maturin and the locked
wasm-bindgen-cli installed:
bash scripts/test-all.sh
bash scripts/smoke-bindings.sh
node examples/javascript/computer-interaction.mjs --output target/javascript-demo
python examples/python/computer_interaction.py --output target/python-demo --compare target/javascript-demo
Wheel and Wasm artifact checks must also run against the packaged outputs; source checkout tests alone do not detect missing archive resources or installation bugs. The release workflow is the executable platform/build specification. Existing benchmark reports are measurements of their recorded revisions and hardware; a release does not silently turn them into measurements of every new build.
Consumer verification#
Download SHA256SUMS alongside release assets. On Linux, check the downloaded
files using sha256sum --check --ignore-missing SHA256SUMS; on macOS use
shasum -a 256 to compare with the corresponding entry. On Windows use
Get-FileHash <asset> -Algorithm SHA256 and compare the hash. Checksums detect file
corruption/substitution relative to that manifest; they are not a separate
cryptographic signature or a claim of reproducible binary builds.
Pin the Git tag or exact asset/version in dependencies. Python and JS consumers should not mix files from different releases. Preserve world definitions and action traces in addition to snapshots: alpha checkpoint formats can change. Publish a new version for fixes rather than replacing an existing version's artifacts.