[4.5.0] - July 14, 2026
This release adds support for local (per-rule) holdouts and Feature Rollouts, delivered by upgrading the embedded go-sdk from v2.3.0 to v2.5.0. It builds on the global holdouts support introduced in 4.4.0.
New Features
- Local Holdouts Support (#464): Agent now supports local (per-rule) holdouts in addition to global holdouts, via go-sdk v2.5.0. Local holdouts target specific rules and are evaluated per-rule, after forced decisions and before audience/traffic checks. Held-out decisions return
enabled: false,variationKey: "ho_off_key", andruleKeyset to the holdout identifier, with impressionrule_type: "holdout". As with global holdouts, all decision logic is handled by go-sdk — no Agent code changes are required beyond updating theProjectConfigtest mock. - Feature Rollout Support (#463): Via go-sdk v2.4.0, Agent now supports Feature Rollouts — a rule type combining Targeted Delivery with A/B test measurement capabilities.
Behavior Changes
These changes come from the go-sdk v2.4.0 → v2.5.0 upgrade:
- Decision event ID normalization: decision event
campaign_idandentity_idfall back toexperiment_idwhen empty, andvariation_idserializes asnullwhen non-numeric, for cross-SDK consistency. - ODP identify guard: ODP identify events carrying only a single identifier are now blocked.
- Removed legacy flag-level holdout fields from datafile parsing.
Maintenance
- Upgrade go-sdk v2.3.0 → v2.5.0 (#459, #463, #464)
- Add Dependabot to auto-update the go-sdk dependency (#458)
- Remove Coveralls from CI checks (#462)
- Add Agent developer documentation (#461)
- Fix Arnica security vulnerabilities (#460)
- Synchronize linters between go-sdk and agent (#457)
- Fix Dependabot alerts (#455, #456)
Dependencies
- Upgraded `github.com/optimizely/go-sdk/v2` from v2.3.0 to v2.5.0