From 887795ba339e18b610f9c3f228a4caaeeffbda25 Mon Sep 17 00:00:00 2001 From: Adam Getchell Date: Mon, 10 Aug 2026 14:26:35 -0700 Subject: [PATCH 1/2] chore(release): prepare v1.0.0 Synchronize stable version, changelog, citation, and security metadata. Document the stabilization and later archival handoff, and require clean reference provenance before the future release tag. --- .github/CONTRIBUTING.md | 174 ++++++----------- CHANGELOG.md | 111 +++++++++++ CITATION.cff | 5 +- CMakeLists.txt | 6 +- Justfile | 8 +- README.md | 265 +++++++++++--------------- REFERENCES.md | 44 ++++- SECURITY.md | 25 +++ cliff.toml | 11 ++ docs/Doxyfile | 11 +- docs/RELEASING.md | 123 +++++++++--- docs/arithmetic-backend-evaluation.md | 4 + docs/cgal-integration.md | 10 +- docs/metropolis-hastings.md | 9 +- docs/multithreading.md | 4 +- include/Metropolis.hpp | 2 +- include/Triangulation_traits.hpp | 5 + pyproject.toml | 4 +- reference/README.md | 15 +- scripts/release_check.py | 21 +- scripts/tests/test_release_check.py | 22 ++- scripts/validate_generated_site.py | 2 + typos.toml | 7 + uv.lock | 2 +- vcpkg.json | 2 +- 25 files changed, 560 insertions(+), 332 deletions(-) create mode 100644 SECURITY.md diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index df838120b..a30033ef3 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -1,115 +1,63 @@ # Contributing to CDT++ -Thank you for helping improve CDT++. - -CDT++ v1.0.0-rc3 is the current C++23 release candidate. The project remains maintained as a scientific reference -implementation and regression oracle for -[causal-triangulations](https://github.com/acgetchell/causal-triangulations), its supported Rust successor. The -v1.0.0 release scope is tracked by [issue #90](https://github.com/acgetchell/CDT-plusplus/issues/90). Archiving the -GitHub repository or making it read-only is a separate future maintainer decision, not settled policy for immediately -after v1.0.0. - -## Accepted work - -Contributions should be limited to: - -- correctness fixes, especially for causal invariants, bistellar moves, and scientific results; -- deterministic tests, reproducibility improvements, and cross-implementation validation; -- documentation, build, CI, portability, dependency, and release-readiness fixes; -- work already approved in a project issue or release milestone, including - [Qt restoration #98](https://github.com/acgetchell/CDT-plusplus/issues/98) and - [domain invariant work #101](https://github.com/acgetchell/CDT-plusplus/issues/101) and - [offline C++/Rust comparison #104](https://github.com/acgetchell/CDT-plusplus/issues/104); and -- changes required to complete the v1.0.0 release and Zenodo deposit. - -New simulation features, 3+1D/4D development, and unrelated C++ expansion remain out of scope unless a project issue -explicitly approves them. Potential future 4D research does not authorize implementation by itself. If a change is -not already tracked, open an issue before investing in a substantial implementation so its maintenance value and -scope can be agreed upon. - -## Contribution workflow - -1. Fork the repository and create a short-lived branch from `main`. - -2. Keep the change focused and preserve scientific behavior unless the purpose of the change is to correct a - documented bug. - -3. Add or update deterministic tests for behavior changes. Tests use [doctest] and live in `tests`; register new test - files in `tests/CMakeLists.txt`. Existing tests use descriptive BDD-style `SCENARIO`, `GIVEN`, `WHEN`, and `THEN` - sections where that structure clarifies behavior. - -4. Update relevant documentation and Doxygen comments when interfaces, supported workflows, or scientific behavior - change. - -5. Run the repository-owned validation commands: - - ```bash - just fix - just check - just ci - just build-parallel - ``` - - `just check` is the fast, non-mutating source and tooling gate, including the - repository-owned Semgrep policy and its fixtures. `just ci` adds the - supported build and complete 131-entry CTest suite: 106 doctest scenarios, - 23 CLI integration tests, one compiled C++ API example, and one - arithmetic-backend correctness test. `just build-parallel` builds the - distinct CGAL/oneTBB configuration and runs its 132-entry suite: 106 ordinary - doctest scenarios, one replayable parallel stress launcher containing five - scenarios, the same 23 CLI integration tests, the C++ API example, and the - arithmetic correctness test. When changing C++ - behavior, also run `just clang-tidy` with the pinned LLVM 22 toolchain and - review its advisory diagnostics. - GitHub Actions runs `just ci` in its Ubuntu GCC, Ubuntu Clang, macOS AppleClang, and Windows MSVC jobs. The two - Ubuntu jobs also run `just build-parallel` to exercise the opt-in CGAL/oneTBB contract, and the macOS job runs - `just viewer-build`. Pull requests run the separate coverage and generated-documentation gates. Sanitizer and - coverage builds keep Release assertion semantics while adding their own debug information and optimization settings. A - separate full-suite Debug job is intentionally omitted because several fixtures traverse invalid intermediate - triangulations and abort on CDT++ invariant assertions. Use `just build-debug` to compile production targets with - CDT++ assertions enabled and run the 21 compatible CLI integration CTests. That preset defines `CGAL_NDEBUG` for - supported move paths while excluding `cdt`, `cdt-no-output`, and the doctest unit fixtures because they trip - project assertions on deliberately invalid intermediate states. The Windows job continues to compile with native - MSVC; LLVM tooling is used only for source formatting. Toolchain setup is pkgx-first; - because pkgx does not currently publish its CMake and Ninja packages for Windows, that job uses the exact Justfile - pins available as PyPI wheels through `uv tool install --no-build`. - -6. Run the relevant Linux sanitizer configuration for changes involving memory, lifetime, undefined behavior, or - concurrency: - - ```bash - just sanitize asan - just sanitize lsan - just sanitize tsan - ``` - - MemorySanitizer is experimental because third-party dependencies are not instrumented; run it manually with - `just sanitize msan` when useful. - -7. Open a pull request against `main`, explain the maintenance issue being addressed, and identify any scientific or - reproducibility implications. All required GitHub Actions checks must pass. - -The project [Code of Conduct](CODE_OF_CONDUCT.md) applies to all participation. - -## Style - -The project uses Stroustrup-style formatting with Allman braces, enforced by the repository's `.clang-format` and -LLVM 22. The C++ Core Guidelines inform the `.clang-tidy` policy. Prefer minimal, readable changes over cosmetic -modernization, and do not suppress diagnostics without documenting why the check is inappropriate for this codebase. - -Project source files belong in `src`, public or shared headers in `include`, and tests in `tests`. Use the existing -CMake targets, presets, CTest registrations, Just recipes, and pinned vcpkg manifest rather than introducing parallel -build paths. - -## Release and repository lifecycle - -Release candidates, the final tag, and the Zenodo deposit follow the -[`docs/RELEASING.md`](../docs/RELEASING.md) runbook. The final v1.0.0 release will be tagged from `main`; release -metadata and the Zenodo handoff are tracked by [issue #96](https://github.com/acgetchell/CDT-plusplus/issues/96). -Making the GitHub repository read-only would require a separate explicit maintainer decision. Until then, issues and -pull requests remain governed by the scoped contribution policy above. - -Contributors retain credit through the repository history and resulting project citation metadata. - -[doctest]: https://github.com/doctest/doctest -[Zenodo]: https://zenodo.org/ +CDT++ v1.0.0 is the final planned C++23 feature release. The repository is +preserved as a historical scientific reference and regression oracle for +[causal-triangulations](https://github.com/acgetchell/causal-triangulations), +the supported Rust successor. Active development, new scientific features, +and general support belong in that project. + +Issue [#97](https://github.com/acgetchell/CDT-plusplus/issues/97) owns the +final tag, GitHub release, and Zenodo record verification. Issue +[#155](https://github.com/acgetchell/CDT-plusplus/issues/155) owns the separate +stabilization gate, tracker closure, and eventual repository archival. +Archival is not immediate: the repository remains maintenance-only until the +owner determines that no release blockers remain, after which GitHub will make +it read-only. + +## Final release corrections + +Before archival, pull requests are limited to release-blocking correctness, +reproducibility, security, documentation, and metadata corrections. A +correction must be tied to an existing release issue, preserve the bounded +2+1-dimensional spherical scientific contract unless it fixes a documented +defect, and include deterministic regression evidence when behavior changes. +A critical defect found after v1.0.0 is published must use a new patch release; +the v1.0.0 tag is immutable. + +Run the repository-owned validation appropriate to the correction: + +```bash +just fix +just check +just release-check +just docs-check +just ci +just build-parallel +``` + +`just ci` is the supported headless build and test contract. The two Ubuntu +compiler cells also run `just build-parallel`; the macOS cell additionally +runs the opt-in archival viewer. Use `just clang-tidy` for C++ changes and the +relevant `just sanitize asan`, `just sanitize lsan`, or `just sanitize tsan` +workflow for memory, lifetime, undefined-behavior, or concurrency changes. +MemorySanitizer remains experimental because third-party dependencies are not +instrumented. + +Open a focused pull request against `main`, identify the blocking release +issue, and explain any scientific, compatibility, reproducibility, citation, +or archival-metadata impact. All required GitHub Actions checks must pass. + +## After archival + +Do not fork CDT++ merely to continue its retired development line. Use the +active successor for new work. Historical forks remain subject to the BSD +3-Clause license but are not supported by this repository and must not imply +upstream maintenance or compatibility. + +Security and support reporting is defined in +[`SECURITY.md`](../SECURITY.md). The project +[Code of Conduct](CODE_OF_CONDUCT.md) remains part of the preserved project +record. + +Contributors retain credit through the repository history, `CITATION.cff`, +and the Zenodo archive. diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e5637d20..0aca3dd49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,114 @@ All notable changes to CDT++ are documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.0.0] - 2026-08-10 + +### Release summary + +CDT++ 1.0.0 is the final planned feature release of the C++23 spherical 2+1-dimensional reference implementation. + +- **Compatibility:** The supported source boundary is C++23 with the published GCC, Clang, AppleClang, and MSVC matrix. The project does not promise a stable binary ABI or package-registry distribution. +- **Scientific corrections:** The release completes and independently validates all five 2+1D moves, Metropolis-Hastings proposal ratios and atomic transitions, exact-predicate geometry boundaries, run-owned RNG streams, and causal persistence metadata. +- **Supported surface:** The default build is headless; CGAL/oneTBB bulk Delaunay operations and the macOS Qt viewer are explicit opt-ins. Historical toroidal and higher-dimensional prototypes are excluded from the supported API. +- **Limitations:** Seeds replay stochastic inputs, not necessarily fresh cospherical CGAL topology. Checkpoints are validated snapshots rather than resumable simulations, and parallelism does not extend to Pachner moves or concurrent manifold access. +- **Migration:** Active development and new work move to [causal-triangulations](https://github.com/acgetchell/causal-triangulations). After the v1.0.0 GitHub and Zenodo handoff, CDT++ enters a maintenance-only stabilization window and becomes read-only only when the owner completes the archival gate. + +### Added + +- [**breaking**] Modernize Python experiment workflows [`def276a`](https://github.com/acgetchell/CDT-plusplus/commit/def276aa2fdb9eb473d7425d61e29e26511caa28) + +- [**breaking**] Add offline C++/Rust comparison harness [`45b080e`](https://github.com/acgetchell/CDT-plusplus/commit/45b080e2388b2475bf26f4462fa4d1ebd5915c69) + +- Restore reproducible archival rendering [`2662df9`](https://github.com/acgetchell/CDT-plusplus/commit/2662df9993469e21ec5a0c65c552202b9eec9ae6) + +- [**breaking**] Expose reported Metropolis transitions [`16d1c76`](https://github.com/acgetchell/CDT-plusplus/commit/16d1c769afc67e06f07639f6fd9de8136974e282) + +### Changed + +- Expose shared artifact lifecycle helpers [`2f3ba57`](https://github.com/acgetchell/CDT-plusplus/commit/2f3ba57d425f8ab4f1a0c5da0cedf7876b13eaa5) + +- Evaluate Boost alternatives to GMP and MPFR [`9a02c39`](https://github.com/acgetchell/CDT-plusplus/commit/9a02c3960f7b7f45b4a29f844f2cddbd21ab0231) + +- Harden backend evaluation probes [`d5c3b71`](https://github.com/acgetchell/CDT-plusplus/commit/d5c3b710b0af82651943f5a1e60c23b5ec818679) + +- Format transition validation [`f183f07`](https://github.com/acgetchell/CDT-plusplus/commit/f183f072b44b3fe3b677090b8e5cd4983c193932) + +- Verify unknown moves preserve transition traces [`70ab238`](https://github.com/acgetchell/CDT-plusplus/commit/70ab238eb07271a7754266407f9f61e28e199b49) + +### Fixed + +- Serialize Dependabot automation per pull request [`7567372`](https://github.com/acgetchell/CDT-plusplus/commit/7567372f3f11136b4317b66e695e7f2aa7d2dd69) + +- Deduplicate CodeRabbit review requests by revision [`7f23d53`](https://github.com/acgetchell/CDT-plusplus/commit/7f23d530e092114b69f7b8d42b5339e24495282d) + +- Bind Dependabot auto-merge to reviewed revision [`72fc5a1`](https://github.com/acgetchell/CDT-plusplus/commit/72fc5a1181d8f1d4c4c0756c809b196c72929b43) + +- Harden Dependabot review rearming on head updates [`5d571c8`](https://github.com/acgetchell/CDT-plusplus/commit/5d571c85150615f1a93f931f144e076eeb884d89) + +- Authenticate CodeRabbit review requests as maintainer [`375c9ea`](https://github.com/acgetchell/CDT-plusplus/commit/375c9ea1fcaf775054ad0537d7bf5e0656148d21) + +- Require reviewed Dependabot merges and refresh tooling [`7c3a84b`](https://github.com/acgetchell/CDT-plusplus/commit/7c3a84bdfb91ca33829ad4302f5debd275d824ee) + +- Restore MPFR builds and fail closed on polling errors [`1d2e667`](https://github.com/acgetchell/CDT-plusplus/commit/1d2e667f7df090db7a5ef792fa1bbf9bec9c32b6) + +- Prevent stale vcpkg [`9e8d033`](https://github.com/acgetchell/CDT-plusplus/commit/9e8d033e34c389808206e1d0644a7cd58b88336e) + +- [**breaking**] Preserve coincident causal identities [`3f72a16`](https://github.com/acgetchell/CDT-plusplus/commit/3f72a16c636a21a05c7273f4667efc0b8c919288) + +- Harden persistence and vcpkg pin synchronization [`3a66693`](https://github.com/acgetchell/CDT-plusplus/commit/3a66693a35b27d766b8ac022fd53eccc51f39f09) + +- Canonicalize complete vertex-cell incidence [`52f9a58`](https://github.com/acgetchell/CDT-plusplus/commit/52f9a58e06898b563168dd75525ed53c02cd3ca4) + +- Bound incidence fingerprint canonicalization [`307737c`](https://github.com/acgetchell/CDT-plusplus/commit/307737ce2c5c79af376d7f38b4183a70925992d2) + +- Harden experiment and repository validation [`fb7e5b3`](https://github.com/acgetchell/CDT-plusplus/commit/fb7e5b36161ec11eb16ab9c7b88557dbe5a916ec) + +- Harden cross-platform validation [`6b4d012`](https://github.com/acgetchell/CDT-plusplus/commit/6b4d012067002259a87c51915b6c7bbfaefd48d6) + +- Pin Python for sanitizer bootstrap [`9181494`](https://github.com/acgetchell/CDT-plusplus/commit/9181494871400009192bfea67605543b7be78130) + +- Refresh portable Python package checks [`96baa21`](https://github.com/acgetchell/CDT-plusplus/commit/96baa21d258ae50992f592f498cb87467211f2c6) + +- Preserve local runs when Comet mirroring fails [`9cadfe7`](https://github.com/acgetchell/CDT-plusplus/commit/9cadfe772670abed767953079990a2080914e0a4) + +- Harden portable harness validation [`da7ba14`](https://github.com/acgetchell/CDT-plusplus/commit/da7ba141eb362866942241135d325e1ae9df4fec) + +- Select the root vcpkg manifest [`1c064fd`](https://github.com/acgetchell/CDT-plusplus/commit/1c064fd098c845e6efaea48290a43b023ebddbe3) + +- Restore vcpkg binary caching [`2b27462`](https://github.com/acgetchell/CDT-plusplus/commit/2b2746202d8ebb09b6e2c801a5868794414398ca) + +- Track canonical rendering fixture [`7078f69`](https://github.com/acgetchell/CDT-plusplus/commit/7078f69d7f19e54b0cd4c888666815f2578e5add) + +- Harden archival rendering contract [`81d366e`](https://github.com/acgetchell/CDT-plusplus/commit/81d366ef9b58dfa750061f3fb9305cbbafb04a83) + +- Harden transition and documentation validation [`e955ee6`](https://github.com/acgetchell/CDT-plusplus/commit/e955ee643caa5e081314dfc6c5a5168bc1f17319) + +- Queue approved Dependabot updates for auto-merge [`e63e32f`](https://github.com/acgetchell/CDT-plusplus/commit/e63e32f627dfb1e83392714183c09032157fa74a) + +- Enforce v1.0.0 release gates [`94ed107`](https://github.com/acgetchell/CDT-plusplus/commit/94ed107aa2390accd17f0191c4149df6201618ed) + +- Fail fast and support Dependabot coverage [`2107f20`](https://github.com/acgetchell/CDT-plusplus/commit/2107f20d429b466eb7ec01693e769a0262dcd264) + +- Stabilize macOS viewer and coverage gates [`deb24ab`](https://github.com/acgetchell/CDT-plusplus/commit/deb24ab0d7ce179469839a145f344ca1624c1275) + +### Maintenance + +- Gate automatic merges on CodeRabbit review [`8124227`](https://github.com/acgetchell/CDT-plusplus/commit/812422797620c2203c9214af880cb5957af4469b) + +- Bump the github-actions group with 4 updates [#134](https://github.com/acgetchell/CDT-plusplus/pull/134) [`55d192d`](https://github.com/acgetchell/CDT-plusplus/commit/55d192df05ca9d34050fb8fa618984573be2eb97) + +- Bump the github-actions group with 2 updates [#136](https://github.com/acgetchell/CDT-plusplus/pull/136) [`90a3ea6`](https://github.com/acgetchell/CDT-plusplus/commit/90a3ea67db84d553d5803bdbaa9bb60ed937aa33) + +- Automate vcpkg tool pin sync [`9631335`](https://github.com/acgetchell/CDT-plusplus/commit/96313355bc851ae05f5787e95839d9e619a39d2c) + +- Bump the dependencies group with 3 updates [#144](https://github.com/acgetchell/CDT-plusplus/pull/144) [`098822d`](https://github.com/acgetchell/CDT-plusplus/commit/098822d04b2a8b325f60529e8e98910845dd330c) + +- Stagger Dependabot update schedules [`9cf5b9d`](https://github.com/acgetchell/CDT-plusplus/commit/9cf5b9d3a1f6fc1583a9b937446df56dc1626a06) + +- Bump cryptography from 49.0.0 to 50.0.0 [#146](https://github.com/acgetchell/CDT-plusplus/pull/146) [`e23d3c4`](https://github.com/acgetchell/CDT-plusplus/commit/e23d3c4912b80754bd97c11f2ff8a50f2bc3d61f) + +- Bump taiki-e/install-action [#152](https://github.com/acgetchell/CDT-plusplus/pull/152) [`426edb8`](https://github.com/acgetchell/CDT-plusplus/commit/426edb8085a67c3aae5a308fd1355aa05c800e9c) + ## [1.0.0-rc3] - 2026-07-28 ### Added @@ -81,6 +189,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Streamline and harden supported build workflows [`e29f69a`](https://github.com/acgetchell/CDT-plusplus/commit/e29f69a676bc7c10c12afbea4791fa70e9298de9) +- Update v1.0.0-rc3 release date [`e8f45ea`](https://github.com/acgetchell/CDT-plusplus/commit/e8f45ea15fdb813c00f0d773f8ff30251c699207) + ### Performance - [**breaking**] Avoid rebuilding caches during move validation [`f574f0f`](https://github.com/acgetchell/CDT-plusplus/commit/f574f0f381d202fcdc3cbaf78a815af983a1815d) @@ -123,6 +233,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Update docs/RELEASING.md [`26196da`](https://github.com/acgetchell/CDT-plusplus/commit/26196daa76b1094ea9364a20b3618ef61a5c4185) +[1.0.0]: https://github.com/acgetchell/CDT-plusplus/compare/v1.0.0-rc3...v1.0.0 [1.0.0-rc3]: https://github.com/acgetchell/CDT-plusplus/compare/v1.0.0-rc2...v1.0.0-rc3 [1.0.0-rc2]: https://github.com/acgetchell/CDT-plusplus/compare/v1.0.0-rc1...v1.0.0-rc2 [1.0.0-rc1]: https://github.com/acgetchell/CDT-plusplus/compare/0.1.8...v1.0.0-rc1 diff --git a/CITATION.cff b/CITATION.cff index dfa5120bd..7df25431c 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -11,10 +11,11 @@ authors: given-names: "Adam" email: "adam@adamgetchell.org" orcid: "https://orcid.org/0000-0002-0797-0021" -version: "1.0.0-rc3" -date-released: "2026-07-28" +version: "1.0.0" +date-released: "2026-08-10" repository-code: "https://github.com/acgetchell/CDT-plusplus" url: "https://github.com/acgetchell/CDT-plusplus" +doi: "10.5281/zenodo.21487043" license: BSD-3-Clause keywords: - "causal-dynamical-triangulations" diff --git a/CMakeLists.txt b/CMakeLists.txt index cfc49c217..e457891b1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,9 +29,9 @@ project( # CDT++ does not use C++ modules, so avoid unnecessary dependency scanning. set(CMAKE_CXX_SCAN_FOR_MODULES OFF) -# CMake project versions are numeric, so keep the release-candidate suffix in -# the product version used by executables and release metadata. -set(CDT_VERSION_SUFFIX "-rc3") +# CMake project versions are numeric. Stable releases use an empty product +# suffix; release candidates use the synchronized "-rcN" spelling. +set(CDT_VERSION_SUFFIX "") set(CDT_VERSION "${PROJECT_VERSION}${CDT_VERSION_SUFFIX}") set(CDT_SOURCE_REVISION "unknown") find_package(Git QUIET) diff --git a/Justfile b/Justfile index ed5103089..6488f59ae 100644 --- a/Justfile +++ b/Justfile @@ -602,14 +602,14 @@ spell-check: _ensure-typos sync-vcpkg-tool-pins: _sync-python-dev uv run --no-sync python scripts/sync_vcpkg_tool_pins.py -# Create an annotated release tag from the matching CHANGELOG.md section. +# Create an annotated release tag only after archival provenance is clean. [group('release')] -tag version: _sync-python-dev +tag version: reference-archive-check uv run --no-sync cdt-tag-release {{ quote(version) }} -# Validate and preview an annotated release tag without creating it. +# Validate archival provenance and preview a tag without creating it. [group('release')] -tag-check version: _sync-python-dev +tag-check version: reference-archive-check uv run --no-sync cdt-tag-release {{ quote(version) }} --dry-run # Update and repin GitHub Actions, then validate the resulting workflows. diff --git a/README.md b/README.md index 2fcfda345..0044b198c 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ **Quantize spacetime on your laptop.** [![DOI](https://badgen.net/badge/DOI/10.5281%2Fzenodo.21487043/blue)](https://doi.org/10.5281/zenodo.21487043) -[![GitHub stars](https://badgen.net/github/stars/acgetchell/CDT-plusplus)](https://github.com/acgetchell/CDT-plusplus/stargazers) [![License](https://badgen.net/github/license/acgetchell/CDT-plusplus)](https://github.com/acgetchell/CDT-plusplus/blob/main/LICENSE.md) [![CI](https://github.com/acgetchell/CDT-plusplus/actions/workflows/ci.yml/badge.svg)](https://github.com/acgetchell/CDT-plusplus/actions/workflows/ci.yml) [![Documentation](https://github.com/acgetchell/CDT-plusplus/actions/workflows/doxygen.yml/badge.svg)](https://www.adamgetchell.org/CDT-plusplus/) @@ -14,29 +13,35 @@ This reproducible archival rendering is generated from a tracked triangulation fixture; see the [viewer and visual-artifact contract](docs/viewer.md). -## Maintenance status +## Archival and maintenance status -CDT++ v1.0.0-rc3 is the current C++23 release candidate. The repository remains maintained as an independent -scientific reference and regression oracle for -[causal-triangulations](https://github.com/acgetchell/causal-triangulations), the supported Rust successor. New C++ -work is limited to correctness, reproducibility, cross-implementation validation, the complete supported 2+1D move -set, and work approved in project issues. The v1.0.0 release contract remains tracked by -[issue #90](https://github.com/acgetchell/CDT-plusplus/issues/90); making the GitHub repository read-only is a -separate future lifecycle decision rather than an automatic consequence of that release. The local Python -comparison harness orchestrates independent C++ and Rust executables and analyzes their declared outputs; it is not a -second scientific implementation. +**CDT++ v1.0.0 is the final planned C++23 feature release.** This repository preserves the C++ implementation as a +historical scientific reference and regression oracle. After the release and Zenodo handoff in +[issue #97](https://github.com/acgetchell/CDT-plusplus/issues/97), it will remain maintenance-only during a +stabilization window. [Issue #155](https://github.com/acgetchell/CDT-plusplus/issues/155) will archive it only after +the repository owner ends the stabilization window and determines that no release blockers remain. It does not +accept new features or continued C++ development. Before archival, changes are limited to release-blocking +correctness, reproducibility, security, documentation, and metadata corrections. A critical post-release defect +requires a new patch release rather than changing the v1.0.0 tag. + +For active use, development, and new reports, go to +[causal-triangulations](https://github.com/acgetchell/causal-triangulations), the supported Rust successor. The local +Python comparison harness in this archive only orchestrates independent C++ and Rust executables and analyzes their +declared outputs; it is not a second scientific implementation. See [Security and support](#security-and-support) +for the post-release reporting boundary. ## Table of contents - [CDT-plusplus](README.md) - - [Maintenance status](#maintenance-status) + - [Archival and maintenance status](#archival-and-maintenance-status) - [Introduction](#introduction) - [Regression-oracle scope](#regression-oracle-scope) - [Usage](#usage) - - [Roadmap](#roadmap) + - [Release scope and limitations](#release-scope-and-limitations) - [Quickstart](#quickstart) - [Current reference-suite status](#current-reference-suite-status) - [Setup](#setup) + - [Tested release matrix](#tested-release-matrix) - [Prerequisites](#prerequisites) - [Developer workflow](#developer-workflow) - [vcpkg maintenance](#vcpkg-maintenance) @@ -50,15 +55,17 @@ second scientific implementation. - [Sanitizers](#sanitizers) - [Offline Comparison](#offline-comparison) - [Visualization](#visualization) + - [Security and support](#security-and-support) - [Contributing](#contributing) - [Issues](#issues) ## Introduction -For an introduction to [Causal Dynamical Triangulations](https://github.com/acgetchell/CDT-plusplus/wiki), -including the foundations and recent results, please see the [wiki](https://github.com/acgetchell/CDT-plusplus/wiki). +CDT++ is the archival C++23 implementation of spherical 2+1-dimensional +[Causal Dynamical Triangulations][CDT]. The repository-wide [`REFERENCES.md`](REFERENCES.md) provides the canonical +bibliography for the scientific and algorithmic foundations used here. -[Causal Dynamical Triangulations][CDT] in [C++] uses the +The implementation uses the [Computational Geometry Algorithms Library][CGAL], [Boost], and [TBB]. Arbitrary-precision numbers and functions are by [MPFR] and [GMP]. [Melissa E. O'Neill's Permuted Congruential Generators][PCG] library provides high-quality RNGs that pass L'Ecuyer's @@ -148,34 +155,30 @@ valid cospherical tetrahedralizations. See the [command-line reference](#command-line-reference) for every option. Build and dependency instructions begin at [Quickstart](#quickstart). -## Roadmap - -- [x] Cross-platform support on Linux, macOS (x64 & arm64), and Windows -- [x] Cross-compiler support on gcc, clang, and MSVC -- [x] Develop with [literate programming] using [Doxygen] -- [x] [Efficient Pure Functional Programming in C++ Using Move Semantics][functional] -- [x] Test using [CTest] -- [x] Develop using Behavior-driven development ([BDD]) with [doctest] -- [x] Continuous integration by [GitHub Actions] on the leading edge -- [x] 3D Simplex -- [x] 3D Spherical triangulation -- [x] 2+1 foliation -- [x] S3 Bulk action -- [x] 3D Ergodic moves -- [x] High-quality Random Number Generation with M.E. O'Neill's [PCG] library -- [x] Restore optional parallel triangulation with [TBB] ([#74](https://github.com/acgetchell/CDT-plusplus/issues/74)) -- [x] Automated code analysis with [CodeQL] -- [x] Build/debug with [Visual Studio 2022] -- [x] Use [{fmt}] library (instead of `iostream`) -- [x] 3D Metropolis algorithm -- [x] Multithreaded logging with [spdlog] -- [x] Restore optional visualization with [Qt] ([#98](https://github.com/acgetchell/CDT-plusplus/issues/98)) -- [ ] Initialize two masses -- [ ] The shortest path algorithm -- [ ] Einstein tensor -- [ ] Complete test coverage -- [ ] Complete documentation -- [ ] Quantize Spacetime! +## Release scope and limitations + +The v1.0.0 release supports one scientific model: spherical 2+1-dimensional CDT represented by three-dimensional +foliated triangulations. It includes the complete audited `(2,3)`, `(3,2)`, `(2,6)`, `(6,2)`, and `(4,4)` move set, +the Regge action, Metropolis-Hastings evolution, the headless `cdt` and `initialize` programs, deterministic reference +fixtures, an offline C++/Rust comparison harness, and an opt-in macOS archival viewer. + +The release boundary is intentionally narrow: + +- Toroidal slices, dimensions other than three, and 3+1D/4D simulations are unsupported. The retained periodic and + toroidal headers are historical prototypes under `cdt::experimental`, not public v1.0.0 APIs. +- Requested simplex counts drive a monotone spherical population heuristic; randomized post-repair counts are not an + exact topology oracle or a calibrated phase-distribution result. +- A seed replays PCG inputs. Fresh cospherical CGAL construction can still choose another valid tetrahedralization, + so exact fresh topology and cross-toolchain trajectory identity are not promised. +- Checkpoints are validated snapshots, not resumable simulations. Exact transition replay requires an identical + starting manifold and the recorded toolchain contract. +- Optional oneTBB parallelism is limited to eligible CGAL Delaunay insertion and removal. Pachner moves, + Metropolis-Hastings, persistence, and access to one manifold remain sequential and externally serialized. +- CDT++ publishes a C++23 source boundary, not a stable binary ABI or package-registry distribution. + +The detailed evidence and failure boundaries are in the [CGAL integration](docs/cgal-integration.md), +[ergodic-move](docs/ergodic-moves.md), [Metropolis-Hastings](docs/metropolis-hastings.md), +[reproducibility and persistence](docs/reproducibility.md), and [multithreading](docs/multithreading.md) contracts. ## Quickstart @@ -261,8 +264,24 @@ AddressSanitizer configuration exercises the same replayable stress contract. ## Setup This project uses [CMake]+[Ninja] to build C++23 sources and [vcpkg] manifest mode to manage C++ libraries. The -v1.0.0-rc3 CI matrix exercises Ubuntu with GCC 16 and Clang 22, macOS with AppleClang, and Windows with MSVC. CMake -also rejects compiler versions below the supported C++23 floor: GCC 13.3, Clang 22, AppleClang 15, and MSVC 19.34. +v1.0.0 release matrix is defined by +[`.github/workflows/ci.yml`](https://github.com/acgetchell/CDT-plusplus/blob/main/.github/workflows/ci.yml) and the +pinned tool versions in the +[`Justfile`](https://github.com/acgetchell/CDT-plusplus/blob/main/Justfile). + +### Tested release matrix + +| CI cell | Host | Compiler | Standard library | Required contract | +| --- | --- | --- | --- | --- | +| Ubuntu GCC | `ubuntu-latest` | GCC 16 | libstdc++ | `just ci` and `just build-parallel` | +| Ubuntu Clang | `ubuntu-latest` | Clang 22 | libstdc++ | `just ci` and `just build-parallel` | +| macOS AppleClang | `macos-latest` | Runner AppleClang | libc++ | `just ci` and `just viewer-build` | +| Windows MSVC | `windows-latest`, x64 | Runner MSVC | MSVC STL | `just ci` | + +Linux compiler packages are pinned by the Justfile. The native macOS and Windows compilers follow the GitHub-hosted +runner images, while CMake enforces the minimum C++23 floor: GCC 13.3, Clang 22, AppleClang 15, and MSVC 19.34. +These are tested release cells, not a claim that every distribution, operating-system version, architecture, or +compiler/standard-library pairing is supported. ### Prerequisites @@ -418,7 +437,7 @@ Eigen are installed only in the viewer build tree. See ### Project Layout -The project is similar to [PitchFork Layout], as follows: +The repository-owned source and generated-output boundaries are: - .github - GitHub specific settings - out/build/reference - Ephemeral supported headless build directory @@ -433,78 +452,33 @@ The project is similar to [PitchFork Layout], as follows: ## Command-line reference -CDT-plusplus uses [program_options] to parse options from the help message, and so -understands long or short argument formats, provided the short argument given -is an unambiguous match to a longer one. The help message should be instructive: - -```text -./out/build/reference/src/cdt --help -Causal Dynamical Triangulations in C++ using CGAL. - -Copyright (c) 2013-2026 Adam Getchell - -A program that generates d-dimensional triangulated spacetimes -with a defined causal structure and evolves them according -to the Metropolis algorithm. Specify the number of passes to control -how much evolution is desired. Each pass attempts a number of ergodic -moves equal to the number of simplices in the simulation. - -Usage:./cdt (--spherical | --toroidal) -n SIMPLICES -t TIMESLICES - [-d DIM] - [--init INITIAL RADIUS] - [--foliate FOLIATION SPACING] - [--no-output] - [--seed SEED] - [--threads THREADS] - -k K - --alpha ALPHA - --lambda LAMBDA - [-p PASSES] - [-c CHECKPOINT] - -Optional arguments are in square brackets. - -Examples: -./cdt --spherical -n 32000 -t 11 --alpha 0.6 -k 1.1 --lambda 0.1 --passes 1000 -./cdt -s -n32000 -t11 -a.6 -k1.1 -l.1 -p1000 --seed 92 - -Options: - -h [ --help ] Show this message - -v [ --version ] Show program version - -s [ --spherical ] Spherical topology - -e [ --toroidal ] Toroidal topology - -n [ --simplices ] arg Approximate number of simplices - -t [ --timeslices ] arg Number of timeslices - -d [ --dimensions ] arg (=3) Dimensionality - -i [ --init ] arg (=1) Initial radius - -f [ --foliate ] arg (=1) Foliation spacing - --no-output Do not write checkpoint or final triangulation - files - --seed arg Root random seed (default: operating-system - entropy) - --threads arg (=1) Maximum worker threads for supported Delaunay - operations - -a [ --alpha ] arg Negative squared geodesic length of 1-d - timelike edges - -k [ --k ] arg K = 1/(8*pi*G_newton) - -l [ --lambda ] arg K * Cosmological constant - -p [ --passes ] arg (=100) Number of passes - -c [ --checkpoint ] arg (=10) Checkpoint every n passes +The supported simulation surface is the spherical, three-dimensional form: + +```bash +just run --spherical \ + --simplices 32000 \ + --timeslices 11 \ + --alpha 0.6 \ + --k 1.1 \ + --lambda 0.1 \ + --passes 1000 \ + --seed 92 ``` +Run `just run --help` for the executable-owned option list and `just run --version` for the synchronized product +version. Long options and their defined short forms are parsed by [Boost.Program_options][program_options]. The +legacy parser still names toroidal topology and dimensionality, but runtime validation rejects toroidal input and +every dimension other than three; they are not supported release modes. + `--threads` is a maximum concurrency limit for CGAL/oneTBB bulk Delaunay operations. It defaults to 1. Zero and negative values are rejected. The canonical reference build accepts only 1; values greater than 1 require the `parallel` preset. This option does not parallelize Metropolis-Hastings, Pachner moves, persistence, or concurrent access to one manifold. -The dimensionality of the spacetime is such that each slice of spacetime is -`d-1`-dimensional, so setting `d=3` generates two spacelike dimensions and one -timelike dimension, with a defined global time foliation. A -`d`-dimensional simplex will have some `d-1` sub-simplices that are purely -spacelike (all on the same timeslice) as well as some that are timelike -(span two timeslices). In [CDT] we actually care more about the timelike -links (in 2+1 spacetime), and the timelike faces (in 3+1 spacetime). +With `--dimensions 3`, every spatial slice is two-dimensional and the third dimension is the global time foliation. +The accepted runtime boundary requires positive simplex and timeslice counts, finite physical parameters with +`alpha > 1/2`, and a positive thread limit. Invalid configurations fail before construction. ## Documentation @@ -524,7 +498,7 @@ failure-atomicity rules for the complete 2+1D move set are recorded in [`docs/ergodic-moves.md`](docs/ergodic-moves.md). Seed replay, PCG stream ownership, checkpoint metadata, and the parallel stream policy are recorded in [`docs/reproducibility.md`](docs/reproducibility.md). -The repository-wide scientific bibliography is maintained in +The repository-wide scientific bibliography is [`REFERENCES.md`](REFERENCES.md). Validate the generated API documentation without modifying the worktree: @@ -549,9 +523,9 @@ successful `main` validation, a separate least-privilege job runs `just docs` an If CDT++ contributes to published work, cite the software using [`CITATION.cff`](https://github.com/acgetchell/CDT-plusplus/blob/main/CITATION.cff) and cite the scientific methods relevant to the work from [`REFERENCES.md`](REFERENCES.md). The software citation records the -current declared release, `1.0.0-rc3`. Advance its version and release date -together with the CMake, vcpkg, Python-tooling, Doxygen, and CLI metadata for -subsequent releases. +final release, `1.0.0`, and the all-versions Zenodo concept DOI +[`10.5281/zenodo.21487043`](https://doi.org/10.5281/zenodo.21487043). The concrete v1.0.0 record DOI will be added to +`CITATION.cff` as a version-specific identifier after Zenodo creates the stable deposit during issue #97. ## Testing @@ -698,79 +672,56 @@ noninteractive smoke test, exact canonical-image policy, and inventory of histor [viewer and visual-artifact contract](docs/viewer.md). The default build remains headless and does not install Qt or Eigen. -## Contributing - -Please see [CONTRIBUTING.md] and our [CODE_OF_CONDUCT.md]. - -Your code should pass Continuous Integration: - -- `just fix` for safe automatic formatting with the repository's [.clang-format] - -- `just clang-tidy` to analyze C++ with the pinned LLVM 22 toolchain +## Security and support -- `just check` for fast, non-mutating source, documentation, YAML, workflow, and CMake validation +CDT++ v1.0.0 is an archival scientific reference, not an actively maintained product. The reporting boundary for +archive-specific vulnerabilities and issues that also affect the active successor is documented in +[`SECURITY.md`](SECURITY.md). Do not publish sensitive vulnerability details in the historical issue tracker. -- `just ci` for the supported build and complete validation contract before pushing - -The slower sanitizer workflows remain available through [GitHub Actions] and repository commands when relevant to a -change: - -- [AddressSanitizer], [UndefinedBehaviorSanitizer], [LeakSanitizer], [MemorySanitizer], and [ThreadSanitizer] - -Valgrind is intentionally unsupported: on x86/AMD64 its floating-point emulation does not honor the directed -rounding required by CGAL's interval predicates. Disabling CGAL's rounding check would make geometric results -untrustworthy, so memory diagnostics use the supported sanitizer workflows instead. - -Optional: +## Contributing -- [ClangTidy] on all changed files +Active development has moved to +[causal-triangulations](https://github.com/acgetchell/causal-triangulations). Before CDT++ is archived, only +release-blocking corrections within the maintenance-only stabilization scope are accepted. After archival, GitHub +will make this repository read-only. See [CONTRIBUTING.md] for the correction workflow and +[CODE_OF_CONDUCT.md] for the preserved participation policy. ## Issues -Current work and known limitations are tracked in the -[CDT++ GitHub issue tracker](https://github.com/acgetchell/CDT-plusplus/issues). -The README does not duplicate a hardcoded issue list because tracker state -changes independently of repository releases. +The [CDT++ issue tracker](https://github.com/acgetchell/CDT-plusplus/issues) remains available during the +maintenance-only stabilization window. Issue #155 will close or disposition the remaining trackers and archive this +repository after the owner determines that no blockers remain. New development, support, and scientific work belong +in the [causal-triangulations issue tracker](https://github.com/acgetchell/causal-triangulations/issues). [CDT]: REFERENCES.md#cdt-framework-2001 [CGAL]: REFERENCES.md#cgal-triangulations -[CMake]: https://www.cmake.org +[CMake]: https://cmake.org [doctest]: https://github.com/doctest/doctest [guidelines]: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines -[CTest]: https://gitlab.kitware.com/cmake/community/wikis/doc/ctest/Testing-With-CTest -[literate programming]: http://www.literateprogramming.com -[Doxygen]: http://www.doxygen.org +[Doxygen]: https://www.doxygen.nl [Homebrew]: https://brew.sh [Ninja]: https://ninja-build.org -[program_options]: https://www.boost.org/doc/libs/1_85_0/doc/html/program_options/tutorial.html +[program_options]: https://www.boost.org/doc/libs/1_91_0/doc/html/program_options.html [Mathjax]: https://www.mathjax.org [GraphViz]: https://www.graphviz.org [MPFR]: https://www.mpfr.org [GMP]: https://gmplib.org -[functional]: https://blog.knatten.org/2012/11/02/efficient-pure-functional-programming-in-c-using-move-semantics/ -[TBB]: https://www.threadingbuildingblocks.org +[TBB]: https://uxlfoundation.github.io/oneTBB/ [Doxyfile]: https://github.com/acgetchell/CDT-plusplus/blob/main/docs/Doxyfile [Boost]: https://www.boost.org [ClangTidy]: https://clang.llvm.org/extra/clang-tidy/ -[date]: https://howardhinnant.github.io/date/date.html [BDD]: https://en.wikipedia.org/wiki/Behavior-driven_development [TDD]: https://en.wikipedia.org/wiki/Test-driven_development [vcpkg]: https://github.com/Microsoft/vcpkg -[C++]: https://isocpp.org/ -[Pitchfork Layout]: https://api.csswg.org/bikeshed/?force=1&url=https://raw.githubusercontent.com/vector-of-bool/pitchfork/develop/data/spec.bs#tld.docs [PCG]: REFERENCES.md#pcg-random-number-generators -[TestU01]: https://simul.iro.umontreal.ca/testu01/ +[TestU01]: https://doi.org/10.1145/1268776.1268777 [CONTRIBUTING.md]: https://github.com/acgetchell/CDT-plusplus/blob/main/.github/CONTRIBUTING.md [CODE_OF_CONDUCT.md]: https://github.com/acgetchell/CDT-plusplus/blob/main/.github/CODE_OF_CONDUCT.md -[GitHub Actions]: https://github.com/features/actions -[CodeQL]: https://codeql.github.com/ -[Visual Studio 2022]: https://visualstudio.microsoft.com/vs/ [{fmt}]: https://github.com/fmtlib/fmt [AddressSanitizer]: https://github.com/google/sanitizers/wiki/AddressSanitizer [LeakSanitizer]: https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer [ThreadSanitizer]: https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual [MemorySanitizer]: https://github.com/google/sanitizers/wiki/MemorySanitizer [UndefinedBehaviorSanitizer]: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html -[.clang-format]: https://github.com/acgetchell/CDT-plusplus/blob/main/.clang-format [spdlog]: https://github.com/gabime/spdlog [Qt]: https://www.qt.io diff --git a/REFERENCES.md b/REFERENCES.md index c5cadb236..ec7bcd254 100644 --- a/REFERENCES.md +++ b/REFERENCES.md @@ -3,14 +3,17 @@ ## How to Cite This Software If CDT++ contributes to research or a project, cite it using the structured -metadata in [`CITATION.cff`](https://github.com/acgetchell/CDT-plusplus/blob/16d1c769afc67e06f07639f6fd9de8136974e282/CITATION.cff). GitHub and other citation tools can -generate BibTeX, APA, and additional formats from that file. +metadata in +[`CITATION.cff`](https://github.com/acgetchell/CDT-plusplus/blob/main/CITATION.cff). +GitHub and other citation tools can generate BibTeX, APA, and additional +formats from that file. Quick citation for the current declared release: ```text Adam Getchell. 2026. CDT-plusplus: Causal Dynamical Triangulations in C++. -Version 1.0.0-rc3. GitHub. https://github.com/acgetchell/CDT-plusplus +Version 1.0.0. GitHub. https://github.com/acgetchell/CDT-plusplus +Zenodo concept DOI: https://doi.org/10.5281/zenodo.21487043 ``` The sections below are grouped by scientific domain. Cite the entries relevant @@ -36,6 +39,13 @@ DOI: [10.1103/PhysRevD.64.044011](https://doi.org/10.1103/PhysRevD.64.044011) ## Monte Carlo Methods +### Metropolis algorithm + +N. Metropolis, A. W. Rosenbluth, M. N. Rosenbluth, A. H. Teller, and E. Teller, +“Equation of state calculations by fast computing machines,” *The Journal of +Chemical Physics* 21, no. 6 (1953), 1087–1092. +DOI: [10.1063/1.1699114](https://doi.org/10.1063/1.1699114) + ### Metropolis-Hastings algorithm W. K. Hastings, “Monte Carlo sampling methods using Markov chains and their @@ -60,11 +70,35 @@ DOI: [10.1016/S0195-6698(13)80080-7]( +### Robust geometric predicates + +J. R. Shewchuk, “Adaptive precision floating-point arithmetic and fast robust +geometric predicates,” *Discrete & Computational Geometry* 18, no. 3 (1997), +305–363. +DOI: [10.1007/PL00009321](https://doi.org/10.1007/PL00009321) + +This paper provides primary background for adaptive robust-predicate +methodology. CDT++ delegates its production predicates to CGAL's EPICK kernel; +it does not claim to reimplement Shewchuk's predicate code. + ### Random Voronoi and Delaunay expected complexity R. A. Dwyer, “Higher-dimensional Voronoi diagrams in linear expected time,” @@ -75,8 +109,8 @@ DOI: [10.1007/BF02574694](https://doi.org/10.1007/BF02574694) S.-W. Cheng, T. K. Dey, and J. R. Shewchuk, *Delaunay Mesh Generation*, Chapter 4, “Three-dimensional Delaunay triangulation.” CRC Press (2013), -ISBN 978-1-58488-730-0. DOI metadata issued 2016: -[10.1201/b12987](https://doi.org/10.1201/b12987). +ISBN 978-1-58488-730-0. DOI metadata issued 2016: `10.1201/b12987`; +see the [publisher record](https://www.taylorfrancis.com/books/9781584887317). The authors’ [Chapter 4 preprint]() states the finite three-dimensional tetrahedron bound used by CDT++. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..10919e3bb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,25 @@ +# Security and support + +CDT++ v1.0.0 is a historical scientific reference scheduled for archival after +a maintenance-only stabilization window. No CDT++ version receives active +feature development or guaranteed security maintenance, and fixes to this +archive are not guaranteed. + +For a vulnerability, correctness defect, or support request that affects the +active implementation, report it to +[causal-triangulations](https://github.com/acgetchell/causal-triangulations) +through that repository's current reporting guidance. + +For a vulnerability specific to the CDT++ code, do not publish +sensitive details in a public issue. Contact the +[repository owner](https://github.com/acgetchell) through a private channel +identified on that GitHub profile, using the subject `CDT++ security report` +and including the affected revision or release, a minimal reproducer when safe, +and an assessment of impact. Reports may be documented for historical users, +but the archive does not promise a patch or new release. + +Ordinary usage questions, feature requests, and new scientific work belong in +the successor repository. The historical CDT++ issue tracker remains available +during stabilization and will become read-only when +[issue #155](https://github.com/acgetchell/CDT-plusplus/issues/155) eventually +completes the archival sequence. diff --git a/cliff.toml b/cliff.toml index 5b9fbe10a..688ba91bd 100644 --- a/cliff.toml +++ b/cliff.toml @@ -15,6 +15,17 @@ body = """ {% else -%} ## [Unreleased] {% endif -%} +{% if version == "v1.0.0" or version == "1.0.0" %} + ### Release summary + + CDT++ 1.0.0 is the final planned feature release of the C++23 spherical 2+1-dimensional reference implementation. + + - **Compatibility:** The supported source boundary is C++23 with the published GCC, Clang, AppleClang, and MSVC matrix. The project does not promise a stable binary ABI or package-registry distribution. + - **Scientific corrections:** The release completes and independently validates all five 2+1D moves, Metropolis-Hastings proposal ratios and atomic transitions, exact-predicate geometry boundaries, run-owned RNG streams, and causal persistence metadata. + - **Supported surface:** The default build is headless; CGAL/oneTBB bulk Delaunay operations and the macOS Qt viewer are explicit opt-ins. Historical toroidal and higher-dimensional prototypes are excluded from the supported API. + - **Limitations:** Seeds replay stochastic inputs, not necessarily fresh cospherical CGAL topology. Checkpoints are validated snapshots rather than resumable simulations, and parallelism does not extend to Pachner moves or concurrent manifold access. + - **Migration:** Active development and new work move to [causal-triangulations](https://github.com/acgetchell/causal-triangulations). After the v1.0.0 GitHub and Zenodo handoff, CDT++ enters a maintenance-only stabilization window and becomes read-only only when the owner completes the archival gate. +{% endif %} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | upper_first }} {% for commit in commits %} diff --git a/docs/Doxyfile b/docs/Doxyfile index 644108cbe..b2f5022da 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -38,7 +38,7 @@ PROJECT_NAME = "CDT++" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.0.0-rc3 +PROJECT_NUMBER = 1.0.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a @@ -664,7 +664,7 @@ STRICT_PROTO_MATCHING = NO # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. -GENERATE_TODOLIST = YES +GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. @@ -834,6 +834,8 @@ WARN_LOGFILE = # Note: If this tag is empty the current directory is searched. INPUT = README.md \ + CHANGELOG.md \ + SECURITY.md \ REFERENCES.md \ reference/README.md \ docs \ @@ -922,12 +924,15 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = build \ +EXCLUDE = .cache \ + build \ cmake-build-debug \ cmake-build-release \ cmake-build-relwithdebinfo \ docs/html \ external \ + out \ + vcpkg_installed \ scripts # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 1f13e09bb..00950815f 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -4,7 +4,8 @@ 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 -tracked by [issue #96]. +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 @@ -18,8 +19,7 @@ made; the rest of the workflow is identical: ```bash # The Git tag has a leading v; metadata versions do not. -# For the stable release, use TAG=v1.0.0. -TAG=v1.0.0-rc3 +TAG=v1.0.0 VERSION="${TAG#v}" RELEASE_FLAGS=() @@ -68,11 +68,12 @@ Edit the following synchronized metadata: - `pyproject.toml`: `[project] version`, using the PEP 440 spelling. - `docs/Doxyfile`: `PROJECT_NUMBER`. - `CITATION.cff`: `version` and `date-released`. -- `README.md`, `REFERENCES.md`, and `.github/CONTRIBUTING.md`: active release - references and release-facing prose. +- `README.md`, `REFERENCES.md`, `SECURITY.md`, and + `.github/CONTRIBUTING.md`: active release references and release-facing + archival prose. - `docs/RELEASING.md`: current release command examples. -For `v1.0.0-rc3`, synchronize the versions in the repository before generating +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: @@ -86,6 +87,7 @@ ${EDITOR:-vi} \ CITATION.cff \ README.md \ REFERENCES.md \ + SECURITY.md \ .github/CONTRIBUTING.md \ docs/RELEASING.md @@ -94,15 +96,16 @@ just changelog-unreleased "$TAG" ``` Review the citation identity fields at the same time: title, authors, ORCID, -repository, URL, license, and release date. Add or change a DOI only when the -archival policy and the correct DOI are known. +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. -### Validate the release branch +### Validate and commit the release metadata Run the release-specific metadata check, strict documentation check, and full cross-platform-equivalent local validation gate: @@ -114,7 +117,7 @@ just ci ``` `just release-check` verifies synchronization across CMake, vcpkg, Python, -`uv.lock`, Doxygen, citation metadata, and active release-candidate references. +`uv.lock`, Doxygen, citation metadata, and active release references. The protected-branch ruleset uses stable summary contexts for the deterministic release gates: @@ -146,6 +149,7 @@ git add \ CHANGELOG.md \ README.md \ REFERENCES.md \ + SECURITY.md \ .github/CONTRIBUTING.md \ docs/RELEASING.md @@ -154,6 +158,31 @@ git diff --cached --stat git commit -m "chore(release): release $TAG" ``` +### Refresh the stable archival provenance + +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: + +```bash +test -z "$(git status --porcelain)" +just reference-regenerate + +git diff -- reference/raw/v1 reference/manifests/v1 +git add reference/raw/v1 reference/manifests/v1 +git diff --cached --check +git diff --cached --stat +git commit -m "chore(release): refresh v1 reference provenance" + +just reference-archive-check +``` + +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: ```bash @@ -181,7 +210,7 @@ Return to `main`, update it to the merge commit, and repeat the release gates against the exact commit that will be tagged: ```bash -TAG=v1.0.0-rc3 +TAG=v1.0.0 git switch main git pull --ff-only @@ -190,6 +219,7 @@ git status --short just release-check just docs-check just ci +just reference-archive-check test "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)" test -z "$(git status --porcelain)" @@ -206,10 +236,11 @@ git tag -l --format='%(contents)' "$TAG" git push origin "$TAG" ``` -Both tag commands 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. +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. ## Step 3: Publish and verify the release @@ -239,8 +270,8 @@ Stop if this preflight fails. Enabling Zenodo after publication does not reliably import an earlier GitHub release. ```bash -TAG=v1.0.0-rc3 -RELEASE_FLAGS=(--prerelease) +TAG=v1.0.0 +RELEASE_FLAGS=() gh release create "$TAG" \ --verify-tag \ @@ -294,15 +325,27 @@ jq -e 'select( ``` For a release candidate intentionally deposited with Zenodo, verify the record -and DOI without treating it as the final stable handoff. For a stable release, -complete the Zenodo handoff tracked in [issue #96]: confirm that Zenodo received -the release, verify its version, date, title, authors, license, repository URL, -and files, and record the final DOI according to the archival plan. If the DOI -was unavailable before tagging, update `CITATION.cff` in a focused follow-up -pull request rather than rewriting the tag. A Zenodo deposit does not make the -GitHub repository read-only. Repository archival is a separate lifecycle action -that requires an explicit maintainer decision; if it is approved later, perform -it only after the GitHub release and Zenodo record are correct. +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: + +```yaml +doi: "10.5281/zenodo.21487043" +identifiers: + - type: doi + value: "10.5281/zenodo.STABLE_RECORD_ID" + description: "Zenodo DOI for version 1.0.0" +``` + +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. ## Step 4: Clean up @@ -317,6 +360,32 @@ git push origin --delete "release/$TAG" If the remote branch was already deleted, the remote deletion command may be omitted. +## Step 5: Stabilize, then complete the archival handoff + +[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: + +1. enter a maintenance-only stabilization window in which changes are limited + to release-blocking correctness, reproducibility, security, documentation, + and metadata corrections; +2. retain #155 and any verified release blocker until the repository owner + determines that the handoff has settled, no blockers remain, and CDT++ is + no longer needed as a fallback for successor-integration risk; +3. publish any critical post-release correction as a new patch release rather + than moving or replacing the v1.0.0 tag, then restart the relevant release + verification; +4. close or disposition every remaining tracker, close #155 as the final + repository mutation, and archive the GitHub repository; and +5. verify externally that the repository, release, documentation, and Zenodo + links remain public and readable while issues and pull requests are + read-only. + +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. + ## Release-critical fixes If a critical problem is found before tagging, fix it through a pull request, @@ -328,3 +397,5 @@ 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. [issue #96]: https://github.com/acgetchell/CDT-plusplus/issues/96 +[issue #97]: https://github.com/acgetchell/CDT-plusplus/issues/97 +[issue #155]: https://github.com/acgetchell/CDT-plusplus/issues/155 diff --git a/docs/arithmetic-backend-evaluation.md b/docs/arithmetic-backend-evaluation.md index 1cc675e65..bec0cdd53 100644 --- a/docs/arithmetic-backend-evaluation.md +++ b/docs/arithmetic-backend-evaluation.md @@ -45,6 +45,10 @@ and identify those predicate boundaries. CGAL 6.2 supports either GMP/MPFR or Boost.Multiprecision for exact number types, as documented in its [third-party dependency policy](https://doc.cgal.org/latest/Manual/thirdparty.html). +The repository bibliography also records the primary +[robust-predicate methodology](../REFERENCES.md#robust-geometric-predicates) +that motivates adaptive exactness at geometric decision boundaries; the +evaluated backend remains CGAL's implementation, not a local reimplementation. For the Boost configuration, CGAL selects `boost::multiprecision::cpp_int` and `cpp_rational` for the exact fallback. The required result is the same exact diff --git a/docs/cgal-integration.md b/docs/cgal-integration.md index 280b4d74c..e0209ae66 100644 --- a/docs/cgal-integration.md +++ b/docs/cgal-integration.md @@ -13,7 +13,9 @@ of truth. CMake requires exactly CGAL 6.2 and treats deprecated declarations as errors by default. The baseline currently resolves CGAL 6.2 with Boost 1.91.0, GMP 6.3.0 revision 4, MPFR 4.2.2 revision 1, and oneTBB 2023.0.0. Those transitive versions are a resolution record for the pinned baseline, not -independent version promises. +independent version promises. The canonical bibliography records both the +[CGAL project design](../REFERENCES.md#cgal-design) and the version-specific +[CGAL 6.2 manual](../REFERENCES.md#cgal-triangulations). The supported compiler floor is the intersection of CDT++'s C++23 library requirements and CGAL 6.2's tested platforms: @@ -62,6 +64,12 @@ exact orientation and sphere-side predicates for Delaunay insertion, point location, and checked geometric flips. Coordinates, centroids, distances, and other constructed values remain floating-point approximations. +[Delaunay's original empty-sphere construction](../REFERENCES.md#delaunay-empty-sphere-construction) +provides the geometric foundation. Shewchuk's +[robust-predicate work](../REFERENCES.md#robust-geometric-predicates) records +primary methodological background; CDT++ delegates predicates to CGAL's EPICK +implementation rather than claiming that it reimplements those routines. + That split is intentional. The scientific state is the causal combinatorial triangulation plus time and cell metadata; it is not a claim that every constructed coordinate is exact. The integration suite includes an almost diff --git a/docs/metropolis-hastings.md b/docs/metropolis-hastings.md index ff27e4342..ea27c8094 100644 --- a/docs/metropolis-hastings.md +++ b/docs/metropolis-hastings.md @@ -7,7 +7,9 @@ For a proposed triangulation `T'`, the implemented acceptance probability is min(1, exp(S(T) - S(T')) * q(T | T') / q(T' | T)). ``` -This is the Metropolis-Hastings rule of Hastings +This extends the symmetric proposal rule introduced by Metropolis et al. +[Metropolis1953](../REFERENCES.md#metropolis-algorithm) with the proposal ratio +from Hastings [Hastings1970](../REFERENCES.md#metropolis-hastings-algorithm). The three-dimensional causal triangulations, Regge action, and local move set follow Ambjørn, Jurkiewicz, and Loll @@ -55,7 +57,7 @@ complete transition sequence, including the technical edge ordering used to construct a `(6,2)` candidate. Initialization uses a separate named stream derived from the same root seed, so changes in point-generation draw counts do not shift the transition sequence. -The CLI, checkpoint metadata, stream ownership, and future parallel policy are +The CLI, checkpoint metadata, stream ownership, and parallel stream policy are documented in [Reproducible random runs](reproducibility.md). ## State and geometry deltas @@ -144,6 +146,7 @@ separate libm-to-MPFR conversion bound. ## References Bibliographic metadata for -[Hastings1970](../REFERENCES.md#metropolis-hastings-algorithm) and +[Metropolis1953](../REFERENCES.md#metropolis-algorithm), +[Hastings1970](../REFERENCES.md#metropolis-hastings-algorithm), and [AmbjornJurkiewiczLoll2001-3D](../REFERENCES.md#three-dimensional-cdt-2001) is maintained in the repository-wide [`REFERENCES.md`](../REFERENCES.md). diff --git a/docs/multithreading.md b/docs/multithreading.md index d5e78fd84..ba39cc47e 100644 --- a/docs/multithreading.md +++ b/docs/multithreading.md @@ -1,6 +1,6 @@ # Multithreaded CGAL contract -CDT++ retains one bounded multithreaded capability for the maintained C++ +CDT++ retains one bounded multithreaded capability for the archival C++ reference: CGAL may use oneTBB for bulk 3D Delaunay insertion and range removal. The deterministic `reference` configuration remains the canonical single-threaded correctness oracle. Enabling the parallel configuration does @@ -92,7 +92,7 @@ publishing partial topology. Published scientific mutations continue to use private-copy validation followed by a non-throwing swap. `cdt::Random` remains thread-confined. The current parallel operations consume -no random draws inside worker tasks. Any future stochastic worker must receive +no random draws inside worker tasks. Any downstream stochastic worker must receive a unique, stable `root.split(worker_stream)` engine; sharing one mutable engine is a data race and is unsupported. diff --git a/include/Metropolis.hpp b/include/Metropolis.hpp index 91a0e5055..07ae24ec1 100644 --- a/include/Metropolis.hpp +++ b/include/Metropolis.hpp @@ -9,10 +9,10 @@ /// @author Adam Getchell /// @details Performs the Metropolis-Hastings algorithm on the foliated Delaunay /// triangulations. +/// @see [Metropolis algorithm](../REFERENCES.md#metropolis-algorithm) /// @see [Metropolis-Hastings /// algorithm](../REFERENCES.md#metropolis-hastings-algorithm) /// @see [Three-dimensional CDT](../REFERENCES.md#three-dimensional-cdt-2001) -/// @todo Implement concurrency #ifndef INCLUDE_METROPOLIS_HPP_ #define INCLUDE_METROPOLIS_HPP_ diff --git a/include/Triangulation_traits.hpp b/include/Triangulation_traits.hpp index 60ed99059..a402bb287 100644 --- a/include/Triangulation_traits.hpp +++ b/include/Triangulation_traits.hpp @@ -7,6 +7,11 @@ /// @file Triangulation_traits.hpp /// @brief Traits class for particular uses of CGAL /// @author Adam Getchell +/// @see [Delaunay empty-sphere +/// construction](../REFERENCES.md#delaunay-empty-sphere-construction) +/// @see [CGAL triangulations](../REFERENCES.md#cgal-triangulations) +/// @see [Robust geometric +/// predicates](../REFERENCES.md#robust-geometric-predicates) #ifndef CDT_PLUSPLUS_TRIANGULATION_TRAITS_HPP #define CDT_PLUSPLUS_TRIANGULATION_TRAITS_HPP diff --git a/pyproject.toml b/pyproject.toml index c2d2e00bf..85f4b6dd8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "cdt-plusplus-scripts" -# PEP 440 spelling of the CDT++ v1.0.0-rc3 release. -version = "1.0.0rc3" +# PEP 440 spelling of the CDT++ v1.0.0 release. +version = "1.0.0" description = "Python support and offline comparison scripts for CDT++" requires-python = ">=3.14,<3.15" dependencies = ["jsonschema==4.25.1"] diff --git a/reference/README.md b/reference/README.md index e5410d522..1812b6702 100644 --- a/reference/README.md +++ b/reference/README.md @@ -115,10 +115,17 @@ protocol’s named tolerances to coordinates and action values. Host, compiler, and source-revision provenance are intentionally excluded from that equality check. -The committed macOS records contain a `-dirty` revision because they document -the issue #94 implementation while it is under review. Regenerate them from -the resulting clean commit before the archival v1.0.0 tag; the archival check -will fail until that handoff is complete. +The committed macOS records retain the `-dirty` revision captured during issue +#94 review. Their scientific payload remains covered by `just reference-check` +and `just reference-generated-check`, but they are not the final archival +provenance record. [Issue #97](https://github.com/acgetchell/CDT-plusplus/issues/97) +must first commit the release metadata, run `just reference-regenerate` from +that exact clean producer commit, and then review and commit the regenerated +raw artifacts and manifests. The final merged release state is tagged; its +files name the preceding producer commit because an artifact commit cannot +record its own hash. Both `just tag` and `just tag-check` enforce the +provenance-only archival check, which intentionally fails until that handoff +is complete. ## Scope limits diff --git a/scripts/release_check.py b/scripts/release_check.py index 4727d4351..8185cc0cb 100755 --- a/scripts/release_check.py +++ b/scripts/release_check.py @@ -21,6 +21,9 @@ PEP440_RE = re.compile(r"(?P[0-9]+[.][0-9]+[.][0-9]+)(?:rc(?P[0-9]+))?") RC_REFERENCE_RE = re.compile(r"(?[0-9]+[.][0-9]+[.][0-9]+-rc[0-9]+)(?![0-9A-Za-z])") ACTIVE_RELEASE_DOCS = (Path("README.md"), Path("REFERENCES.md"), Path(".github/CONTRIBUTING.md")) +CITATION_TITLE = "CDT-plusplus: Causal Dynamical Triangulations in C++" +CITATION_REPOSITORY = "https://github.com/acgetchell/CDT-plusplus" +CITATION_CONCEPT_DOI = "10.5281/zenodo.21487043" class ReleaseCheckError(ValueError): @@ -132,8 +135,20 @@ def _citation_metadata(root: Path) -> tuple[str, date]: if _require_string(citation, "type", str(path)) != "software": message = f"{path} must describe software" raise ReleaseCheckError(message) - for key in ("message", "title", "abstract", "repository-code", "url", "license"): + for key in ("message", "title", "abstract", "repository-code", "url", "doi", "license"): _require_string(citation, key, str(path)) + expected_identity = { + "title": CITATION_TITLE, + "repository-code": CITATION_REPOSITORY, + "url": CITATION_REPOSITORY, + "doi": CITATION_CONCEPT_DOI, + "license": "BSD-3-Clause", + } + for key, expected in expected_identity.items(): + value = _require_string(citation, key, str(path)) + if value != expected: + message = f"{path} {key} must be {expected!r}; found {value!r}" + raise ReleaseCheckError(message) authors = citation.get("authors") if not isinstance(authors, list) or not authors: message = f"{path} must contain at least one author" @@ -142,6 +157,10 @@ def _citation_metadata(root: Path) -> tuple[str, date]: parsed_author = _require_object(author, f"{path} author {index}") _require_string(parsed_author, "family-names", f"{path} author {index}") _require_string(parsed_author, "given-names", f"{path} author {index}") + primary_author = _require_object(authors[0], f"{path} author 1") + if _require_string(primary_author, "orcid", f"{path} author 1") != "https://orcid.org/0000-0002-0797-0021": + message = f"{path} author 1 must use Adam Getchell's validated ORCID" + raise ReleaseCheckError(message) version = _require_string(citation, "version", str(path)) raw_date = _require_string(citation, "date-released", str(path)) try: diff --git a/scripts/tests/test_release_check.py b/scripts/tests/test_release_check.py index 93c4b2135..19693e8df 100644 --- a/scripts/tests/test_release_check.py +++ b/scripts/tests/test_release_check.py @@ -23,15 +23,17 @@ def _write_project(root: Path, *, metadata_version: str = "1.2.3-rc4", release_d "cff-version: 1.2.0\n" 'message: "Cite this software."\n' "type: software\n" - 'title: "CDT++"\n' 'abstract: "A fixture."\n' "authors:\n" ' - family-names: "Getchell"\n' ' given-names: "Adam"\n' + ' orcid: "https://orcid.org/0000-0002-0797-0021"\n' f'version: "{metadata_version}"\n' f'date-released: "{release_date}"\n' - 'repository-code: "https://example.com/repository"\n' - 'url: "https://example.com"\n' + f'title: "{release_check.CITATION_TITLE}"\n' + f'repository-code: "{release_check.CITATION_REPOSITORY}"\n' + f'url: "{release_check.CITATION_REPOSITORY}"\n' + f'doi: "{release_check.CITATION_CONCEPT_DOI}"\n' 'license: "BSD-3-Clause"\n' ), "CHANGELOG.md": f"# Changelog\n\n## [{metadata_version}] - {release_date}\n\n- Fixture release.\n", @@ -90,6 +92,20 @@ def test_rejects_invalid_citation_date(self) -> None: with self.assertRaisesRegex(release_check.ReleaseCheckError, "ISO calendar date"): release_check.check_release_metadata(root) + def test_rejects_citation_identity_drift(self) -> None: + """The stable archival DOI remains the all-versions concept DOI.""" + with tempfile.TemporaryDirectory() as temp_dir: + root = Path(temp_dir) + _write_project(root) + path = root / "CITATION.cff" + path.write_text( + path.read_text(encoding="utf-8").replace(release_check.CITATION_CONCEPT_DOI, "10.5281/zenodo.21647031"), + encoding="utf-8", + ) + + with self.assertRaisesRegex(release_check.ReleaseCheckError, "doi must be"): + release_check.check_release_metadata(root) + def test_rejects_stale_active_documentation(self) -> None: """Active documentation may not retain an older RC version.""" with tempfile.TemporaryDirectory() as temp_dir: diff --git a/scripts/validate_generated_site.py b/scripts/validate_generated_site.py index 669d65a2a..a43ed3000 100755 --- a/scripts/validate_generated_site.py +++ b/scripts/validate_generated_site.py @@ -39,7 +39,9 @@ ) REQUIRED_TARGETS = { "index.html": ("developer-workflow", "documentation", "introduction"), + "md__c_h_a_n_g_e_l_o_g.html": (), "md__r_e_f_e_r_e_n_c_e_s.html": ("metropolis-hastings-algorithm",), + "md__s_e_c_u_r_i_t_y.html": (), "md_docs_2api-boundary.html": ("generated-reference-policy", "header-classification"), "md_docs_2comparison-harness.html": (), "md_docs_2cpp-api-quickstart.html": ( diff --git a/typos.toml b/typos.toml index 075acd7ff..df8bfe6a1 100644 --- a/typos.toml +++ b/typos.toml @@ -7,3 +7,10 @@ extend-exclude = ["docs/images/*.eps", "tests/cgal_no_gmp_probe/overlay-ports/** [default.extend-identifiers] # Doxygen prose uses this conventional plural acronym. PNGs = "PNGs" + +[default.extend-words] +# Preserve the original French title and venue for Delaunay's 1934 paper. +Classe = "Classe" +Sur = "Sur" +# git-cliff can expose this byte pair inside generated abbreviated commit hashes. +ba = "ba" diff --git a/uv.lock b/uv.lock index 1d4843b36..46b65fb92 100644 --- a/uv.lock +++ b/uv.lock @@ -56,7 +56,7 @@ wheels = [ [[package]] name = "cdt-plusplus-scripts" -version = "1.0.0rc3" +version = "1.0.0" source = { editable = "." } dependencies = [ { name = "jsonschema" }, diff --git a/vcpkg.json b/vcpkg.json index 30b5c8735..08792c44d 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "cdt-plusplus", - "version": "1.0.0-rc3", + "version": "1.0.0", "builtin-baseline": "9e593bb18ea69cc5095e012465dcd675a822ed0d", "dependencies": [ "boost-compat", From 703b474ab8ba0f6ee86fef7842ad9c5b4b74a3e7 Mon Sep 17 00:00:00 2001 From: Adam Getchell Date: Mon, 10 Aug 2026 14:37:42 -0700 Subject: [PATCH 2/2] docs: clean up archival documentation references --- README.md | 1 - reference/README.md | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 0044b198c..9b67c709c 100644 --- a/README.md +++ b/README.md @@ -707,7 +707,6 @@ in the [causal-triangulations issue tracker](https://github.com/acgetchell/causa [MPFR]: https://www.mpfr.org [GMP]: https://gmplib.org [TBB]: https://uxlfoundation.github.io/oneTBB/ -[Doxyfile]: https://github.com/acgetchell/CDT-plusplus/blob/main/docs/Doxyfile [Boost]: https://www.boost.org [ClangTidy]: https://clang.llvm.org/extra/clang-tidy/ [BDD]: https://en.wikipedia.org/wiki/Behavior-driven_development diff --git a/reference/README.md b/reference/README.md index 1812b6702..318872bca 100644 --- a/reference/README.md +++ b/reference/README.md @@ -115,10 +115,10 @@ protocol’s named tolerances to coordinates and action values. Host, compiler, and source-revision provenance are intentionally excluded from that equality check. -The committed macOS records retain the `-dirty` revision captured during issue -#94 review. Their scientific payload remains covered by `just reference-check` -and `just reference-generated-check`, but they are not the final archival -provenance record. [Issue #97](https://github.com/acgetchell/CDT-plusplus/issues/97) +The committed macOS records retain the `-dirty` revision captured during the +review for issue #94. Their scientific payload remains covered by +`just reference-check` and `just reference-generated-check`, but they are not +the final archival provenance record. [Issue #97](https://github.com/acgetchell/CDT-plusplus/issues/97) must first commit the release metadata, run `just reference-regenerate` from that exact clean producer commit, and then review and commit the regenerated raw artifacts and manifests. The final merged release state is tagged; its