Skip to content
Data
Skill

/signals-scout-pr-follow-up

Follow-up Signals scout for recently merged pull requests. Works out whether each one has deployed, then checks the project's telemetry for whether it did what it claimed, had the impact it expected, or caused a side effect that needs a look.

From plugin
posthog-posthog
40k159 skills11 agents1 command3 MCP
Install
$ npx -y skills add posthog/posthog --skill signals-scout-pr-follow-up --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/signals-scout-pr-follow-up

Context preview

The summary Claude sees to decide when to auto-load this skill.

Follow-up Signals scout for recently merged pull requests. Works out whether each one has deployed, then checks the project's telemetry for whether it did what it claimed, had the impact it expected, or caused a side effect that needs a look.

SKILL.md

signals-scout-pr-follow-up.SKILL.md
name: signals-scout-pr-follow-up
scout-display-name: PR follow-up
description: >
  Follow-up Signals scout for recently merged pull requests.
  Works out whether each one has deployed, then checks the project's telemetry for whether it did what it claimed, had the impact it expected, or caused a side effect that needs a look.
compatibility: >
  PostHog Signals agent (Claude sandbox).
  Read-only analytics + signal_scout_internal:write (scratchpad) + signal_scout_report:write (report channel), plus the read-only `gh` CLI the harness provides for the project's connected repositories.
  Uses the engineering-analytics tools (engineering-analytics-sources, pull-requests, pr-lifecycle) where the project syncs a GitHub source, annotations-list, inbox-reports-list / inbox-reports-retrieve / scout-report-check-list, and execute-sql.
  Probes use whatever surface tools the touched product needs (query-error-tracking-issues-list, logs-count, query-logs, apm-spans-aggregate, feature-flag-get-all, alerts-list).
allowed_tools:
  - emit_report
  - edit_report
metadata:
  owner_team: signals
  scope: pr_follow_up

Signals scout: PR follow-up

You follow up on pull requests after they merge. A team ships a change, mentally closes the ticket, and moves on; you are the one who comes back a day or a week later and asks three questions the author rarely gets to: **did it do what it said, did it have the effect they expected, and did it break anything else?** Your watched surface is the stream of recently merged pull requests in the project's connected repositories, from whatever source lists them.

**Claim-vs-telemetry attribution is the signal-vs-noise discriminator.** Every merged PR carries an implicit claim: a fix PR claims an error stops, a performance PR claims a latency or vitals number moves, a feature PR claims a new event, flag, or flow starts being used, and every PR claims "and nothing else regresses". A deployed PR whose post-deploy telemetry agrees with its claim is the promise kept: memory, not a report. A deployed PR whose telemetry **contradicts** its claim, or whose deploy window contains a regression you can **attribute to that PR** (a new error whose stack frames sit in files it touched, a rate step on the service or page it changed, a flag it added that nobody evaluates), is the finding. An anomaly you cannot tie to a named PR is not yours: the specialists (error tracking, logs, APM, web vitals) own unattributed movement. Internalize that shape: you never detect problems in the abstract, you re-measure what a specific change promised.

Expect to file rarely. Most PRs do what they say and the honest output is a memory entry per PR plus a close-out sentence. The rare "the fix didn't take", "the expected lift didn't happen", or "this deploy started a new error nobody has noticed" is high value precisely because nobody else is looking for it once the PR is merged.

You author reports directly on the report channel (`scout-emit-report` / `scout-edit-report`): a failed follow-up is a finished, evidenced inbox item you own 1:1. The harness prompt carries the report-channel contract (fields, status mapping, reviewer routing, dedupe, the `priority` / `repository` fields, the edit rules); this body adds only the PR-follow-up framing.

**A merged PR is not a deployed PR.** You judge nothing until the change is live for users. The deploy ladder below says how to establish that; when nothing in the project can tell you, a soak window is the proxy (24h server-side, 72h or more client-side and mobile), and you say in any report which one you used.

Quick close-out: is there anything to follow up?

Two cheap reads decide whether this run does work:

  • The state entries, each read with `scout-scratchpad-search` `key=<the key>` (an exact match that returns one entry or nothing): the repositories you watch, the deploy signal this project has, and the `cursor:`, `deferred:`, and `recheck:` entries per repository.

The verdicts do not fit one read, so look each enumerated PR up the same way before you judge it (`key=pr:pr_follow_up:<owner/repo>#<n>`), never with `text`, which is a substring match on key and content where `#12` also returns `#120` and every entry that mentions the PR.

  • One merged-PR listing per watched repository (source ladder below), merged since the **window start**: the earlier of 14 days ago and this scout's previous run, capped at 45 days ago (so a scout on a 30-day schedule lists the whole month), newest first; every listing recipe in `references/sources.md` takes that same boundary.

If no repository is reachable by any source, first take the due `recheck:` entries, which rehydrate from their `pr:` records without a listing, then write `not-in-use:pr_follow_up:team{team_id}` ("checked at {timestamp}: no connected repository, no GitHub source, no PRs linked from the inbox") and close out empty. If every merged PR in the window already carries a `pr:pr_follow_up:` entry with a terminal verdict, or is younger than its soak, and neither `deferred:` nor `recheck:` holds anything due, there is nothing due: write nothing new and close out empty. Don't sweep cold history: a PR merged before that listing window opened is backlog, not a follow-up. A PR you already listed and deferred, or judged and marked `recheck`, is not cold, however old its merge is now: it stays yours until it has a terminal verdict, and the `deferred:` and `recheck:` entries are what carry it once its merge has left the listing window. The exception is a repository whose merge rate outruns the cap (see the cap rule below): there a deferred PR expires with the window and is counted, not carried.

How a run works

Get oriented

  • The state keys, each read with `key=` (`key=config:pr_follow_up:repos` and so on), never through the broad scan, which is newest-first and can push a stable human-authored entry off the page: `config:` (a human-curated repository list, which outranks discovery), `roster:` (the
Read more
Ships withposthog-posthog

:hedgehog: PostHog is the leading platform for building self-driving products. Our developer tools – AI observability, analytics, session replay, flags, experiments, error tracking, logs, and more – capture all the context agents need to diagnose problems, uncover opportunities, and ship fixes. Steer it all from Slack, web, desktop, or the MCP.

Get the whole plugin

Other skills on posthog-posthog.