Skip to content

Update/utilities and roadmap#100

Merged
acgetchell merged 5 commits intomainfrom
update/utilities-and-roadmap
Oct 11, 2025
Merged

Update/utilities and roadmap#100
acgetchell merged 5 commits intomainfrom
update/utilities-and-roadmap

Conversation

@acgetchell
Copy link
Copy Markdown
Owner

This pull request includes improvements to CI workflows and updates to the changelog, focusing on better error handling, code consistency, and enhanced documentation. The most significant changes are grouped below.

CI Workflow Improvements:

  • Refactored SARIF file creation in .github/workflows/codacy.yml to use a more robust block for generating empty SARIF files, improving workflow reliability.
  • Updated environment variable handling in .github/workflows/profiling-benchmarks.yml for consistency and correctness, including quoting $GITHUB_ENV and refining benchmark commands. [1] [2]

Changelog and Documentation Updates:

Code Consistency and Maintenance:

  • Improved code consistency and reduced redundancy in various scripts and workflows, as noted in the changelog.
  • Updated dependencies and build scripts for better maintainability and up-to-date tooling. [1] [2]

These changes help ensure that CI runs more reliably, documentation is up-to-date, and the codebase remains consistent and maintainable.

Updates the cspell dictionary to include new words and remove obsolete
entries, ensuring consistent spell-checking across the project.

Enhances changelog utilities with new ANSI color codes for terminal
output, improved git root detection, and fixes for long title formatting.
Refactors the build system, CI, and benchmarking tooling for
improved development workflows. This includes updates to
the spellcheck dictionary, workflow configurations, and
the introduction of a `justfile` for task automation.
These changes streamline common development tasks
and improve overall project maintainability.
Copilot AI review requested due to automatic review settings October 11, 2025 17:42
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Oct 11, 2025

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Updates CI workflows for SARIF and benchmarking, adds docs and references, restructures Just-based developer workflows, reshapes spellcheck dictionary, refactors changelog and commit-processing scripts (with tests), and adds a topology design doc.

Changes

