sequential-monitoring — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited sequential-monitoring (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 fixed-horizon A/B test promises a 5% false-positive rate at one planned read. The moment you check the result daily and stop "when it looks good", the actual false-positive rate climbs to 20-30%. Sequential testing fixes this: it lets you check as often as you like and stop the moment the evidence is strong enough, with the type-I error still controlled at the nominal alpha. This skill encodes when to apply mSPRT versus confidence sequences, how to read the boundaries, and when sequential math will not rescue an underpowered test.
A fixed-horizon test computes a p-value under the assumption you look once, at the planned end. Each additional peek is another chance to cross the 5% threshold by noise alone.
| Peeks across the test | Actual false-positive rate (nominal 5%) |
|---|---|
| 1 (end only) | 5% |
| 2 | ~8% |
| 5 (weekly) | ~14% |
| 10 (twice weekly) | ~19% |
| Daily over a month | ~25-30% |
If the user has been "checking how the test is doing" every morning, the nominal 5% threshold is meaningless. They need either a sequential method (always-valid) or alpha-spending (pre-commit to a peek schedule and inflate the threshold).
Two practical options. Pick by the decision the user is actually making.
| Question the user is asking | Use | Output |
|---|---|---|
| "Should we ship treatment or not?" (binary call) | mSPRT | Log-likelihood ratio crosses upper or lower boundary → ship or reject |
| "What is the lift, with a CI I can trust at any time?" | Confidence sequences | Always-valid CI on lift; ship when the CI excludes 0 (or excludes a minimum effect) |
| "I just want to peek without breaking alpha" | Either; mSPRT is simpler to read | See above |
Both methods are always-valid: the false-positive rate stays at alpha no matter how often you look. mSPRT is Statsig's default; confidence sequences are GrowthBook's default. The choice is taste plus what the user wants to read.
Same prerequisites as experiment-result-reader:
If any check fails, stop and surface the issue.
mSPRT (Johari et al., 2017) generalises Wald's 1945 SPRT to the case where the effect size is unknown. The trick: instead of testing a single point alternative (e.g. "lift = 2pp exactly"), test a mixture over plausible alternatives, weighted by a prior. This gives a single log-likelihood ratio statistic that can be checked at every observation.
For a two-proportion test (conversion rate, control vs treatment):
logLR(n) = log( (1 / sqrt(1 + n·V/tau²)) ·
exp( (n·V·(diff)²) / (2·(tau² + n·V)) ) )where n is the per-arm sample size, V is the pooled variance of the proportion, and diff is the observed control-treatment difference.
Empirical validation from Statsig's deployment: across 50,000 A/A tests, false-positive rate stayed at ≤1.2% (well under the nominal 5%). Across true-effect tests, 58% of decisive results fired by the half-horizon mark, with ~84% of the power of a fixed-horizon test at the same final n.
In practice you do not hand-roll this; a library or the analytics platform computes logLR for you. Your job is to read it and apply the stopping rule honestly.
A confidence sequence (Waudby-Smith & Ramdas, 2021) is a sequence of confidence intervals, one per observation, such that the probability that any of them fails to cover the true parameter is at most alpha. Contrast with fixed-horizon CIs, where the coverage guarantee holds only at the single planned end.
The intervals are wider than fixed-horizon CIs at the same n (the cost of always-valid), but they tighten with sample size and never widen to uselessness. Practical use:
Confidence sequences shine when the user cares about effect size, not just direction. mSPRT shines when the user just wants "ship or not".
Even with the correct framework, three patterns can produce misleading sequential reads:
Mirror the experiment-result-reader Pyramid format, with sequential-specific fields:
VERDICT: <ship | kill | keep running, and why>
METHOD: <mSPRT | confidence sequence>
NUMBERS:
- control: n=<exposed>, conversions=<converted>, rate=<rate>%
- treatment: n=<exposed>, conversions=<converted>, rate=<rate>%
- observed lift: <pp>pp absolute, <%> relative
- sequential statistic: <logLR value | always-valid CI on lift>
- boundary / threshold: <value>
- days run / planned horizon: <X> / <Y>
CAVEATS:
- <SRM check>
- <seasonality / day-of-week if relevant>
- <metric-switch / multi-arm caveat if applicable>
WHAT TO DO NEXT:
- <ship treatment | kill treatment | keep running until <date or n>>If the boundary has not been crossed, the answer is "keep running, do not over-read the direction". Sequential testing does not promise an early answer; it promises an honest one.
User: We launched a checkout copy test 14 days ago, planned 4 weeks.
Treatment looks like it's converting at 13% vs control at 10%.
Can we ship now or do we need to finish the 4 weeks?
Agent: [Phase 1: framework]
Binary ship/no-ship call. Use mSPRT.
[Phase 2: setup verification]
events.list(name="$exposure", group_by="variant", window=14d):
- control: 8,012
- treatment: 8,043
SRM check: 49.95% / 50.05%, p>0.5, no mismatch.
Conversion event confirmed as purchase_completed,
attributed to exposure session.
Smaller arm n = 8,012, well above the 400 threshold. Proceed.
[Phase 3: mSPRT applied]
- control: 800 conv / 8,000 exposed = 10.00%
- treatment: 1,040 conv / 8,000 exposed = 13.00%
- observed absolute lift: +3.00pp
- observed relative lift: +30.0%
Mixture variance tau² set at MDE² = (0.01)² (test was designed
to detect a 1pp lift).
Running logLR over the 14-day window:
- day 1: logLR = 0.4
- day 5: logLR = 1.8
- day 9: logLR = 3.1 ← crossed upper boundary (log(1/0.05) ≈ 3.00)
- day 14: logLR = 6.7
Upper boundary was crossed on day 9 and has only widened since.
[Phase 4: confounders]
Channel mix per variant (last 14d):
- control: organic 38%, paid 34%, direct 28%
- treatment: organic 39%, paid 33%, direct 28%
No meaningful mix shift.
No metric switch (purchase_completed is the declared primary).
Two-arm test, no multiple-comparison correction needed.
[Phase 5: verdict]
VERDICT: Ship treatment. mSPRT crossed the upper boundary on day 9
and has stayed above it for 5 consecutive days. Continuing the
test to day 28 buys no additional decision quality; it costs 14
more days of running an inferior variant on half the traffic.
METHOD: mSPRT, alpha=0.05, tau²=(0.01)²
NUMBERS:
- control: n=8,000, conv=800, rate=10.00%
- treatment: n=8,000, conv=1,040, rate=13.00%
- lift: +3.00pp absolute, +30.0% relative
- logLR: 6.7 (boundary: 3.00)
- days run / planned: 14 / 28
CAVEATS:
- No SRM, no channel mix shift, no metric switch.
- 14 days covers two full weekly cycles; seasonality not a concern.
WHAT TO DO NEXT:
- Ship treatment. Document the early-stop decision and the sequential
method used (alpha protection holds).
- The 19 days of horizon saved is real; redeploy that traffic to
the next test in the queue.User: Nudge banner test, 10 days in, planned 21. Treatment looks
slightly up. Should we call it?
Agent: [Phase 1: framework]
User asked "is it up", which is an effect-size question.
Use a confidence sequence on the lift.
[Phase 2-3: pull + compute]
- control: n=4,200, conv=210, rate=5.00%
- treatment: n=4,180, conv=234, rate=5.60%
- observed lift: +0.60pp absolute, +12.0% relative
- always-valid 95% CI on lift: [-0.4pp, +1.6pp]
[Phase 5: verdict]
VERDICT: Do not call it. The always-valid CI on lift is
[-0.4pp, +1.6pp] and contains 0. Direction is mildly positive
but magnitude is anywhere from "slightly negative" to "small
positive". Keep running.
METHOD: confidence sequence, alpha=0.05
NUMBERS:
- control: n=4,200, rate=5.00%
- treatment: n=4,180, rate=5.60%
- lift: +0.60pp, 95% always-valid CI [-0.4pp, +1.6pp]
- days run / planned: 10 / 21
CAVEATS:
- SRM clean, no mix shift.
- 10 days = ~1.4 weekly cycles; the +12% relative could easily
be a midweek artifact.
WHAT TO DO NEXT:
- Keep running. Re-check at day 17 (two full cycles).
- If at day 21 the CI still contains 0, the honest call is
"no detectable effect at MDE"; do not chase a +12% headline.The method above is platform-neutral. For the per-variant exposure, conversion, and per-day-rolling-rate queries you need to feed an mSPRT or confidence-sequence calculation, 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.