Assignment
Deterministic SHA-256 bucketing over a stable unit id, project, environment,
namespace, iteration, and salt. Layers and holdouts use dedicated namespaces
(layer: / holdout:) so mutual exclusion and untreated
holdouts stay consistent across languages.
Cluster designs
set randomization_unit
to cluster. Pass the cluster value via context attributes (default key workspace_id, or the experiment cluster_attribute).
Switchback designs use time_block units: the SDK floors
wall-clock time from switchback.schedule_start into period ids
(tb_N), skipping washout minutes at the start of each period. CUPED on
switchback uses prior-period means as covariates when enabled.
Geo designs
are a deterministic map lookup on attributes[geo.attribute]
(default country) via geo.variant_map
with optional *
fallback — not hash
bucketing. randomization_unit
is geo.
Bandit (epsilon-greedy) is control-plane dogfood: explore with probability ε else pick highest running mean quality. Client SDKs still hash for pure A/B unless the bundle carries a bandit state snapshot.
Contextual bandit (LinUCB)
when bandit.mode
is contextual: arm scores use ridge-regression θ̂ over covariate features
from context attributes (bias, plan_tier, country_us, mobile, plus custom keys). Bundle may snapshot
per-arm A/b matrices for offline/dogfood decide.