Skip to content

fix(moves)!: make Metropolis transitions reversible and reproducible#112

Merged
acgetchell merged 13 commits into
mainfrom
fix/92-105-moves-reproducibility
Jul 21, 2026
Merged

fix(moves)!: make Metropolis transitions reversible and reproducible#112
acgetchell merged 13 commits into
mainfrom
fix/92-105-moves-reproducibility

Conversation

@acgetchell

@acgetchell acgetchell commented Jul 20, 2026

Copy link
Copy Markdown
Owner
  • complete failure-atomic 3D Pachner moves and Hastings proposal ratios
  • centralize seeded PCG streams across initialization and transitions
  • standardize local and GitHub Actions validation through just ci and Semgrep
  • synchronize v1.0.0-rc1 metadata, citations, and uv experiment entry points

BREAKING CHANGE: move helpers now require caller-owned RNG state, and generated OFF filenames include seed and pass metadata.

Closes #92
Closes #105

Summary by CodeRabbit

  • New Features
    • Added --seed support to cdt and initialize, including “Effective random seed” output and seed-aware deterministic replay/output.
    • Added new console entry points for MNIST/Comet workflows and vcpkg bootstrapping.
  • Documentation
    • Updated release-candidate guidance, added CITATION.cff, and introduced REFERENCES.md.
    • Added detailed reproducibility and Metropolis–Hastings documentation.
  • CI/Quality
    • Standardized CI execution, expanded Semgrep and CodeQL coverage, improved Doxygen publishing, and added release-metadata validation.
  • Bug Fixes
    • Tightened --no-output validation to ensure correct seed/help behavior.
  • Tests
    • Increased determinism via seeding and updated reference-smoke presets to run the complete test suite.

- complete failure-atomic 3D Pachner moves and Hastings proposal ratios
- centralize seeded PCG streams across initialization and transitions
- standardize local and GitHub Actions validation through just ci and Semgrep
- synchronize v1.0.0-rc1 metadata, citations, and uv experiment entry points

BREAKING CHANGE: move helpers now require caller-owned RNG state, and generated OFF filenames include seed and pass metadata.

Closes #92
Closes #105
@acgetchell acgetchell self-assigned this Jul 20, 2026
@acgetchell
acgetchell enabled auto-merge (squash) July 20, 2026 21:23
@coderabbitai

coderabbitai Bot commented Jul 20, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1820febc-f6ee-4199-9318-35bc86b69cc3

📥 Commits

Reviewing files that changed from the base of the PR and between 6ac07d0 and a578231.

📒 Files selected for processing (3)
  • .github/workflows/_sanitizer.yml
  • Justfile
  • scripts/sanitizer.sh

Walkthrough

The release candidate introduces caller-owned reproducible RNG streams, seed-aware CLI execution and output metadata, revised Metropolis-Hastings transitions, release and citation metadata, vcpkg and CI tooling, Semgrep policies, documentation workflows, and expanded deterministic tests.

Changes

Release and validation

