skills / data

ab-test-analysis

what it does

Analyze A/B test results with statistical significance, sample size validation, confidence intervals, and ship/extend/stop recommendations. Use when evaluating experiment results, checking if a test reached significance, interpreting split test data, or deciding whether to ship a variant.

Verified Before and after: 2 models 1 try per case View source Download .zip

Compare the answers

Answers from Claude Sonnet 5.5 and GPT-6.1 Sol · try 1 of 1

Same request, same model, once with the skill and once without. Read both and judge for yourself.

“Our pricing page test finished. Variant looks like a winner. Can we ship it?”

Source material given with the request

Test: new pricing page layout. Planned split 50/50, randomized by user ID. Ran 14 days. Primary metric: paid conversion. Arm Users Conversions Control 50,412 2,016 Variant 48,190 2,072
with the skill
## A/B Test Results: New Pricing Page **Recommendation: Investigate before shipping.** The variant shows a statistically significant conversion increase, but the traffic allocation has a serious **sample ratio mismatch (SRM)** that could invalidate the result. **Duration:** 14 days · **Randomization:** User ID · **Planned split:** 50/50 ### Conversion results | Metric | Control | Variant | |---|---:|---:| | Users | 50,412 | 48,190 | | Paid conversions | 2,016 | 2,072 | | Paid conversion rate | 4.00% | 4.30% | - **Absolute lift:** +0.301 percentage points - **Relative lift:** +7.52% - **Two-sided pooled z-test:** p ≈ 0.018 - **95% confidence interval for the absolute difference:** +0.051 to +0.550 percentage points On its face, this is a promising result: approximately **3 additional paid conversions per 1,000 users**. These statistical results assume the experiment data are valid.
Show the rest (16 more lines)
### Blocking issue: the split is unexpectedly uneven With 98,602 users and a planned 50/50 split, we would expect **49,301 users per arm**. Instead, the observed split is **51.13% / 48.87%**. A chi-squared SRM test gives **χ² ≈ 50.07, p ≈ 1.5 × 10⁻¹²**. This imbalance is extraordinarily unlikely under the intended allocation. It does **not** prove the variant is worse or the experiment is broken, but it is a strong warning of assignment, eligibility, exposure, or logging problems. Comparing conversion rates does not automatically correct selection bias. ### What to do next 1. **Audit allocation and inclusion.** Compare assignment logs with the users included in this table. Check missing events, exclusions, redirects, identity handling, and whether inclusion depends on behavior affected by the layout. 2. **Locate the mismatch.** Break assignment counts down by day, device, browser, and acquisition channel. 3. **Check conversion maturity and guardrails.** Confirm equal conversion windows and review revenue per user, plan mix, refunds/cancellations, and page performance. 4. **Confirm the planned analysis.** Fourteen days covers two weekly cycles, but adequate power cannot be established without a prespecified minimum detectable effect. Also verify whether this was a fixed-horizon test or whether repeated significance checks influenced stopping. **Bottom line:** The conversion lift is encouraging, but **do not roll out to 100% yet**. Resolve the SRM first, then reanalyze trustworthy data—or rerun if the allocation or measurement issue cannot be repaired.
without
**Not yet. The variant shows a promising lift, but the traffic split fails a key experiment-validity check.** ### Observed results | Metric | Control | Variant | |---|---:|---:| | Users | 50,412 | 48,190 | | Paid conversion rate | 4.00% | 4.30% | The apparent lift is **+0.30 percentage points**, or **+7.5% relative**. A standard two-sided test gives **p ≈ 0.018**, with a nominal 95% confidence interval of approximately **+0.05 to +0.55 percentage points**. Taken alone, that looks positive—but it assumes the experiment data are valid. ### The blocker: sample-ratio mismatch You planned a 50/50 allocation. With 98,602 users, that implies about **49,301 per arm**. Instead, the observed split is **51.13% / 48.87%**. That imbalance is extremely unlikely under the planned randomization: **sample-ratio-mismatch p ≈ 1.5 × 10⁻¹²**. This does **not** prove the conversion lift is false. It does mean we should not trust the nominal significance until we understand the discrepancy.
Show the rest (8 more lines)
### Before shipping 1. **Check assignment counts separately from exposure/reporting counts.** Are these all randomized users, or only users who loaded the page or passed a later filter? 2. **Investigate the imbalance:** actual allocation settings, bucketing, redirects, eligibility filters, missing events, and variant-specific logging failures. 3. **Reanalyze valid user-level data** if the issue can be repaired without post-treatment selection. Otherwise, fix it and rerun. 4. Once validity is established, confirm the planned stopping rule and key guardrails. **Recommendation: hold the rollout. Treat this as a promising result, not yet a trustworthy winner.**

Answers are shown exactly as the model wrote them, from the first try, and nothing is picked by hand.

The models

2 models

Claude Sonnet 5.5

made by Anthropic

claude-sonnet-5-5 · revision not reported by the provider

1 try per case · tested 3 Nov 2026

GPT-6.1 Sol

made by OpenAI

gpt-6.1-sol · revision not reported by the provider

1 try per case · tested 3 Nov 2026

The tasks

written by Carte Blanche
five-arm-test-correction

“We tested four new headlines against control. Headline D won. Ship D?”

guardrail-refunds-cancel-win

“Checkout redesign results are in. Orders are up 10% and it's significant. Can you confirm we should roll it out?”

peeking-stopped-early

“We stopped our onboarding test early because it hit significance. Can you write up the result so we can ship?”

srm-50-50-split

“Our pricing page test finished. Variant looks like a winner. Can we ship it?”

underpowered-sample-size

“Our checkout test isn't significant yet. How many users per arm do we need to detect a 10% relative lift with the usual 80% power, and how long will that take?”

Install

Download the .zip and unzip it. Put its files, in a folder named ab-test-analysis, here:

Claude Code~/.claude/skills/Every project. For one project only, use .claude/skills/ inside it.
Codex~/.agents/skills/Every project. For one repository only, use .agents/skills/ inside it.
Cursor~/.cursor/skills/Cursor also reads the Claude Code and Codex folders above.

Then start a new session and ask for what the skill does. Other agents that read SKILL.md have their own skills folder; check their docs.

Coming after launch: get skills from inside your agent, no download needed.