Unreleased
Fixed
- Select all requested distinct replica owners across both ring boundaries, in clockwise order, with bounded traversal. Addresses #39 and the incomplete wraparound case discussed in #40.
- Start supervised managed rings under the requesting supervisor, with correct restart/shutdown ownership, rather than calling a missing function. Addresses #38.
- Apply the existing primary-owner atom normalization to replica lookup too.
- Accept empty/weighted-atom managed node configurations and unambiguous scalar or compound bulk keys; report invalid options and weights intentionally. Reject empty binary keys before worker mutation, preserving existing ring state.
- Apply remote node-type filtering consistently at monitored startup and on later events, and subscribe before the initial membership snapshot. Honor the documented no-op behavior of manual membership requests on monitored rings.
- Correct hashing, keyspace, read-path, license, source-link, and release guidance.
Maintenance
- Restore supported CI runners and explicit runtime pairs, including a separate minimum-consumer compatibility job without development dependencies.
- Enforce action lockfiles, actionlint, zizmor, least-privilege tokens, and trusted cache writes; refresh documentation, type-analysis, and property-test tooling.
- Add a changelog to documentation and package contents.
Compatibility
- Existing atom-key replica selections can change: the first replica now matches
key_to_node/2. Single-node routing and non-atom hashing remain unchanged. Applications persisting replicas should reconcile placement during rollout. - Monitored rings now ignore valid manual membership changes as documented. Applications managing membership explicitly should use static rings.
- Managed two-tuples remain weighted-entry syntax; wrap a tuple node in an
explicitly weighted entry. Invalid startup options raise
ArgumentError. - The declared Elixir 1.11 consumer requirement and default node weight of 128 remain unchanged. Development tooling uses newer runtimes.