Layer / File(s) Summary
Release metadata and build validation
.github/*, CMakeLists.txt, CMakePresets.json, CITATION.cff, REFERENCES.md, Justfile, pyproject.toml, scripts/*, semgrep.yaml, vcpkg.json
Release version metadata, citation data, packaging, vcpkg bootstrapping, CI workflows, Semgrep checks, documentation generation, and validation recipes are updated.
Seeded runtime and move execution
include/*, src/cdt.cpp, src/initialize.cpp, src/cdt-viewer.cpp
Randomness is owned by explicit cdt::Random streams, threaded through triangulation and move APIs, and recorded in CLI output and generated filenames.
Metropolis-Hastings and numerical contracts
include/Metropolis.hpp, include/Mpfr_value.hpp, include/S3Action.hpp, docs/metropolis-hastings.md, docs/reproducibility.md
Proposal ratios, candidate transitions, counters, MPFR rounding, action precision, replay behavior, and transition contracts are updated and documented.
Deterministic validation
tests/*, cmake/RunCdtNoOutputTest.cmake
Move geometry deltas, RNG replay, CLI seeds, proposal domains, filesystem isolation, release metadata, support scripts, and Semgrep fixtures are tested deterministically.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related issues

Possibly related PRs

Poem

Seeds split softly, streams align,
Moves replay in deterministic time.
Metadata blooms for version one,
Tests keep watch beneath the sun.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR also bundles extensive release, CI, docs, packaging, and tooling changes unrelated to #92/#105. Split the release/CI/docs/tooling work into a separate PR and keep this one focused on Metropolis/RNG fixes.
Docstring Coverage ⚠️ Warning Docstring coverage is 53.11% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed Title clearly summarizes the main change: reversible, reproducible Metropolis transitions.
Linked Issues check ✅ Passed The changes cover #92/#105 with seeded RNG ownership, proposal ratios, geometry deltas, precision handling, and deterministic replay tests.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/92-105-moves-reproducibility

Comment @coderabbitai help to get the list of available commands.

@acgetchell acgetchell added this to the v1.0.0-rc.1 milestone Jul 20, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
tests/Ergodic_moves_3_test.cpp (1)

577-595: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Missing CAPTURE(random.seed()) for this scenario's RNG.

Every other seeded block in this file captures random.seed() for failure diagnosis, but this one doesn't. Given the PR's reproducibility goal (reporting effective seeds for randomized test failures), this block should follow suit.

🩹 Proposed fix
     cdt::Random      random{92};
+    CAPTURE(random.seed());
 
     WHEN("A (2,6) move is proposed")
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/Ergodic_moves_3_test.cpp` around lines 577 - 595, Add
CAPTURE(random.seed()) to the seeded test scenario containing the do_26_move
call, before executing the move, matching the failure-diagnosis pattern used by
the other randomized blocks in this test.
include/Foliated_triangulation.hpp (2)

899-914: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Missing @tparam/@param docs for the new caller-owned generator.

make_foliated_ball and make_triangulation gained a required Generator& template parameter and generator parameter, but the Doxygen blocks above them weren't updated to document either. Since these are public template APIs whose signature just became a breaking change (callers must now own and pass RNG state), documenting ownership/lifetime expectations here matters.

As per path instructions for include/**/*.hpp: "Focus on design patterns, interfaces, and encapsulation."

