YakExperiment
Documentation

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.