Testland
Browse all skills & agents

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-interpreter
View source

experiment-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:

  1. Shipping a result that is statistically significant but not practically meaningful.
  2. Shipping a result that will not persist because it reflects novelty, primacy, or interaction artefacts rather than genuine long-term user value.

This skill is a pure reference for data scientists and PMs reading final experiment dashboards.

When to use

  • Reading the results of an experiment that has reached its pre-declared sample size or end date.
  • Preparing the ship/no-ship decision document.
  • Auditing a past ship decision that produced unexpected post-launch outcomes.
  • Coaching a PM or analyst who is over-indexing on p-values or under-checking guardrails.

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:

QuestionHow 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 positionInterpretation
Entirely above zero and above MPSEStrong positive - candidate for ship
Entirely above zero, partially below MPSEPositive but magnitude uncertain - extend or accept lower bound as the working estimate
Crosses zeroInconclusive; do not ship on this signal
Entirely below zeroNegative 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:

SignalMethod
Week 1 lift much larger than week 2+Segment metric by experiment week; compute week-over-week trend
Effect reversal after shipLook for Kendall's tau trending toward zero over 14+ day window
New-user cohort differs from returning-user cohortSegment 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:

CheckPass criterion
Concurrent experiment auditList all experiments running in the same user population during the experiment window
Mutual-exclusion / interaction checkFor each concurrent experiment: did assignment overlap create a joint condition that was never intended?
SUTVA plausibilityIs 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:

  • Traffic allocation differs across segments (e.g., mobile gets 60% of control but 40% of treatment due to a holdout policy or ramp-up).
  • The OEC baseline differs strongly across segments (e.g., power users convert at 12%, new users at 2%).
  • The treatment effect differs in sign across segments.

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-patternConsequence
OEC positive, latency guardrail in alert band, ship anywayRegression 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-patternWhy it failsFix
Ship on week-1 lift aloneNovelty effect inflates early results; may revertRun at least 2 weeks; compare week 1 vs week 2
Treat p-value < 0.05 as "the result"Binary; ignores magnitude, direction, and CI widthRead the CI; compare CI to MPSE
Skip segment analysisSimpson's paradox hidden in aggregateAlways segment by device, new vs returning, country
Ignore guardrail alerts as "not significant"Wide CI is not clearanceInvestigate every alert before ship
Ship on practical but not statistical significanceEffect may be noise at that magnitudeWait for power target
Treat post-ship metric as experiment validationObservational data after ship mixes causationExperiment result is causal; post-ship is not
Combine result across concurrent experiments without interaction checkConfounded OECAudit the concurrent experiment list
Ship "because the direction is right" on a CI that crosses zeroInconclusive resultExtend runtime or accept null

Limitations

  • This skill does not validate the experiment harness. SRM, telemetry, and peeking discipline belong in ab-test-validity-checklist. This skill assumes the harness is valid.
  • Novelty / primacy detection requires two or more weeks of data. Products under launch pressure may not have it.
  • Interaction effects are hard to detect without factorial design. Audit-based detection (Step 4) is heuristic, not conclusive.
  • Simpson's paradox analysis surfaces the descriptive pattern, not the causal explanation. Requires domain knowledge to resolve.
  • Guardrail thresholds are pre-declared. Post-hoc threshold adjustment to clear a guardrail is p-hacking; this skill cannot prevent that without governance enforcement.

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

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

  1. Pick the guardrail set for the experiment's surface (web / API / mobile / revenue / trust) from the canonical-set table.
  2. Declare each guardrail - metric, direction, block threshold - in the experiment config before launch (see the pre-commitment worked example below).
  3. Set two-tier levels per metric (alert + block), using max(%, absolute) on fast endpoints - see thresholds-and-corrections.md (opens in new window).
  4. Correct for multiple comparisons across the OEC + N guardrails (Bonferroni / FDR) - see thresholds-and-corrections.md (opens in new window).
  5. Gate the ship: block if any guardrail crosses its pre-declared block threshold, even when the OEC wins.

When to use

  • Designing the metric set for a new experiment.
  • PR review of experiment config changes.
  • Pre-ship review: did we have guardrails on the right things?
  • Investigating "we shipped X but Y broke" incidents.

The guardrail taxonomy

Four classes:

ClassExamplesWhy
Quality / engineeringAPI p95 latency, error rate, crash rate, time-to-first-byteA degraded experience is bad even with metric wins
EngagementDAU, MAU, sessions per user, time on siteEngagement loss is a strategic loss
RevenueGross revenue, conversion rate, ARPUDirect business impact
TrustOpt-out rate, unsubscribe rate, complaint rateLong-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

  • OEC - the metric you want to improve (e.g., revenue, signups, retention).
  • Guardrail - the metric you don't want to break (e.g., latency, error rate).
  • Driver - intermediate metric that explains why OEC changes (e.g., click-through rate explains conversion).

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

DomainGuardrailDirection
Web appTTFB, LCP, INP (Core Web Vitals)Should not increase
APIp95 / p99 latency, error rate, 5xx rateShould not increase
MobileCrash rate, ANR rate, app start timeShould not increase
EngagementDAU, sessions / user, retention day 7Should not decrease
RevenueGross revenue, average order value, conversionShould not decrease
TrustOpt-out rate, complaint rate, refund rateShould 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 absolute

