Release Guide¶
obslog releases are automated and hardened: PyPI Trusted Publishing (OIDC — no
long-lived tokens), signed build provenance attestations, and a published SBOM
(REL-013, NFR-SEC-005).
Versioning¶
- The package follows Semantic Versioning (
REL-001). - The Record schema is versioned independently via
schema_version(REL-002). - See API stability for the compatibility guarantees.
One-time setup¶
- On PyPI, configure Trusted Publishing for the project, pointing at this
repository and the
release.ymlworkflow (and apypienvironment). - Ensure the repository has GitHub Pages enabled for the docs deploy.
Cutting a release¶
- Update the version and finalize the
CHANGELOG.mdUnreleased section under the new version heading. - Open a PR; ensure CI is green (lint, strict types, tests across the Python matrix, benchmarks).
- Merge, then create a GitHub Release with a tag
vX.Y.Z. - The
release.ymlworkflow then: - builds the sdist and wheel,
- generates a CycloneDX SBOM,
- attests build provenance (Sigstore) for the artifacts,
- publishes to PyPI via Trusted Publishing.
Reaching 1.0¶
At 1.0 the public API and reserved Record schema are frozen (REL-003); subsequent
breaking changes require a 2.0 and an ADR. Before tagging 1.0:
- confirm the public surface in API stability is final,
- confirm the Record and bundle JSON Schemas are final,
- confirm docs cover every item in the documentation set.
Docs¶
Documentation is built with MkDocs and deployed by docs.yml on pushes to main:
python -m pip install -e ".[docs]"
mkdocs serve # local preview
mkdocs build --strict