Also applies to: 985-998

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@include/Foliated_triangulation.hpp` around lines 899 - 914, Update the
Doxygen comments for make_foliated_ball and make_triangulation to document the
Generator template parameter with `@tparam` and the caller-owned generator
argument with `@param`, including that callers provide and maintain its RNG state
for the call.

Source: Path instructions


1-1: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Document the new caller-owned generator parameter across all its introduction sites. This PR makes RNG ownership an explicit, breaking part of the public interface (Generator&/cdt::Random&/cdt::Random&&), but none of the sites that introduce it add @tparam/@param docs, unlike sibling functions/constructors in the same files that do document their parameters.

  • include/Foliated_triangulation.hpp#L899-914,985-998: add @tparam Generator and @param generator to make_foliated_ball and make_triangulation.
  • include/Foliated_triangulation.hpp#L1248-1269: add @param generator/@param t_simplices/etc. to the two new FoliatedTriangulation<3> constructors, matching the detail level of the Delaunay-based constructor above them.
  • include/Manifold.hpp#L111-130: add @param generator (and the other parameters) to the two new Manifold<3> constructors, matching the Causal_vertices constructor immediately below.

As per path instructions for include/**/*.hpp: "Focus on design patterns, interfaces, and encapsulation."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@include/Foliated_triangulation.hpp` at line 1, Document every newly
introduced generator and constructor parameter in the listed public APIs: add
`@tparam` Generator and `@param` generator to make_foliated_ball and
make_triangulation, and add complete `@param` entries for both new
FoliatedTriangulation<3> and Manifold<3> constructors. Match the detail and
naming style of the adjacent documented constructors, including all other
parameters.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/optimize_initialize.py`:
- Around line 65-120: Remove the unreachable
cm.exceptions.NoMoreSuggestionsAvailable exception handler and ensure each
Experiment created in the parameters loop always calls experiment.end(),
including when qx or later processing raises an error. Scope cleanup to the
current experiment using a finally-based structure while preserving iteration
over remaining parameter pairs according to the existing error behavior.
- Around line 66-69: Replace the unsupported Experiment.log_multiple_params call
in the parameter loop with the current SDK method Experiment.log_parameters,
preserving the existing hyper_params and experiment flow.

In `@scripts/tests/test_optimize_initialize.py`:
- Around line 29-34: Extend the tests around test_initializer_output_is_parsed
to cover both RuntimeError branches in _parse_initializer_output: assert an
output without the final simplex count raises the expected error, and assert an
output without any volume-profile entries raises the expected error. Keep the
existing happy-path assertion unchanged.

In `@tests/Random_benchmark.cpp`:
- Around line 67-69: Validate owned_time.count() before computing speedup in the
benchmark measurement flow, rejecting or skipping runs whose duration is zero
after nanosecond truncation. Keep the existing speedup calculation unchanged for
positive owned durations, and anchor the change around owned_ns and speedup.

In `@tests/S3Action_test.cpp`:
- Around line 166-173: Update the test description around the THEN block to
explicitly state that the values remain distinct at MPFR precision but collapse
to the same value when converted to double. Split the assertions into separate
THEN/AND_THEN blocks if appropriate, with names covering both the nonzero MPFR
delta and equal double conversions.

---

Outside diff comments:
In `@include/Foliated_triangulation.hpp`:
- Around line 899-914: Update the Doxygen comments for make_foliated_ball and
make_triangulation to document the Generator template parameter with `@tparam` and
the caller-owned generator argument with `@param`, including that callers provide
and maintain its RNG state for the call.
- Line 1: Document every newly introduced generator and constructor parameter in
the listed public APIs: add `@tparam` Generator and `@param` generator to
make_foliated_ball and make_triangulation, and add complete `@param` entries for
both new FoliatedTriangulation<3> and Manifold<3> constructors. Match the detail
and naming style of the adjacent documented constructors, including all other
parameters.

In `@tests/Ergodic_moves_3_test.cpp`:
- Around line 577-595: Add CAPTURE(random.seed()) to the seeded test scenario
containing the do_26_move call, before executing the move, matching the
failure-diagnosis pattern used by the other randomized blocks in this test.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: d0a21636-e52e-4d29-84d4-9c3a08191eba

📥 Commits

Reviewing files that changed from the base of the PR and between 4245ac0 and a4a8ef4.

⛔ Files ignored due to path filters (1)
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (66)
  • .github/CONTRIBUTING.md
  • .github/workflows/ci.yml
  • .semgrepignore
  • CITATION.cff
  • CMakeLists.txt
  • CMakePresets.json
  • Justfile
  • README.md
  • REFERENCES.md
  • cmake/RunCdtNoOutputTest.cmake
  • cmake/Version.hpp.in
  • docs/Doxyfile
  • docs/metropolis-hastings.md
  • docs/reproducibility.md
  • include/Apply_move.hpp
  • include/Ergodic_moves_3.hpp
  • include/Foliated_triangulation.hpp
  • include/Manifold.hpp
  • include/Metropolis.hpp
  • include/Move_always.hpp
  • include/Move_command.hpp
  • include/Move_tracker.hpp
  • include/Mpfr_value.hpp
  • include/Random.hpp
  • include/S3Action.hpp
  • include/Utilities.hpp
  • pyproject.toml
  • scripts/__init__.py
  • scripts/clang-tidy.sh
  • scripts/mnist_experiment.py
  • scripts/optimize_initialize.py
  • scripts/release_check.py
  • scripts/semgrep_fixture_config.py
  • scripts/tests/__init__.py
  • scripts/tests/test_optimize_initialize.py
  • scripts/tests/test_release_check.py
  • semgrep.yaml
  • src/CMakeLists.txt
  • src/cdt-viewer.cpp
  • src/cdt.cpp
  • src/initialize.cpp
  • src/optimize-initialize.py
  • src/test.py
  • tests/Apply_move_test.cpp
  • tests/CMakeLists.txt
  • tests/Ergodic_moves_3_test.cpp
  • tests/Foliated_triangulation_test.cpp
  • tests/Function_ref_test.cpp
  • tests/Geometry_test.cpp
  • tests/Manifold_test.cpp
  • tests/Metropolis_test.cpp
  • tests/Move_always_test.cpp
  • tests/Move_command_test.cpp
  • tests/Random_benchmark.cpp
  • tests/Random_header_consumer.cpp
  • tests/Random_test.cpp
  • tests/S3Action_test.cpp
  • tests/Settings_test.cpp
  • tests/Tetrahedron_test.cpp
  • tests/Utilities_test.cpp
  • tests/Vertex_test.cpp
  • tests/main.cpp
  • tests/semgrep/doctest_hygiene.cpp
  • tests/semgrep/move_hot_path_logging.cpp
  • tests/semgrep/random_ownership.cpp
  • vcpkg.json
💤 Files with no reviewable changes (3)
  • tests/main.cpp
  • src/test.py
  • src/optimize-initialize.py

Comment thread scripts/optimize_initialize.py Outdated
Comment thread scripts/optimize_initialize.py Outdated
Comment thread scripts/tests/test_optimize_initialize.py
Comment thread tests/Random_benchmark.cpp Outdated
Comment thread tests/S3Action_test.cpp
- run pinned Doxygen and Graphviz checks through just ci on every platform
- publish the same validated documentation output to gh-pages
- install Windows tooling without Chocolatey
- keep sanitizer workloads deterministic and within runner timeouts
- ensure Comet experiments clean up and reject malformed initializer output
- complete RNG documentation and guard benchmark timing edge cases

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
include/Utilities.hpp (1)

378-389: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Align the RNG documentation with the generic API.

The template accepts any std::uniform_random_bit_generator, but the preceding text still says it uses PCG. Limit that claim to cdt::Random callers or describe the API as generator-agnostic.

Proposed fix
-  /// Uses Melissa E. O'Neill's Permuted Congruential Generator for high-quality
-  /// RNG which passes the TestU01 statistical tests.
+  /// Samples from the caller-owned uniform random bit generator.
+  /// `cdt::Random` uses Melissa E. O'Neill's Permuted Congruential Generator.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@include/Utilities.hpp` around lines 378 - 389, Update the documentation for
the generic RNG API near the NumberType, Distribution, and Generator template
declarations so it no longer claims that all callers use PCG; describe the
function as generator-agnostic, or explicitly scope the PCG description to
cdt::Random callers while preserving the existing generator parameter
documentation.
README.md (1)

