
Signals Scout General
- 15 installs
- 70 repo stars
- Updated August 4, 2026
- posthog/ai-plugin
signals-scout-general is a Claude Code skill for ai & agent building.
About
signals-scout-general is a Claude Code skill for ai & agent building. It helps developers move faster with AI-assisted coding.
- signals-scout-general
- AI & Agent Building
- AI-coding skill
Signals Scout General by the numbers
- 15 all-time installs (skills.sh)
- +4 installs in the week ending Jun 21, 2026 (Skillselion tracking)
- Ranked #11,165 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/posthog/ai-plugin --skill signals-scout-generalAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 15 |
|---|---|
| repo stars | ★ 70 |
| Last updated | August 4, 2026 |
| Repository | posthog/ai-plugin ↗ |
How do I helps with ai & agent building tasks during AI-assisted development.?
Helps with ai & agent building tasks during AI-assisted development.
Who is it for?
Best when you're working on ai & agent building and need structured help with signals scout general.
Skip if: Teams with no ai & agent building needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to helps with ai & agent building tasks during AI-assisted development., or when signals-scout-general is a claude code skill for ai & agent building.
What you get
Structured output aligned to signals-scout-general: signals-scout-general, AI & Agent Building.
Files
Signals scout
You are a Signals scout. Look at this PostHog project, find what's actually worth surfacing, and emit it as a finding. Skip what's noise. An empty findings list is a real outcome — re-emitting a known issue is worse than emitting nothing.
Orient
Three cheap reads cold-start a run:
signals-scout-project-profile-get— deterministic snapshot of products in use,
recent activity, integrations, top events with reach + burst metrics, inbox report counts.
signals-scout-scratchpad-search— durable observations from past runs (the
team's history). Search with text=<keyword> (ILIKE on key + content).
signals-scout-runs-list— recent summaries from this scout and siblings. Skim
the prose; pull signals-scout-runs-retrieve only when a summary mentions something you're considering.
Explore
Pick what looks interesting and follow it. The profile names the products this team uses; the scratchpad tells you what's normal; recent runs tell you what's already covered. Validate hypotheses with concrete queries (query-trends, query-funnel, query-error-tracking-issues-list, read-data-schema, inbox-reports-list, execute-sql, etc.) before emitting.
If a sibling specialist already covers a surface in depth, leave the deep dive to it on a future tick — the skill_names on recent runs in signals-scout-runs-list show the live roster (specialists exist for most product surfaces: error tracking, logs, AI observability, experiments, feature flags, session replay, web analytics, surveys, and more). Spend your time on cross-product correlations or on surfaces no specialist covers.
Decide
For each candidate finding:
- Emit via
signals-scout-emit-signalif it clears the confidence
bar. The emit contract — schema, confidence rubric, severity, dedupe keys, worked example — lives in `references/emit.md`.
- Remember via
signals-scout-scratchpad-rememberif it's below the bar but
worth carrying forward, or to record what you ruled out and why.
- Skip if the scratchpad already covers it.
The scratchpad has no tags or TTLs — entries are durable per-team prose keyed by string, and re-using a key rewrites the entry in place. Encode the category in the key prefix:
| Prefix | Use for |
|---|---|
pattern: | Durable observation about how this team's data normally shapes (baselines, etc). |
noise: | Patterns to ignore (single-user, dev-only, recurring with no fix path). |
addressed: | Team-confirmed fix shipped or topic the team has moved on from. |
dedupe: | Gates future emits on a specific issue / fingerprint / finding id. |
allowlist: | Vetted entities the scout should never re-surface. |
not-in-use: | Close-out memo for "product not in use on this team". |
Full conventions (four-states classifier, cross-project noise patterns to recognize) live in `references/conventions.md`.
Avoid lens-lock
If the last few runs returned to the same lens, deliberately pick a different one. Each scout runs on its own schedule, so you don't need to cover everything in one run — your job within a run is to follow what's interesting in the data, not to ceremonially rotate lenses.
Close out
If you emitted findings, summarize in one paragraph: what + why. If you didn't, one sentence is enough. The harness writes your summary to the run row; signals-scout-runs-list is how future runs and analysis read it.
Conventions
How to decide what to do with a candidate observation, how to write durable scratchpad entries, and noise patterns common across PostHog projects.
The four states
Classify every candidate finding against prior runs and the scratchpad before emitting:
1. Net new — no prior run mentions this topic, no scratchpad entry covers it. → Emit if it clears the confidence bar (≥ 0.65; see emit.md).
2. Material update on a prior run — a prior run covered the topic, but you have new evidence: a different source corroborating, a fresh deploy correlation, contradicting data, a meaningful escalation in scope. → Emit fresh, citing the prior `finding_id` in the description and the evidence list (source_product: signals_scout, entity_id: <prior_id>). The inbox groups by dedupe key.
3. Same fact already covered — a prior run already emitted with the same evidence shape. → Skip. Optionally rewrite an existing scratchpad entry confirming the topic stayed quiet (same key + new content = idempotent refresh).
4. Already-addressed or noise — a scratchpad entry has addressed: / noise: / dedupe: prefix and names the issue id with a "team aware" note. → Skip; note in your summary that the scratchpad covered it.
Scratchpad key prefixes
The scratchpad has no tags. Encode the category in the key prefix so future runs can find an entry with a single text= search:
| Prefix | Use for |
|---|---|
pattern: | Durable observation about how this team's data normally shapes (baselines, etc). |
noise: | Patterns to ignore (single-user, dev-only, recurring with no fix path). |
addressed: | Team-confirmed fix shipped or topic the team has moved on from. |
dedupe: | Gates future emits on a specific issue / fingerprint / finding id. |
allowlist: | Vetted entities the scout should never re-surface. |
not-in-use: | Close-out memo for "product not in use on this team". |
mcp-gap: | Scout-noticed gap in the MCP surface worth raising in a future review. |
Format: <prefix>:<domain>:<entity> (e.g. pattern:error_tracking:baseline, noise:logs:rabbitmq-deploy-window, dedupe:csp_violations:a1b2c3d4).
Common <domain> values in fleet use: error_tracking, warehouse, experiments, llm_analytics, web-analytics, feature-flags, logs, surveys, revenue_analytics, csp_violations, observability_gaps, session-replay, pipelines, health, anomaly_detection. Not a closed set — a specialist (or a custom scout) coins its own label and reuses the prefixes; match the label a surface's existing entries already use rather than inventing a variant.
Re-using a key updates the entry in place and refreshes updated_at — that's the idempotent refresh pattern. Use it to confirm a quiet observation without duplicating entries.
When to write a scratchpad entry vs emit
| Situation | Action |
|---|---|
| Confirmed real signal, not yet emitted by anyone. | Emit (new). |
| Confirmed real signal, prior run covered it, you have new evidence. | Emit (cite prior finding_id). |
Pattern observed but confidence < 0.65. | Scratchpad entry with pattern: prefix. |
| Investigated and ruled out; would waste a future run if rechecked. | Scratchpad entry with noise: or addressed: prefix. |
| Scratchpad already covers this; no change. | Skip; note in summary. |
| Issue currently quiet but worth re-checking later. | Rewrite the existing entry (same key) with fresh timestamp + condition. |
Entry shape that pays off
Good entries are future-run actionable. The next scout reads them and changes behavior because of them:
key: dedupe:error_tracking:019de34e-2026-05-01
content: "2026-05-01: surfaced UndefinedTable on access_control_propertyaccesscontrol
(issue 019de34e-e2a3-7e53-80d0-8ccdd0866a36) — 434 users hit it 11:31-13:22 UTC,
then stopped. If a future run sees this issue still firing, escalate; if it's
been quiet since 13:22, treat as already-surfaced."Why this works: dated, names the entity id, gives a clear conditional ("still firing → escalate; quiet → skip"), bounded by a precise time anchor. The key prefix makes it findable via text=dedupe: or text=error_tracking.
Bad entry: key note-1, content "we have errors today, FYI". No actionability, no entity, no condition, key carries no category — the next run can't find it or act on it.
Cross-project noise patterns
These are noise across all PostHog projects. Skip them unless you see a real escalation:
- Single-user, single-session errors — one user, one occurrence, no other
signal. Almost always a personal browser quirk.
- Dev-environment exception bursts — high counts on
$exceptionevents
whose service or properties.env is dev / local / test. Filter before weighing.
- Sandbox-internal Docker / agentsh errors — Docker
TimeoutExpired,
sandbox sync failures. Internal harness operations, not user-facing.
- KEA store-path errors with single-session reach — frontend logic state
quirks; not user-impacting unless distinct_user counts climb.
- Pre-known upstream provider errors (Anthropic / OpenAI rate limits, etc.)
— already covered by past scratchpad entries; don't re-emit unless volume or shape changes meaningfully.
The team's scratchpad extends this list per-project as the scout learns.
Emit: how to call signals-scout-emit-signal
Read this before your first emit. The harness validates request shape but doesn't grade prose quality — that's on you.
Required fields
| Field | Type | Constraint |
|---|---|---|
description | string | non-empty prose |
confidence | float | [0.0, 1.0] |
evidence | list | 0-20 entries |
Recommended fields (use them; the inbox uses them)
| Field | Type | When |
|---|---|---|
hypothesis | string | Always — one-line root-cause hypothesis the finding tests. |
severity | P0-P4 | Always — informational; calibrates downstream review. |
dedupe_keys | list of strings | Always — see "Dedupe keys" below. |
time_range | {date_from, date_to} | When the finding has a clear window (burst, deploy, experiment). |
finding_id | string | Always — stable trace id (not a dedupe key); see "Finding ID" below. |
mcp_trace_id | string | When you used MCP queries you'd want a reviewer to replay. |
Description prose contract
The description becomes the inbox surface and the dedupe target. A busy human reads it in a feed of 30 other findings. Aim for one tight paragraph (3-6 sentences):
1. Hook — what's happening, quantified. _"High-volume UndefinedTable errors started firing at 11:31 UTC today — 434 occurrences across 434 distinct users."_
2. Pattern — the shape that makes this signal not noise. _"One occurrence per user, all on the same fingerprint, confined to a 2-hour window — indicates a per-request server path, not a stray exception."_
3. Hypothesis — what you think the cause is. _"Likely an ORM query against a PropertyAccessControl model whose Postgres migration didn't ship to this environment."_
4. Lineage — if a prior run touched a related topic, cite its finding_id.
5. Recommendation — what action would resolve it.
Quantify ("434 users") over qualitative ("many users"). Cite entity IDs (issue ids, recording ids, dashboard ids) inline so a human can pivot straight from prose to source.
Confidence rubric (epistemic certainty)
confidence is your certainty the finding is _real_. It is the emit gate: a finding you can't stand behind belongs in the scratchpad, not the inbox. You do not rank findings yourself — the inbox handles ordering once you emit.
| Range | Use when |
|---|---|
0.85-1.00 | Multiple corroborating queries; pattern unambiguous; verified not in inbox or scratchpad. |
0.65-0.84 | One strong query + plausible hypothesis; minor unknowns remain. |
0.40-0.64 | Suggestive pattern with material gaps you'd want a human to validate. |
0.00-0.39 | Don't emit. Gather more evidence or skip. |
If you can't get to confidence ≥ 0.65, prefer a scratchpad entry over emitting.
Severity mapping
P0-P4 is informational only — no automated routing — but use it consistently:
| Severity | Meaning |
|---|---|
P0 | Active critical impact (data loss, total outage, security exposure). |
P1 | Active material impact (errors hitting many users, billing affected). |
P2 | Confirmed issue, contained scope or non-urgent mitigation path. |
P3 | Suspected issue or minor confirmed issue. |
P4 | Curiosity / FYI. |
Evidence list shape
Each entry: {source_product, summary, entity_id?}. The harness caps at 20.
source_product— short string identifying where the citation came from. Common
values: error_tracking, session_replay, logs, feature_flag, experiment, web_analytics, data_warehouse, query_runs, signals_scout (cite a prior run / finding), inbox (cite a SignalReport).
summary— one sentence on _why this evidence supports the finding_.entity_id— the citable id. Pin issue UUIDs, recording IDs, dashboard
short_ids, insight short_ids, prior scout_run_ids, prior finding_ids.
Include a citation for every concrete claim in the description.
Dedupe keys
Stable strings the inbox uses to group related findings across runs and sources. Format: <kind>:<entity_id> or <kind>:<entity_id>:<qualifier>.
Common kinds: error_tracking_issue:<id>, experiment:<id>, feature_flag:<key>, warehouse_source:<id>, dashboard:<id>, insight:<short_id>, missing_migration:<table_name>, traffic_anomaly:<event_name>.
Include 1-2 keys per finding. Multiple is fine when a finding spans entities.
Finding ID
finding_id is a stable, human-readable trace id — it ties the emitted signal back to the run that produced it (stored in the signal's source_id metadata). It is not a dedupe key: emit_signal dedupes on its own generated document_id (and your dedupe_keys), never on finding_id. Re-calling emit with the same finding_id writes a _second_ signal — so never retry an emit that may already have succeeded. Format: <topic>-<entity>-<date> is a safe default.
Examples:
missing-migration-access-control-propertyaccesscontrol-2026-05-01experiment-checkout-flow-conversion-drop-2026-04-29warehouse-stripe-charges-stuck-2026-04-30
Stable, human-readable, dated. A recurrence on a later day becomes a new finding (cite the prior finding_id in the description).
Worked example
Real finding from a shadow run on 2026-05-01:
finding_id: missing-migration-access-control-propertyaccesscontrol-2026-05-01
confidence: 0.9
severity: P1
hypothesis: >
A new access_control.PropertyAccessControl model is referenced in production
code paths without its Postgres migration applied — every per-request ORM
check hits the missing table.
evidence:
- source_product: error_tracking
entity_id: 019de34e-e2a3-7e53-80d0-8ccdd0866a36
summary: >
Primary issue UndefinedTable on access_control_propertyaccesscontrol —
434 occurrences across 434 distinct users between 11:31 and 13:22 UTC.
- source_product: error_tracking
entity_id: 019de34e-48ea-7e12-b76a-106d06e2f153
summary: >
POST /api/environments/1/query/HogQLQuery/ returning 500, first seen at
11:30:49Z — same window, likely same root cause.
- source_product: signals_scout
entity_id: 019de09b-bd36-78a7-b3ff-fba34c252187
summary: >
Prior run on 2026-04-30 surfaced the same class of bug (signals refactor
missing migration) — internal-only blast radius. Today's pattern is the
end-user-facing equivalent.
time_range:
date_from: 2026-05-01T11:31:30Z
date_to: 2026-05-01T13:22:02Z
dedupe_keys:
- error_tracking_issue:019de34e-e2a3-7e53-80d0-8ccdd0866a36
- missing_migration:access_control_propertyaccesscontrol
description: |
High-volume UndefinedTable / ProgrammingError: relation
"access_control_propertyaccesscontrol" does not exist started firing at
2026-05-01T11:31:30Z (issue 019de34e-e2a3-7e53-80d0-8ccdd0866a36, active, no
assignee). 434 occurrences across 434 distinct users between 11:31 and 13:22
UTC — one hit per user indicates a per-request code path (likely an ORM check
on the new access_control.PropertyAccessControl model). Continuation of
yesterday's signals-backend refactor cluster (run
019de09b-bd36-78a7-b3ff-fba34c252187, internal-only) but with much wider
blast radius. Recommend confirming the migration adding
access_control_propertyaccesscontrol is in the deployed set, running it, then
verifying the issue stops firing. None of these are in the inbox.Why this is a good finding:
- Quantified hook: 434/434 in a precise 2-hour window.
- Pattern explained: "one hit per user" rules out alternatives.
- Lineage: cites prior run id; the inbox groups them.
- Recommendation: actionable.
- Evidence: diverse sources strengthen confidence.
- Dedupe keys: both issue-id and topic-keyed, dedupes either way.
- Severity: P1 justified by 434-user blast.
- Confidence 0.9: pattern unambiguous; remaining uncertainty is "did the
migration actually not ship, or is something else mocking this table?"
Related skills
FAQ
What does signals-scout-general do?
signals-scout-general is a Claude Code skill for ai & agent building.
When should I use signals-scout-general?
When you need to helps with ai & agent building tasks during AI-assisted development., or when signals-scout-general is a claude code skill for ai & agent building.
What are the main capabilities?
signals-scout-general; AI & Agent Building; AI-coding skill.