# Experiment Loop with Pre-Registered Gates ``` name: Experiment Loop with Pre-Registered Gates slug: experiment-loop-with-pre-registered-gates tier: forward-deployed (operations) role: fdm status: template score: 43 (demand 4, pain 4, differentiation 3, usability 4, connectors 5) intent: Basano on the test design: the stopping rule, MDE, and sample-size math pre-registered before any variant ships, the SEO safety of variants gated, and the verdict computed only against the pre-registered rule when to use: a mechanism hypothesis worth a controlled test on a property with enough traffic to power it when not to use: finding the hypothesis in the first place (Conversion-by-Source Diagnosis); a defect fix rather than a test (the ordinary held-fix flow) validation note: gated on adequate traffic on a designated property; it holds at template until a designated property has the traffic and a mechanism to test ``` ## Connectors ``` connectors: - capability: experiment.read access: read - capability: analytics.read access: read - capability: crawl.read access: read # variant SEO-safety checks on the built variant - capability: repo.change access: write-held # the variant and its config land as held changes ``` The variant and its config land held; a human allocates traffic and launches. Traffic allocation is never an agent action. The verdict is computed against the pre-registered rule and nothing else. ## Prerequisites - Claude with the catalog installed: `/plugin marketplace add rampstackco/claude-skills` - A hypothesis from Conversion-by-Source Diagnosis (mechanism, expected effect, segment), or an equivalent stated the same way. - Enough traffic in the target segment to power a test; if the segment cannot reach the sample the math requires, the honest outcome is not to run. - The experiment platform (experiment.read) and the analytics that will measure the primary metric. - A person who allocates traffic and launches; the workflow never does. ## Phases ### Phase 1: Intake · lane: convergent (Tholo) Skills: analytics-strategy Capability class: experiment.intake (substitute equivalents if off-catalog) Input: the hypothesis from Conversion-by-Source Diagnosis (mechanism, expected effect, segment) Run: Invoke analytics-strategy to frame the incoming hypothesis as a testable spec: the mechanism it claims (what about the page or offer would move the metric, and why), the expected effect size, the primary metric it would move, and the exact segment. A hypothesis that arrives as an aspiration rather than a mechanism goes back to Conversion-by-Source Diagnosis; this workflow tests mechanisms, not hopes. Produce the framed spec. Output artifact: the framed experiment spec (mechanism, expected effect size, primary metric, segment) Done when: the hypothesis is framed as a mechanism with an expected effect size, a primary metric, and a segment, or returned to Conversion-by-Source Diagnosis as too vague to test Fails look like: testing an aspiration. "Improve the CTA" names no mechanism and predicts no effect, so whatever the test does, nothing is learned; the spec has to say why the gap exists before a test can falsify it. ### Phase 2: Pre-registration · lane: gate (Basano) Skills: experiment-design, experimentation-analytics Capability class: experiment.pre-registration (substitute equivalents if off-catalog) Input: the framed experiment spec; the segment's available traffic Run: Invoke experiment-design and experimentation-analytics to pre-register the test BEFORE anything ships: the stopping rule, the minimum detectable effect, the sample-size math the MDE and the segment's traffic imply, the primary metric, and the window. Write them down and freeze them. If the segment cannot reach the required sample in a reasonable window, the pre-registration verdict is "insufficient n, do not run", which is a respectable and final outcome, not a delay. Report the pre-registration, or the not-run verdict, with the math. Output artifact: the frozen pre-registration (stopping rule, MDE, sample size, primary metric, window), or the "insufficient n, do not run" verdict with its math Done when: the test is pre-registered with all five fields frozen, or it is declared underpowered and not run, with the sample-size math shown either way Fails look like: shipping first and pre-registering after. A stopping rule and a metric written once the variant is believed in are fitted to the hope, and the test becomes a search for a number that agrees with it. ### Phase 3: Variant SEO-safety gate · lane: gate (Basano) Skills: seo-technical Capability class: experiment.seo-safety (substitute equivalents if off-catalog) Input: the built variant (crawl.read); the pre-registration Run: Invoke seo-technical against the built variant. Check that the variant is safe to serve to search: no cloaking risk (the variant does not show crawlers and users materially different content in a way search treats as deceptive), canonical consistency across the variant and the control, and no layout-shift or core-vitals regression the variant introduces. Report a verdict per check with the evidence. Report only. Output artifact: the SEO-safety report (cloaking, canonical consistency, layout-shift, each with a verdict) Done when: the variant carries a verdict on cloaking risk, canonical consistency, and layout-shift, all clear or the risk flagged Fails look like: an experiment that wins by getting deindexed. A variant that trims the content search ranked for can lift the on-page metric while the page quietly falls out of the results, and the test would call that a win. ### Phase 4: Launch as a held config change · lane: divergent (human) Skills: none; the launch and the traffic allocation are deliberately human Input: the pre-registration and the passing SEO-safety report Run: the variant and its experiment config land as a HELD change (repo.change). A person allocates traffic and launches the test; traffic allocation is never an agent action, because it is a live change to what real users see. The human launches against the frozen pre-registration, allocating exactly the design the math called for, and records the launch. Output artifact: the launched experiment, recorded against its pre-registration, with the variant and config as held changes a human merged Done when: the experiment is launched by a human at the pre-registered allocation, with the config held and merged by a person Fails look like: an agent turning traffic on. Allocating traffic is a production act on real users, and it stays with a person the same way merging and deploying do. ### Phase 5: The verdict · lane: gate (Basano) Skills: experimentation-analytics Capability class: experiment.verdict (substitute equivalents if off-catalog) Input: the running experiment's results; the frozen pre-registration Run: Invoke experimentation-analytics to compute the verdict ONLY against the pre-registered rule, at the pre-registered point. The stopping rule decides when the test ends; interim looks are not stopping decisions, and a result that looks significant early is not a verdict until the pre-registered point. The primary metric is the one pre-registered, not whichever moved. Report the verdict (win, loss, or inconclusive) against the pre-registered rule, with the numbers. Report only. Output artifact: the verdict against the pre-registered rule (win, loss, or inconclusive) with the numbers at the pre-registered point Done when: the verdict is computed at the pre-registered point against the pre-registered primary metric and stopping rule, with the numbers attached Fails look like: peeking, then stopping on a good look. Checking the test daily and stopping the day it crosses significance turns noise into a false win, because the more often you look, the more often chance alone crosses the line. ### Phase 6: Closeout · lane: convergent (Tholo) Skills: experimentation-analytics Capability class: experiment.closeout (substitute equivalents if off-catalog) Input: the verdict; the original hypothesis and its Conversion-by-Source finding Run: Invoke experimentation-analytics to close the loop. Route the verdict and the hypothesis outcome back to Conversion-by-Source Diagnosis as calibration: a hypothesis that won, lost, or came back inconclusive updates that workflow's hit-rate, which is what makes its next ranking better. If a winning variant is to consolidate into the live page, it re-enters the SEO-safety check on the consolidated version before it ships through the ordinary held-fix flow; the experiment never publishes itself. Record the closeout. Output artifact: the routed verdict and hypothesis outcome to Conversion-by-Source Diagnosis, and the consolidation path (with its SEO-safety re-check) recorded where a variant won Done when (public gate): the verdict and hypothesis outcome are recorded and routed to Conversion-by-Source Diagnosis, and any winning variant is queued for the ordinary held-fix flow with an SEO-safety re-check, not published from here Operated-layer note: in an operated deployment the pre-registration, the verdict, and their agreement land as an agreement-log row; the verdict-versus-pre-registration agreement is what calibrates this lane (AGREEMENT-LOG.md) Fails look like: shipping the winner without re-checking the consolidated version. A variant proven safe in isolation can regress SEO once it is merged into the real page with the rest of the layout, and the win does not carry a waiver for that. ## Failure modes - Peeking (Phase 5's failure): interim looks becoming stopping decisions, which manufactures false wins. - Post-hoc metric switching: reporting whichever metric moved instead of the pre-registered primary. - Retrofitted pre-registration (Phase 2's failure): registering the rule after the variant is believed in. - Shipping the winner without the SEO-safety re-check on the consolidated version (Phase 6's failure). - Underpowered tests run anyway: ignoring the "insufficient n, do not run" verdict and running a test that cannot detect the effect; not-rankable is a verdict here too. - An agent allocating traffic (Phase 4's failure): a production act on real users that stays human. ## Worked example Pending. Populates when this workflow is executed as written on a designated property with adequate traffic to power a test; it holds at template until a designated property has both the traffic and a mechanism hypothesis to run. Status flips to validated when a run record links here. ## Boundaries - Conversion-by-Source Diagnosis supplies this workflow's intake (its ranked hypotheses) and consumes its verdicts as calibration; the two form the diagnose-then-test loop, and neither runs the other's step. - Revenue Tracking Integrity underwrites the measurement this workflow trusts: a verdict computed over a money path that does not survive redirects or consent is a verdict over noise. - Content Pipeline with Prove Gates owns the publish path; a winning variant consolidates through the ordinary held-fix flow with an SEO-safety re-check, and the experiment never self-selects into publishing.