# Changelog - 0.5.x

## [0.5.4] - 2025-11-25

### Merged Pull Requests

- Release v0.5.4 [#131](https://github.com/acgetchell/delaunay/pull/131)
- Bump taiki-e/install-action from 2.62.54 to 2.62.56 [#130](https://github.com/acgetchell/delaunay/pull/130)
- Bump actions/checkout from 5.0.0 to 6.0.0 [#129](https://github.com/acgetchell/delaunay/pull/129)
- Bump astral-sh/setup-uv from 7.1.2 to 7.1.4 [#128](https://github.com/acgetchell/delaunay/pull/128)
- Perf/reduce-heap-allocations [#127](https://github.com/acgetchell/delaunay/pull/127)
- Add stack-allocated SmallBuffer types for D+1 operations [#126](https://github.com/acgetchell/delaunay/pull/126)
- Fix remove_vertex topology consistency and test failures [#124](https://github.com/acgetchell/delaunay/pull/124)
- Refactor/jaccard [#123](https://github.com/acgetchell/delaunay/pull/123)
- Migrate to nalgebra and add adaptive tolerance [#122](https://github.com/acgetchell/delaunay/pull/122)
- Test/improve coverage [#119](https://github.com/acgetchell/delaunay/pull/119)

### Added

- Migrate to nalgebra and add adaptive tolerance [#122](https://github.com/acgetchell/delaunay/pull/122)
  [`1baa1ee`](https://github.com/acgetchell/delaunay/commit/1baa1ee01a4b04d99439a53a81f411cbbcab2910)

  •  Replace peroxide with nalgebra for matrix ops; introduce Matrix alias
    (na::DMatrix<f64>), update determinant/inverse calls
  •  Add matrix::adaptive_tolerance() that excludes an all-ones last column
    for ∞-norm scaling; apply to orientation/insphere (incl. lifted) and
    add fast path when test point equals a simplex vertex
  •  Update predicates, robust_predicates, util, and debug tools to use the
    new matrix utilities
  •  Derive thiserror::Error for core/geometry error types; remove manual
    Error impls and simplify error handling
  •  Remove peroxide from Cargo.toml; update Cargo.lock
  •  Docs: expand numerical robustness guide (adaptive tolerance details and
    sign conventions) and wrap long lines to satisfy markdownlint (MD013)
  •  Tests: add proptest regression corpus and update affected tests

### Changed

- Test/improve coverage [#119](https://github.com/acgetchell/delaunay/pull/119)
  [`936fc8c`](https://github.com/acgetchell/delaunay/commit/936fc8ce49cd712e35f9a0026166c8e293ba4d9f)
- Increase tarpaulin timeout for 5D integration tests [`8755071`](https://github.com/acgetchell/delaunay/commit/87550712a8a5595b76beb85c92e40f99d850dbf3)

Increases the tarpaulin timeout to 240 seconds. This is done to
  accommodate the longer execution times of the 5D integration tests,
  preventing premature termination of the code coverage analysis.

- Updates dependencies and reduces test samples [`318990a`](https://github.com/acgetchell/delaunay/commit/318990a72d38bdb8e4a83589a45ef7b99b768510)

Updates `derive_builder` and `pastey` dependencies to their
  latest versions. Reduces the sample size in one integration
  test to improve coverage run times. (Internal change)

- Skips 5D tests in CI, adds attributes to tests [`ed4b714`](https://github.com/acgetchell/delaunay/commit/ed4b71438a7f5a9b7928a4be030e2304cffec70b)

Changes the 5D tests to be skipped during continuous integration
  due to their long runtime. Adds attributes to the integration tests
  via macro to allow for skipping.

- Refactor/jaccard [#123](https://github.com/acgetchell/delaunay/pull/123)
  [`9eaa225`](https://github.com/acgetchell/delaunay/commit/9eaa22539e605761a0694e1b7c66be0231708f1d)

### Documentation

- Update CHANGELOG.md [`b6825e9`](https://github.com/acgetchell/delaunay/commit/b6825e99bb48799571aa107c9c8e8585c2fc2d5a)

### Fixed

- Fix remove_vertex topology consistency and test failures [#124](https://github.com/acgetchell/delaunay/pull/124)
  [`da473c8`](https://github.com/acgetchell/delaunay/commit/da473c8c66557b18217ddb45520127dee49bae49)

  This commit addresses three critical issues:

  1. **Fix remove_vertex to maintain topology consistency**

  - Added logic to clear dangling neighbor references in remaining cells
  - Prevents triangulation corruption when removing vertices
  - Added 3 comprehensive unit tests for remove_vertex functionality
  - Fixes failing doctest at triangulation_data_structure.rs:1784

  2. **Fix proptest quality metric failures**

  - Changed cell comparison from key-order to UUID-based matching
  - Translation/scaling operations can reorder cells in Delaunay triangulation
  - Tests now match cells by their vertex UUIDs instead of assuming same order
  - Fixes prop_normalized_volume and prop_radius_ratio tests in 4D/5D

  3. **Fix convex hull integration test**

  - Updated test_convex_hull_cache_during_construction with proper hull vertices
  - Previous vertices were all interior, causing "No boundary facets" error

  Additional improvements:

  - Improve rollback functionality for missed inserts
  - RobustBowyerWatson now enforces Delaunay property post-insertion
  - Improved duplicate coordinate detection in insertion algorithms
  - Archive completed invariant_validation_plan.md documentation
  - Remove proptest regression files for cleaner repo state

  **Fixed: Fix Delaunay violations in cavity-based insertion**

  Fixes a critical bug where the Bowyer-Watson insertion algorithm was
  creating triangulations with violations of the empty circumsphere
  property. The issue manifested in proptest failures and affected
  approximately 1.35% of test cases.

  Root cause: The `determine_strategy_default` method used a faulty
  heuristic for single-cell triangulations, assuming all vertices were
  exterior without proper geometric validation.

- Handle GitHub's 125KB tag annotation limit with CHANGELOG.md references
  [`a74bbdb`](https://github.com/acgetchell/delaunay/commit/a74bbdbaf35d75c589aae25dd89ad74cdb27bf86)

Resolve git tag creation failures when changelog content exceeds GitHub's
  125,000 byte annotation limit (encountered with v0.5.4 at 152KB).

  Tag Creation Strategy:

- Always creates annotated tags for consistency
- Changelogs ≤125KB: Full content in tag annotation
- Changelogs >125KB: Short reference message with CHANGELOG.md link
- Users always use `gh release create "$TAG" --notes-from-tag`

  Implementation (scripts/changelog_utils.py):

- _get_changelog_content(): Returns tuple (message, is_truncated)
  - Checks byte size against 125,000 limit
  - Returns reference message for large changelogs
- _create_tag_with_message(): Always creates annotated tags
  - Renamed parameter: is_lightweight → is_truncated
  - Maintains uniform workflow regardless of size
- _show_success_message(): Simplified to always use --notes-from-tag
  - Notes CHANGELOG.md reference for large changelogs

  Testing (scripts/tests/test_changelog_tag_size_limit.py):

- 7 comprehensive tests using real v0.5.4 data (152KB)
- Tests cover: limit detection, tag creation, success messages, full workflow
- Validates both normal and large changelog handling
- All 452 Python tests passing

### Maintenance

- Update documentation [`283d5e2`](https://github.com/acgetchell/delaunay/commit/283d5e259a92433bda73b3bc02990920920fc08e)
- Bump astral-sh/setup-uv from 7.1.2 to 7.1.4 [#128](https://github.com/acgetchell/delaunay/pull/128)
  [`e3e5977`](https://github.com/acgetchell/delaunay/commit/e3e597779dee3becaeb61430e3bd416352b97ca2)

Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.1.2 to 7.1.4.

- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41...1e862dfacbd1d6d858c55d9b792c756523627244)

  ---
  updated-dependencies:

- dependency-name: astral-sh/setup-uv
    dependency-version: 7.1.4
    dependency-type: direct:production
    update-type: version-update:semver-patch
  ...

- Bump actions/checkout from 5.0.0 to 6.0.0 [#129](https://github.com/acgetchell/delaunay/pull/129)
  [`747b6ef`](https://github.com/acgetchell/delaunay/commit/747b6efd5c16d335340b02dec4821a1019273588)

Bumps [actions/checkout](https://github.com/actions/checkout) from 5.0.0 to 6.0.0.

- [Release notes](https://github.com/actions/checkout/releases)
- [Commits](https://github.com/actions/checkout/compare/v5...v6)

  ---
  updated-dependencies:

- dependency-name: actions/checkout
    dependency-version: 6.0.0
    dependency-type: direct:production
    update-type: version-update:semver-major
  ...

- Bump taiki-e/install-action from 2.62.54 to 2.62.56 [#130](https://github.com/acgetchell/delaunay/pull/130)
  [`37ccaec`](https://github.com/acgetchell/delaunay/commit/37ccaecab39e7951ee9fbc3da7f7dd1556bdbf95)

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.62.54 to 2.62.56.

- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/62da238c048aa0f865cc5a322082957d34e7fc1a...f79fe7514db78f0a7bdba3cb6dd9c1baa7d046d9)

  ---
  updated-dependencies:

- dependency-name: taiki-e/install-action
    dependency-version: 2.62.56
    dependency-type: direct:production
    update-type: version-update:semver-patch
  ...

- Release v0.5.4 [#131](https://github.com/acgetchell/delaunay/pull/131)
  [`bdfc43d`](https://github.com/acgetchell/delaunay/commit/bdfc43dbae7d5dd0109fa7ad6a1fce9d6a01afaa)

  - Bump version to v0.5.4
  - Update changelog with latest changes
  - Update documentation for release
  - Add performance results for v0.5.4

  **Fixed: Convert setext headings to ATX in changelog and update SLURM script**

  Fixes markdown linting errors (MD003, MD025, MD001) in auto-generated
  CHANGELOG.md caused by setext-style headings from commit messages.

  Changelog fixes:

  - Add _convert_setext_to_atx() to detect and convert setext headings
    (text underlined with === or ---) to ATX style (####)

  - Apply conversion in _format_entry_body() before processing
  - Add "setext", "clonable", "wordlist" to cspell dictionary
  - Regenerate CHANGELOG.md with fixes applied

  All headings in commit message bodies now consistently use #### to:
  1. Avoid conflicts with changelog structure (## for versions, ### for sections)
  2. Maintain proper heading hierarchy
  3. Satisfy markdownlint MD001 (no heading level jumps)

  SLURM script updates:

  - Enable Rust 1.91.0 and Python 3.11 module loads for cluster execution
  - Update from commented examples to active module loads matching MSRV

  **Fixed: Lower Python requirement to 3.11 and update documentation**

  Reduces Python version requirement from 3.13 to 3.11, making the project
  more accessible while maintaining all modern features.

  Python version changes:

  - Update .python-version from 3.13 to 3.11
  - Update pyproject.toml requires-python to >=3.11
  - Add Python 3.11 and 3.12 classifiers
  - Update ruff target-version to py311
  - Update all documentation references from 3.13+ to 3.11+

  Features used only require Python 3.11+:

  - PEP 585 built-in generics (list[str], dict[str, Any]) - 3.9+
  - PEP 604 union types (X | None) - 3.10+
  - datetime.UTC - 3.11+

  Documentation corrections:

  - CONTRIBUTING.md: Fix MSRV version 1.90.0 → 1.91.0
  - benches/PERFORMANCE_RESULTS.md: Fix misleading "consistently best"
    performance statement to reflect actual test results

  - WARP.md: Add GitHub CLI non-interactive usage requirements

  Coverage test fixes:

  - Remove storage_backend_compatibility from coverage (all tests ignored)
  - Fixes codecov CI "Test failed during run" error

  All 445 Python tests pass with Python 3.11.14. All quality checks pass.

  **Documentation: Improve performance documentation clarity and fix markdown lint**

  Performance Documentation:

  - Add average performance times to rankings (161 ns, 177 ns, 181 ns)
  - Clarify relative performance differences (~1.1x slower than fastest)
  - Restructure recommendations with clearer headings and use case guidance
  - Emphasize boundary vertex performance advantage (3-4 ns vs 78-366 ns)
  - Break long lines in conclusion to meet 160-char markdown lint limit

  Coverage Configuration:

  - Exclude test_cavity_boundary_error from coverage runs
  - Document reason: regression test is very slow (~2.5min) and causes tarpaulin issues
  - Improves coverage report generation reliability

  **Documentation: Update just commands and clarify performance recommendations**

  Update all documentation files with correct just workflow commands from
  justfile, replacing outdated command references and ensuring consistency
  across the project.

  Documentation Updates:

  - README.md: Replace `just dev`/`just quality` with `just ci` and related commands
  - CONTRIBUTING.md: Update workflow sections with complete command listings
    including test variants, hierarchical linting, benchmark commands with
    timing estimates, and utility commands

  - WARP.md: Update Just Workflow Summary, Code Quality Checks, Testing and
    Validation, and Performance sections with accurate commands

  - docs/code_organization.md: Update Development Workflow section with
    comprehensive command organization and regenerate file layout tree
    (added proptest_duplicates.rs)

  Performance Documentation:

  - benches/PERFORMANCE_RESULTS.md: Clarify performance ranking descriptions
    and recommendation consistency

    - Add specific timings "(3-4 ns)" to performance ranking for clarity
    - Explicitly state `insphere` is both fastest AND most stable upfront
    - Eliminate ambiguity about performance vs stability trade-offs
    - Update wording to emphasize insphere combines best performance with
      numerical reliability

  Key Command Changes:

  - Replaced: `just dev`, `just quality`, `just pre-commit`
  - Updated to: `just ci`, `just commit-check`, `just commit-check-slow`
  - Added: `just help-workflows` references throughout
  - Expanded: Testing commands (test-integration, test-slow, test-slow-release)
  - Expanded: Linting hierarchy (lint, lint-code, lint-docs, lint-config)
  - Added: Benchmark variants with timing estimates (bench-ci, bench-dev, bench-quick)
  - Added: Profiling commands (profile, profile-dev, profile-mem)

  All changes validated with markdown linting, spell checking, and JSON validation.

### Performance

- Add stack-allocated SmallBuffer types for D+1 operations [#126](https://github.com/acgetchell/delaunay/pull/126)
  [`f7203df`](https://github.com/acgetchell/delaunay/commit/f7203df88008dd51431d25708caaf0f06b51861b)

  Replace Vec allocations with stack-allocated SmallBuffer types for
  collections that always contain D+1 elements (typically 3-6 items).
  Eliminates heap allocations for D≤7 (90%+ of use cases).

  New type aliases in src/core/collections.rs:

  - NeighborBuffer<T>: Stack buffer for cell neighbors (D+1)
  - CellVertexBuffer: Stack buffer for vertex keys (D+1)
  - CellVertexUuidBuffer: Stack buffer for vertex UUIDs (D+1)
  - CellToVertexUuidsMap: HashMap using CellVertexUuidBuffer values

  Updated functions:

  - Tds::find_neighbors_by_key() → returns NeighborBuffer<Option<CellKey>>
  - Cell::vertex_uuids() → returns CellVertexUuidBuffer
  - CellVertexKeysMap → uses CellVertexBuffer values
  - Serialization converts SmallVec to Vec for serde compatibility

  Performance benefits:

  - Zero heap allocations for D+1 collections when D≤7
  - Better cache locality with 128-byte stack allocation
  - Maintains same API surface (both implement Deref<[T]>)

  Test improvements:

  - Stabilized 4/5 Delaunay condition property tests (2D-5D empty circumsphere)
  - Documented insertion-order dependency issue in prop_insertion_order_invariance_2d
    (requires separate algorithmic investigation)

  - Removed stale proptest regression file
  - Fixed zero_allocation_iterator_demo to compare as slices

  **Changed: Improve type alias consistency and test coverage**

  Improve consistency and discoverability of D+1 buffer type aliases:

  - CellNeighborsMap now uses NeighborBuffer<Option<CellKey>> instead of
    spelling out SmallBuffer<..., MAX_PRACTICAL_DIMENSION_SIZE> inline

  - Makes all D+1 neighbor collections share single semantic alias
  - Updates documentation to reference NeighborBuffer consistently

  Add test coverage for CellVertexKeysMap:

  - Extend test_collection_type_instantiation to test CellVertexKeysMap
  - Verify D+1 usage pattern (3 vertices for 2D cell)
  - Validate stack allocation behavior (no heap spill for D≤7)

  Addresses code review feedback for better semantic naming and
  protection against accidental signature changes.

  **Changed: Use semantic type aliases for internal buffers**

  Replace raw SmallBuffer types with semantic aliases in Cell struct:

  - vertices: SmallBuffer<VertexKey, 8> → CellVertexBuffer
  - neighbors: SmallBuffer<Option<CellKey>, 8> → NeighborBuffer<Option<CellKey>>

  Updated locations:

  - Cell struct field declarations (lines 290, 309)
  - Cell::new() parameter type (line 482)
  - Cell::neighbors() return type (line 652)
  - Cell::ensure_neighbors_buffer_mut() return type (line 727)
  - Deserialization initialization (line 431)
- Perf/reduce-heap-allocations [#127](https://github.com/acgetchell/delaunay/pull/127)
  [`e3def62`](https://github.com/acgetchell/delaunay/commit/e3def623db8dfe98c5d981d82ad97d6c3da913b8)

## [0.5.3] - 2025-10-31

### Merged Pull Requests

- Release v0.5.3 [#117](https://github.com/acgetchell/delaunay/pull/117)
- Handle degenerate configurations and improve test robustness [#116](https://github.com/acgetchell/delaunay/pull/116)

### Fixed

- Prevent duplicate commit entries in generated changelog [`dbcfb87`](https://github.com/acgetchell/delaunay/commit/dbcfb872dbb542b90f5526263f9692073123a74b)

Fixes two bugs in changelog_utils.py that caused duplicate content:

  1. Reused changes_section_index causing multiple insertions

- Mark changes_section_index as used (-1) after insertion to prevent
       the same index from being reused for duplicate insertions

- Add missing pending_expanded_commits.clear() in _finalize_pending_commits

  2. Expanded PR commits duplicating entries from Fixed Issues section

- Track expanded commit SHAs in self.expanded_commit_shas set
- Skip commit lines whose SHAs were already expanded from PRs
- Store both full and short SHA formats to catch all duplicates
- Clear tracking set per release to avoid cross-release conflicts

  Root cause: auto-changelog lists squash commits in both "Merged Pull
  Requests" and "Fixed Issues" sections. PR expansion was processing
  the same commit twice—once from the PR entry and again from the
  commit entry.

- Normalize markdown headers and protect cron expressions [`1f070dd`](https://github.com/acgetchell/delaunay/commit/1f070dd7c6684bbed36f8aec376badaa461b425e)

Fixes markdown formatting issues in commit message bodies:

  1. Normalize header levels to ####

- Convert all markdown headers (# through ######) to #### in commit bodies
- Maintains consistent hierarchy: ## Release > ### Section > #### Detail
- Prevents conflicts with changelog structure (## for releases, ### for sections)
- Satisfies markdownlint MD001 rule (no heading level jumps)
- Previous approach (adding 2 levels) created h3→h5 jumps that violated MD001

  2. Protect cron expressions from markdown interpretation

- Add _protect_cron_expressions() to wrap cron patterns in backticks
- Detects quoted strings with asterisks and digits (e.g., '0 2 * * 0')
- Prevents markdown from treating * as emphasis markers
- Example: '0 2 * * 0' → `0 2 * * 0`
- Handle degenerate configurations and improve test robustness [#116](https://github.com/acgetchell/delaunay/pull/116)
  [`a6ec3fa`](https://github.com/acgetchell/delaunay/commit/a6ec3fae7423e9245018e7fb071bd92fbb70283e)

  This commit addresses several issues related to degenerate point
  configurations and improves the robustness of property-based tests:

  **Duplicate Vertex Handling**

  - Add duplicate coordinate detection to Tds::new() constructor
  - Silently skip vertices with identical coordinates during batch construction
  - Document behavior difference between new() (permissive) and add() (strict)
  - Matches expected behavior for batch initialization from potentially unfiltered data

  **Property Test Improvements**

  - Filter degenerate configurations in convex hull proptests
    (collinear/coplanar points with no boundary facets)

  - Use approx crate for floating-point comparisons in serialization tests
  - Add BoundaryAnalysis trait import where needed
  - Fix debug-only variable compilation with #[cfg(debug_assertions)]

  **Serialization Test Fixes**

  - Address JSON floating-point precision limitations (not a bug)
  - Use relative_eq! from approx crate instead of exact equality
  - JSON typically preserves 15-17 significant digits for f64
  - Minor coordinate differences after roundtrip are expected and acceptable

  **New Property Tests**

  - Add comprehensive proptest suites for Bowyer-Watson, convex hull,
    cells, facets, geometry utilities, quality metrics, and serialization

  - Include proptest regression files to track minimal failing cases
  - Add serialization vertex preservation integration test

  All tests now pass successfully. Degenerate cases are filtered in
  property tests since they're covered by dedicated edge case tests.

  **Fixed: Add rollback on cell creation failure and fix property test**

  Implement atomic insertion semantics by adding rollback mechanisms when
  cell creation fails during vertex insertion. This prevents TDS
  corruption from partial insertions that leave dangling references.

  Key changes:

  - Add rollback after preventive facet filtering to handle edge cases
    where all boundary facets are unexpectedly removed

  - Add rollback when cell creation yields zero cells despite valid
    facets, preventing inconsistent triangulation state

  - Implement Point Hash + Eq for efficient duplicate detection in
    Tds::new() using HashSet instead of O(n²) sequential scan

  - Add Point import and move HashSet to top-level imports
  - Fix degenerate simplex generator in proptest_quality to create
    full-dimensional thin simplices using safe_usize_to_scalar

  - Add proptest regression file for insertion_algorithm edge cases
  - Improve serialization test coverage for vertex preservation

  The rollback logic ensures failed insertions don't corrupt the
  triangulation, maintaining the invariant that operations either fully
  succeed or leave the TDS unchanged. Property tests now properly
  exercise quality metric comparisons between regular and degenerate
  simplices.

  Fixes edge cases where invalid facet sharing or degenerate geometry
  would previously cause TDS invariant violations.

  **Fixed: Fix preventive facet filter and UUID/construction_state bugs**

  Fix critical bug in preventive facet filtering where all valid interior
  boundary facets were incorrectly rejected, and address UUID duplicate
  detection and construction_state accuracy issues.

  **Preventive Facet Filter Fix (CRITICAL)**

  - Fixed filter_boundary_facets_by_valid_facet_sharing to discount bad
    cell contributions before checking facet sharing limits

  - Bad cells are about to be deleted, but were being counted as if they
    would remain, causing every interior facet to be flagged as over-sharing

  - Added unit test test_preventive_filter_does_not_reject_valid_interior_facets
    to prevent regression of this critical bug

  - Captured bad_cell before moving info to avoid borrow issues

  **UUID Duplicate Detection Fix**

  - Reordered Tds::new() to check UUID collisions before coordinate deduplication
  - Previously duplicate UUIDs were missed when coordinates were also duplicated
  - Added Vertex::new_with_uuid() test helper (marked #[doc(hidden)])
  - Added 4 integration tests for UUID collision detection scenarios

  **Construction State Accuracy Fix**

  - Recalculate construction_state after deduplication loop in Tds::new()
  - Now reflects actual unique vertex count instead of raw input length
  - Added 2 integration tests verifying correct state calculation

  All quality checks pass (979 unit tests, 8 integration tests, clippy pedantic).
  The preventive filter now correctly allows valid cavity reconstructions to proceed.

  **Changed: Improve error handling and performance in insertion algorithm**

  Add early exit for empty facet handles, optimize deduplication, clarify
  documentation, and restrict test helper visibility.

  **Early Exit for Empty Input**

  - Add check at start of create_cells_from_facet_handles for empty handles
  - Returns clear error "No facet handles provided" instead of misleading
    "preventive filtering" message

  - Avoids unnecessary vertex insertion and rollback operations

  **Improved Error Messages**

  - Changed post-filtering error to "No boundary facets available after filtering"
  - More accurate since empty result can come from filtering, deduplication, or
    empty input

  **Performance Optimization**

  - Replace std::HashSet with FastHashSet in deduplicate_boundary_facet_info
  - Pre-allocate both collections with boundary_infos.len() capacity
  - Improves deduplication performance and consistency with codebase

  **Documentation Updates**

  - Clarify saturating_add/sub_for_bbox only support floats (not integers)
  - CoordinateScalar is only implemented for f32/f64
  - Update test comments to reflect early exit behavior
  - Add prominent warning to Vertex::new_with_uuid test helper
  - Keep pub visibility for integration tests but enhance safety warnings

  **Performance: Optimize deduplication and facet filtering hot paths**

  Reduce allocations in deduplication and improve hashing performance in
  the preventive facet filter's inner loop.

  **Deduplication Optimization**

  - Use u64 facet keys instead of Vec<VertexKey> for deduplication
  - Leverages canonical facet_key_from_vertices() hashing
  - Eliminates Vec allocation per facet (N allocations saved)
  - Consistent with hashing used throughout codebase

  **Facet Filter Optimization**

  - Replace std::HashMap with FastHashMap in filter_boundary_facets_by_valid_facet_sharing
  - Pre-allocate with facet_map.len() capacity to avoid rehashing
  - Reduces hashing overhead in N·D inner loop
  - Improves consistency with other hot-path containers

  **Documentation Clarification**

  - Clarify saturating_add/sub_for_bbox perform standard FP arithmetic
  - Add note explaining "saturating" naming is for bbox semantic consistency
  - Not actual integer saturation since CoordinateScalar only supports floats

  **Test Alignment**

  - Fix test_create_cells_from_boundary_facets to assert error on empty input
  - Remove unwrap_or(0) pattern in favor of explicit error assertion
  - Consistent with new API contract where empty handles error immediately

  **Documentation: Add AI tool acknowledgements and clarify bbox helpers**

  Add AI-assisted development tool acknowledgements:

  - List AI tools used in project development (ChatGPT, Claude, CodeRabbit,
    GitHub Copilot, KiloCode, WARP) in README.md

  - Add detailed citations and human oversight note in REFERENCES.md
  - Clarify all AI output was reviewed/edited by maintainer

  Clarify floating-point bbox helper documentation:

  - Simplify doc comments for saturating_add/sub_for_bbox functions
  - Emphasize "saturating" naming is for semantic consistency, not actual
    integer saturation behavior

  - Update test comment to reflect deduplication via canonical vertex sets

  **Changed: Surface duplicate boundary facets as errors instead of silent filtering**

  Replace silent deduplication with explicit error handling to catch algorithmic
  bugs in cavity boundary detection early.

  **Breaking API Changes**

  - deduplicate_boundary_facet_info: Returns Result<SmallBuffer, InsertionError>
    instead of Vec (errors on duplicates, uses SmallBuffer for performance)

  - filter_boundary_facets_by_valid_facet_sharing: Returns Result<SmallBuffer>
    instead of Vec (propagates errors from facet map building)

  - Add InsertionError::DuplicateBoundaryFacets variant with duplicate_count and
    total_count fields

  **Rationale**
  The cavity boundary should form a topological sphere with no duplicate facets.
  Duplicates indicate:

  - Incorrect neighbor traversal logic
  - Non-manifold mesh connectivity
  - Data structure corruption

  By returning errors instead of silently filtering, we surface these bugs
  immediately rather than allowing corrupted triangulations.

  **Performance Optimization**

  - Use SmallBuffer (stack-allocated, falls back to heap) for typical D+1 facets
  - Faster than Vec for small collections (common case in D dimensions)
  - Maintains O(n) duplicate detection with FastHashSet

  **Implementation Details**

  - Propagate DuplicateBoundaryFacets errors through insert_vertex_cavity_based
    and create_cells_from_facet_handles

  - Update tests to expect errors on duplicates instead of silent filtering
  - Rename prop_deduplication_is_idempotent to prop_deduplication_detects_duplicates
  - Fix test_create_cells_from_facet_handles_duplicate_handles to assert error

  **Documentation: Rename saturating_* helpers to bbox_* and clarify float semantics**

  The "saturating" terminology was misleading for floating-point operations.
  These functions perform plain arithmetic, not saturating arithmetic.

  **Renaming**

  - saturating_sub_for_bbox → bbox_sub
  - saturating_add_for_bbox → bbox_add

  **Updated Documentation**

  - Clarify these are plain float operations, NOT saturating arithmetic
  - Explain float overflow behavior: naturally produces ±infinity
  - Document that this is the desired behavior for bounding box expansion
    (ensures all vertices are contained even with extreme coordinates)

  - Add explicit type constraints: only supports f32/f64 via CoordinateScalar
  - Update all 28 call sites and test names

  **Rationale**
  "Saturating" implies integer-style clamping to min/max bounds, but:

  - Floats don't saturate - they naturally produce ±infinity on overflow
  - This is actually the correct behavior for bbox expansion
  - The old naming suggested these functions did something special, when
    they're just plain +/- operations with overflow-to-infinity semantics

### Maintenance

- Release v0.5.3 [#117](https://github.com/acgetchell/delaunay/pull/117)
  [`fa921a0`](https://github.com/acgetchell/delaunay/commit/fa921a092a8c6514f646274b53734b67845bf8bd)

- Bump version to v0.5.3
  - Update changelog with latest changes
  - Update documentation for release
  - Add performance results for v0.5.3

## [0.5.2] - 2025-10-29

### Merged Pull Requests

- Release v0.5.2 [#115](https://github.com/acgetchell/delaunay/pull/115)
- Bump actions/download-artifact from 5.0.0 to 6.0.0 [#113](https://github.com/acgetchell/delaunay/pull/113)
- Bump astral-sh/setup-uv from 7.1.1 to 7.1.2 [#112](https://github.com/acgetchell/delaunay/pull/112)
- Bump actions/upload-artifact from 4 to 5 [#111](https://github.com/acgetchell/delaunay/pull/111)
- Refactor/phase 4 [#109](https://github.com/acgetchell/delaunay/pull/109)
- Bump astral-sh/setup-uv from 7.1.0 to 7.1.1 [#108](https://github.com/acgetchell/delaunay/pull/108)
- Feature/geometry quality metrics [#107](https://github.com/acgetchell/delaunay/pull/107)

### Changed

- Feature/geometry quality metrics [#107](https://github.com/acgetchell/delaunay/pull/107)
  [`c707b09`](https://github.com/acgetchell/delaunay/commit/c707b09e6ab78a07bbce873f0c39cf8119dfb076)
- Refactor/phase 4 [#109](https://github.com/acgetchell/delaunay/pull/109)
  [`4ecc21f`](https://github.com/acgetchell/delaunay/commit/4ecc21fbe65c1292165594171c6d137093120076)

### Documentation

- Remove outdated TODOs and update documentation references [`a4213e1`](https://github.com/acgetchell/delaunay/commit/a4213e1bdd44626dea91345f3fad7880a8a048cd)

Cleaned up outdated TODOs and documentation references across the codebase:

  Code cleanup:

- Remove outdated Phase 3 cache migration TODOs from bowyer_watson.rs
- Remove deprecated Cell method references and old commented code from cell.rs
- Update issue reference from #86 to #105 in triangulation_data_structure.rs
- Remove outdated test TODO comments from convex_hull.rs

  Documentation updates:

- Update docs/README.md to reference existing files (property_testing_summary.md, topology.md) instead of non-existent optimization guides
- Update docs/OPTIMIZATION_ROADMAP.md to reference archived Phase 2/3 documentation in docs/archive/ instead of removed files
- Update docs/code_organization.md project structure tree to reflect current files:
  - Add proptest files (proptest_point.rs, proptest_predicates.rs, proptest_triangulation.rs)
  - Add docs/archive/ directory with historical documentation
  - Add property_testing_summary.md and topology.md
- Update test counts from 772/774 to current 781 tests across all documentation

  All changes are internal cleanup with no functional impact. All 781 tests passing.

### Maintenance

- Bump astral-sh/setup-uv from 7.1.0 to 7.1.1 [#108](https://github.com/acgetchell/delaunay/pull/108)
  [`7abf5f9`](https://github.com/acgetchell/delaunay/commit/7abf5f97c142eaf148454daab770042b4cdbfd50)

Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.1.0 to 7.1.1.

- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/3259c6206f993105e3a61b142c2d97bf4b9ef83d...2ddd2b9cb38ad8efd50337e8ab201519a34c9f24)

  ---
  updated-dependencies:

- dependency-name: astral-sh/setup-uv
    dependency-version: 7.1.1
    dependency-type: direct:production
    update-type: version-update:semver-patch
  ...

- Bump actions/download-artifact from 5.0.0 to 6.0.0 [#113](https://github.com/acgetchell/delaunay/pull/113)
  [`9756b59`](https://github.com/acgetchell/delaunay/commit/9756b594b26715b478d2eebdf78aebe016bb48d7)

Bumps [actions/download-artifact](https://github.com/actions/download-artifact) from 5.0.0 to 6.0.0.

- [Release notes](https://github.com/actions/download-artifact/releases)
- [Commits](https://github.com/actions/download-artifact/compare/634f93cb2916e3fdff6788551b99b062d0335ce0...018cc2cf5baa6db3ef3c5f8a56943fffe632ef53)

  ---
  updated-dependencies:

- dependency-name: actions/download-artifact
    dependency-version: 6.0.0
    dependency-type: direct:production
    update-type: version-update:semver-major
  ...

- Bump actions/upload-artifact from 4 to 5 [#111](https://github.com/acgetchell/delaunay/pull/111)
  [`3ffdf6b`](https://github.com/acgetchell/delaunay/commit/3ffdf6b10f37776a40be3c3b047cdac9e44709b6)

Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 4 to 5.

- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v4...v5)

  ---
  updated-dependencies:

- dependency-name: actions/upload-artifact
    dependency-version: '5'
    dependency-type: direct:production
    update-type: version-update:semver-major
  ...

- Bump astral-sh/setup-uv from 7.1.1 to 7.1.2 [#112](https://github.com/acgetchell/delaunay/pull/112)
  [`febd5f5`](https://github.com/acgetchell/delaunay/commit/febd5f55278f73dfd9e69c7b4a71e86058da2815)

Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.1.1 to 7.1.2.

- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/2ddd2b9cb38ad8efd50337e8ab201519a34c9f24...85856786d1ce8acfbcc2f13a5f3fbd6b938f9f41)

  ---
  updated-dependencies:

- dependency-name: astral-sh/setup-uv
    dependency-version: 7.1.2
    dependency-type: direct:production
    update-type: version-update:semver-patch
  ...

- Update CHANGELOG, add storage comparison tooling [`49f5eb5`](https://github.com/acgetchell/delaunay/commit/49f5eb5d90bb0a5eb26166986347b73038100de1)

- Generate comprehensive CHANGELOG.md with AI-categorized Phase 4 entries
  - Add legitimate technical terms to cspell.json dictionary (invariances, kibibytes, unparseable)
  - Document storage backend comparison scripts in code_organization.md and scripts/README.md
  - Add Slurm-based storage comparison script for SlotMap vs DenseSlotMap benchmarking
- Release v0.5.2 [#115](https://github.com/acgetchell/delaunay/pull/115)
  [`2f8b68d`](https://github.com/acgetchell/delaunay/commit/2f8b68dbec13079e024a0cab8780303347823225)

- Bump version to v0.5.2
  - Update changelog with latest changes
  - Update documentation for release
  - Add performance results for v0.5.2

## [0.5.1] - 2025-10-16

### Merged Pull Requests

- Release v0.5.1 [#104](https://github.com/acgetchell/delaunay/pull/104)
- Refactor/complete phase 3 [#103](https://github.com/acgetchell/delaunay/pull/103)
- Bump astral-sh/setup-uv from 7.0.0 to 7.1.0 [#102](https://github.com/acgetchell/delaunay/pull/102)
- Replaces fxhash with rustc-hash for performance [#101](https://github.com/acgetchell/delaunay/pull/101)
- Update/utilities and roadmap [#100](https://github.com/acgetchell/delaunay/pull/100)
- Bump astral-sh/setup-uv from 6.7.0 to 6.8.0 [#96](https://github.com/acgetchell/delaunay/pull/96)
- Bump actions-rust-lang/setup-rust-toolchain [#95](https://github.com/acgetchell/delaunay/pull/95)
- Bump ordered-float in the dependencies group [#94](https://github.com/acgetchell/delaunay/pull/94)
- Bump the dependencies group with 2 updates [#93](https://github.com/acgetchell/delaunay/pull/93)
- Bump actions-rust-lang/setup-rust-toolchain [#92](https://github.com/acgetchell/delaunay/pull/92)

### Changed

- Update/utilities and roadmap [#100](https://github.com/acgetchell/delaunay/pull/100)
  [`353a46e`](https://github.com/acgetchell/delaunay/commit/353a46e385baa936e5e94f0b3a1b5e7b58a3350e)
- Replaces fxhash with rustc-hash for performance [#101](https://github.com/acgetchell/delaunay/pull/101)
  [`3c56251`](https://github.com/acgetchell/delaunay/commit/3c5625137f7cdd5385d056453860f20083882247)

  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.

  Replaces the fxhash hashing algorithm with rustc-hash.

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

- Refactor/complete phase 3 [#103](https://github.com/acgetchell/delaunay/pull/103)
  [`2db8acd`](https://github.com/acgetchell/delaunay/commit/2db8acd18e373f4847de73526e387c7f14b5a3e5)

### Maintenance

- Bump actions-rust-lang/setup-rust-toolchain [#92](https://github.com/acgetchell/delaunay/pull/92)
  [`e11ff2e`](https://github.com/acgetchell/delaunay/commit/e11ff2e71caba08020843cb25c38937fe14bdff3)

Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.0 to 1.15.1.

- [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases)
- [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/2fcdc490d667999e01ddbbf0f2823181beef6b39...02be93da58aa71fb456aa9c43b301149248829d8)

  ---
  updated-dependencies:

- dependency-name: actions-rust-lang/setup-rust-toolchain
    dependency-version: 1.15.1
    dependency-type: direct:production
    update-type: version-update:semver-patch
  ...

- Bump the dependencies group with 2 updates [#93](https://github.com/acgetchell/delaunay/pull/93)
  [`b0a7051`](https://github.com/acgetchell/delaunay/commit/b0a70518c4594dc97ed2f93316d13c227c4cb861)

Bumps the dependencies group with 2 updates: [serde](https://github.com/serde-rs/serde) and [thiserror](https://github.com/dtolnay/thiserror).

  Updates `serde` from 1.0.227 to 1.0.228

- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.227...v1.0.228)

  Updates `thiserror` from 2.0.16 to 2.0.17

- [Release notes](https://github.com/dtolnay/thiserror/releases)
- [Commits](https://github.com/dtolnay/thiserror/compare/2.0.16...2.0.17)

  ---
  updated-dependencies:

- dependency-name: serde
    dependency-version: 1.0.228
    dependency-type: direct:production
    update-type: version-update:semver-patch
    dependency-group: dependencies

- dependency-name: thiserror
    dependency-version: 2.0.17
    dependency-type: direct:production
    update-type: version-update:semver-patch
    dependency-group: dependencies
  ...

- Bump ordered-float in the dependencies group [#94](https://github.com/acgetchell/delaunay/pull/94)
  [`1a213f7`](https://github.com/acgetchell/delaunay/commit/1a213f7cd262f3dfc319b72c9bde9836db7119cc)

Bumps the dependencies group with 1 update: [ordered-float](https://github.com/reem/rust-ordered-float).

  Updates `ordered-float` from 5.0.0 to 5.1.0

- [Release notes](https://github.com/reem/rust-ordered-float/releases)
- [Commits](https://github.com/reem/rust-ordered-float/compare/v5.0.0...v5.1.0)

  ---
  updated-dependencies:

- dependency-name: ordered-float
    dependency-version: 5.1.0
    dependency-type: direct:production
    update-type: version-update:semver-minor
    dependency-group: dependencies
  ...

- Bump actions-rust-lang/setup-rust-toolchain [#95](https://github.com/acgetchell/delaunay/pull/95)
  [`34db79a`](https://github.com/acgetchell/delaunay/commit/34db79a89fefc3e062afb1cb47e9da9d80db4f89)

Bumps [actions-rust-lang/setup-rust-toolchain](https://github.com/actions-rust-lang/setup-rust-toolchain) from 1.15.1 to 1.15.2.

- [Release notes](https://github.com/actions-rust-lang/setup-rust-toolchain/releases)
- [Changelog](https://github.com/actions-rust-lang/setup-rust-toolchain/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions-rust-lang/setup-rust-toolchain/compare/02be93da58aa71fb456aa9c43b301149248829d8...1780873c7b576612439a134613cc4cc74ce5538c)

  ---
  updated-dependencies:

- dependency-name: actions-rust-lang/setup-rust-toolchain
    dependency-version: 1.15.2
    dependency-type: direct:production
    update-type: version-update:semver-patch
  ...

- Bump astral-sh/setup-uv from 6.7.0 to 6.8.0 [#96](https://github.com/acgetchell/delaunay/pull/96)
  [`ef8c98d`](https://github.com/acgetchell/delaunay/commit/ef8c98df6fd2399790c5f64e2cbcbdfc19e8bbd9)

Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 6.7.0 to 6.8.0.

- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/b75a909f75acd358c2196fb9a5f1299a9a8868a4...d0cc045d04ccac9d8b7881df0226f9e82c39688e)

  ---
  updated-dependencies:

- dependency-name: astral-sh/setup-uv
    dependency-version: 6.8.0
    dependency-type: direct:production
    update-type: version-update:semver-minor
  ...

- Bump astral-sh/setup-uv from 7.0.0 to 7.1.0 [#102](https://github.com/acgetchell/delaunay/pull/102)
  [`8a09e60`](https://github.com/acgetchell/delaunay/commit/8a09e6020ec0dcf55a2cc146d8ddb05a48aee1a2)

Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 7.0.0 to 7.1.0.

- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](https://github.com/astral-sh/setup-uv/compare/eb1897b8dc4b5d5bfe39a428a8f2304605e0983c...3259c6206f993105e3a61b142c2d97bf4b9ef83d)

  ---
  updated-dependencies:

- dependency-name: astral-sh/setup-uv
    dependency-version: 7.1.0
    dependency-type: direct:production
    update-type: version-update:semver-minor
  ...

- Release v0.5.1 [#104](https://github.com/acgetchell/delaunay/pull/104)
  [`2675a5e`](https://github.com/acgetchell/delaunay/commit/2675a5e00ae8c983c2e37b5cc115c65e6196a872)

- Bump version to v0.5.1
  - Update changelog with latest changes
  - Update documentation for release
  - Add performance results for v0.5.1

## [0.5.0] - 2025-09-27

### Merged Pull Requests

- Release v0.5.0 [#91](https://github.com/acgetchell/delaunay/pull/91)
- Refactor/phase 3 [#90](https://github.com/acgetchell/delaunay/pull/90)
- Test/improve coverage [#89](https://github.com/acgetchell/delaunay/pull/89)
- Bump the dependencies group with 4 updates [#88](https://github.com/acgetchell/delaunay/pull/88)

### Changed

- Update documentation for v0.4.4 (skip ci) [`696f740`](https://github.com/acgetchell/delaunay/commit/696f74056e07ad2d3a8db4269f281029df089b33)
- Test/improve coverage [#89](https://github.com/acgetchell/delaunay/pull/89)
  [`b8a2024`](https://github.com/acgetchell/delaunay/commit/b8a2024fa9921141b1a453bb8911fbc2dbf02b5f)
- Refactor/phase 3 [#90](https://github.com/acgetchell/delaunay/pull/90)
  [`2a9b655`](https://github.com/acgetchell/delaunay/commit/2a9b655f73432e3cce52f9c9db58e46d525bc9d3)
- Updates docs, adds Claude config ignore, cspell [`7a1e51f`](https://github.com/acgetchell/delaunay/commit/7a1e51f5af069c35ff840103da691b3d38a4536f)

Updates documentation with progress on Phase 1/2 optimizations,
  justfile usage, development workflow and command examples.

  Adds .claude/ to .gitignore to exclude user-specific Claude AI
  settings.

  Adds "Makefiles" to cspell.json to prevent spell check on
  Makefiles.

### Maintenance

- Increase profiling to 6 hour max runtime [skip ci] [`52c7dfd`](https://github.com/acgetchell/delaunay/commit/52c7dfd51d1a5a1d5cd69bbb424ca3c947a68d46)
- Bump the dependencies group with 4 updates [#88](https://github.com/acgetchell/delaunay/pull/88)
  [`68caee6`](https://github.com/acgetchell/delaunay/commit/68caee6276094e9cb106a7edc43e5ce2a62c9aef)

Bumps the dependencies group with 4 updates: [anyhow](https://github.com/dtolnay/anyhow) , [clap](https://github.com/clap-rs/clap) ,
[nalgebra](https://github.com/dimforge/nalgebra) and [serde](https://github.com/serde-rs/serde) .

  Updates `anyhow` from 1.0.99 to 1.0.100

- [Release notes](https://github.com/dtolnay/anyhow/releases)
- [Commits](https://github.com/dtolnay/anyhow/compare/1.0.99...1.0.100)

  Updates `clap` from 4.5.47 to 4.5.48

- [Release notes](https://github.com/clap-rs/clap/releases)
- [Changelog](https://github.com/clap-rs/clap/blob/master/CHANGELOG.md)
- [Commits](https://github.com/clap-rs/clap/compare/clap_complete-v4.5.47...clap_complete-v4.5.48)

  Updates `nalgebra` from 0.34.0 to 0.34.1

- [Changelog](https://github.com/dimforge/nalgebra/blob/main/CHANGELOG.md)
- [Commits](https://github.com/dimforge/nalgebra/commits/v0.34.1)

  Updates `serde` from 1.0.223 to 1.0.226

- [Release notes](https://github.com/serde-rs/serde/releases)
- [Commits](https://github.com/serde-rs/serde/compare/v1.0.223...v1.0.226)

  ---
  updated-dependencies:

- dependency-name: anyhow
    dependency-version: 1.0.100
    dependency-type: direct:production
    update-type: version-update:semver-patch
    dependency-group: dependencies

- dependency-name: clap
    dependency-version: 4.5.48
    dependency-type: direct:production
    update-type: version-update:semver-patch
    dependency-group: dependencies

- dependency-name: nalgebra
    dependency-version: 0.34.1
    dependency-type: direct:production
    update-type: version-update:semver-patch
    dependency-group: dependencies

- dependency-name: serde
    dependency-version: 1.0.226
    dependency-type: direct:production
    update-type: version-update:semver-patch
    dependency-group: dependencies
  ...

- Release v0.5.0 [#91](https://github.com/acgetchell/delaunay/pull/91)
  [`81f7b88`](https://github.com/acgetchell/delaunay/commit/81f7b889d6ed0d78452505716c7e07ed4bfab514)

- Bump version to v0.5.0
  - Update changelog with latest changes
  - Update documentation for release
  - Add performance results for v0.5.0

[0.5.4]: https://github.com/acgetchell/delaunay/compare/v0.5.3..v0.5.4
[0.5.3]: https://github.com/acgetchell/delaunay/compare/v0.5.2..v0.5.3
[0.5.2]: https://github.com/acgetchell/delaunay/compare/v0.5.1..v0.5.2
[0.5.1]: https://github.com/acgetchell/delaunay/compare/v0.5.0..v0.5.1
[0.5.0]: https://github.com/acgetchell/delaunay/compare/v0.4.4..v0.5.0
