A/B Test: Guardrails, CUPED, and a Human Call
By William Zhu & the InfiniSynapse Data Team · Published: 2026-08-22 · Last updated: 2026-08-24 · Last verified: 2026-08-24 · Next review: 2026-11-24 · Editorial standards · Corrections
Table of Contents
- TL;DR
- What an A/B Test Must End With
- A Ship-Hold-Iterate Framework
- How Teams Stop Short of the Call
- Tool Landscape for a Signed Memo
- Implementation Steps to the Human Line
- Desk Sample: Illustrative Hold after a Primary Win
- Selection Scorecard for the Last Line
- Failure Modes that Skip the Human Call
- Frequently Asked Questions
- Conclusion
TL;DR
We evaluate these patterns at the InfiniSynapse desk on sanitized composites; sample figures on this page are illustrative, not customer uplifts.
Direct answer: An a/b test is not finished when the interval is green. It ends in ship, hold, or iterate, signed by a named human, after guardrails and optional CUPED are written on the same memo as the SQL.
What you'll learn: why an a/b test is a three-way call; a six-row decision contract; when CUPED is a line and not a rescue; how to keep the design from being patched after freeze; an illustrative checkout hold; and the breaks that treat a chat as approval.
The hub method is A/B test analysis. This page is narrower: the last line of the comparison, not the first hypothesis.
What an A/B Test Must End With
Key Definition: An a/b test is a frozen randomized comparison that produces a ship, hold, or iterate memo a human signs, with named primary, guardrails, and inspectable SQL. The interval is a line in that memo. It is not the decision.
A structured document in RFC 8259 is a JSON object you can parse again. An a/b test should end as a structured object too: action, owner, window, CUPED state, and the query. A chat paragraph is not that object.
The comparison sits next to experiment analysis. That sibling starts with assignment. This page starts at the call you still owe after assignment is clean.
Ship, hold, or iterate is the product
Ship means the primary moved the right way, guardrails did not fail, and the owner accepts residual risk. Hold means you do not launch; the comparison may still be valid. Iterate means you keep the freeze, change a named thing, and run again with the same unit and the same kill metrics.
Natural language to SQL can be the execution path for the join. It is not a replacement for the last line. A memo that “recommends ship” in a bubble has skipped the product.
Do not patch the design after you see the number
JSON Patch is a listed set of operations. If you change the primary after a peek, write that as a new a/b test, not as a silent patch on the old one. Thawing the metric because the original looked flat is how holds become fake ships.
If variance reduction is the next object, continue in CUPED explained. CUPED can tighten an interval. It cannot choose ship.
A Ship-Hold-Iterate Framework
Every decision read should fill this table before anyone sends a launch email.
| Decision row | What you lock | Typical source | Failure if skipped |
|---|---|---|---|
| Action | Ship, hold, or iterate | Memo last line | Chat as approval |
| Owner | Named human | Same memo | Model as policy |
| Primary | One metric, one window | Outcome + note | Metric shopping |
| Guardrails | Named kills, joined or “not measured” | Adjacent tables | Silent harm |
| CUPED | Covariate name or off | Pre-period | Leaking tightness |
| SQL | Downloadable query | /tasks artifact | Slide-only lift |
Decision quality is the filled last line. “Looks good” is not an action. “Iterate on payment retry copy” is an action.
Web Linking describes relations you can follow. Assignment must link to outcomes the same way. A comparison whose join is implied in a screenshot cannot be signed.
How Teams Stop Short of the Call
Teams celebrate the badge. A comparison that stops at the badge still needs the call.
| Stopping place | Looks like progress | Why it is incomplete |
|---|---|---|
| Green interval | “We won” | Guardrail unread |
| CUPED-tight interval | “More confident” | Covariate unnamed |
| Exposed-only lift | “Users who saw it convert” | ITT missing |
| Agent paragraph | “The model says ship” | No owner |
Guardrails that veto a primary win
The comparison can win on checkout completion and still be a hold if refunds or latency move the wrong way. Pre-register those kills. If the join is missing, write “not measured” and consider a hold. Continue in guardrail metrics when the kill object is the gap.
Self-service analytics does not mean a PM ships from a sparkline. The memo still needs a reviewer who can open SQL.
CUPED as a line, not a rescue
Use CUPED on the comparison when a pre-period covariate is correlated with the outcome and the variant cannot change it. New users often have no such history; leave it off. Never apply CUPED to rescue a run you already stopped early. Name the covariate or do not use the method.
Tool Landscape for a Signed Memo
You do not need a new warehouse to finish the call. You need assignment, outcomes, a bound metric note, and a place to keep the memo. A dated CSV is valid if it includes assignment time.
InfiniSynapse can draft the memo on a source you authorize. It is not ChatBI. It does not invent a prebuilt experiment warehouse, and it does not write ship back into production. A data agent owns the trail in /tasks. The human owns the call.
Locale-stable metric names
CLDR exists so labels stay stable across locales. Bind “conversion” and “refund” the same way. A pack that uses a CMS string in one memo and a warehouse alias in another will produce two calls.
Unit grain that does not drift
H3 is a hierarchical index: you pick a resolution and you keep it. A pack that assigns users and analyzes sessions has changed resolution mid-map. Stop. Fix assignment. Then compute.
Data visualization of lift is fine after the call is drafted. Charts are not the signature.
If the artifact shape is the gap, use the experiment decision memo. If horizon math is the gap, use A/B test sample size.
Implementation Steps to the Human Line
Start from the frozen note. An a/b test that starts from “can we ship today” will shop for a metric.
Freeze, then join assignment to outcomes
Write unit, primary, window, and peeking rule. Confirm uniqueness and SRM. An a/b test on a join that uses first-event time instead of assigned_at will manufacture lift. Keep the randomizer’s IDs.
Bind kills and CUPED state before lift
List two or three guardrails. Set CUPED on or off with a named covariate. An a/b test that toggles CUPED after seeing the interval is a peek. Then ask for the memo: primary, interval, guardrails, balance, recommended action, SQL.
Write the call and the owner
The last sentence is ship, hold, or iterate plus a name. An a/b test does not ship itself. If marketing wants a public claim, raise the evidence bar before copy leaves the building.
Open the query. An a/b test without attached SQL is a slide. If the join is the missing file, continue in analyze experiment results in SQL.
Desk Sample: Illustrative Hold after a Primary Win
The following numbers are an illustrative desk composite, not a customer result and not an uplift claim.
| Item | Desk composite (illustrative) |
|---|---|
| Window | 42 days, assignment-stable |
| Units | 88,100 users; 50.0% / 50.0% |
| Primary | Checkout completion +1.9 pp (illustrative) |
| CUPED | Prior 28-day orders; named in note |
| Guardrail | Refund rate +0.4 pp (illustrative) |
| Recommended action | Hold |
| Owner | Checkout lead, named on memo |
This a/b test is useful because the call is Hold. A primary-only dashboard would have looked like Ship. The refund join is the finding. Iterate means rewrite retry copy, keep the same unit, and run again.
A second a/b test that reuses the refund definition is how the desk accumulates memory. A new CMS experiment with a new “conversion” string is how memory resets.

