Releases are cut from the monorepo (the source of truth), published to PyPI, and
then reflected here as a new Release vX.Y.Z mirror commit. Contributors never cut
releases from this repo.
- SemVer. The public surface + promise are defined in
docs/STABILITY.md. - SSOT =
src/*/_version.pyin the monorepo. Bumping it is the release trigger. - Pre-releases use PEP 440 suffixes (
1.1.1b4).pip install convilyninstalls the latest stable;pip install --pre convilynopts into betas.
- Bump
src/*/_version.pyin the monorepo via a PR (+ aCHANGELOG.mdentry); merge to the integration branch. - Tag the release commit with the manifest-driven tag:
sdk-consumer-python/vX.Y.Zorsdk-author-python/vX.Y.Z, then push the tag. - OIDC publish (no secrets). The tag triggers
.github/workflows/sdk-publish.ymlin the monorepo — resolve → build → clean-venv install/import smoke → PyPI Trusted Publishing over OIDC. No long-lived API token is ever used.- One-time setup on PyPI: add a Trusted Publisher for the
convilynproject bound to theCoreNovus/convilynrepo + thesdk-publish.ymlworkflow + release environment.
- One-time setup on PyPI: add a Trusted Publisher for the
- Refresh this mirror: regenerate with
scripts/oss/mirror_sdk.pyand push the newRelease vX.Y.Z(append-only, plaingit push— no force). Runscripts/oss/validate_mirror_ci.sh <sdk>first so the mirror's CI is green before the push.
- Public surface matches
docs/STABILITY.mdand the contract tests are green. -
CHANGELOG.mdhas a dated entry; no[Unreleased]gaps. - A
--preinstall smoke test passes on a clean venv (import + a real call). - Drop the
bNsuffix in_version.py; tag…/vX.Y.Z; OIDC-publish; refresh the mirror.
- Never
twine uploadwith a long-lived token — use the OIDC tag flow. - Never force-push the mirror or re-tag a published version (PyPI versions are immutable — bump instead).