experiment-result-reader — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited experiment-result-reader (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
A/B tests die from two failure modes that have nothing to do with the variant: reading the result before the sample is big enough, and reading the result without controlling for the wrong thing. This skill encodes the discipline analysts use to avoid both.
event-schema.yaml and exposure events aren't being fired. There's nothing to read; nudge the user toward instrumenting the experiment first via event-schema-author or their platform of choice.Before reading anything, confirm two facts:
event-schema.yaml's experiments: section. The experiment should have a name, variants list, and ideally an intent. If it isn't declared, ask the user where the variant assignments live and whether the exposure event is firing reliably.events.list(name="$exposure", group_by="variant") or whichever event name is canonical for the platform; Mixpanel uses $experiment_started, Amplitude uses $exposure). You should see roughly even counts per variant if assignment is unbiased; a heavy skew is a setup bug, not a result.If either check fails, stop and surface the issue. Don't compute lift on a broken setup.
For each variant, get:
Conversion rate = converted / exposed, per variant.
The conversion event should be named explicitly by the user (or read from the experiments[<name>].intent field if it's in there). Common shapes: signup_completed, subscription_started, purchase_completed, feature_used. If the user is vague, ask once.
Lift = (treatment rate − control rate) / control rate.
Three checks before reporting it:
analytics-diagnostic-method: at the smaller variant's n, the 95% CI on a proportion is roughly:| n | ±CI |
|---|---|
| 100 | 10 percentage points |
| 400 | 5 |
| 1,000 | 3 |
| 10,000 | 1 |
If the observed lift in percentage points is smaller than the CI for the smaller variant, the result is noise, not signal. Say so explicitly. Don't report a "12% lift" when the CI is ±15pp.
Even when the lift looks real, two confounders catch most novice analysts:
channel or device_type for each variant. If treatment got more organic-search traffic and organic converts higher overall, the "lift" is acquisition-mix, not the variant. Use Clamp's traffic.breakdown(dimension="channel") filtered to each variant's exposed cohort to check.If either confounder is in play, the result is unreadable until it's resolved.
Report the answer first, then the supporting numbers, then the caveats. Specific to experiments:
VERDICT: <one sentence with winner and confidence, OR "too early / inconclusive" with why>
NUMBERS:
- control: n=<exposed>, conversions=<converted>, rate=<rate>%
- treatment: n=<exposed>, conversions=<converted>, rate=<rate>%
- absolute lift: <pp>pp
- relative lift: <%>
- 95% CI on lift: ±<pp>pp at the smaller variant's n
CAVEATS:
- <sample-size caveat if applicable>
- <run-length caveat if applicable>
- <mix-shift / SRM caveat if applicable>
WHAT TO DO NEXT:
- <ship | wait for more data | investigate confound | redesign>If you cannot produce a one-sentence verdict (the result is genuinely too thin to read), say so. "Inconclusive at current sample size; revisit at n>X" is a real answer.
/pricing page and the conversion event is signup_completed (which can happen 3 sessions later), make sure the conversion is attributable to the exposure session, or use a windowed conversion definition. Without that, the result is contaminated by users who would have converted regardless.User: how's the pricing_redesign_2026 test doing?
Agent: [Phase 1: verify setup]
Reading event-schema.yaml... pricing_redesign_2026 is declared with
three variants: control, long_copy, short_video. Started 2026-04-15.
$exposure events grouped by variant, last 14d:
- control: 302
- long_copy: 297
- short_video: 311
Roughly balanced (no SRM red flag). Setup looks clean.
[Phase 2: pull numbers]
Conversion event: subscription_started (asked user to confirm).
- control: n=302, converted=15, rate=4.97%
- long_copy: n=297, converted=22, rate=7.41%
- short_video: n=311, converted=12, rate=3.86%
[Phase 3: lift + sample]
long_copy vs control:
absolute lift: +2.44pp
relative lift: +49.1%
95% CI at n=297: ±5.7pp
The CI is twice the absolute lift. Even though +49% relative looks
spectacular, it's well inside noise at this sample size.
short_video vs control: no lift; short_video is slightly worse but
also inside noise.
[Phase 4: confounders]
Channel mix per variant:
- control: organic_search 41%, direct 32%, paid 27%
- long_copy: organic_search 39%, direct 35%, paid 26%
- short_video: organic_search 43%, direct 30%, paid 27%
No meaningful mix shift. Conversion difference, if any, isn't a
channel artifact.
[Phase 5: verdict]
VERDICT: Too early. long_copy looks promising at +49% relative, but
the 95% CI is ±5.7pp on a +2.4pp observed lift; well within noise.
short_video shows no real movement either direction.
NUMBERS:
- control: n=302, rate=4.97%
- long_copy: n=297, rate=7.41% (+2.44pp, ±5.7pp CI)
- short_video: n=311, rate=3.86% (-1.11pp, ±5.5pp CI)
CAVEATS:
- At ~300/variant, the smallest readable absolute lift is ~6pp.
- Test has been running 14 days; weekly-cycle confound is small.
- No SRM, no mix shift detected.
WHAT TO DO NEXT:
- Wait until n≥800/variant before reading lift confidently. At
current pace (~22/day per variant), that's another ~25 days.
- Don't ship long_copy yet despite the promising direction; at
n<400 the +49% relative could easily revert to baseline.event-schema-author first if no experiments are declared yet.The method above is platform-neutral. For specific MCP calls per workflow row (per-variant exposure, per-variant conversion, channel-mix-shift check, user-journey validation), load the tool-map for the active platform: see tool-maps/ and the tool_map: field in analytics-profile.md. If the field is missing, run analytics-profile-setup to set it.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.