What's Changed
- Fix forced rollout hashing and evaluator parity by @madhuchavva in #176
Bug Fixes Summary
- Remove the duplicate legacy coverage gate from forced feature rules
- honor configured seeds, hash versions, hash attributes, fallback attributes, and ranges through one rollout decision
- reject missing hash attributes for rollouts and filters instead of hashing an empty string
- enable sticky bucketing by default when a service is configured and
disableStickyBucketingis omitted - make malformed one-element ranges non-matching instead of allowing an out-of-bounds access
Root cause and impact
Forced rules first used isIncludedInRollout with the configured hashing inputs, then ran a duplicate coverage check with the feature key and hash v1. For rules using hash v2 or a custom seed, users had to pass two different gates, reducing effective inclusion toward coverage². Remote-evaluation tracking ran between those gates, so an exposure could be recorded even when the forced value was not returned.
The evaluator also hashed empty strings when rollout or filter attributes were missing, and treated an omitted disableStickyBucketing as disabled in two paths. These behaviors diverged from the evaluator contract and other SDK implementations.
Full Changelog: 1.1.15...1.2.0