Figure. Illustrative desk composite (category × method). Not a customer experiment, SLA, or official benchmark.
| Evidence class | What you can cite | What you cannot claim |
|---|---|---|
| Desk composite on this page | Action, owner, inspectable SQL | Customer uplift or vendor bake-off |
| Published public sources above | Structured objects, links, indexes | That those RFCs ran this desk pack |
Desk composite: +1.9 pp primary, +0.4 pp refund → hold. Context: JSON objects, JSON Patch, Web Linking, CLDR, H3.
We ran this check on a sanitized composite at the InfiniSynapse desk on 2026-08-23. The inspect order for a/b test was the assignment table, the written primary, and both intervals. We stopped when treating a green badge as ship could still ship. The memo stayed in draft. Figures stay illustrative. What you can copy is the assignment join and the on/off rule, not a lift.
Selection Scorecard for the Last Line
Score from 1 to 5. An a/b test that cannot name an owner should not win on a prettier interval.
| Criterion | What “5” looks like | Disqualifier |
|---|---|---|
| Three-way call | Ship / hold / iterate written | “Looks good” |
| Owner | Named human | Model as policy |
| Guardrails | Joined or “not measured” | Primary-only ship |
| CUPED honesty | Named or off | Post-treatment feature |
| Audit | Memo + SQL | Chat-only winner |
| Freeze | No silent patch | Primary rewritten after peek |
An a/b test scores well when finance can replay the hold. It scores poorly when the stack implies a prebuilt warehouse you do not operate.
Failure Modes that Skip the Human Call
Write the break on the memo. Reviews go faster when the skip is explicit.
Treating a green badge as ship
A significant primary is not a launch. An a/b test still needs guardrails and an owner. Shipping from the badge is how refunds show up in the weekly ops pack.
Silent design patches
Changing the primary, the window, or the inclusion rule after a look is a new a/b test. Attach the exploratory chart. Do not treat the new metric as the frozen contract.
Model paragraph as approval
The draft can recommend. The owner signs. An a/b test that files the bubble and deletes the SQL has no replay. A fourth pattern is CUPED on a leaking covariate used to “make the hold go away.”
Before you open a workspace, check four things: a written three-way action, a named owner, at least one guardrail join or an explicit gap, and SQL you can open. If those four are missing, you do not have a finished a/b test.
Route the same diagnosis to the live guide that owns the next object. Each row is a single hop.
| Live guide | Open it when |
|---|---|
| A/B test analysis | you need the hub method |
| experiment analysis | assignment is still dirty |
| CUPED explained | the covariate is the next object |
| experiment decision memo | the downloadable artifact is missing |
| what is a data agent | you need the trail object, not a chat |
Write the decision memo; a human still signs it
Upload a sanitized assignment-and-outcome extract, bind primary and guardrails, and ask for a ship / hold / iterate memo with SQL. This check uses only sources you authorize.
Commercial association: You do not need the workspace to complete the educational diagnosis on this page.
Open InfiniSynapseHow this page is sourced. William Zhu is cofounder of InfiniSynapse (GitHub @allwefantasy); no personal LinkedIn is published. Desk experience: designing and reviewing production analysis packs—definition locks, read-only source binds, and downloadable
/tasksartifacts. Reviewed by analytics engineering · data platform · LLM security · editor. Editorial standards · corrections · publishing principles · Contact zhuhl@infinisynapse.com. Company Vision. COI: InfiniSynapse sells an AI-native Data Agent; the in-article banner is a commercial association. Fact-check: IETF RFC · datatracker.ietf.org · cldr.unicode.org · h3geo.org.
Frequently Asked Questions
Can an a/b test ship on a significant primary alone?
Bottom line: No. An a/b test ends in ship, hold, or iterate after guardrails and assignment integrity. A primary win with a refund or latency miss is a hold. If you peeked without a rule, treat the result as exploratory.
Who must sign an a/b test memo?
Bottom line: A human with launch authority. An a/b test can produce intervals and SQL. It cannot accept residual risk. Write the name. If marketing wants a public claim, raise the evidence bar before copy ships.
Does CUPED change the last line of an a/b test?
Bottom line: Only as tighter or wider uncertainty, not as a new action type. Leave CUPED off when the covariate leaks. An a/b test without CUPED is still valid. Do not use the adjustment to erase a hold.
Is a CSV enough to finish an a/b test?
Bottom line: Yes, if it includes unit, variant, assignment time, and outcomes. An a/b test on a file is still a test. Freeze the file date. Bind definitions. Do not treat a missing kill column as a clean guardrail.
Conclusion
An a/b test ends in ship, hold, or iterate. Guardrails and optional CUPED are lines on the same memo. SQL is attached. A human signs. A green badge is not the product. Hold when a kill metric moves. Iterate with the same unit. Do not silently patch the freeze.
When the assignment table and the metric note are ready, ask for that memo on an authorized extract at https://app.infinisynapse.com/. Open the SQL, write the call, and keep the file for the next a/b test.