cairntir

Publish Checklist — releasing Cairntir

This is the canonical release sequence — how to publish, once publishing has been decided. Whether a release is warranted at all, and which version number it gets, is Release Cadence.

Code completion never authorizes publication. Pushing a v*.*.* tag starts the trusted-publishing workflow, so the tag is an explicit human gate.

Per-release acceptance

This is a template. Copy it into the release’s own evidence document under docs/release/ and check items off there — leave the boxes here unchecked so the next release starts from a clean list.

Automated acceptance:

Operational acceptance:

Release operations:

Past release records

Evidence and known limits for each shipped release live under docs/release/. The 1.12.3 record covers the current release preparation; the 1.12.2 record retains the prior publication evidence. The 1.12.1 record covers the current production installation. The withheld 1.12.0 record preserves its failed verification and unchanged tag. Earlier published records include 1.11.0 and 1.10.0.

Local verification

Run every command from the repository root:

$env:HF_HUB_OFFLINE = "1"
uv sync --all-extras
uv run ruff format --check .
uv run ruff check .
uv run mypy --strict src
uv run python scripts/check_no_silent_except.py
uv run pytest -q
uv run mkdocs build --strict
uv build

Also confirm:

Remote acceptance and publication

  1. Push the release-candidate branch and open or update its pull request.
  2. Wait for every required CI job. Investigate failures; never bypass them.
  3. Merge only the exact commit that passed review and CI.
  4. Obtain Patrick’s explicit approval to publish.
  5. Create the candidate’s annotated version tag on that merged commit and push only that tag.
  6. Watch the release workflow through verification, build, attestation, PyPI, and GitHub Release.
  7. Compare the published artifact hashes with the workflow artifacts and run the fresh-install smoke above.

If any publish job fails after PyPI accepts the version, do not delete or reuse the version. Diagnose the partial release, preserve the evidence, and ship the smallest higher patch version if another artifact is required.

Non-negotiable safeguards