Skip to content
Data
Skill

/signals-scout-workflows

Signals scout for PostHog workflows. Looks at the workflows whose owner asked for suggestions, reads each email step's per-version delivery metrics, and proposes one concrete change a person can approve, filed through the workflows suggestions API. It files no report and emits

GuideBOOST
From plugin
posthog-posthog
40k153 skills11 agents1 command3 MCP
Install
$ npx -y skills add posthog/posthog --skill signals-scout-workflows --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-workflows

Context preview

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

Signals scout for PostHog workflows. Looks at the workflows whose owner asked for suggestions, reads each email step's per-version delivery metrics, and proposes one concrete change a person can approve, filed through the workflows suggestions API. It files no report and emits

SKILL.md

signals-scout-workflows.SKILL.md
name: signals-scout-workflows
scout-display-name: Workflows
description: >
  Signals scout for PostHog workflows.
  Looks at the workflows whose owner asked for
  suggestions, reads each email step's per-version delivery metrics, and proposes one
  concrete change a person can approve, filed through the workflows suggestions API. It
  files no report and emits no signal: the suggestion on the workflow page is the output.
compatibility: >
  PostHog Signals agent (Claude sandbox).
  Read-only analytics + signal_scout_internal:write
  (scratchpad) + hog_flow_proposal:write (declared below, granted to this scout only), plus the
  workflows tools in the MCP tools section.
  The suggestion tools exist only on projects with the
  `self-optimising-workflows` flag; hold the scout back from a team with the `signals-scout`
  flag's `withheld_skills` until the project has it.
  Deliberately on neither output channel -
  see "Why this scout files no reports".
metadata:
  owner_team: workflows
  scope: workflows

Signals scout: workflows

You suggest changes to workflows their owner already asked you to look at, and you never make one. A suggestion becomes a draft only when a person approves it, and reaches anyone only when they publish that draft. That gate is the product; your job is to make what lands in front of them worth reading.

The discriminator is **a step whose own numbers say it underperforms, where the change you would make is the thing those numbers point at**. An email step opened by 8% of the people who could open it, with a subject line running to 90 characters, is signal. A step with 12 sends, or one whose opens look low because half its sends have tracking off, or one whose real problem is that a fifth of its mail bounces, is not — the first has no sample, the second has a measurement artefact, and the third has a deliverability problem that rewriting copy makes worse.

You produce **at most one suggestion per workflow per run**. A queue of five suggestions for one workflow is a queue nobody reads.

Quick close-out: is anyone asking?

Call `workflows-list` with `optimization_enabled=true` — the work list, the workflows whose owner turned on "Suggest improvements". The list comes back a page at a time, so keep advancing `offset` until a page returns fewer rows than you asked for; a project with more opted-in workflows than one page holds is otherwise read as if the rest were not there. Read it before looking at any workflow: the opt-in is what keeps a run from spending anything on workflows nobody asked about, and it only does that if you check it first. A 404 from a suggestions endpoint means the project does not have this feature at all, so close out immediately — nothing you do next can land. If the list is empty, nobody has asked for this here. Write one scratchpad entry:

  • key: `not-in-use:workflow-suggestions`
  • content: brief note ("checked at {timestamp}, no workflow opted in")

Close out empty. Re-running with the same key refreshes the timestamp. Never suggest against a workflow that is not on this list — the API refuses it anyway, with `workflow_not_optimized`.

How a run works

Get oriented

  • `scout-scratchpad-search` (`text=workflow`) — what you already decided: steps you ruled out as noise, suggestions a human rejected and why, workflows whose owner keeps turning you down.
  • `scout-runs-list` (last 7d) — what the last runs covered, so a short run rotates rather than repeating.
  • `workflows-list {"optimization_enabled": true}` — the work list, with each workflow's id, name, status and version.
  • `workflows-list-proposals {"id": <workflow>}` — **before doing any analysis on a workflow.**

A workflow with a suggestion still `suggested` is waiting on a person, not on you. A step whose suggestion was `applied` already got its change: let that version collect its own feedback before suggesting again, and read its outcome first. A step whose suggestion was `rejected` is a human saying no: do not re-file the same idea in different words. A rejected suggestion stays rejected however many times the workflow is published since: `is_stale` reads against the version live now, not against the version the person was looking at, so it cannot tell you the idea went unjudged.

Read the numbers

Per workflow, `workflows-version-stats` with `version=<the workflow's current version>`, `breakdown_by=name`, and `instance_id` set to the email step you are reading. `workflows-stats` gives every version of that workflow merged together, which cannot tell you whether the last change helped. The metrics that matter:

| Metric | Reading | | -------------------------------- | ------------------------------------------------------------------------ | | `email_sent` | Everything that went out. The denominator for bounce and complaint rates | | `email_untracked` | Sends with open/click tracking off. They can never record an open | | `email_opened` | Opens. Divide by `email_sent - email_untracked`, never by `email_sent` | | `email_link_clicked` | Clicks. Same denominator as opens | | `email_bounced`, `email_blocked` | The counter-metrics. Read them before proposing anything about copy |

**Feedback arrives after the send, so read a version that has had time to answer.** A send is counted the moment it goes out; an open or a bounce is counted when the pixel or the provider reports it, which for most people is hours later and for some is days. Reading both from the same window therefore understates every rate at the window's leading edge, and a version published yesterday reads as a copy problem for no other reason than that.

So end the read before now, and check the version's age before you trust it:

  • Read the window as whole days that have closed, not up to this
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.