142-145: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

Describe the cross-platform build entry point accurately.

Line 142 says build.sh runs on every supported platform, but Windows dispatches to scripts/build.bat. Refer to just build or the platform-specific scripts instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` around lines 142 - 145, Update the README build-entry description
to avoid claiming build.sh runs on every supported platform; refer to the
cross-platform just build command and acknowledge the platform-specific scripts,
including scripts/build.bat for Windows, while preserving the stated test
coverage.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@scripts/sanitizer.sh`:
- Around line 39-40: Update the cdt invocation in scripts/sanitizer.sh to pass
the same deterministic --seed 92 option already used by initialize, while
preserving cdt’s existing arguments.

---

Outside diff comments:
In `@include/Utilities.hpp`:
- Around line 378-389: Update the documentation for the generic RNG API near the
NumberType, Distribution, and Generator template declarations so it no longer
claims that all callers use PCG; describe the function as generator-agnostic, or
explicitly scope the PCG description to cdt::Random callers while preserving the
existing generator parameter documentation.

In `@README.md`:
- Around line 142-145: Update the README build-entry description to avoid
claiming build.sh runs on every supported platform; refer to the cross-platform
just build command and acknowledge the platform-specific scripts, including
scripts/build.bat for Windows, while preserving the stated test coverage.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: d9738c6a-dccb-4d84-8af7-c6f91d211a94

