Skip to content

0.20.2 - get_experiment_groups() Across All SDKs, Key-Independent GCIR target_app_id (Rust/Go), DCS Delta-Sync Stall Recovery, iPadOS User-Agent Parsing Fix

Choose a tag to compare

@statsig-kong statsig-kong released this 23 Jul 23:13
· 96 commits to main since this release
3c1805e

Breaking Changes

  • N/A

New Features

  • All SDKs (rust core + Node.js, Python, Java, PHP, Go, .NET, Elixir, C++, and the C FFI):
    • get_experiment_groups(experiment_name) — returns the counterfactual view of an experiment: every group's configuration (group_name, rule_id, id_type,
      return_value) plus is_experiment_active, without running a user evaluation or logging an exposure. Lets callers log exposures only when variants would actually
      diverge (avoiding dilution). is_experiment_active is null for unknown names and non-experiment entities (dynamic config, autotune); groups are returned regardless
      of active state. Complements the get_experiment_by_group_name / get_experiment_by_group_id_advanced getters from 0.20.0. Community-contributed by @cam-matsui
      (Cameron Matsui, Whatnot) — #54.
  • Rust:
    • target_app_id on ClientInitResponseOptions — get_client_initialize_response (GCIR) can now be scoped to a target app independently of the client SDK key,
      enabling a single shared ("super") client key across all target apps. Resolution precedence: explicit target_app_id → key-derived app id → DCS global app_id; an
      empty string normalizes to unset. With neither a client key nor a target app id set, behavior is unchanged. Restores the legacy go-sdk/v2 GCIROptions{ClientKey, TargetAppID} capability.
  • Go:
    • ClientInitResponseOptions.TargetAppID — exposes the key-independent GCIR target-app scoping in the Go binding, restoring parity with legacy go-sdk/v2.

Improvements & Fixes

  • All SDKs (rust core): DCS delta-sync stall recovery. StatsigHttpSpecsAdapter now tracks consecutive background delta syncs that carry updates but make no LCUT
    progress and, past a threshold, forces one full (non-delta) resync — fixing the "sawtooth" config-staleness pattern where a wedged delta stream (server has newer
    data, client keeps failing to apply the delta) froze the in-memory snapshot indefinitely. A "no updates" response counts as progress, so an already-current config
    never triggers a needless resync.
  • All SDKs (rust core): fixed iPadOS user-agent parsing. UAs such as ... iPadOS 26.5, iPad13,19 previously lost their OS version (surfaced as os_version = 0.0.0), breaking OS-version targeting; they now parse to os_name = iOS, os_version = 26.5, matching the equivalent iPhone UA.

Included In This Release

  • e5738b2 statsig-kong[bot]
    • chore: bump version to 0.20.2-rc.2607201627
  • 5fc00f7 Xin Li (Bot)
    • [automated] sync rc with main
  • 41d7971 statsig-kong[bot]
    • [automated] chore: bump version to 0.20.2-beta.2607180300 (#3077)
  • fa1933d Kenneth Yeh
    • feat: add get_experiment_groups() across all SDKs (#3062)
  • 11c37d9 statsig-kong[bot]
    • [automated] chore: bump version to 0.20.2-beta.2607170300 (#3076)
  • af560c8 statsig-kong[bot]
    • [automated] chore: bump version to 0.20.1-rc.1 (#3075)
  • 3e51c05 Sandeep Madugula
    • [S2SDK-132] core: force full DCS resync when delta syncs stall (#3032)
  • 44929a6 Kenneth Yeh
    • fix(go): SIGSEGV under concurrent evaluation — bump purego to v0.10.1 (#3065)
  • 651b490 statsig-kong[bot]
    • [automated] chore: bump version to 0.20.1-beta.2607150300 (#3064)
  • 3137de6 Kenneth Yeh
    • go: expose TargetAppID in GCIR ClientInitResponseOptions (#3063)
  • 37afbb6 Kenneth Yeh
    • fix: recognize iPadOS user-agent strings in first-party UA parser (#3052)
  • aeb7168 Kenneth Yeh
    • feat: support key-independent target_app_id in GCIR ClientInitResponseOptions (#3059)
  • 1c4d152 statsig-kong[bot]
    • [automated] chore: bump version to 0.20.1-rc.2607140134 (#3061)
  • 32d53c4 statsig-kong[bot]
    • [automated] sync rc with main (#3060)

Full Changelog: 0.20.1...0.20.2