Cohort / File(s) Summary
CI workflows
.github/workflows/codacy.yml, .github/workflows/profiling-benchmarks.yml
Rework empty SARIF generation to write a single structured JSON file; quote env redirection, branch cargo bench invocation on BENCH_FILTER, and add a memory-bench branch using --features count-allocations with adjusted memory env flag handling.
Documentation & references
CHANGELOG.md, REFERENCES.md, docs/topology.md
Expand CHANGELOG entries; add many citations and a new performance/memory section in REFERENCES; add docs/topology.md describing a topology module design, API surface, validation strategies, integration points, and testing plan.
Spell-check dictionary
cspell.json
Reorder and update the words dictionary with many added/reintroduced proper nouns and domain terms.
Just recipes
justfile
Major reorganization: remove legacy monolithic recipes and add many CI/perf/benchmark/lint/build workflows and developer utilities with parameterized targets and enhanced help text.
Changelog utilities
scripts/changelog_utils.py, scripts/tests/test_changelog_utils.py
Add ANSI color constants, improve project-root detection with git fallback, refactor title-wrapping helpers, improve CLI error handling/messages, and update tests to mock git fallback and expect updated errors/messages.
Commit enhancement tool
scripts/enhance_commits.py, scripts/tests/test_enhance_commits.py
Introduce typing and modular helpers, replace inline regex with compiled CATEGORY_PATTERNS, refactor parsing/categorization and section-flush logic, improve I/O/error handling; tests updated to use CATEGORY_PATTERNS and new exit-code expectations.
Changelog constants
scripts/changelog_utils.py (constants)
Add public ANSI color constants: COLOR_GREEN, COLOR_BLUE, COLOR_YELLOW, COLOR_RESET.
Cargo config
.cargo/config.toml
Remove the [alias] section, deleting previously defined cargo command aliases while keeping env settings.
Docs & READMEs
CONTRIBUTING.md, README.md, WARP.md, benches/README.md, tests/README.md
Replace cargo-centric commands with Just-based workflows across contributor guidance, README, WARP, and benchmark/test docs; update examples and recommendations.
Tests
scripts/tests/*
Adjust tests to reflect new behaviors: mock git fallback in changelog tests, use CATEGORY_PATTERNS in enhance_commits tests, and assert updated formatting and exit codes.

Sequence Diagram(s)

sequenceDiagram
  participant GH as GitHub Actions
  participant Profile as profiling-benchmarks.yml
  participant Cargo as cargo

  GH->>Profile: Start workflow
  Profile->>Profile: echo "PROFILING_DEV_MODE=1" >> "$GITHUB_ENV"
  alt BENCH_FILTER empty
    Profile->>Cargo: cargo bench
  else BENCH_FILTER set
    Note right of Profile: shellcheck disable SC2086
    Profile->>Cargo: cargo bench -- $BENCH_FILTER
  end
  alt Memory benchmarks enabled
    Profile->>Cargo: cargo bench --features count-allocations [ $BENCH_FILTER? ]
    Profile->>GH: echo "MEMORY_BENCHMARKS_RUN=true" >> "$GITHUB_ENV"
  end
Loading
sequenceDiagram
  participant GH as GitHub Actions
  participant Codacy as codacy.yml
  participant FS as Filesystem

  GH->>Codacy: Run SARIF preparation
  alt SARIF missing or empty
    Codacy->>FS: Write `sarif_empty.sarif` as single JSON block
    Codacy->>Codacy: set SARIF_FILE := sarif_empty.sarif
    Codacy-->>GH: Exit early
  else SARIF present
    Codacy-->>GH: Continue upload steps
  end
Loading
sequenceDiagram
  participant CLI as changelog_utils CLI
  participant Utils as get_project_root
  participant FS as Filesystem
  participant Git as git

  CLI->>Utils: resolve project root
  alt CHANGELOG.md exists
    Utils->>FS: return CHANGELOG.md path
    Utils-->>CLI: success
  else not found
    Utils->>Git: rev-parse --show-toplevel
    alt git returns root
      Utils-->>CLI: return git root
    else git fails
      Utils-->>CLI: raise ChangelogError("Cannot determine project root")
    end
  end
Loading
sequenceDiagram
  participant CLI as enhance_commits
  participant Parser as _process_changelog_lines
  participant Patterns as CATEGORY_PATTERNS
  participant Writer as output

  CLI->>Parser: read changelog lines
  Parser->>Patterns: categorize entries using compiled regex
  Parser->>Parser: manage section state and flush on boundaries
  Parser->>Writer: emit categorized output
  Writer-->>CLI: exit 0 or SystemExit(1) on I/O errors
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

rust

Poem

"I nibble lines of changelog hay and tidy up the trail,
I stitch a SARIF single-block so uploads won't derail.
I tune the benches, patch the grep, and color messages bright,
I plant a topology seed at dusk and dream of Euler's light.
Hop on, dear devs — the repo blooms beneath my moonlit tail." 🐇✨

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title Check ❓ Inconclusive The title uses non-specific terms and failed to highlight the main changes such as CI workflow improvements and documentation updates, making it unclear what the pull request actually does. Consider renaming the pull request to something more descriptive like “Improve CI workflows and update documentation and changelog” so readers immediately understand the primary changes.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed The description clearly outlines the key changes to CI workflows, changelog entries, and documentation and aligns with the actual modifications in the pull request.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch update/utilities-and-roadmap

📜 Recent review details

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d129fd4 and 59a53c3.

📒 Files selected for processing (7)
  • .cargo/config.toml (1 hunks)
  • CONTRIBUTING.md (7 hunks)
  • README.md (1 hunks)
  • WARP.md (3 hunks)
  • benches/README.md (2 hunks)
  • justfile (2 hunks)
  • tests/README.md (10 hunks)
✅ Files skipped from review due to trivial changes (1)
  • tests/README.md
🧰 Additional context used
🧠 Learnings (2)
📚 Learning: 2025-09-04T20:03:49.896Z
Learnt from: acgetchell
PR: acgetchell/delaunay#65
File: WARP.md:249-254
Timestamp: 2025-09-04T20:03:49.896Z
Learning: The delaunay repository contains all the specialized integration tests documented in WARP.md: circumsphere_debug_tools.rs, robust_predicates_comparison.rs, convex_hull_bowyer_watson_integration.rs, and allocation_api.rs, plus additional test files like robust_predicates_showcase.rs and coordinate_conversion_errors.rs.

Applied to files:

  • WARP.md
📚 Learning: 2025-09-02T02:40:54.439Z
Learnt from: acgetchell
PR: acgetchell/delaunay#58
File: scripts/tests/test_subprocess_utils.py:92-101
Timestamp: 2025-09-02T02:40:54.439Z
Learning: In Rust projects, cargo is expected to be available in development and CI environments, so conditional skipping of cargo-dependent tests is typically unnecessary.

Applied to files:

  • CONTRIBUTING.md
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Codacy Security Scan
  • GitHub Check: Code Coverage
  • GitHub Check: performance-regression
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: build (macos-latest)
  • GitHub Check: build (windows-latest)
🔇 Additional comments (12)
benches/README.md (1)

11-18: LGTM! Documentation updates align with Just-based workflows.

The updates correctly reflect the migration from cargo-based commands to Just-based workflows. The guidance is clear and provides both Just commands (just bench, just bench-compile) and direct cargo alternatives where appropriate.

Also applies to: 85-91

WARP.md (1)

263-274: LGTM! Consistent migration to Just-based commands.

The documentation correctly updates command references from cargo-based to Just-based workflows (e.g., just test-release, just test-debug, just examples, just bench-compile, just test-allocation, just doc-check). The updates are thorough and maintain clarity for AI assistant guidance.

Also applies to: 278-290

CONTRIBUTING.md (1)

86-140: LGTM! Comprehensive Just workflow integration.

The contributing guide has been thoroughly updated to reflect the Just-based workflow system. Key improvements include:

  • Clear command examples for testing, benchmarking, and quality checks
  • Well-organized workflow recommendations (from quick development to comprehensive validation)
  • Helpful workflow guidance with just help-workflows
  • Proper migration of performance testing commands

The documentation maintains clarity while providing both traditional cargo commands and modern Just alternatives where appropriate.

Also applies to: 348-434, 735-865

justfile (8)

7-18: LGTM! Robust GitHub Actions workflow validation.

The action-lint recipe correctly uses null-delimited file handling with git ls-files -z and proper bash array handling. This avoids issues with filenames containing spaces or special characters.


30-32: LGTM! Useful benchmark compilation check.

The bench-compile recipe provides a quick way to verify benchmarks compile without running them, which is valuable for CI validation and development iteration.


55-77: LGTM! Well-structured CI simulation workflows.

The modular CI-related recipes (ci, ci-baseline, commit-check) provide clear, composable workflows:

  • ci combines quality checks, release tests, and benchmark compilation
  • ci-baseline adds performance baseline generation
  • commit-check provides the most comprehensive pre-commit validation

The dependency chains are logical and the echo messages provide helpful feedback.


101-136: LGTM! Comprehensive workflow documentation.

The help-workflows recipe provides excellent documentation of available commands, organized into logical categories:

  • Common workflows (dev, quality, ci, commit-check)
  • Testing options
  • Quality check groups
  • Benchmark system
  • Performance analysis

This makes the Just-based workflow system discoverable and user-friendly.


138-148: LGTM! Modular linting organization.

The hierarchical lint recipes (lint-code, lint-docs, lint-config, lint) provide excellent composability. This addresses the previous review comment about improving readability through grouping, while allowing users to run specific lint categories or all lints comprehensively.


164-203: LGTM! Comprehensive performance analysis framework.

The performance analysis recipes (perf-baseline, perf-check, perf-compare, perf-help) provide a well-designed framework:

  • Optional tagging for baselines
  • Configurable regression thresholds
  • Comparison against specific baseline files
  • Helpful documentation via perf-help

The baseline-missing check in perf-check provides clear user guidance.


252-274: LGTM! Robust spell-check implementation.

The spell-check recipe correctly handles:

  • Null-delimited git status output via -z flag
  • Filenames with spaces through proper regex parsing
  • Rename operations by extracting the destination filename
  • Empty file list with appropriate messaging

This implementation addresses the concerns raised in previous reviews about handling filenames with spaces and renames.


237-250: LGTM! Consistent null-delimited file handling.

The shell-lint and validation recipes (validate-json, validate-toml) all use consistent null-delimited file handling patterns:

  • git ls-files -z for null-separated output
  • while IFS= read -r -d '' file for safe parsing
  • Array accumulation and null-delimited piping to xargs

This ensures proper handling of filenames with spaces and special characters throughout the justfile. The removal of GNU-specific -r flag from xargs makes these recipes portable across BSD/macOS systems.

Also applies to: 296-320

README.md (1)

74-79: LGTM! Clear workflow documentation for users.

The expanded Just workflows section provides explicit, positive descriptions of available commands:

  • Clear hierarchy from quick development to comprehensive validation
  • Explicit mentions of quality, ci, commit-check, and lint commands
  • Discoverability via just --list and just help-workflows

This aligns perfectly with the justfile changes and makes the workflow system accessible to new contributors.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull Request Overview

This pull request improves CI workflows and updates project documentation with a focus on better error handling, code consistency, and enhanced testing coverage. The changes include refactoring SARIF file generation, improving environment variable handling, updating changelog generation scripts, reorganizing justfile commands, adding comprehensive topology documentation, and updating spell-check dictionaries.

  • Enhanced CI reliability through improved SARIF creation and environment variable handling
  • Refactored test scripts to use compiled regex patterns and improved error handling
  • Added comprehensive topology integration design documentation
  • Reorganized justfile with better command structure and help system

Reviewed Changes

Copilot reviewed 11 out of 11 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
.github/workflows/codacy.yml Improved SARIF file generation with more robust block syntax
.github/workflows/profiling-benchmarks.yml Enhanced environment variable quoting and benchmark command handling
scripts/tests/test_enhance_commits.py Refactored to use compiled regex patterns and improved test structure
scripts/tests/test_changelog_utils.py Enhanced test coverage for git repository fallback scenarios
scripts/enhance_commits.py Major refactoring with type hints, compiled patterns, and better function organization
scripts/changelog_utils.py Improved error handling, git repository detection, and color output formatting
justfile Complete reorganization with better command structure and comprehensive help system
docs/topology.md New comprehensive design document for topology integration
cspell.json Updated spell-check dictionary with alphabetical organization
REFERENCES.md Added new academic references for computational geometry
CHANGELOG.md Updated with new changelog entries

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.


# Precompiled regex patterns for performance
COMMIT_BULLET_RE = re.compile(r"^\s*[-*]\s*\*\*")
COMMIT_BULLET_RE = re.compile(r"^\s*[-*]\s+")
Copy link

Copilot AI Oct 11, 2025

Choose a reason for hiding this comment

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

The regex pattern has been simplified from checking bold formatting to just bullet format. This is a significant behavior change that should be well-documented, as it affects how commit entries are parsed.

Suggested change
COMMIT_BULLET_RE = re.compile(r"^\s*[-*]\s+")
COMMIT_BULLET_RE = re.compile(r"^\s*[-*]\s+(?:\*\*.*?\*\*\s*)?")

Copilot uses AI. Check for mistakes.
Comment on lines +232 to +234
# Add blank line after each entry except the last one in the section
if i < len(entries) - 1:
output_lines.append("")
Copy link

Copilot AI Oct 11, 2025

Choose a reason for hiding this comment

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

[nitpick] This logic adds blank lines between entries within sections. Consider extracting this formatting logic into a separate function to improve readability and make the spacing behavior more explicit.

Copilot uses AI. Check for mistakes.
Comment on lines +1042 to +1046
fallback = "https://github.com/acgetchell/delaunay" # Delaunay-specific fallback
print(
f"Warning: Could not detect repository URL, using fallback: {fallback}",
file=sys.stderr,
)
Copy link

Copilot AI Oct 11, 2025

Choose a reason for hiding this comment

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

[nitpick] The hardcoded fallback URL makes this utility specific to the Delaunay project. Consider making this configurable or removing the fallback to make the utility more generic.

Copilot uses AI. Check for mistakes.
Comment thread justfile Outdated
uv run ruff format scripts/

# Comprehensive quality check
quality: fmt clippy doc-check python-lint shell-lint markdown-lint spell-check validate-json validate-toml action-lint
Copy link

Copilot AI Oct 11, 2025

Choose a reason for hiding this comment

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

[nitpick] The quality recipe has a very long dependency list. Consider grouping related checks into intermediate recipes (e.g., 'lint-code', 'lint-docs') to improve readability and maintainability.

Suggested change
quality: fmt clippy doc-check python-lint shell-lint markdown-lint spell-check validate-json validate-toml action-lint
lint-code: fmt clippy python-lint shell-lint
lint-docs: doc-check markdown-lint spell-check
lint-config: validate-json validate-toml action-lint
quality: lint-code lint-docs lint-config

Copilot uses AI. Check for mistakes.
@coderabbitai coderabbitai bot added the documentation Improvements or additions to documentation label Oct 11, 2025
@codacy-production
Copy link
Copy Markdown

codacy-production bot commented Oct 11, 2025

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
+0.03% (target: -1.00%)
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (ef8c98d) 3598 2583 71.79%
Head commit (db33dfb) 3598 (+0) 2584 (+1) 71.82% (+0.03%)

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#100) 0 0 ∅ (not applicable)

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

See your quality gate settings    Change summary preferences

@codecov
Copy link
Copy Markdown

codecov bot commented Oct 11, 2025

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 71.80%. Comparing base (ef8c98d) to head (db33dfb).
⚠️ Report is 1 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff             @@
##             main     #100      +/-   ##
==========================================
+ Coverage   71.77%   71.80%   +0.02%     
==========================================
  Files          18       18              
  Lines        3596     3596              
==========================================
+ Hits         2581     2582       +1     
+ Misses       1015     1014       -1     
Flag Coverage Δ
unittests 71.80% <ø> (+0.02%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@acgetchell
Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Oct 11, 2025

✅ Actions performed

Full review triggered.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (13)
docs/topology.md (3)

215-228: Unify Euler characteristic semantics (solid vs boundary) — current doc is inconsistent

  • calculate_3d uses χ = V − E + F − C (solid), so a single tetrahedron yields 1.
  • PlanarTopology.expected_euler_characteristic returns 2 for D=3 (boundary), and the test asserts 2.
  • Choose one: either compute solid χ (recommended here) or boundary χ everywhere. Below patches align to solid χ=1 for convex D-polytopes.

Apply these edits:

@@
 impl<T, U, V, const D: usize> TopologicalSpace<T, U, V, D> for PlanarTopology
@@
-    fn expected_euler_characteristic(&self) -> i64 {
-        match D {
-            2 => 1, // Planar graph with outer face: χ = 2 - 1 = 1
-            3 => 2, // 3D convex polytope: χ = 2 (by Euler's polyhedron formula)
-            4 => 0, // 4D convex polytope: χ = 2 - 2 = 0
-            _ => self.calculate_expected_for_dimension(D),
-        }
-    }
+    fn expected_euler_characteristic(&self) -> i64 {
+        // For solid, contractible D-dimensional triangulations (balls): χ = 1 for all D ≥ 1
+        1
+    }
@@
-    #[test] 
-    fn test_3d_tetrahedron_euler_characteristic() {
-        // Single tetrahedron: V=4, E=6, F=4, C=1 → χ = 4-6+4-1 = 1
-        // Wait, this should be χ = 2 for a convex 3D polytope
-        // Let me recalculate: for boundary of tetrahedron χ = 2
+    #[test] 
+    fn test_3d_tetrahedron_euler_characteristic() {
+        // Single tetrahedron (solid): V=4, E=6, F=4, C=1 → χ = 4-6+4-1 = 1
@@
-        assert_eq!(euler, 2);
+        assert_eq!(euler, 1);
     }

Also applies to: 284-291, 622-637


332-336: Formula/comment mismatch; align with chosen χ semantics

Comment says “This gives: 2D→1, 3D→2, 4D→1, 5D→2” but code computes 1 + (−1)^d (which yields even→2, odd→0). If adopting solid χ=1, simplify.

-    /// Using the general formula for convex polytopes
-    fn calculate_expected_for_dimension(&self, d: usize) -> i64 {
-        // For convex d-polytopes: χ = 1 + (-1)^d
-        // This gives: 2D→1, 3D→2, 4D→1, 5D→2, etc.
-        1 + if d % 2 == 0 { -1 } else { 1 }
-    }
+    /// Using the general property of convex D-dimensional solids (contractible)
+    fn calculate_expected_for_dimension(&self, _d: usize) -> i64 {
+        // For convex solids: χ = 1 in all dimensions
+        1
+    }

109-135: TopologyError not in scope in trait snippet

validate_topology returns TopologyError, but it isn’t imported in this file snippet.

Add an explicit import to make the snippet compile standalone:

 use crate::core::{triangulation_data_structure::Tds, traits::DataType};
 use crate::geometry::traits::coordinate::CoordinateScalar;
+use super::TopologyError;
scripts/tests/test_enhance_commits.py (1)

52-56: Prefer isinstance(pattern, re.Pattern) over hasattr checks

Cleaner and stricter type check for compiled regex.

+import re
@@
-            # Verify patterns are compiled regex objects
-            for pattern in patterns[category]:
-                assert hasattr(pattern, "search")  # Check it's a compiled regex
-                assert hasattr(pattern, "pattern")  # Has pattern attribute
+            # Verify patterns are compiled regex objects
+            for pattern in patterns[category]:
+                assert isinstance(pattern, re.Pattern)
scripts/tests/test_changelog_utils.py (1)

209-216: Good expansion of failure-path coverage

Patching _run_git_command alongside find_changelog_path validates the combined failure scenario. Consider autospec for tighter patching.

-@patch("changelog_utils._run_git_command")
+@patch("changelog_utils._run_git_command", autospec=True)
scripts/changelog_utils.py (5)

34-38: Make ANSI colors conditional (TTY/NO_COLOR).

Great centralization. Consider disabling colors when not a TTY or when NO_COLOR is set; enable on Windows via colorama if needed.

Example:

+# Honor NO_COLOR and TTY
+USE_COLOR = sys.stdout.isatty() and os.environ.get("NO_COLOR") is None
-COLOR_GREEN = "\033[0;32m"
-COLOR_BLUE = "\033[0;34m"
-COLOR_YELLOW = "\033[1;33m"
-COLOR_RESET = "\033[0m"
+COLOR_GREEN = "\033[0;32m" if USE_COLOR else ""
+COLOR_BLUE = "\033[0;34m" if USE_COLOR else ""
+COLOR_YELLOW = "\033[1;33m" if USE_COLOR else ""
+COLOR_RESET = "\033[0m" if USE_COLOR else ""

298-312: Project root fallback: prefer wrapper and env hint.

Logic is fine. Two tweaks:

  • Use your run_git wrapper for consistency/structured errors.
  • If git root unavailable, try $GITHUB_WORKSPACE or $GITHUB_REPOSITORY before failing.

Example:

-            try:
-                result = _run_git_command(["rev-parse", "--show-toplevel"])
-                git_root = Path(result.stdout.strip())
+            try:
+                stdout, code = ChangelogUtils.run_git_command(["rev-parse", "--show-toplevel"], check=False)
+                git_root = Path(stdout.strip()) if code == 0 else None
                 if git_root.exists():
                     return str(git_root)
-                msg = "Git root directory does not exist"
+                # CI hint
+                if os.getenv("GITHUB_WORKSPACE"):
+                    return os.getenv("GITHUB_WORKSPACE")
+                msg = "Git root directory does not exist"
                 raise ChangelogError(msg)

458-461: Hoist trailer regex to module scope.

Avoid recompiling on each call; precompile once.

+TRAILER_RE = re.compile(
+    r"^\s*(Co-authored-by|Signed-off-by|Change-Id|Reviewed-on|Reviewed-by|Refs|See-Also):",
+    re.I,
+)
 ...
-        trailer_re = re.compile(
-            r"^\s*(Co-authored-by|Signed-off-by|Change-Id|Reviewed-on|Reviewed-by|Refs|See-Also):",
-            re.I,
-        )
         for line in lines[1:]:
-            if trailer_re.match(line):
+            if TRAILER_RE.match(line):
                 continue

730-739: Stdout/stderr consistency for existing-tag warning/instructions.

All warning lines go to stderr except the delete command. Keep them together on stderr.

-                    print(f"  git tag -d {tag_version}", file=sys.stderr)
-                    raise ChangelogError(f"Tag '{tag_version}' already exists")
-                print(f"{COLOR_BLUE}Deleting existing tag '{tag_version}'...{COLOR_RESET}")
+                    print(f"  git tag -d {tag_version}", file=sys.stderr)
+                    raise ChangelogError(f"Tag '{tag_version}' already exists")
+                print(f"{COLOR_BLUE}Deleting existing tag '{tag_version}'...{COLOR_RESET}")

Note: only the first print needed file=sys.stderr; “Deleting…” can remain stdout.


1038-1048: Use GITHUB_REPOSITORY for fallback repo URL.

Prefer env-provided slug in CI before a hardcoded repo.

-    except GitRepoError:
-        fallback = "https://github.com/acgetchell/delaunay"  # Delaunay-specific fallback
+    except GitRepoError:
+        repo_slug = os.getenv("GITHUB_REPOSITORY")
+        fallback = f"https://github.com/{repo_slug}" if repo_slug else "https://github.com/acgetchell/delaunay"
         print(
             f"Warning: Could not detect repository URL, using fallback: {fallback}",
             file=sys.stderr,
         )
         return fallback
scripts/enhance_commits.py (3)

29-177: Pattern set refactor looks solid; consider grouping and comments for ambiguity.

Good structure and precompilation. Consider brief comments or tests for ambiguous phrases (e.g., “enable/disable support” vs “remove support”) to avoid misclassification.


194-213: Deterministic category precedence is good; expose the order for tests.

You hard-code order inside the function. Consider a module-level CATEGORY_ORDER to use here and in tests for clarity.

+CATEGORY_ORDER = ["added", "removed", "fixed", "changed", "deprecated", "security"]
 ...
-    return next(
+    return next(
         (
             category
-            for category in [
-                "added",
-                "removed",
-                "fixed",
-                "changed",
-                "deprecated",
-                "security",
-            ]
+            for category in CATEGORY_ORDER
             if any(pattern.search(title_text) for pattern in patterns.get(category, []))
         ),
         "changed",
     )

454-487: Robust I/O with clear errors — LGTM.

Good stderr usage and exit codes. Consider printing a one-line success message on completion for parity with other scripts (optional).

📜 Review details

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ef8c98d and 96871dd.

📒 Files selected for processing (11)
  • .github/workflows/codacy.yml (1 hunks)
  • .github/workflows/profiling-benchmarks.yml (2 hunks)
  • CHANGELOG.md (27 hunks)
  • REFERENCES.md (3 hunks)
  • cspell.json (4 hunks)
  • docs/topology.md (1 hunks)
  • justfile (2 hunks)
  • scripts/changelog_utils.py (14 hunks)
  • scripts/enhance_commits.py (11 hunks)
  • scripts/tests/test_changelog_utils.py (1 hunks)
  • scripts/tests/test_enhance_commits.py (13 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
scripts/*.py

⚙️ CodeRabbit configuration file

scripts/*.py: These are Python utility scripts for changelog and commit processing.
Focus on code quality, maintainability, and adherence to Python best practices.
The scripts use ruff for comprehensive linting and formatting (pylint has been retired).

Files:

  • scripts/changelog_utils.py
  • scripts/enhance_commits.py
🧬 Code graph analysis (4)
scripts/changelog_utils.py (1)
scripts/subprocess_utils.py (1)
  • run_safe_command (140-164)
scripts/tests/test_changelog_utils.py (1)
scripts/changelog_utils.py (1)
  • ChangelogNotFoundError (45-46)
scripts/enhance_commits.py (3)
scripts/changelog_utils.py (1)
  • main (825-858)
scripts/benchmark_utils.py (1)
  • main (2438-2453)
scripts/hardware_utils.py (1)
  • main (578-625)
scripts/tests/test_enhance_commits.py (1)
scripts/enhance_commits.py (1)
  • main (454-486)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Codacy Security Scan
  • GitHub Check: build (windows-latest)
  • GitHub Check: build (ubuntu-latest)
  • GitHub Check: Code Coverage
🔇 Additional comments (7)
scripts/tests/test_enhance_commits.py (4)

17-29: Importing CATEGORY_PATTERNS looks correct

Tests now align with the new exported constant. No issues.


803-808: Loosening COMMIT_BULLET_RE to allow non-bold bullets is reasonable

Matches real-world bullets without bold formatting; downstream parsing handles titles separately. Looks good.


635-642: Parenthesized multi-context with requires Python 3.10+

The syntax with (ctx1, ctx2, ...) is Python 3.10+. Ensure CI/runtime is ≥3.10 or refactor to nested with or ExitStack.

If 3.9 support is needed, refactor:

  • Use nested with blocks, or
  • Use contextlib.ExitStack() to enter multiple contexts.

903-905: zip(..., strict=False) requires Python 3.10+

Confirm supported Python version. For 3.9 compatibility, drop strict or guard via sys.version_info.

scripts/enhance_commits.py (2)

179-192: Title extraction fallback is reasonable; add link/title edge-case test.

Lowercasing + bold extraction then regex fallback looks fine. Add a test for entries lacking bold and containing both PR and SHA to ensure correct title pick.


318-341: Header processing preserves MPRs and flushes pending entries — nice.

Flow correctly flushes categorized entries before “Merged Pull Requests.” Ensure tests cover transitions: Changes → MPRs → other section, and no duplicate blank lines around headers.

scripts/changelog_utils.py (1)

156-166: SemVer regex enforces ‘v’ prefix; verify all tag/release commands emit v-prefixed versions. Check CI pipelines, GitHub Actions, and custom scripts (e.g., git tag, gh release create) for non-v tags.

Comment thread docs/topology.md
Comment on lines +193 to +199
match D {
2 => Self::calculate_2d(tds),
3 => Self::calculate_3d(tds),
4 => Self::calculate_4d(tds),
_ => Self::calculate_generic(tds),
}
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

calculate_4d referenced but not defined

Match arm calls Self::calculate_4d(tds) but no such function exists in the snippet.

Quick fix: route 4D to generic until a 4D-optimized path exists.

@@
-            4 => Self::calculate_4d(tds),
+            4 => Self::calculate_generic(tds),
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
match D {
2 => Self::calculate_2d(tds),
3 => Self::calculate_3d(tds),
4 => Self::calculate_4d(tds),
_ => Self::calculate_generic(tds),
}
}
match D {
2 => Self::calculate_2d(tds),
3 => Self::calculate_3d(tds),
4 => Self::calculate_generic(tds),
_ => Self::calculate_generic(tds),
}
}
🤖 Prompt for AI Agents
In docs/topology.md around lines 193 to 199, the match arm references
Self::calculate_4d(tds) which is not defined; replace that arm so the 4 case
delegates to the generic implementation (e.g., change the 4 =>
Self::calculate_4d(tds) arm to 4 => Self::calculate_generic(tds)) so the code
compiles and 4D falls back to the generic path until a 4D-optimized function is
implemented.

Comment thread docs/topology.md
Comment on lines +940 to +945
<citations>
<document>
<document_type>RULE</document_type>
<document_id>/Users/adam/projects/delaunay/WARP.md</document_id>
</document>
</citations>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Leaked absolute local path in citations

The citation references a user-specific absolute path (/Users/adam/...). This shouldn’t be in versioned docs.

  • Remove the citations block or replace with a repository-relative path.
🤖 Prompt for AI Agents
In docs/topology.md around lines 940 to 945 there's a leaked absolute user path
(/Users/adam/projects/delaunay/WARP.md) inside the <citations> block; remove
that block or replace document_id with a repository-relative path (for example
docs/WARP.md or ./WARP.md), update any references that expect the old path, and
run a quick grep to ensure no other absolute user paths remain before committing
with a descriptive message like "Remove absolute local path from citations in
topology.md".

Comment thread justfile Outdated
Comment thread justfile
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

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

⚠️ Outside diff range comments (1)
scripts/enhance_commits.py (1)

275-280: Flush categorized entries before leaving Changes/Fixed sections
When a new section header (e.g. “### Deprecated”) appears immediately after collecting entries in the “Changes”/“Fixed Issues” sections, _handle_section_header_processing just updates section_state and skips output. Because we only flush categorize_entries_list inside _handle_section_header_processing for the “merged_prs” case (and otherwise rely on _handle_release_end), the newly encountered header lands in the output without the pending entries ever being written. Please flush (and clear) categorize_entries_list for every recognized header transition that exits the Changes/Fixed buckets before updating section_state, so categorized sections don’t silently disappear.

📜 Review details

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ef8c98d and 96871dd.

📒 Files selected for processing (11)
  • .github/workflows/codacy.yml (1 hunks)
  • .github/workflows/profiling-benchmarks.yml (2 hunks)
  • CHANGELOG.md (27 hunks)
  • REFERENCES.md (3 hunks)
  • cspell.json (4 hunks)
  • docs/topology.md (1 hunks)
  • justfile (2 hunks)
  • scripts/changelog_utils.py (14 hunks)
  • scripts/enhance_commits.py (11 hunks)
  • scripts/tests/test_changelog_utils.py (1 hunks)
  • scripts/tests/test_enhance_commits.py (13 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
scripts/*.py

⚙️ CodeRabbit configuration file

scripts/*.py: These are Python utility scripts for changelog and commit processing.
Focus on code quality, maintainability, and adherence to Python best practices.
The scripts use ruff for comprehensive linting and formatting (pylint has been retired).

Files:

  • scripts/changelog_utils.py
  • scripts/enhance_commits.py
🧠 Learnings (1)
📚 Learning: 2025-09-02T20:32:05.985Z
Learnt from: acgetchell
PR: acgetchell/delaunay#60
File: cspell.json:103-103
Timestamp: 2025-09-02T20:32:05.985Z
Learning: In cspell.json for the delaunay project, the word "itional" is intentionally added to the dictionary because it comes from a regex pattern, not a typo.

Applied to files:

  • cspell.json
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Codacy Static Code Analysis

Comment thread docs/topology.md
Comment on lines +286 to +336
2 => 1, // Planar graph with outer face: χ = 2 - 1 = 1
3 => 2, // 3D convex polytope: χ = 2 (by Euler's polyhedron formula)
4 => 0, // 4D convex polytope: χ = 2 - 2 = 0
_ => self.calculate_expected_for_dimension(D),
}
}

fn validate_topology(&self, tds: &Tds<T, U, V, D>) -> Result<(), TopologyError> {
// Check if this topology supports the given dimension
if !self.supports_dimension(D) {
return Err(TopologyError::UnsupportedDimension {
topology: self.topology_name().to_string(),
dimension: D
});
}

// Calculate actual Euler characteristic
let calculated = EulerCharacteristic::calculate(tds);
let expected = self.expected_euler_characteristic();

if calculated == expected {
Ok(())
} else {
Err(TopologyError::EulerCharacteristicMismatch {
expected,
calculated
})
}
}

fn genus(&self) -> Option<u64> {
Some(0) // Planar topology has genus 0
}

fn supports_dimension(&self, dimension: usize) -> bool {
dimension >= 2 && dimension <= 10 // Practical limitation
}

fn topology_name(&self) -> &'static str {
"Planar"
}
}

impl PlanarTopology {
/// Calculate expected Euler characteristic for arbitrary dimension
/// Using the general formula for convex polytopes
fn calculate_expected_for_dimension(&self, d: usize) -> i64 {
// For convex d-polytopes: χ = 1 + (-1)^d
// This gives: 2D→1, 3D→2, 4D→1, 5D→2, etc.
1 + if d % 2 == 0 { -1 } else { 1 }
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Correct the Euler characteristic references

Two problems here will mislead the implementation:

  • Line 287 asserts χ = 2 for a 3D convex polytope, but a tetrahedron (and any convex 3-ball) has χ = 1. Using 2 will make the validation reject every valid 3D triangulation.
  • Lines 333‑335 claim the helper yields “4D→1”, yet the code 1 + if d % 2 == 0 { -1 } else { 1 } returns 0 when d is even (including 4), so the narrative contradicts the formula.

Please correct the stated invariants and align the explanatory text with the actual formula before these specs guide any code.

🤖 Prompt for AI Agents
In docs/topology.md around lines 286–336, the Euler characteristic references
are inconsistent and incorrect: change the 3D case comment/value to χ = 1 (a
convex 3‑ball/tetrahedron has χ=1), and replace the misleading formula and
explanatory text in calculate_expected_for_dimension so it and the examples are
consistent with the correct invariant for convex d‑polytopes (which is χ = 1 for
the solid d‑ball) — update the mapping comments (2→1, 3→1, 4→1, etc.) and the
helper’s documentation to state it returns 1 for any d (or alternatively make
the code/commentry consistent if you intend a different mathematical
convention), ensuring comments and implementation match exactly.

Comment thread justfile
Enhances the robustness of several utility scripts by ensuring they
gracefully handle cases where no files are found. This prevents errors
and improves the overall user experience.

Updates tooling to explicitly track file renames in spell check,
ensuring proper file handling.

Refs: update/utilities-and-roadmap
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (2)
scripts/enhance_commits.py (1)

22-22: Pattern simplification already noted.

The regex pattern simplification was already flagged in previous reviews as a significant behavior change.

justfile (1)

191-192: Consider grouping related checks into intermediate recipes.

The quality recipe has a long dependency list. Grouping related checks (e.g., lint-code: fmt clippy doc-check, lint-docs: markdown-lint spell-check, lint-config: validate-json validate-toml action-lint) would improve readability and make it easier to run subsets of checks during development.

🧹 Nitpick comments (3)
scripts/enhance_commits.py (3)

29-177: Consider externalizing pattern definitions.

The inline pattern dictionary spans 150+ lines and could become difficult to maintain as categories grow. Moving patterns to a JSON/YAML configuration file would improve readability and make additions/modifications easier without touching the code.

Example structure in category_patterns.json:

{
  "added": [
    "\\badd\\b(?!itional)",
    "\\badds\\b",
    ...
  ],
  ...
}

Then load and compile at module initialization:

import json

def _load_patterns() -> dict[str, list[Pattern[str]]]:
    """Load and compile category patterns from config file."""
    config_path = SCRIPT_DIR / "category_patterns.json"
    with config_path.open() as f:
        pattern_strings = json.load(f)
    return {
        category: [re.compile(pattern) for pattern in patterns]
        for category, patterns in pattern_strings.items()
    }

CATEGORY_PATTERNS = _load_patterns()

229-234: Blank line logic is clear as-is.

While the previous review suggested extracting the blank line formatting logic, the current implementation is straightforward and localized within _add_section_with_entries. The inline comments clearly document the spacing behavior.

Extraction would only be beneficial if this formatting logic needs to be reused elsewhere or becomes more complex.


472-492: Improved error handling.

The enhanced error handling with explicit file existence checks and clear error messages is a solid improvement. The use of Path objects and proper encoding specification follows best practices.

Optionally, you could catch more specific exceptions for better error diagnosis:

-    except OSError as error:
-        print(f"Error: {error}", file=sys.stderr)
-        sys.exit(1)
+    except FileNotFoundError:
+        print(f"Error: Input file '{input_file}' not found", file=sys.stderr)
+        sys.exit(1)
+    except PermissionError as error:
+        print(f"Error: Permission denied - {error}", file=sys.stderr)
+        sys.exit(1)
+    except OSError as error:
+        print(f"Error: {error}", file=sys.stderr)
+        sys.exit(1)
📜 Review details

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 96871dd and d129fd4.

📒 Files selected for processing (3)
  • cspell.json (4 hunks)
  • justfile (2 hunks)
  • scripts/enhance_commits.py (11 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
scripts/*.py

⚙️ CodeRabbit configuration file

scripts/*.py: These are Python utility scripts for changelog and commit processing.
Focus on code quality, maintainability, and adherence to Python best practices.
The scripts use ruff for comprehensive linting and formatting (pylint has been retired).

Files:

  • scripts/enhance_commits.py
🧠 Learnings (1)
📚 Learning: 2025-09-02T20:32:05.985Z
Learnt from: acgetchell
PR: acgetchell/delaunay#60
File: cspell.json:103-103
Timestamp: 2025-09-02T20:32:05.985Z
Learning: In cspell.json for the delaunay project, the word "itional" is intentionally added to the dictionary because it comes from a regex pattern, not a typo.

Applied to files:

  • cspell.json
🧬 Code graph analysis (1)
scripts/enhance_commits.py (1)
scripts/changelog_utils.py (1)
  • main (825-858)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Codacy Security Scan
  • GitHub Check: build (windows-latest)
  • GitHub Check: Code Coverage
🔇 Additional comments (8)
scripts/enhance_commits.py (2)

10-12: LGTM!

Modern type hints improve static analysis and code clarity.


318-396: LGTM!

The extraction of section processing logic into dedicated helper functions improves modularity and testability. The functions have clear responsibilities and the parameter passing is well-designed.

justfile (6)

7-18: LGTM! macOS portability issue resolved.

The recipe correctly avoids the GNU-only xargs -r flag by explicitly checking the file array length before invoking xargs -0. This pattern is now portable across macOS/BSD and GNU systems.


131-142: LGTM!

Same portable pattern as action-lint: NUL-delimited file handling without the problematic xargs -r flag.


217-230: LGTM!

Portable file handling, and the note on Line 230 correctly explains why justfiles are excluded from shellcheck.


233-254: LGTM! Major improvement over previous implementation.

The recipe now correctly handles filenames with spaces and renames by:

  • Using git status --porcelain -z for NUL-delimited output
  • Parsing with a regex instead of brittle awk field splitting
  • Extracting new filenames from rename entries

This addresses the major correctness gap flagged in previous reviews. The only edge case is filenames containing the literal string ->, which would confuse the rename detection, but such filenames are rare enough that this is an acceptable tradeoff.


277-288: LGTM!

Portable file handling and jq empty is a clean approach for JSON validation.


290-301: LGTM!

Portable file handling and tomllib validation is appropriate. The open() call without explicit closing is fine here since each validation runs in a separate Python process that exits immediately.

Migrates from `cargo alias` commands to `just` for improved
workflow management and consistency across development tasks.

Updates documentation and examples to use `just` commands,
simplifying common operations and enhancing the developer
experience.  Removes the `.cargo/config.toml` alias definitions.
Refs: update/utilities-and-roadmap
@coderabbitai coderabbitai bot added the rust Pull requests that update rust code label Oct 11, 2025
Increases the performance regression threshold from 5% to 7.5%
to account for increased variability observed in the CI environment.
This reduces false positive regression alerts.

Refs: update/utilities-and-roadmap
@acgetchell acgetchell merged commit 353a46e into main Oct 11, 2025
10 of 11 checks passed
@acgetchell acgetchell deleted the update/utilities-and-roadmap branch October 11, 2025 20:09
acgetchell added a commit that referenced this pull request Oct 11, 2025
Replaces the fxhash hashing algorithm with rustc-hash.

rustc-hash provides improved performance characteristics for the
delaunay triangulation algorithm, leading to faster overall execution.

Refs: #100
acgetchell added a commit that referenced this pull request Oct 11, 2025
* Changed: Replaces fxhash with rustc-hash for performance

Replaces the `fxhash` crate with `rustc-hash` for improved
performance in hash-based collections. This change enhances the
speed of internal data structures by utilizing a faster hashing
algorithm.

Adds detailed logging for performance comparisons to better
understand benchmark results and potential regressions.

* Changed: Replaces fxhash with rustc-hash for performance

Replaces the fxhash hashing algorithm with rustc-hash.

rustc-hash provides improved performance characteristics for the
delaunay triangulation algorithm, leading to faster overall execution.

Refs: #100
@coderabbitai coderabbitai bot mentioned this pull request Oct 22, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation rust Pull requests that update rust code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants