All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project aims to follow Semantic Versioning.
1.4.0 - 2026-05-16
- Canonicalize explicit zero-counter
VectorClockentries away during parse/read paths so structural equality matches vector-clock semantics for missing entries.
- Add opt-in
UuidV7FactoryStatisticscounters for generated UUIDs, clock rollback, counter overflow, spin-wait, logical drift, CAS retries, and random-buffer refills. - Add opt-in UUIDv7 node partitioning that reserves 1 to 16
rand_bbits for a node, shard, process, or deployment discriminator. - Add opt-in
UuidV7FactoryStaterestart frontier snapshots for services that persist and restore UUIDv7 logical cursors.
UuidV7Factorynow appliesCounterOverflowBehaviorconsistently when logical time is ahead of physical time and the 12-bit counter is exhausted.HlcGuidFactoryconstructor now enforces a 14-bit node ID constraint and throwsArgumentOutOfRangeExceptionfor values aboveHlcGuidFactory.MaxNodeId(16383). Previously, higher values were silently truncated in generated UUIDv7 values.
- Document UUIDv7 restart-state invariants, durability boundaries, and multi-writer failure modes.
- Document UUIDv7 node partitioning trade-offs versus default UUIDv7,
HlcGuidFactory, Snowflake-style IDs, and database allocators. - Document UUIDv7 factory statistics and counter semantics.
- Clarify
UuidV7Factorycollision and clock-skew guarantees, including the distinction between per-instance deterministic monotonicity and probabilistic cross-factory uniqueness. - Document the custom RNG contract for
UuidV7Factory, including deterministic replay behavior and production CSPRNG guidance.
1.3.1 - 2026-04-02
- Add GitHub Actions CI workflow for pushes and pull requests to
main. - Add tag-driven release workflow to publish NuGet packages and create GitHub Releases.
- Remove
setup-dotnetlock-file caching requirement from workflows (nopackages.lock.jsonneeded).
- Add a repository
commit-msghook under.githooks/to strip auto-injectedCo-authored-bytrailers for Copilot/dexcompiler identities.
1.3.0 - 2026-02-19
- Fix packed HLC decode for high-bit wall times.
- Enforce HLC drift bounds when the clock moves backwards.
- Harden
VectorClockstring parsing and coordinator locking. - Fix
VectorClockoverflow behavior. - Fix thread safety in demo
FailureInjector. - Preserve correlation IDs correctly in at-least-once demo flows.
- Prevent a template dictionary memory leak in the integration demo.
- Stabilize demo
MessageIdgeneration.
- Optimize HLC timestamp serialization/parsing, and simplify witness max selection.
- Make HLC message header
TryParsenon-exceptional. - Split HLC coordinator supporting types into separate files.
- Optimize
VectorClockmerge/compare/increment and serialization. - Use
ArrayPool<T>for vector clock merge buffers. - Use
CollectionsMarshalfor vector clock canonicalization. - UUIDv7 packing now uses
BinaryPrimitivesand a tighter packing path. - UUIDv7 factory batch generation throughput improvements.
- Adopt C# 14 extension member blocks.
- Add high-value property tests for HLC and vector clocks.
- Demo: add distributed-systems at-least-once simulation with HLC/VC stats.
- Update README with HLC and
VectorClockwire formats. - Clarify HLC drift bounds and ordering scope.
- Infrastructure scripts: improve setup/maintenance harness and dotnet installation step.
1.2.0 - 2026-01-27
- HLC receive semantics now witness the full remote
HlcTimestamp(wallTime, counter, nodeId)(including nodeId tie-breaking) rather than only the remote wall time. - HLC coordinator receive statistics now treat "remote ahead" based on full timestamp ordering.
- Additional property tests for
HlcCoordinatorcovering remote-ahead by counter, nodeId tie-breaking, remote-behind behavior, and mixed send/receive/time interleavings. - Unit test coverage for receiving a remote timestamp with higher counter at the same wall time.
- Centralized common build properties in
Directory.Build.props.