📥 Commits

Reviewing files that changed from the base of the PR and between a4a8ef4 and c508c7a.

📒 Files selected for processing (19)
  • .github/actions/setup-just/action.yml
  • .github/workflows/ci.yml
  • .github/workflows/doxygen.yml
  • Justfile
  • README.md
  • docs/Doxyfile
  • include/Ergodic_moves_3.hpp
  • include/Foliated_triangulation.hpp
  • include/Formatters.hpp
  • include/Manifold.hpp
  • include/Utilities.hpp
  • scripts/doxygen.sh
  • scripts/optimize_initialize.py
  • scripts/sanitizer.sh
  • scripts/tests/test_optimize_initialize.py
  • tests/CMakeLists.txt
  • tests/Ergodic_moves_3_test.cpp
  • tests/Random_benchmark.cpp
  • tests/S3Action_test.cpp

Comment thread scripts/sanitizer.sh Outdated
- prepare dependencies before CodeQL and trace only CDT++ production targets
- make sanitizer and initializer optimization runs replayable with recorded seeds
- reject malformed initializer profiles instead of silently ignoring them
- clarify cross-platform build entry points and generator-agnostic RNG documentation

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
include/Utilities.hpp (1)

418-423: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Accept the timeslice bound by value. generate_random_timeslice takes t_max_timeslice as a forwarding reference, so a mutable lvalue like int max = 8; deduces IntegerType to int& and makes static_cast<IntegerType>(1) ill-formed. Taking the bound by value, or decaying the type before the cast, keeps this public helper usable for ordinary named bounds.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@include/Utilities.hpp` around lines 418 - 423, Update
generate_random_timeslice to accept t_max_timeslice by value rather than as a
forwarding reference, while preserving the existing integer-bound behavior and
forwarding it appropriately to generate_random_int. Ensure ordinary mutable
lvalue bounds such as named integers compile successfully.

Source: Path instructions

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In `@include/Utilities.hpp`:
- Around line 418-423: Update generate_random_timeslice to accept
t_max_timeslice by value rather than as a forwarding reference, while preserving
the existing integer-bound behavior and forwarding it appropriately to
generate_random_int. Ensure ordinary mutable lvalue bounds such as named
integers compile successfully.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: bfa47bb8-4ec4-412a-affe-43edc0d1b890

📥 Commits

Reviewing files that changed from the base of the PR and between c508c7a and 666b1b9.

📒 Files selected for processing (9)
  • .github/workflows/codeql.yml
  • Justfile
  • README.md
  • include/Utilities.hpp
  • scripts/codeql-build.sh
  • scripts/optimize_initialize.py
  • scripts/pkgx-build.sh
  • scripts/sanitizer.sh
  • scripts/tests/test_optimize_initialize.py

- pass the Unix pkgx toolchain as one whitespace-separated package list
- propagate verified Windows tools through PowerShell Core environment files
- accept mutable lvalue bounds in generate_random_timeslice

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
include/Utilities.hpp (1)

368-376: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Align die_roll documentation with its generic interface.

die_roll accepts any std::uniform_random_bit_generator, not specifically a PCG engine. Update the brief to describe a caller-supplied generator, or constrain the template if PCG-only behavior is intentional.

Suggested change
-  /// `@brief` Roll a die with PCG
+  /// `@brief` Roll a die using a caller-supplied generator

As per path instructions, this public header should keep its interface documentation aligned with the actual abstraction.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@include/Utilities.hpp` around lines 368 - 376, Update the Doxygen brief for
die_roll to describe rolling a die using a caller-supplied
std::uniform_random_bit_generator rather than referring specifically to PCG;
keep the generic template interface unchanged.

