experiment-results-interpreter
Interprets the results of a valid online controlled experiment, one whose harness, SRM, and telemetry have already been confirmed. Covers the distinction between practical and statistical significance, reading confidence intervals instead of binary p-values, novelty and primacy week-over-week decay that causes post-ship reversion, interaction effects from concurrent experiments, Simpson's paradox in segmented results, and the ordered guardrail-check sequence required before a ship decision - with the deep methodology in references/: the peeking problem and its corrections (fixed-horizon, alpha-spending, always-valid mSPRT) in references/peeking.md, and guardrail-metric methodology (taxonomy, OEC relationship, pre-commitment, thresholds) in references/guardrails.md. Use when a data scientist or PM is ready to draw conclusions from an experiment, when designing a stop-early policy, or when declaring an experiment's guardrail set. Distinct from ab-test-validity-checklist (harness setup and SRM detection).
Install with skills.sh (any agent)
npx skills add testland/qa --skill experiment-results-interpreterexperiment-results-interpreter
Overview
The ab-test-validity-checklist skill confirms that an experiment was run correctly - clean SRM, honest peeking discipline, pre-declared OEC. This skill covers the next question: given a valid experiment, what does the result actually mean, and is it safe to ship?
The two most common failure modes at this stage, per Kohavi, Tang, Xu Trustworthy Online Controlled Experiments (Cambridge Univ. Press, 2020, ISBN 9781108724265), are:
This skill is a pure reference for data scientists and PMs reading final experiment dashboards.
When to use
How to use
Work through the six interpretation steps in order. Each step has a hard stop: if a step blocks, do not proceed to the next.
Step 1 - Practical significance before statistical significance
A statistically significant effect can still be too small to matter: results "may be statistically significant but not practically significant" (Nielsen Norman Group, sources).
The minimum practically significant effect (MPSE) must be declared in the pre-registration (proposal.yml). At read-time:
| Question | How to answer |
|---|---|
| Is the point estimate above the MPSE? | Compare OEC lift to the pre-declared threshold |
| Is the confidence interval entirely above the MPSE? | If the lower bound falls below the MPSE, treat as inconclusive |
| Would a 0.1% conversion lift justify the maintenance cost? | Engineering and product judgement, not statistics |
A statistically significant result with a point estimate well below the MPSE is a no-ship unless the maintenance cost is zero and the direction is consistent with strategy.
Step 2 - Confidence intervals, not just p-values
A 95% confidence interval gives the plausible range of the true effect - "both directionality and magnitude of effects simultaneously" (Statsig, sources) - which a binary p-value cannot.
Reading a result:
| CI position | Interpretation |
|---|---|
| Entirely above zero and above MPSE | Strong positive - candidate for ship |
| Entirely above zero, partially below MPSE | Positive but magnitude uncertain - extend or accept lower bound as the working estimate |
| Crosses zero | Inconclusive; do not ship on this signal |
| Entirely below zero | Negative treatment effect - do not ship |
Width matters. A narrow CI means high power and a precise estimate; a wide CI means the experiment was underpowered, so extending runtime or pooling more traffic will narrow it. Variance-reduction techniques (CUPED) narrow the CI without inflating the false-positive rate (Microsoft ExP, sources) - prefer platforms that apply it by default.
Do not convert CI edges back to p-values to decide - the CI is the complete picture.
Step 3 - Novelty and primacy effects
A statistically and practically significant result in week 1 may not persist. Two opposing artefacts corrupt early-period estimates:
Novelty effect: users react to the mere newness of a change; engagement (clicks, session length) inflates above the true long-run level, then decays.
Primacy effect (resistance to change): new UI or workflows initially hurt task-completion because users must relearn existing habits; the treatment appears worse early, then improves as users adapt. Kohavi et al. note novelty and primacy are "significant causes of treatment effects changing over time but are not the sole causes" (sources).
Detection and mitigation:
| Signal | Method |
|---|---|
| Week 1 lift much larger than week 2+ | Segment metric by experiment week; compute week-over-week trend |
| Effect reversal after ship | Look for Kendall's tau trending toward zero over 14+ day window |
| New-user cohort differs from returning-user cohort | Segment by first_exposure_date - new users see no novelty decay |
Microsoft ExP found "14-day surprises" - the second week's estimate falling outside the first week's 3-sigma CI - at roughly 4% of experiments, far more than the theoretical rate (sources). Minimum run time: two full weeks before drawing ship conclusions from experiments that change UI patterns; feature launches with no UX learning curve may need only one week.
Step 4 - Interaction effects
An experiment running concurrently with other experiments may have its treatment effect inflated, deflated, or reversed by interference.
Two types:
Between-experiment interaction: variant A of experiment X and variant B of experiment Y are assigned to overlapping user populations. If the two treatments interact (positively or negatively), the OEC measured for X is partly caused by Y's presence (Microsoft ExP, "A/B Interactions: A Call to Relax", sources).
Treatment spillover: a social or marketplace product where treating some users changes outcomes for untreated users in the same experiment (network effects). The control group is contaminated; the measured effect is attenuated. Kohavi et al. (ISBN 9781108724265) categorise this as a stable unit treatment value assumption (SUTVA) violation.
Detection checklist:
| Check | Pass criterion |
|---|---|
| Concurrent experiment audit | List all experiments running in the same user population during the experiment window |
| Mutual-exclusion / interaction check | For each concurrent experiment: did assignment overlap create a joint condition that was never intended? |
| SUTVA plausibility | Is the metric a per-user metric (e.g., clicks) or a network metric (e.g., messages sent to others)? Network metrics need holdout or cluster-level randomisation |
If a significant interaction is identified, the measured effect is confounded. Options: (a) isolate with mutual exclusion and re-run, (b) include the interaction term in a factorial model, (c) block ship pending analysis.
Step 5 - Simpson's paradox
The aggregate OEC lift may be positive while every segment shows a negative or neutral lift - or vice versa. This is Simpson's paradox.
Simpson's paradox is when "a trend appears in several groups of data but disappears or reverses when the groups are combined" (Wikipedia, sources).
In A/B testing, it surfaces when:
Detection:
For each major segment (device, country, user-cohort, new vs returning):
1. Compute per-segment OEC lift and CI.
2. Verify direction is consistent with the aggregate result.
3. Check that per-segment traffic allocation matches the overall ratio.If direction flips in a large segment: the aggregate result is misleading. Segment-level results are the truth; the aggregate is an artefact of unequal allocation. Do not ship on a positive aggregate with a negative segment that represents > 20% of users.
The ab-test-validity-checklist Step 7 includes a "segment-stability" gate for this reason - this skill provides the interpretive depth behind that gate.
Step 6 - Guardrail check before ship
Per references/guardrails.md: no ship decision is valid without confirming that no guardrail metric has breached its block threshold. (Guardrail declaration, thresholds, and multiple-comparison correction live there and in references/thresholds-and-corrections.md; the peeking discipline behind the "reached its pre-declared end" premise is references/peeking.md.)
Ordered check:
1. Load the guardrail dashboard for the experiment.
2. For each declared guardrail metric:
a. Is the observed change within the alert threshold? (investigate, but not blocked)
b. Does the observed change breach the block threshold? (STOP - no-ship)
3. If any guardrail is on alert: document the finding and make an
explicit call (accepted risk + rationale OR extend experiment).
4. If all guardrails are within alert thresholds: proceed to ship.Common guardrail check failures before ship:
| Anti-pattern | Consequence |
|---|---|
| OEC positive, latency guardrail in alert band, ship anyway | Regression ships; support tickets spike |
| Checking guardrails at 80% of sample (early) | Underpowered - guardrail CIs wide; false safe signal |
| Ignoring guardrails with wide CIs because "p > 0.05" | Wide CI is not clearance; it means underpowered, not unaffected |
| Trust guardrail omitted (opt-out rate) | Long-term retention damage, not captured by OEC |
Measuring only the OEC can "disregard important information" (Nielsen Norman Group, sources) - always check guardrails alongside it.
Example
Scenario: Redesigned onboarding flow experiment. Declared OEC: 7-day activation rate. MPSE: +0.5pp absolute. Alpha 0.05, 80% power. Ran 14 days. Result reads: lift = +1.2pp (95% CI: +0.3pp, +2.1pp).
Step 1 - Practical significance: Point estimate +1.2pp > MPSE +0.5pp. Lower CI bound +0.3pp is below MPSE. Minimum realistic effect is 0.3pp - marginal. Discuss with product whether 0.3pp justifies the complexity.
Step 2 - CI read: CI entirely above zero; statistically significant. Width (1.8pp) is moderate. Acceptable - not underpowered.
Step 3 - Novelty check: Week 1 lift was +2.1pp; week 2 lift was +0.9pp. Declining trend. Novelty effect likely inflating week 1. Use week 2 estimate (+0.9pp) as the stable-state estimate - still above MPSE.
Step 4 - Interaction: No other experiment running in onboarding funnel. SUTVA: metric is per-user (not network). Clear.
Step 5 - Simpson's: Mobile segment (45% of traffic): lift +0.7pp. Desktop segment (55%): lift +1.6pp. Directions consistent; no paradox.
Step 6 - Guardrails: API p95 latency +3% (alert threshold +5% or +50ms block). Within alert, no breach. DAU stable. Opt-out rate flat. All green.
Ship decision: Ship, citing week-2 stable estimate +0.9pp and clean guardrails. Document novelty decay in the ship note.
Anti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| Ship on week-1 lift alone | Novelty effect inflates early results; may revert | Run at least 2 weeks; compare week 1 vs week 2 |
| Treat p-value < 0.05 as "the result" | Binary; ignores magnitude, direction, and CI width | Read the CI; compare CI to MPSE |
| Skip segment analysis | Simpson's paradox hidden in aggregate | Always segment by device, new vs returning, country |
| Ignore guardrail alerts as "not significant" | Wide CI is not clearance | Investigate every alert before ship |
| Ship on practical but not statistical significance | Effect may be noise at that magnitude | Wait for power target |
| Treat post-ship metric as experiment validation | Observational data after ship mixes causation | Experiment result is causal; post-ship is not |
| Combine result across concurrent experiments without interaction check | Confounded OEC | Audit the concurrent experiment list |
| Ship "because the direction is right" on a CI that crosses zero | Inconclusive result | Extend runtime or accept null |
Limitations
References
Full source attributions and verbatim quotes: references/sources.md. Primary source is Kohavi, Tang, Xu, Trustworthy Online Controlled Experiments (Cambridge Univ. Press, 2020, ISBN 9781108724265). Deep methodology: references/peeking.md, references/guardrails.md, references/thresholds-and-corrections.md; companion catalog ab-test-validity-checklist.
Guardrail metrics
View source (opens in new window)Guardrail metrics
A guardrail metric is a measure that must not significantly degrade for an experiment to ship, even if the primary metric (the OEC - Overall Evaluation Criterion) improves. The guardrail prevents "we shipped 5% revenue improvement, but latency 30% worse and we discovered too late." Per Kohavi et al. Trustworthy Online Controlled Experiments (Cambridge Univ. Press, ISBN 978-1108724265), this is "the most important class of metrics after the OEC."
This reference is consumed by ab-test-validity-checklist and the SDK harnesses in experiment-sdk-testing.
How to use this reference
When to use
The guardrail taxonomy
Four classes:
| Class | Examples | Why |
|---|---|---|
| Quality / engineering | API p95 latency, error rate, crash rate, time-to-first-byte | A degraded experience is bad even with metric wins |
| Engagement | DAU, MAU, sessions per user, time on site | Engagement loss is a strategic loss |
| Revenue | Gross revenue, conversion rate, ARPU | Direct business impact |
| Trust | Opt-out rate, unsubscribe rate, complaint rate | Long-term churn signal |
Microsoft's Experimentation Platform team writes that "we're always warning our customers to be vigilant when running A/B tests" and that "we warn them about the pitfalls of even tiny SRMs (sample ratio mismatches)" (A/B Interactions: A Call to Relax (opens in new window)). Tiny SRMs (per the peeking.md (opens in new window) sibling concept) and degraded guardrails are the canonical ship-and-regret sources.
The OEC vs guardrail relationship
Per Kohavi et al.: the OEC is one metric (or a weighted combination), declared in advance, with a power calculation. The guardrails are the rest of the dashboard - short-term loss is acceptable if within bounds, but a significant degradation blocks ship.
Standard guardrails - the canonical set
| Domain | Guardrail | Direction |
|---|---|---|
| Web app | TTFB, LCP, INP (Core Web Vitals) | Should not increase |
| API | p95 / p99 latency, error rate, 5xx rate | Should not increase |
| Mobile | Crash rate, ANR rate, app start time | Should not increase |
| Engagement | DAU, sessions / user, retention day 7 | Should not decrease |
| Revenue | Gross revenue, average order value, conversion | Should not decrease |
| Trust | Opt-out rate, complaint rate, refund rate | Should not increase |
Per Kohavi et al.: always include a quality guardrail (latency / error) - the most-missed category in real experiments.
Pre-commitment vs post-hoc
Guardrails must be declared before the experiment starts. Per Kohavi et al.: post-hoc guardrails are p-hacking - if you look at 50 metrics, some will spuriously fail.
Worked example - declare every guardrail in the experiment config before the experiment starts:
experiment: feed-ranking-v3
oec: ctr_per_session
power:
primary_metric: ctr_per_session
expected_effect: +1.5%
alpha: 0.05
beta: 0.20
guardrails:
- metric: api_p95_latency
direction: not-increase
block_threshold: +10% or +50ms
- metric: dau
direction: not-decrease
block_threshold: -1%
- metric: error_rate
direction: not-increase
block_threshold: +0.1pp absoluteThe block_threshold on api_p95_latency uses the max(%, absolute) rule so a fast endpoint can't ship a small absolute regression that a percentage alone would miss.
Anti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| OEC + zero guardrails | Cargo-cult "ship the metric improvement" | Always include latency + error |
| Guardrails added after seeing results | p-hacking variant; non-causal | Pre-commit guardrails |
| Same alpha across OEC + 50 guardrails | Inflated false-positive rate | Bonferroni / FDR correction |
| Guardrail thresholds invented post-hoc | Move the goalposts | Pre-commit thresholds |
| Single block-threshold (no alert level) | Pass / fail; no surface for "investigate" | Two-tier: alert + block |
| Guardrail in % only on fast endpoint | 10% of 10ms = nothing; ship a 9ms regression | Use max(% , absolute) |
| No mobile-specific guardrails on a mobile experiment | Web-shaped metrics miss crash / ANR | Per-surface guardrails |
| Re-using last experiment's guardrails verbatim | New experiment, new failure modes | Per-experiment review |
Limitations
Setting thresholds and correcting alpha - deep reference
Once the guardrail set is declared, the quantitative evaluation rules live in one companion reference:
References
The peeking problem
View source (opens in new window)The peeking problem
In classical (fixed-horizon) hypothesis testing, the test is run once, on a pre-declared sample size, at a pre-declared alpha (typically 0.05). Looking at the data and stopping when significance is reached before the pre-declared end inflates the false-positive rate well above alpha - sometimes to 30%+ at naive 0.05.
This is the peeking problem. Per Kohavi et al. Trustworthy Online Controlled Experiments (ISBN 978-1108724265): "Repeated significance testing is one of the most common mistakes in practical A/B testing."
This reference is consumed by ab-test-validity-checklist and the sample-ratio-mismatch-detector agent.
How to use this reference
When to use
Why naive peeking inflates false positives
At alpha=0.05, the test is calibrated to give a 5% false-positive rate if you look once. If you look every day for 30 days and ship at the first significance - at each look, the test has a fresh chance to spuriously hit. The total false-positive rate compounds.
Per Microsoft Experimentation Platform research (microsoft.com/en-us/research/group/experimentation-platform-exp/ (opens in new window)): common patterns that surface this - dashboards that update hourly, "early-stop" buttons in experimentation UIs, manager asks for "where are we now?" mid-experiment.
Three corrections
1. Fixed-horizon test (pre-declared)
Decide N in advance via power analysis; collect N samples; do one test; ship or not. No peeking, no early stop.
Pros: standard p-value interpretation, full alpha budget on the declared test.
Cons: must wait for N. Cannot stop early on obvious winners (opportunity cost) or obvious losers (continuing risk).
2. Sequential testing with alpha-spending
Pre-commit to multiple looks, each with a fraction of the alpha budget. Two canonical schedules:
| Schedule | Pattern |
|---|---|
| Pocock | Equal alpha at each look; symmetric |
| O'Brien-Fleming | Tiny alpha early, large alpha late; conservative early-stop |
Implementation: declare K looks in advance; at each look k, the rejection threshold is computed from the cumulative alpha spent (per the schedule). If the test stat exceeds the threshold, stop.
Math: Σ alpha_k = alpha_total.
3. Always-valid inference / mSPRT
Per Johari, Pekelis, Walsh "Always Valid Inference" (paper ID: arXiv:1512.04922) and related work, the mixture sequential probability ratio test (mSPRT) lets you peek arbitrarily often without inflating alpha. The trade-off: less powerful per sample than fixed-horizon.
This is the foundation of "valid sequential" experimentation in Optimizely / Statsig / similar - they expose p-values that are always valid under continuous monitoring.
Per Optimizely's sequential-testing docs (a derivative of mSPRT): the platform allows the user to look at any time; the p-value remains valid.
Visual intuition
| Approach | Look 1 (day 1) | Look 30 (day 30) | Final |
|---|---|---|---|
| Naive fixed-horizon | Don't look | Don't look | Look once at day 30, alpha=0.05 |
| Fixed-horizon + early-stop = WRONG | "Hmm 0.04, ship!" | n/a | False positive risk inflated |
| Pocock 5 looks | alpha=0.016 (=0.05/√5 ish) | alpha=0.016 | Sum ≤ 0.05 |
| mSPRT / always-valid | Look any time; p-value valid | Look any time | Same alpha guarantee |
Decision boundary in tests
Tests for an experimentation platform must verify:
| Behaviour | Test |
|---|---|
| Naive p-value not auto-significant on peek | Run synthetic A/A test; look 100×; ≤5% false positives |
| Sequential adjustment correctly enforced | At look N, threshold matches the declared schedule |
| Stop-early threshold consistent with declared method | Pocock vs O'Brien-Fleming asymmetric on early vs late |
| Always-valid p-value never decreases below declared alpha | Simulate; check never-exceeds-alpha |
| Ship-decision gate enforces the peek-protected p-value | Mock low-p naive p, observe gate rejection |
Worked example - stacking peeking + guardrail corrections
Per guardrails.md (opens in new window): the guardrail-correction (Bonferroni / FDR) stacks with the peeking correction. Don't apply only one if both are needed.
For an experiment with one OEC, 10 guardrails, and 5 looks:
| Naive alpha per look per metric | 0.05 |
|---|---|
| With 5 looks alpha-spending | 0.011 per look |
| With Bonferroni for 11 metrics at each look | 0.001 per (look, metric) |
The strict math is rarely applied this thoroughly; pragmatically most platforms apply sequential + per-metric alpha but not formal multi-comparison correction across guardrails.
Anti-patterns
| Anti-pattern | Why it fails | Fix |
|---|---|---|
| Peek + early-stop on naive p-value | False positive rate explodes | Use sequential / always-valid |
| Dashboards refresh hourly, treated as "data" | Implicit peeking; humans see + react | Lock decisions to pre-declared look schedule |
| Stop-loss without symmetric stop-win | One-sided peeking still inflates | Symmetric or pre-committed |
| "We'll just look once at midpoint" | One unscheduled look = one inflation event | Either fixed-horizon OR sequential - not "fixed + one peek" |
| Different metric uses different schedule | Coordination mismatch; inconsistent alpha | One schedule per experiment |
| Re-running an experiment after p=0.06 to "find significance" | Garden of forking paths | Pre-commit; accept null result |
| Stop-early on a guardrail alone | Guardrails should be assessed at horizon | Stop-early only on OEC (with sequential math) |
| Treating "p=0.04 mid-experiment" as significant | Naive interpretation | Use the sequential / always-valid p-value |
Limitations
References
Sources and verbatim citations
View source (opens in new window)Sources and verbatim citations
Full source attributions for the interpretation steps in SKILL.md. Each inline [sources](references/sources.md) link points here.
Practical vs statistical significance (Step 1)
Nielsen Norman Group, A/B testing guide: results "may be statistically significant but not practically significant" - a test can show reliable differences that lack meaningful business value. nngroup.com/articles/ab-testing/ (opens in new window)
Confidence intervals (Step 2)
Statsig confidence-interval docs: "A 95% confidence interval should contain the true effect 95% of the time"; it is "an intuitive way to quantify the uncertainty" that gives "both directionality and magnitude of effects simultaneously." docs.statsig.com/experiments/statistical-methods/confidence-intervals (opens in new window)
Microsoft ExP variance-reduction research: CUPED and similar techniques produce "narrower confidence intervals, with values that are closer to the estimated effect" without sacrificing the false-positive rate. microsoft.com/en-us/research/group/experimentation-platform-exp/articles/deep-dive-into-variance-reduction/ (opens in new window)
Novelty and primacy effects (Step 3)
Kohavi, Tang, Xu, Trustworthy Online Controlled Experiments (Cambridge Univ. Press, 2020, ISBN 9781108724265): "novelty and primacy effects are significant causes of treatment effects changing over time but are not the sole causes."
Microsoft ExP external-validity research: "14-day surprises" - the second week's estimate falling outside the first week's 3-sigma confidence interval - occurred at roughly 4% of experiments, far more than the theoretical rate. microsoft.com/en-us/research/group/experimentation-platform-exp/articles/external-validity-of-online-experiments-can-we-predict-the-future/ (opens in new window)
Wikipedia, novelty effect: a temporary boost from "introducing new elements on some activity or behavior" rather than underlying improvement. en.wikipedia.org/wiki/Novelty_effect (opens in new window)
Interaction effects (Step 4)
Microsoft ExP, "A/B Interactions: A Call to Relax": addresses A/B interactions in concurrent experiment design alongside the pitfalls of even tiny SRMs. microsoft.com/en-us/research/group/experimentation-platform-exp/articles/ (opens in new window)
Kohavi et al. (ISBN 9781108724265) categorise treatment spillover as a stable unit treatment value assumption (SUTVA) violation.
Simpson's paradox (Step 5)
Wikipedia, Simpson's paradox: "a trend appears in several groups of data but disappears or reverses when the groups are combined." Canonical Berkeley admissions example: men were admitted at higher aggregate rates (44% vs 35%) while women had better odds in most individual departments, because women applied to more competitive departments. en.wikipedia.org/wiki/Simpson%27s_paradox (opens in new window)
Guardrails (Step 6)
Nielsen Norman Group: "if you measure only one metric to determine whether your test is successful, you might disregard important information." nngroup.com/articles/ab-testing/ (opens in new window)
Companion catalogs
ab-test-validity-checklist; sibling references peeking.md (opens in new window) and guardrails.md (opens in new window).
Guardrail thresholds and multiple-comparison correction
View source (opens in new window)Guardrail thresholds and multiple-comparison correction
Deep reference for guardrails.md (opens in new window). Consult when setting per-metric alert/block levels and correcting alpha across the OEC + N guardrails.
Setting guardrail thresholds
A guardrail typically has two levels:
| Threshold | What |
|---|---|
| Alert | A statistically significant degradation; investigate before ship |
| Block | A degradation past a pre-declared limit; ship-decision flips to "no" |
Example for API latency p95:
| Level | Threshold |
|---|---|
| Alert | Any statistically significant increase |
| Block | > 10% increase OR > 50ms absolute increase, whichever is greater |
The "whichever is greater" handles fast endpoints where 10% is trivially small in absolute terms.
Multiple-comparison correction
With one OEC + N guardrails (typically 10-20), a fixed-alpha significance test means you'll see N×0.05 false positives on average. Per Kohavi et al., apply Bonferroni or Benjamini- Hochberg correction:
| Method | When |
|---|---|
| Bonferroni | Strict; alpha / N. Use when missing a true regression is catastrophic |
| Benjamini-Hochberg (FDR) | Less strict false-discovery-rate control; use for general guardrail dashboards |
Reference
Related skills
ab-test-validity-checklist
Workflow skill that builds an A/B-test validity checklist from an experiment proposal, walking the canonical design-correctness gates - pre-registered OEC/power/guardrails, randomization unit + SRM check, assignment integrity, telemetry, peeking discipline, novelty/primacy, post-experiment SRM re-check - into a per-experiment checklist + sign-off form. Use when launching, auditing, or governing an experiment. For pitfall mechanics (guardrails, peeking) see experiment-results-interpreter's references; to read an already-valid result use experiment-results-interpreter; for per-SDK harness tests use experiment-sdk-testing - this gates DESIGN, not SDK code.
experiment-sdk-testing
Umbrella for experimentation-SDK test harnesses: the shared offline-datafile / hermetic-init pattern (commit a point-in-time flag/experiment config fixture, initialize the SDK with no network, pin arms per test, assert assignment integrity), with per-vendor references for Statsig (localMode + overrideGate), Optimizely (datafile + forced decisions), Split.io / Harness FME (localhost mode + features map or YAML fixture), Amplitude Experiment (local evaluation + bootstrap), and VWO (settings file + deterministic bucketing). Use when writing tests for application code instrumented with any of these five experimentation SDKs; for experiment DESIGN gates use ab-test-validity-checklist, and to read results use experiment-results-interpreter.
feature-flag-test-matrix-reference
Feature-flag test matrix design: the flag-state combinatorics problem (N flags × M variants × K user-segments = N×M×K test cases), the canonical coverage strategies (pairwise interaction coverage; default-only smoke; full matrix; risk-driven matrix), the workflow for building the coverage suite from a flag inventory (grep-based inventory, per-flag classification, PICT pairwise generation, per-cell test skeletons), the dedicated kill-switch test categories (references/killswitch.md: graceful degradation, fail-static default, kill latency, mid-flight consistency), and the flags-vs-experiments distinction. Use when designing the flag-test surface for a new project, building or auditing flag-test coverage, or authoring kill-switch tests.
launchdarkly-testing
Wraps LaunchDarkly server-side SDK testing patterns: TestData data source for hermetic tests (no network), file-based data source for fixture-driven tests, flag override patterns (TestData.update for per-test flag values), and assignment-integrity tests. Use when writing tests for code that uses LaunchDarkly flags; to decide which flag combinations those tests should cover in the first place, see feature-flag-test-matrix-reference.
openfeature-sdk-testing
Wraps OpenFeature (CNCF vendor-neutral SDK abstraction) testing patterns: the InMemoryProvider for hermetic tests without network calls, provider registration via OpenFeature.setProvider, the getBooleanValue/getBooleanDetails evaluation API with EvaluationDetails (value, variant, reason, errorCode), hooks for evaluation side-effects, and evaluation context for targeting-rule tests. Covers TypeScript, Java, and Python SDKs, plus per-vendor hermetic-bootstrap references for Unleash (bootstrap toggles), Flagsmith (offline LocalFileHandler), and GrowthBook (initSync payload). Use when writing tests for code that resolves feature flags through the OpenFeature SDK or the Unleash / Flagsmith / GrowthBook native SDKs; LaunchDarkly has its own skill (launchdarkly-testing).