Skip to content
This repository was archived by the owner on Aug 12, 2026. It is now read-only.

Commit 2840437

Browse files
committed
fix(release): harden repository readiness contracts
- validate complete reference packages before publishing generated artifacts - bound initializer optimization commands and report actionable failures - add pinned Markdown validation to local and CI workflows - reconcile archival guidance, API contracts, and successor issue routing
1 parent 169c272 commit 2840437

19 files changed

Lines changed: 389 additions & 86 deletions

‎.github/CODE_OF_CONDUCT.md‎

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
## Our Pledge
44

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

79
## Our Standards
810

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

2527
## Our Responsibilities
2628

27-
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.
29+
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective
30+
action in response to any instances of unacceptable behavior.
2831

29-
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.
32+
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions
33+
that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate,
34+
threatening, offensive, or harmful.
3035

3136
## Scope
3237

33-
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.
38+
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
39+
Examples include using an official project email address, posting via an official social media account, or acting as an appointed representative at
40+
an online or offline event. Project maintainers may further define and clarify representation of the project or community.
3441

3542
## Enforcement
3643

37-
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.
44+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at
45+
[adam@adamgetchell.org](mailto:adam@adamgetchell.org). The project team will review and investigate all complaints and respond as appropriate to the
46+
circumstances. The project team is obligated to maintain confidentiality about the reporter of an incident. Further details of specific enforcement
47+
policies may be posted separately.
3848

39-
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.
49+
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by
50+
other members of the project's leadership.
4051

4152
## Attribution
4253

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

4557
[homepage]: http://contributor-covenant.org
4658
[version]: http://contributor-covenant.org/version/1/4/

‎.github/CONTRIBUTING.md‎

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ setup is:
3939
- [Just] 1.58.0 or newer; and
4040
- [Python] 3.14 and [uv] when running Python-backed checks directly.
4141

