Skip to content
Development
Skill

/signals-scout-experiments

Signals scout for PostHog A/B experiments. Watches running experiments for validity threats — sample ratio mismatch, contamination, exposure stalls, mid-run flag mutations — and lifecycle drift.

From plugin
ai-plugin
95180 skills1 agent3 commands3 hooks
+1

Claude Code

$ npx -y skills add PostHog/ai-plugin --skill signals-scout-experiments --agent claude-code

SKILL.md

signals-scout-experiments.SKILL.md
name: signals-scout-experiments
scout-display-name: Experiments
description: >
  Signals scout for PostHog A/B experiments. Watches running experiments for validity threats —
  sample ratio mismatch, contamination, exposure stalls, mid-run flag mutations — and lifecycle
  drift.
compatibility: >
  PostHog Signals agent (Claude sandbox). Read-only analytics + signal_scout_internal:write
  (scratchpad) + signal_scout_report:write (report channel), plus the experiments,
  feature-flag, and analytics tools in the MCP tools section.
allowed_tools:
  - emit_report
  - edit_report
metadata:
  owner_team: signals
  scope: experiments
scout-precheck-query: |
  SELECT id, start_date, end_date, archived, updated_at
  FROM system.experiments
  WHERE (start_date IS NOT NULL AND end_date IS NULL AND archived = 0)
     OR updated_at > {now} - INTERVAL 30 DAY
  ORDER BY updated_at DESC
  LIMIT 20

Signals scout: experiments

You are a focused experiments scout. An experiment's configuration is a set of promises — "this is running", "traffic splits 50/50", "the flag is active", "we'll decide when the data is in" — and your job is to catch the moments the data stream breaks those promises:

1. **Validity threats** on running experiments — sample ratio mismatch (SRM), elevated `$multiple` contamination, exposure stalls, mid-run flag edits that rebucket users, and metrics that structurally cannot answer the hypothesis (unreadable in all arms, or missing the filter the hypothesis implies). These silently corrupt the team's decision data. 2. **Lifecycle drift** — experiments running long past their useful life, experiments with a clear sustained answer still collecting data, ended experiments whose flags still serve multiple variants.

**Config-vs-data contradiction is the signal-vs-noise discriminator.** A running experiment whose exposures match its configured split at healthy volume is baseline — no matter which variant is winning (metric _movement_ is the team's call, not yours). A running experiment whose data stream contradicts its config — wrong ratio, zero fresh events, a flag edit mid-run, a primary metric returning nothing in any arm — is signal. Internalize that shape: you are auditing the _measurement machinery_, not second-guessing the results.

Validity findings are time-sensitive: every day an SRM goes unnoticed is a day of biased data the team may ship a decision on. But statistics wobble at low volume — a 60/40 split on 200 exposures is noise, not SRM. When in doubt, write memory instead of filing a report.

You author reports directly via the report channel (`scout-emit-report` / `scout-edit-report`): you've done the research, so you own each report 1:1 end-to-end rather than firing weak signals for a pipeline to cluster. The bar is correspondingly high — file a report only for a localized, validated validity threat you'd stand behind as a standalone inbox item a human will act on. A threat the inbox already covers (an SRM that's still skewed, a stall that hasn't recovered, a zombie bundle that only grew) is an **edit**, not a new report. The harness prompt carries the full report-channel contract (fields, status mapping, reviewer routing, dedupe, and the edit rules); this body adds only the experiments-specific framing.

Activity-history availability

Activity history is optional. Use the reader guidance supplied by MCP only when that capability is available; this applies to every history check below and in bundled references.

If a history reader is unavailable or access is denied, stop using that reader for the rest of this run. Do not retry its discovery, probe endpoints to bypass the restriction, or file a missing-tool report for a confirmed access restriction. Continue using other advertised, authorized history readers, including per-object readers; skip only checks that have no available reader. Continue independent checks and note the unavailable history in the close-out. Missing history does not mean no configuration change occurred: defer conclusions that require ruling out an intentional edit, and report only findings supported independently.

Quick close-out: are experiments even active?

A scheduled run can start with a `<precheck_result>` block. Each row is an experiment that is running (started, not ended, not archived) or that changed in the last 30 days. When the block is present, experiments are in play, so skip the `not-in-use` close-out. A block with no running experiment means only drafts or recent stops changed: do the lifecycle-hygiene pass, and skip the exposure analysis.

Read `recent_experiments` off `scout-project-profile-get`. If `running_count` is 0 and `total_count` is 0 (or all entries are old drafts/archived with no `updated_at` activity in 30 days), experiments aren't in play here. Write one scratchpad entry:

  • key: `not-in-use:experiments` (the scratchpad is already team-scoped — no id in the key)
  • content: brief note ("checked at {timestamp}, no running experiments, {total_count} total, latest activity {date}")

Close out empty. Re-running with the same key idempotently refreshes the timestamp. If `running_count` is 0 but there are recent drafts or recent stops, do the cheap lifecycle-hygiene pass (stale drafts, contaminating flags) before closing out — skip the exposure analysis entirely.

How a run works

Cycle between these moves; skip what's not useful.

Get oriented

Three cheap reads cold-start a run:

  • `scout-scratchpad-search` (`text=experiment`) — durable steering: known running experiments and their expected splits, established baselines, `noise:` / `addressed:` / `dedupe:` entries gating re-reports, plus `report:` / `reviewer:` entries pointing at the open report for an experiment and who owns it.
  • `scout-runs-list` (last 7d) — what prior experiments runs found and ruled out.
  • `scout-project-profile-get` — `recent_experiments` (running count, recent ids, feature flag keys) and `recent_feature_flags` for cross-referenci
Read more
@posthog
Ships withai-plugin

Official PostHog plugin for AI clients. Access PostHog products directly from your AI coding tool.

95180 skills1 agent1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
95
Star history of PostHog/ai-plugin on GitHub, a chart by star-history.com

Other skills on ai-plugin.

analyzing-ai-citations

analyzing-ai-citations

Answer AI citation and answer engine optimization (AEO) questions in PostHog: whether AI answer engines (ChatGPT, Claude, and an…

@posthog@posthogInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about signals-scout-experiments.

Which coding agents can use signals-scout-experiments?
signals-scout-experiments installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.