How a new Raven version is cut and published.
- Semantic versioning
MAJOR.MINOR.PATCH. The source of truth isversioninpyproject.toml. - Tags:
vX.Y.Zfor a stable release,vX.Y.Z-rcNfor a pre-release. The tag must match thepyproject.tomlversion -- CI enforces this (release.yml). - For a pre-release, keep
pyproject.tomlat the base version (e.g.0.1.3while taggingv0.1.3-rc1); CI compares only the base. Do NOT set the version to0.1.3-rc1-- that is not a version hatch will build.
Raven X.Y.Z (YYYY-MM-DD) -- for example Raven 0.1.3 (2026-07-08). The CI
draft fills this in automatically (date is the build date; adjust when
publishing if needed).
Notes are hand-written and curated. The CI draft prefills the boilerplate (Install, Release Status, Notes); a human writes the one-line summary and the Highlights before publishing. Structure:
<one-line summary>
## Highlights
- <user-facing change>
## Install
curl -fsSL https://raven.evermind.ai/install.sh | bash
then: raven onboard
## Release Status
- Version: `X.Y.Z`
- Tag: `vX.Y.Z`
- Stability: <public preview patch | public preview minor | ...> # fill by hand per release type
- Assets: wheel, source distribution, and locked constraints
(`raven-constraints.txt`) attached to this release
## Notes
- pre-1.0 evolution caveat
- PyPI not enabled; install via the GitHub Release wheel
Stability is not boilerplate -- set it by release type (patch / minor / rc).
- Bump
versioninpyproject.toml, runuv lock, then open a PR; merge tomain. git tag vX.Y.Z && git push origin vX.Y.Z.- CI (
release.yml) builds the wheel + sdist, exports the locked constraints fromuv.lock(uv export --locked, which fails the release if the lock is stale vs pyproject), and creates a draft GitHub Release with all three attached, titled and prefilled from the template. - Fill the summary + Highlights in the draft, then click Publish.
Publishing makes it
/releases/latest, whichinstall.shserves.
vX.Y.Z-rcNtags build a draft marked pre-release. A pre-release is never/releases/latest, socurl | shusers are unaffected. Use an rc tag to verify the release pipeline before cutting the stable tag; delete the rc release and tag afterward.
mainis squash-merge + PR-only. The release itself is not automated past the draft: publishing is a deliberate human step.- PyPI publishing is not wired up; the supported install path is the GitHub
Release wheel asset resolved by
install.sh. install.sh/install.ps1passraven-constraints.txttouv tool install -c, so a one-click install gets the exact locked versions we test rather than re-resolving to the newest allowed bypyproject.toml. A release older than this asset installs without pinning (the scripts degrade gracefully). To lift a pin later, updateuv.lockand cut a new release; the install scripts need no change.