Skip to content
This repository was archived by the owner on Aug 12, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 19 additions & 7 deletions .github/CODE_OF_CONDUCT.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level
of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Expand All @@ -24,23 +26,33 @@ Examples of unacceptable behavior by participants include:

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective
action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
Examples include using an official project email address, posting via an official social media account, or acting as an appointed representative at
an online or offline event. Project maintainers may further define and clarify representation of the project or community.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at adam@adamgetchell.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at
[adam@adamgetchell.org](mailto:adam@adamgetchell.org). The project team will review and investigate all complaints and respond as appropriate to the
circumstances. The project team is obligated to maintain confidentiality about the reporter of an incident. Further details of specific enforcement
policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by
other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at
[http://contributor-covenant.org/version/1/4][version].

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
18 changes: 11 additions & 7 deletions .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ setup is:
- [Just] 1.58.0 or newer; and
- [Python] 3.14 and [uv] when running Python-backed checks directly.

Complete local validation also requires [rumdl](https://github.com/rvben/rumdl) 0.2.53 and [typos]
1.49.0. The Justfile reports the exact installation command when either tool is missing.

Without pkgx, provide [Git], [Bash], [CMake] 4.4.0 or newer, [Ninja], [Python], [GNU M4], [Autoconf],
[Autoconf Archive], [Automake], [GNU Libtool], [Texinfo], and [pkg-config] through the host package manager.
Documentation work also requires [Doxygen] 1.16.1 and [Graphviz] 15.1.0. The build does not require a personal vcpkg
Expand All @@ -49,7 +52,7 @@ For native Windows work, use an x64 [Developer Command Prompt or Developer Power
and expose [Git Bash] on `PATH`, because the Justfile uses Bash as its recipe shell. The supported build path also
requires [Just] 1.58.0 or newer, [Python] 3.14 with `python.exe` on `PATH`, [CMake] 4.4.0 or newer, and
[Ninja]. The tested Windows cell uses Python 3.14.6, CMake 4.4.1, and Ninja 1.13.0. Complete local
validation additionally requires [uv] 0.12.3, [typos] 1.49.0, and [Go] or [pinact] 4.1.1 for the workflow
validation additionally requires [uv] 0.12.3, rumdl 0.2.53, [typos] 1.49.0, and [Go] or [pinact] 4.1.1 for the workflow
policy checks. The CI cell sets `VCPKG_DEFAULT_TRIPLET=x64-windows`; set the same value when a local
vcpkg environment would otherwise select a different triplet.

Expand Down Expand Up @@ -98,14 +101,15 @@ updating a pull request. The primary recipes are:
| `just fix` | Format C++, Python, and the Justfile. |
| `just initialize [ARGS]` | Build as needed and generate an initial triangulation. |
| `just load INPUT [ARGS]` | Load an initialized triangulation and start a new CDT move series. |
| `just markdown-check` | Validate tracked and unignored Markdown sources. |
| `just reference-check` | Validate the committed reference package offline. |
| `just release-check` | Validate synchronized release metadata and citation fields. |
| `just resume CHECKPOINT [ARGS]` | Resume the identical CDT move series from a checkpoint. |
| `just run [ARGS]` | Build as needed and run the primary CDT++ simulation. |
| `just sanitize KIND` | Run the selected Linux sanitizer preset. |
| `just viewer-check` | Validate viewer fixtures, manifests, and the tracked image. |

`just check` covers C++ and Python formatting, Python lint and types, spelling, release and citation
`just check` covers C++ and Python formatting, Python lint and types, Markdown, spelling, release and citation
metadata, YAML, GitHub Actions syntax and security, whitespace, CMake preset parsing, Semgrep policy,
reference-package consistency, and viewer artifacts. `just ci` adds action-pin policy, the supported
build and test contract, regenerated-reference drift checks, and Python package validation.
Expand Down Expand Up @@ -135,10 +139,9 @@ the owning Just recipe.

## Build and test validation

The canonical Release build runs 135 CTest registrations: 108 doctest scenarios, 25 CLI integration
tests, one compiled C++ API example, and one arithmetic-backend correctness test. The parallel
configuration registers 136 tests: the 108 ordinary doctest scenarios, one parallel launcher with
five scenarios, the same 25 integration tests, the C++ API example, and the arithmetic test.
The canonical Release build registers 138 CTest entries. The parallel configuration registers 139,
including its replayable parallel launcher. Labels overlap, so use CTest label selection rather than
adding the category counts as though they were disjoint.

To rerun the complete supported suite without rebuilding:

Expand All @@ -156,7 +159,8 @@ ctest --preset reference-smoke -L integration
The Debug build compiles the `cdt` and `initialize` production targets, then runs the 21
Debug-compatible CTest entries labeled `integration`. It defines `CGAL_NDEBUG` because supported move
paths deliberately traverse invalid intermediate triangulations while keeping CDT++ assertions
enabled. Release remains the canonical complete test configuration.
enabled. The compiled C++ API quickstart remains part of the Release integration suite but is
excluded from Debug for the same reason. Release remains the canonical complete test configuration.

For behavior changes, add or update the smallest deterministic unit, integration, reference, or
compiled-example evidence that would have caught the defect. Randomized CGAL topology counts and
Expand Down
6 changes: 6 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
blank_issues_enabled: false
contact_links:
- name: Feature requests and active development
url: https://github.com/acgetchell/causal-triangulations/issues/new/choose
about: Propose new work in the supported Rust successor.
27 changes: 0 additions & 27 deletions .github/ISSUE_TEMPLATE/feature_request.md

This file was deleted.

6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ jobs:
echo "ninja=$(just --evaluate ninja_version)"
echo "ninja-windows-wheel=$(just --evaluate ninja_windows_wheel_version)"
echo "python=$(just --evaluate python_version)"
echo "rumdl=$(just --evaluate rumdl_version)"
echo "typos=$(just --evaluate typos_version)"
echo "uv=$(just --evaluate uv_version)"
} >> "$GITHUB_OUTPUT"
Expand Down Expand Up @@ -143,6 +144,11 @@ jobs:
with:
tool: typos@${{ steps.tool-versions.outputs.typos }}

- name: Set up rumdl
uses: taiki-e/install-action@1beb33eee6d086258184383af9a538940be190ed # v2.85.6
with:
tool: rumdl@${{ steps.tool-versions.outputs.rumdl }}

- name: Set up canonical CI environment with pkgx
if: runner.os != 'Windows'
uses: pkgxdev/setup@4d4ae97af87ccb39ab8be4e073dea697fef2c6f7 # v5.0.0
Expand Down
14 changes: 13 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ CDT++ 1.0.0 is the final planned feature release of the C++23 spherical 2+1-dime
- **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.
- **Limitations:** Seeds replay stochastic inputs, not necessarily fresh cospherical CGAL topology. Resumable checkpoints continue the identical Markov chain only on the recorded producer toolchain; they are restart artifacts rather than portable interchange files. 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
Expand All @@ -27,6 +27,8 @@ CDT++ 1.0.0 is the final planned feature release of the C++23 spherical 2+1-dime

- [**breaking**] Expose reported Metropolis transitions [`16d1c76`](https://github.com/acgetchell/CDT-plusplus/commit/16d1c769afc67e06f07639f6fd9de8136974e282)

- Add initial-state loading and checkpoint resume [`e1305d6`](https://github.com/acgetchell/CDT-plusplus/commit/e1305d66663778e3c9bd7e04f8020f10919ecd1a)

### Changed

- Expose shared artifact lifecycle helpers [`2f3ba57`](https://github.com/acgetchell/CDT-plusplus/commit/2f3ba57d425f8ab4f1a0c5da0cedf7876b13eaa5)
Expand All @@ -39,6 +41,12 @@ CDT++ 1.0.0 is the final planned feature release of the C++23 spherical 2+1-dime

- Verify unknown moves preserve transition traces [`70ab238`](https://github.com/acgetchell/CDT-plusplus/commit/70ab238eb07271a7754266407f9f61e28e199b49)

### Documentation

- Clean up archival documentation references [`703b474`](https://github.com/acgetchell/CDT-plusplus/commit/703b474ab8ba0f6ee86fef7842ad9c5b4b74a3e7)

- Exclude PCG shim from generated reference [`7e8734f`](https://github.com/acgetchell/CDT-plusplus/commit/7e8734fac7097406eb416df4dd241c6a6b5d9461)

### Fixed

- Serialize Dependabot automation per pull request [`7567372`](https://github.com/acgetchell/CDT-plusplus/commit/7567372f3f11136b4317b66e695e7f2aa7d2dd69)
Expand Down Expand Up @@ -95,6 +103,10 @@ CDT++ 1.0.0 is the final planned feature release of the C++23 spherical 2+1-dime

- Stabilize macOS viewer and coverage gates [`deb24ab`](https://github.com/acgetchell/CDT-plusplus/commit/deb24ab0d7ce179469839a145f344ca1624c1275)

- Harden checkpoint resume contracts [`17bb7fb`](https://github.com/acgetchell/CDT-plusplus/commit/17bb7fb0a687837955b2a8932f028d76d029480b)

- Limit resumable checkpoint continuation to the recorded producer toolchain [`95754c4`](https://github.com/acgetchell/CDT-plusplus/commit/95754c430c33d4913f8e7fc30c1775280cc554e6)

Comment thread
coderabbitai[bot] marked this conversation as resolved.
### Maintenance

- Gate automatic merges on CodeRabbit review [`8124227`](https://github.com/acgetchell/CDT-plusplus/commit/812422797620c2203c9214af880cb5957af4469b)
Expand Down
36 changes: 35 additions & 1 deletion Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ primary_binary := if os_family() == "windows" { "out/build/reference/src/cdt.exe
python_version := trim(read(".python-version"))
reference_fixture_binary := if os_family() == "windows" { "out/build/reference/tests/CDT_reference_fixture.exe" } else { "out/build/reference/tests/CDT_reference_fixture" }
rng_benchmark_binary := if os_family() == "windows" { "out/build/reference/tests/CDT_rng_benchmark.exe" } else { "out/build/reference/tests/CDT_rng_benchmark" }
rumdl_version := "0.2.53"
typos_version := "1.49.0"
uv_version := "0.12.3"
viewer_binary := "out/build/viewer/src/cdt-viewer"
Expand Down Expand Up @@ -145,6 +146,21 @@ _ensure-git-cliff:
exit 1
fi

[private]
_ensure-rumdl:
#!/usr/bin/env bash
set -euo pipefail
command -v rumdl >/dev/null || {
echo "rumdl {{ rumdl_version }} is required." >&2
echo "Install it with: cargo install rumdl --version {{ rumdl_version }} --locked" >&2
exit 1
}
actual_version="$(rumdl --version | awk '{print $2}')"
if [[ "$actual_version" != "{{ rumdl_version }}" ]]; then
echo "rumdl {{ rumdl_version }} is required; found $actual_version." >&2
exit 1
fi

[private]
_ensure-typos:
#!/usr/bin/env bash
Expand Down Expand Up @@ -310,7 +326,7 @@ changelog-unreleased version: _ensure-git-cliff _sync-python-dev

# Run fast, non-mutating local validation.
[group('workflows')]
check: _justfile-check _format-check _yaml-check _action-lint _zizmor _whitespace-check _cmake-check release-check python-check reference-check semgrep semgrep-test spell-check viewer-check
check: _justfile-check _format-check _yaml-check _action-lint _zizmor _whitespace-check _cmake-check markdown-check release-check python-check reference-check semgrep semgrep-test spell-check viewer-check
@echo "Checks complete."

# Run the comprehensive pre-commit/pre-push validation gate.
Expand Down Expand Up @@ -408,6 +424,24 @@ initialize *args: build
load input *args: build
{{ primary_binary }} --input {{ quote(input) }} {{ args }}

# Check every tracked or unignored Markdown file with the pinned linter.
[group('workflows')]
markdown-check: _ensure-rumdl
#!/usr/bin/env bash
set -euo pipefail
files=()
while IFS= read -r -d '' file; do
if [[ -f "$file" && "$file" != "CHANGELOG.md" ]]; then
files+=("$file")
fi
done < <(git ls-files -co --exclude-standard -z -- '*.md')
if [[ "${#files[@]}" -gt 0 ]]; then
rumdl check --deny-config-warnings -- "${files[@]}"
fi
if [[ -f CHANGELOG.md ]]; then
rumdl check --deny-config-warnings --extend-disable MD013 -- CHANGELOG.md
fi

# Run every non-mutating Python source check.
[group('workflows')]
python-check: python-format-check python-lint python-typecheck python-support-test python-entrypoint-test
Expand Down
2 changes: 1 addition & 1 deletion cliff.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ body = """
- **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.
- **Limitations:** Seeds replay stochastic inputs, not necessarily fresh cospherical CGAL topology. Resumable checkpoints continue the identical Markov chain only on the recorded producer toolchain; they are restart artifacts rather than portable interchange files. 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") %}
Expand Down
5 changes: 3 additions & 2 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ if(ENABLE_TESTING)
"-DTEST_EXECUTABLE=$<TARGET_FILE:CDT_cpp_api_quickstart>"
"-DTEST_OUTPUT=${CMAKE_CURRENT_BINARY_DIR}/cpp-api-quickstart.off"
-P ${PROJECT_SOURCE_DIR}/cmake/RunCppApiQuickstartTest.cmake)
set_tests_properties(cpp-api-quickstart PROPERTIES LABELS "example;integration"
TIMEOUT 30)
set_tests_properties(
cpp-api-quickstart
PROPERTIES LABELS "example;integration;debug-incompatible" TIMEOUT 30)
endif()
Loading
Loading