|
CDT++ 1.0.0
Causal Dynamical Triangulations in C++
|
This guide documents the release flow for CDT++ release candidates and the final v1.0.0 release: prepare a dedicated release pull request, merge it, create an annotated tag with reviewed release notes, and create the GitHub release. The final stable release also includes the Zenodo deposit handoff prepared by issue #96, the publication sequence owned by issue #97, and the separate owner-timed stabilization and archival gate in issue #155.
CDT++ is not published to a package registry. The GitHub release and its automatically provided source archives are the release artifacts. The Python project and vcpkg manifest are repository tooling and dependency metadata; do not publish them independently as part of this process.
Run the commands from the repository root. Set TAG for the release being made; the rest of the workflow is identical:
A release-candidate tag such as v1.0.0-rc3 uses 1.0.0-rc3 for product, vcpkg, Doxygen, and citation metadata, and the PEP 440 spelling 1.0.0rc3 for Python metadata. A stable tag such as v1.0.0 uses 1.0.0 everywhere else.
The changelog workflow requires the pinned git-cliff version declared by the Justfile. Check or install it with:
All feature and fix work intended for the release should already be on main. Keep the release pull request limited to release metadata, active release documentation, and its lockfile consequences.
Start from an up-to-date, clean main branch:
The status command should produce no output before creating the branch.
Edit the following synchronized metadata:
For v1.0.0, synchronize the versions in the repository before generating the changelog. Set CITATION.cff's date-released to the actual release date and review the other fields rather than rewriting unchanged metadata:
Review the citation identity fields at the same time: title, authors, ORCID, repository, URL, license, release date, and DOI. The top-level doi is the Zenodo concept DOI 10.5281/zenodo.21487043 for all CDT++ versions. Do not replace it with the RC3 record DOI or another version-specific DOI.
just changelog-unreleased validates TAG against all synchronized release metadata, runs git-cliff offline, takes the release date from CITATION.cff, and atomically replaces CHANGELOG.md. Review the generated release section before committing it.
Run the release-specific metadata check, strict documentation check, and full cross-platform-equivalent local validation gate:
just release-check verifies synchronization across CMake, vcpkg, Python, uv.lock, Doxygen, citation metadata, and active release references.
The protected-branch ruleset uses stable summary contexts for the deterministic release gates:
ThreadSanitizer and CodeQL remain advisory diagnostics rather than protected branch requirements; MemorySanitizer remains manual and experimental. Do not promote those contexts without a separate stability decision.
Review and commit only release artifacts:
For the final v1.0.0 release, regenerate the reference package only after the release metadata commit leaves the worktree clean. The generator records that clean commit as the producer revision:
Review and explain every changed exact field before committing the generated artifacts. The producer revision is the preceding clean release-metadata commit; the subsequent artifact commit cannot name itself without a self-reference. Both commits remain in the release pull request history, and the resulting merge commit containing both is the one that is tagged.
Push the branch and open the release pull request:
Merge the pull request only after every required check passes. Use the normal repository merge strategy; from the command line:
Return to main, update it to the merge commit, and repeat the release gates against the exact commit that will be tagged:
Preview the annotated tag that will be created from the matching CHANGELOG.md section, then create and inspect it:
Both tag commands first run reference-archive-check, then reject malformed SemVer, missing or empty changelog sections, existing tags, and dirty worktrees. just tag-check performs every preflight without changing Git state. Do not move or replace a pushed release tag. If the tagged commit is wrong, prepare a new version instead.
Create the GitHub release from the annotated tag. RELEASE_FLAGS marks an RC as a prerelease and expands to no arguments for a stable release:
Before publishing a release that Zenodo should archive, sign in to Zenodo with the GitHub-linked account, enable this repository under Profile → GitHub, and verify that GitHub has exactly one active Zenodo release webhook without printing its token-bearing callback URL:
Stop if this preflight fails. Enabling Zenodo after publication does not reliably import an earlier GitHub release.
Published releases may be immutable. Never delete a published release to retrigger an integration: GitHub permanently reserves an immutable release's tag name, so the release cannot be recreated with that tag. Verify external integrations before publishing and create a new version if a release must be repeated.
Always use the exact tag, including the leading v, as the release title. Verify the published release. The tag-specific delivery lookup requires repository-webhook read access; if gh reports a missing admin:repo_hook scope, add it once with gh auth refresh -h github.com -s admin:repo_hook:
For a release candidate intentionally deposited with Zenodo, verify the record and DOI without treating it as the final stable handoff. For the stable release, complete the Zenodo handoff prepared by issue #96 and executed by [issue #97]: confirm that Zenodo received the release, verify its version, date, title, authors, license, repository URL, and files, and retain the top-level CFF doi as the all-versions concept DOI.
Once Zenodo creates the stable record DOI, add it without replacing the concept DOI:
If the record DOI was unavailable before tagging, make this one focused post-release metadata commit, rerun just release-check and just docs-check, and do not rewrite the tag. Finish this update before the repository is made read-only.
After the release is verified, remove the release branch if the pull request did not already delete it:
If the remote branch was already deleted, the remote deletion command may be omitted.
Issue #155 owns the stabilization gate and eventual irreversible final sequence. It remains blocked by issue #97 until the GitHub release, source archives, Zenodo record, DOI metadata, and repository description are verified:
Do not close #155 or archive before the owner ends the stabilization window, retires the fallback hedge, and completes the version-specific DOI commit above. Do not leave a tracker open for work that cannot be performed after archival.
If a critical problem is found before tagging, fix it through a pull request, regenerate CHANGELOG.md with just changelog-unreleased "$TAG" after the fix is merged, and rerun all validation steps. Defer non-critical fixes to the next version and document them in the changelog when appropriate.
If a problem is found after the tag is pushed or the GitHub release is published, do not retag the release. Correct it in a new release.