42+
Complete local validation also requires [rumdl](https://github.com/rvben/rumdl) 0.2.53 and [typos]
43+
1.49.0. The Justfile reports the exact installation command when either tool is missing.
44+
4245
Without pkgx, provide [Git], [Bash], [CMake] 4.4.0 or newer, [Ninja], [Python], [GNU M4], [Autoconf],
4346
[Autoconf Archive], [Automake], [GNU Libtool], [Texinfo], and [pkg-config] through the host package manager.
4447
Documentation work also requires [Doxygen] 1.16.1 and [Graphviz] 15.1.0. The build does not require a personal vcpkg
@@ -49,7 +52,7 @@ For native Windows work, use an x64 [Developer Command Prompt or Developer Power
4952
and expose [Git Bash] on `PATH`, because the Justfile uses Bash as its recipe shell. The supported build path also
5053
requires [Just] 1.58.0 or newer, [Python] 3.14 with `python.exe` on `PATH`, [CMake] 4.4.0 or newer, and
5154
[Ninja]. The tested Windows cell uses Python 3.14.6, CMake 4.4.1, and Ninja 1.13.0. Complete local
52-
validation additionally requires [uv] 0.12.3, [typos] 1.49.0, and [Go] or [pinact] 4.1.1 for the workflow
55+
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
5356
policy checks. The CI cell sets `VCPKG_DEFAULT_TRIPLET=x64-windows`; set the same value when a local
5457
vcpkg environment would otherwise select a different triplet.
5558

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

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

136140
## Build and test validation
137141

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

143146
To rerun the complete supported suite without rebuilding:
144147

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

161165
For behavior changes, add or update the smallest deterministic unit, integration, reference, or
162166
compiled-example evidence that would have caught the defect. Randomized CGAL topology counts and

‎.github/ISSUE_TEMPLATE/config.yml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
blank_issues_enabled: false
3+
contact_links:
4+
- name: Feature requests and active development
5+
url: https://github.com/acgetchell/causal-triangulations/issues/new/choose
6+
about: Propose new work in the supported Rust successor.

‎.github/ISSUE_TEMPLATE/feature_request.md‎

Lines changed: 0 additions & 27 deletions
This file was deleted.

‎.github/workflows/ci.yml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ jobs:
9797
echo "ninja=$(just --evaluate ninja_version)"
9898
echo "ninja-windows-wheel=$(just --evaluate ninja_windows_wheel_version)"
9999
echo "python=$(just --evaluate python_version)"
100+
echo "rumdl=$(just --evaluate rumdl_version)"
100101
echo "typos=$(just --evaluate typos_version)"
101102
echo "uv=$(just --evaluate uv_version)"
102103
} >> "$GITHUB_OUTPUT"
@@ -143,6 +144,11 @@ jobs:
143144
with:
144145
tool: typos@${{ steps.tool-versions.outputs.typos }}
145146

147+
- name: Set up rumdl
148+
uses: taiki-e/install-action@1beb33eee6d086258184383af9a538940be190ed # v2.85.6
149+
with:
150+
tool: rumdl@${{ steps.tool-versions.outputs.rumdl }}
151+
146152
- name: Set up canonical CI environment with pkgx
147153
if: runner.os != 'Windows'
148154
uses: pkgxdev/setup@4d4ae97af87ccb39ab8be4e073dea697fef2c6f7 # v5.0.0

‎CHANGELOG.md‎

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ CDT++ 1.0.0 is the final planned feature release of the C++23 spherical 2+1-dime
1414
- **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.
1515
- **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.
1616
- **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.
17-
- **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.
17+
- **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.
1818
- **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.
1919

2020
### Added
@@ -27,6 +27,8 @@ CDT++ 1.0.0 is the final planned feature release of the C++23 spherical 2+1-dime
2727

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

30+
- Add initial-state loading and checkpoint resume [`e1305d6`](https://github.com/acgetchell/CDT-plusplus/commit/e1305d66663778e3c9bd7e04f8020f10919ecd1a)
31+
3032
### Changed
3133

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

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

44+
### Documentation
45+
46+
- Clean up archival documentation references [`703b474`](https://github.com/acgetchell/CDT-plusplus/commit/703b474ab8ba0f6ee86fef7842ad9c5b4b74a3e7)
47+
48+
- Exclude PCG shim from generated reference [`7e8734f`](https://github.com/acgetchell/CDT-plusplus/commit/7e8734fac7097406eb416df4dd241c6a6b5d9461)
49+
4250
### Fixed
4351

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

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

106+
- Harden checkpoint resume contracts [`17bb7fb`](https://github.com/acgetchell/CDT-plusplus/commit/17bb7fb0a687837955b2a8932f028d76d029480b)
107+
108+
- Enforce portable checkpoint continuation [`95754c4`](https://github.com/acgetchell/CDT-plusplus/commit/95754c430c33d4913f8e7fc30c1775280cc554e6)
109+
98110
### Maintenance
99111

100112
- Gate automatic merges on CodeRabbit review [`8124227`](https://github.com/acgetchell/CDT-plusplus/commit/812422797620c2203c9214af880cb5957af4469b)

‎Justfile‎

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ primary_binary := if os_family() == "windows" { "out/build/reference/src/cdt.exe
2828
python_version := trim(read(".python-version"))
2929
reference_fixture_binary := if os_family() == "windows" { "out/build/reference/tests/CDT_reference_fixture.exe" } else { "out/build/reference/tests/CDT_reference_fixture" }
3030
rng_benchmark_binary := if os_family() == "windows" { "out/build/reference/tests/CDT_rng_benchmark.exe" } else { "out/build/reference/tests/CDT_rng_benchmark" }
31+
rumdl_version := "0.2.53"
3132
typos_version := "1.49.0"
3233
uv_version := "0.12.3"
3334
viewer_binary := "out/build/viewer/src/cdt-viewer"
@@ -145,6 +146,21 @@ _ensure-git-cliff:
145146
exit 1
146147
fi
147148
149+
[private]
150+
_ensure-rumdl:
151+
#!/usr/bin/env bash
152+
set -euo pipefail
153+
command -v rumdl >/dev/null || {
154+
echo "rumdl {{ rumdl_version }} is required." >&2
155+
echo "Install it with: cargo install rumdl --version {{ rumdl_version }} --locked" >&2
156+
exit 1
157+
}
158+
actual_version="$(rumdl --version | awk '{print $2}')"
159+
if [[ "$actual_version" != "{{ rumdl_version }}" ]]; then
160+
echo "rumdl {{ rumdl_version }} is required; found $actual_version." >&2
161+
exit 1
162+
fi
163+
148164
[private]
149165
_ensure-typos:
150166
#!/usr/bin/env bash
@@ -310,7 +326,7 @@ changelog-unreleased version: _ensure-git-cliff _sync-python-dev
310326

311327
# Run fast, non-mutating local validation.
312328
[group('workflows')]
313-
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
329+
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
314330
@echo "Checks complete."
315331

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

427+
# Check every tracked or unignored Markdown file with the pinned linter.
428+
[group('workflows')]
429+
markdown-check: _ensure-rumdl
430+
#!/usr/bin/env bash
431+
set -euo pipefail
432+
files=()
433+
while IFS= read -r -d '' file; do
434+
if [[ -f "$file" && "$file" != "CHANGELOG.md" ]]; then
435+
files+=("$file")
436+
fi
437+
done < <(git ls-files -co --exclude-standard -z -- '*.md')
438+
if [[ "${#files[@]}" -gt 0 ]]; then
439+
rumdl check --deny-config-warnings -- "${files[@]}"
440+
fi
441+
if [[ -f CHANGELOG.md ]]; then
442+
rumdl check --deny-config-warnings --extend-disable MD013 -- CHANGELOG.md
443+
fi
444+
411445
# Run every non-mutating Python source check.
412446
[group('workflows')]
413447
python-check: python-format-check python-lint python-typecheck python-support-test python-entrypoint-test

‎cliff.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ body = """
2323
- **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.
2424
- **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.
2525
- **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.
26-
- **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.
26+
- **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.
2727
- **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.
2828
{% endif %}
2929
{% for group, commits in commits | group_by(attribute="group") %}

‎examples/CMakeLists.txt‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ if(ENABLE_TESTING)
1717
"-DTEST_EXECUTABLE=$<TARGET_FILE:CDT_cpp_api_quickstart>"
1818
"-DTEST_OUTPUT=${CMAKE_CURRENT_BINARY_DIR}/cpp-api-quickstart.off"
1919
-P ${PROJECT_SOURCE_DIR}/cmake/RunCppApiQuickstartTest.cmake)
20-
set_tests_properties(cpp-api-quickstart PROPERTIES LABELS "example;integration"
21-
TIMEOUT 30)
20+
set_tests_properties(
21+
cpp-api-quickstart
22+
PROPERTIES LABELS "example;integration;debug-incompatible" TIMEOUT 30)
2223
endif()

0 commit comments

Comments
 (0)