Source: Path instructions

.github/workflows/ci.yml (1)

125-134: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Bound the Windows archive downloads with explicit timeouts. .github/workflows/ci.yml:125-134Invoke-WebRequest uses an indefinite timeout by default, so a stalled Doxygen or Graphviz download can hang the Windows CI job. Add -TimeoutSec to both calls.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/ci.yml around lines 125 - 134, Add an explicit -TimeoutSec
value to both Invoke-WebRequest calls downloading the Doxygen and Graphviz
archives in the Windows CI setup, using the same bounded timeout for each and
leaving their existing URLs and output paths unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.github/workflows/ci.yml:
- Around line 125-134: Add an explicit -TimeoutSec value to both
Invoke-WebRequest calls downloading the Doxygen and Graphviz archives in the
Windows CI setup, using the same bounded timeout for each and leaving their
existing URLs and output paths unchanged.

In `@include/Utilities.hpp`:
- Around line 368-376: Update the Doxygen brief for die_roll to describe rolling
a die using a caller-supplied std::uniform_random_bit_generator rather than
referring specifically to PCG; keep the generic template interface unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: db06e032-8c60-48d2-95d0-c9aac13ecb52

📥 Commits

Reviewing files that changed from the base of the PR and between 666b1b9 and 31be859.

📒 Files selected for processing (3)
  • .github/workflows/ci.yml
  • include/Utilities.hpp
  • tests/Utilities_test.cpp

- Keep documentation validation separate from the portable just ci contract.
- Launch pinned Doxygen and Graphviz ephemerally in the publishing workflow.
- Document die_roll using its generic caller-supplied RNG contract.
@acgetchell

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

- verify the pinned vcpkg executable with native certutil
- align the action checkout with the repository vcpkg cache
- limit MSVC build parallelism to the proven two-job configuration
Capture the configured remote before comparing it so the Windows bootstrap
does not reject the checkout prepared by run-vcpkg. Continue requiring the
official microsoft/vcpkg repository while accepting canonical HTTPS URLs
with or without the .git suffix.
Replace the platform-specific bootstrap validators with one Python
implementation shared by Windows, macOS, and Linux.

Preserve origin, baseline, executable-integrity, and version checks while
allowing action-owned untracked vcpkg metadata.
Comment thread scripts/tests/test_bootstrap_vcpkg.py Fixed
acgetchell and others added 2 commits July 20, 2026 20:51
- provision sanitizer CMake and Ninja from shared Justfile pins
- isolate sanitizer builds from pkgx transitive build variables
- canonicalize Windows cache paths and avoid false secret classification

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/_sanitizer.yml:
- Around line 87-90: Update the sanitizer workflow’s tool-version configuration
so the llvm.org entry uses an exact LLVM package version or resolved digest
instead of the major-version selector from steps.tool-versions.outputs.llvm.
Keep the existing CMake and Ninja entries unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1906d63f-8519-4eb1-bf9e-bd4e1fa6d338

📥 Commits

Reviewing files that changed from the base of the PR and between 1eb3222 and 6ac07d0.

📒 Files selected for processing (1)
  • .github/workflows/_sanitizer.yml

Comment thread .github/workflows/_sanitizer.yml Outdated
@acgetchell
acgetchell merged commit 1d7269c into main Jul 21, 2026
13 checks passed
@acgetchell
acgetchell deleted the fix/92-105-moves-reproducibility branch July 21, 2026 05:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make random-number generation reproducible and seedable Correct Metropolis-Hastings transitions and Regge action calculations

2 participants