Contributing
Contributing
This guide explains how to contribute changes and ship a release safely.
Development Workflow
Create a branch from
mainusing thecodex/prefix.Keep commits focused by concern (core code, providers, tests, examples, docs).
Run local quality gates before opening a PR.
Open a PR with:
change summary,
risk notes,
test evidence,
migration notes when API behavior changes.
Release Workflow
Use this flow for any tagged release.
1. Stabilize release branch
Update the authoritative version in
pyproject.toml; runtimepraval.__version__is derived from installed distribution metadata.Confirm release notes include:
feature summary,
breaking/behavioral changes,
migration guidance,
validation evidence.
Verify no unresolved TODOs or temporary debug code remain.
2. Run strict gates on final release candidate commit
Run all required checks and keep outputs for PR evidence:
make lint
make type-check
make test
make test-cov
python tests/test_all_examples.py
bash scripts/test-docker-examples.sh
make docs-check
make docs-html
python scripts/check_release_metadata.py
python scripts/check_api_surface.py
Rules:
Do not waive failing gates for a release.
Re-run the full gate set after any late fix.
3. PR topology
Use two PRs when docs are published from a separate site/docs repository:
PR-A: framework/package repo (code, tests, docs sources, release metadata).
PR-B: docs/site publish repo (generated docs, version index updates, site badges/links).
Order:
Merge PR-A and let
mainCI build the exact package/docs artifacts.Optionally run protected live certification for that commit.
Prepare and validate PR-B without merging it.
Upload the exact CI wheel to PyPI, verify it, and tag that
maincommit.Merge PR-B only after the new version appears on PyPI.
4. Build and publish artifacts
Keep exactly one wheel in
dist/; write manifests and checksums toevidence/.Validate the exact CI wheel with
twine check, distribution validation, reproducibility, and clean-wheel smoke tests.Upload the named CI wheel with Twine. Do not use
dist/*.Create the tag only after PyPI serves that exact wheel. The tag workflow verifies its hash and creates the GitHub release.
Do not rebuild or upload a different local artifact.
Smoke test installation from PyPI in a clean virtual environment.
5. Tag and GitHub release
Create and push release tag (for example
vX.Y.Z) from mergedmain.Create the GitHub release using the release notes file.
Attach released artifact(s) to the GitHub release when required by project policy.
6. Post-release verification
Install released version from registry and verify import/version.
Verify CLI entry points and critical commands.
Verify docs
latestand versioned pages resolve correctly.Verify the generated release evidence; do not copy volatile counts or hashes back into the committed release notes.
Commit Convention
Use commit prefixes to signal intent:
feat:new functionalityfix:bug fixdocs:documentation-only changestest:tests onlyrefactor:non-behavioral code restructuringBREAKING CHANGE:incompatible API/behavior change
Pull Request Checklist
Scope is focused and documented.
Tests added/updated for behavior changes.
Examples updated when user-facing behavior changed.
Docs updated (developer guide/API/tutorials/migration notes as needed).
Strict gates pass.
Release notes/changelog updated for release branches.