The 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-patternWhy it failsFix
OEC + zero guardrailsCargo-cult "ship the metric improvement"Always include latency + error
Guardrails added after seeing resultsp-hacking variant; non-causalPre-commit guardrails
Same alpha across OEC + 50 guardrailsInflated false-positive rateBonferroni / FDR correction
Guardrail thresholds invented post-hocMove the goalpostsPre-commit thresholds
Single block-threshold (no alert level)Pass / fail; no surface for "investigate"Two-tier: alert + block
Guardrail in % only on fast endpoint10% of 10ms = nothing; ship a 9ms regressionUse max(% , absolute)
No mobile-specific guardrails on a mobile experimentWeb-shaped metrics miss crash / ANRPer-surface guardrails
Re-using last experiment's guardrails verbatimNew experiment, new failure modesPer-experiment review

Limitations

  • Guardrails are negative-defined. They prevent ship-and-regret; they don't measure success.
  • Latency-as-guardrail interacts with caching. A cache hit rate shift changes apparent latency without product impact.
  • Engagement guardrails are noisy. DAU varies with day-of- week, seasonality. Require longer experiments to surface signal.
  • Pre-commitment is hard to enforce. Code review of experiment configs is the only practical gate.
  • Guardrail-only dashboards miss the bigger picture. Pair with a counterfactual analysis dashboard.

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

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

  1. Choose the analysis regime up front: fixed-horizon (no peeking) or a peek-protected method (sequential alpha-spending or always-valid / mSPRT) - see the three corrections below.
  2. If you must stop early, pick a sequential schedule (Pocock vs O'Brien-Fleming) or mSPRT, and pre-declare it before launch.
  3. Lock the look schedule: hourly dashboards and "where are we now?" checks are not decision looks - only the pre-declared schedule is.
  4. Read the peek-protected p-value at the gate, never the naive mid-experiment p-value.
  5. Stack corrections: if the experiment also has guardrails, combine the peeking correction with the guardrail (Bonferroni / FDR) correction - see the worked example below.

When to use

  • Designing the stop-early policy for an experiment platform.
  • Auditing an "early ship" decision - was the math valid?
  • PR review of a new experiment dashboard / analysis flow.
  • Investigating "we shipped, then the effect disappeared."

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:

SchedulePattern
PocockEqual alpha at each look; symmetric
O'Brien-FlemingTiny 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

ApproachLook 1 (day 1)Look 30 (day 30)Final
Naive fixed-horizonDon't lookDon't lookLook once at day 30, alpha=0.05
Fixed-horizon + early-stop = WRONG"Hmm 0.04, ship!"n/aFalse positive risk inflated
Pocock 5 looksalpha=0.016 (=0.05/√5 ish)alpha=0.016Sum ≤ 0.05
mSPRT / always-validLook any time; p-value validLook any timeSame alpha guarantee

Decision boundary in tests

Tests for an experimentation platform must verify:

BehaviourTest
Naive p-value not auto-significant on peekRun synthetic A/A test; look 100×; ≤5% false positives
Sequential adjustment correctly enforcedAt look N, threshold matches the declared schedule
Stop-early threshold consistent with declared methodPocock vs O'Brien-Fleming asymmetric on early vs late
Always-valid p-value never decreases below declared alphaSimulate; check never-exceeds-alpha
Ship-decision gate enforces the peek-protected p-valueMock 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 metric0.05
With 5 looks alpha-spending0.011 per look
With Bonferroni for 11 metrics at each look0.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-patternWhy it failsFix
Peek + early-stop on naive p-valueFalse positive rate explodesUse sequential / always-valid
Dashboards refresh hourly, treated as "data"Implicit peeking; humans see + reactLock decisions to pre-declared look schedule
Stop-loss without symmetric stop-winOne-sided peeking still inflatesSymmetric or pre-committed
"We'll just look once at midpoint"One unscheduled look = one inflation eventEither fixed-horizon OR sequential - not "fixed + one peek"
Different metric uses different scheduleCoordination mismatch; inconsistent alphaOne schedule per experiment
Re-running an experiment after p=0.06 to "find significance"Garden of forking pathsPre-commit; accept null result
Stop-early on a guardrail aloneGuardrails should be assessed at horizonStop-early only on OEC (with sequential math)
Treating "p=0.04 mid-experiment" as significantNaive interpretationUse the sequential / always-valid p-value

Limitations

  • Always-valid inference is less powerful. Same effect size requires more samples than fixed-horizon. Trade convenience for sample efficiency.
  • Sequential methods require pre-declared schedules. The alpha-spending isn't "fluid"; the schedule is fixed in advance.
  • Multiple-testing correction across many metrics is brutal. Per-metric alpha after Bonferroni × 20 metrics = 0.0025.
  • Operator behaviour is the real bottleneck. Math is robust to peeking; humans are not. Education + UI gating matter.
  • Doesn't help with novelty / primacy effects. Statistical validity doesn't fix "users react to change, then revert."

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:

ThresholdWhat
AlertA statistically significant degradation; investigate before ship
BlockA degradation past a pre-declared limit; ship-decision flips to "no"

Example for API latency p95:

LevelThreshold
AlertAny 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:

MethodWhen
BonferroniStrict; 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

  • Kohavi, Tang, Xu. Trustworthy Online Controlled Experiments (Cambridge University Press, 2020). ISBN 978-1108724265.

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).