Releasing¶
Policy¶
Patch bumps are cheap. Prefer frequent small releases over feature-batching. Contract changes (§10.1/§10.2/§10.3 — see contracts.md) are the one exception: they demand a deliberate ceremony.
Versioning follows Semantic Versioning:
Patch — bug fixes, doc clarifications, additive internal refactors.
Minor — new features, additive contract changes (new CSL field, new policy,
schema_versionadditive).Major — contract breaks (renamed/removed CSL field, renamed
GenerationResultfield, changed citation marker shape, dropped policy).
The release flow¶
Land all PRs for the release into
main.Run
/bump [patch|minor|major](or invoke therelease-bumpskill) — updatessrc/citeformer/_version.pyand moves[Unreleased]into a numberedCHANGELOG.mdentry.Commit, push, open a “release vX.Y.Z” PR. Merge after CI is green.
Tag on main:
git tag vX.Y.Z && git push --tags.GitHub Actions
release.ymlpicks up the tag, builds sdist + wheel, publishes to PyPI via OIDC trusted publishing, and attaches artifacts to a GitHub Release with a CHANGELOG-link note.
Pre-release checklist¶
Before pushing the tag:
make lint && make test && make docs-buildall green locallyCI green on
mainCHANGELOG.mdhas the new version section (not[Unreleased])/contract-checkclean if any §10 files were touchedsrc/citeformer/_version.pymatches the tagAny new deps reflected in the right
pyproject.tomlextra
ReadTheDocs — one-time import¶
The .readthedocs.yaml in the repo root is wired up; what’s left is the
one-time import on readthedocs.org.
Sign in at https://app.readthedocs.org/ with the GitHub account that owns
random-walks/citeformer.Import a project → import manually (or use the GitHub integration if
random-walksis connected).Repository URL:
https://github.com/random-walks/citeformerDefault branch:
mainDocumentation type: Sphinx
After the first build succeeds, enable the Automation rule that activates new tags (so
v0.1.1,v0.1.2, … appear under the version picker without manual intervention).Confirm the URL resolves: https://citeformer.readthedocs.io/en/latest/.
Once live, the RTD badge in the README (which currently points at an unimported slug) will start rendering the real build status.