/suppressing-noisy-errors
Create PostHog error tracking suppression rules to drop high-volume, low-value errors at ingestion. Use when the user asks "stop capturing this error", "drop browser extension errors", "ignore ResizeObserver loops", "suppress bot-driven errors", or wants to reduce ingestion cost
$ npx -y skills add posthog/posthog --skill suppressing-noisy-errors --agent claude-codeHow 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
/suppressing-noisy-errors
Context preview
The summary Claude sees to decide when to auto-load this skill.
Create PostHog error tracking suppression rules to drop high-volume, low-value errors at ingestion. Use when the user asks "stop capturing this error", "drop browser extension errors", "ignore ResizeObserver loops", "suppress bot-driven errors", or wants to reduce ingestion cost
SKILL.md
suppressing-noisy-errors.SKILL.mdname: suppressing-noisy-errors
description: >
Create PostHog error tracking suppression rules to drop high-volume,
low-value errors at ingestion. Use when the user asks "stop capturing
this error", "drop browser extension errors", "ignore ResizeObserver
loops", "suppress bot-driven errors", or wants to reduce ingestion
cost from noisy unactionable errors. Identifies suppression
candidates, scopes the filter tightly, decides between full
suppression and sampling, and confirms the rule before creating it.
Suppressed errors are dropped permanently — this skill defaults to
caution.
Suppressing noisy errors
Suppression is destructive in spirit: matching events are dropped at ingestion and never become issues. The wrong rule silently throws away real bugs. This skill exists to make sure suppression is applied only to patterns that are genuinely unactionable, with filters narrow enough to avoid swallowing unrelated errors.
When suppression is the right tool
Suppression is the right tool when an error is:
- **Unactionable from your code** — browser extensions, third-party scripts, ad
blockers, network beacons firing after navigation. You can't fix it because you didn't write it.
- **Browser engine quirks** — `ResizeObserver loop limit exceeded`,
`Script error.`, `Non-Error promise rejection captured` with empty payloads.
- **Bot or crawler traffic** — errors firing only from headless browsers or known
crawler user agents.
- **Sampling already enough** — for high-volume but real errors, dampen with
`sampling_rate` instead of full suppression so you keep visibility without paying full cost.
Suppression is **not** the right tool when:
- The error is unactionable _today_ but might become actionable after a fix —
use issue status `archived` or `resolved` instead so it surfaces if it returns.
- You only want to mute notifications — assign the issue to a user, change its
status, or use notification rules.
- The error is a duplicate of another — merge or create a grouping rule
(`grouping-noisy-errors`).
Available tools
| Tool | Purpose | | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | | `posthog:query-error-tracking-issues-list` | Find suppression candidates by volume and impact; dry-run a candidate filter via `filterGroup` | | `posthog:query-error-tracking-issue-events` | Inspect sampled `$exception` events to confirm the pattern | | `posthog:execute-sql` | Fallback dry-run for filters that need OR groups or operators outside the `filterGroup` allowed list | | `posthog:error-tracking-suppression-rules-list` | Check existing suppression rules | | `posthog:error-tracking-suppression-rules-create` | Create the suppression rule | | `posthog:error-tracking-issues-partial-update` | Hide past data via issue status without dropping events at ingestion |
Workflow
Step 1 — Identify candidates
High occurrences with low distinct users is the strongest noise signal — one user (or one bot) producing many events.
posthog:query-error-tracking-issues-list
{
"status": "active",
"orderBy": "occurrences",
"orderDirection": "DESC",
"dateRange": { "date_from": "-7d" },
"limit": 30,
"volumeResolution": 0
}Look for:
- High `occurrences`, low `users` ratio (e.g., 50,000 occurrences, 3 users → likely
bot or extension loop)
- Exception messages matching known noise patterns: `ResizeObserver loop`,
`Script error.`, extension namespaces (`chrome-extension://`, `moz-extension://`, `safari-extension://`)
- Stack traces dominated by third-party domains the user doesn't control
Step 2 — Confirm the pattern
For each candidate, pull a sample of `$exception` events and check that the pattern matches what you intend to suppress:
posthog:query-error-tracking-issue-events
{
"issueId": "<candidate_issue_id>",
"limit": 10,
"include": ["exception", "stacktrace", "environment", "navigation"]
}`onlyAppFrames` defaults to `true`, but for noise investigation you usually want the third-party frames visible — pass `onlyAppFrames: false` so extension URLs and vendor domains show up in the stack.
Confirm:
- The exception type or message text is consistent across the sample
- The URLs / user agents / browsers don't include real user traffic mixed in with
the noise
- Suppressing this pattern won't hide a future real bug that happens to share
the type
If any sample doesn't match, narrow the filter or skip the candidate.
Step 3 — Scope the filter tightly
Suppression rules are configured with the same filter shape as grouping rules. The `error-tracking-suppression-rules-create` tool description warns explicitly: do **not** create match-all rules and do **not** create overly broad rules. Match on the most specific property combination you can:
| Noise pattern | Recommended filter | | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | Chrome extension errors | `$exception_sources icontains "chrome-extension://"` | | Firefox extension errors | `$exception_sources icontains "moz-extension://"`
Read more
name: suppressing-noisy-errors description: > Create PostHog error tracking suppression rules to drop high-volume, low-value errors at ingestion. Use when the user asks "stop capturing this error", "drop browser extension errors", "ignore ResizeObserver loops", "suppress bot-driven errors", or wants to reduce ingestion cost from noisy unactionable errors. Identifies suppression candidates, scopes the filter tightly, decides between full suppression and sampling, and confirms the rule before creating it. Suppressed errors are dropped permanently — this skill defaults to caution.
Suppressing noisy errors
Suppression is destructive in spirit: matching events are dropped at ingestion and never become issues. The wrong rule silently throws away real bugs. This skill exists to make sure suppression is applied only to patterns that are genuinely unactionable, with filters narrow enough to avoid swallowing unrelated errors.
When suppression is the right tool
Suppression is the right tool when an error is:
- **Unactionable from your code** — browser extensions, third-party scripts, ad
blockers, network beacons firing after navigation. You can't fix it because you didn't write it.
- **Browser engine quirks** — `ResizeObserver loop limit exceeded`,
`Script error.`, `Non-Error promise rejection captured` with empty payloads.
- **Bot or crawler traffic** — errors firing only from headless browsers or known
crawler user agents.
- **Sampling already enough** — for high-volume but real errors, dampen with
`sampling_rate` instead of full suppression so you keep visibility without paying full cost.
Suppression is **not** the right tool when:
- The error is unactionable _today_ but might become actionable after a fix —
use issue status `archived` or `resolved` instead so it surfaces if it returns.
- You only want to mute notifications — assign the issue to a user, change its
status, or use notification rules.
- The error is a duplicate of another — merge or create a grouping rule
(`grouping-noisy-errors`).
Available tools
| Tool | Purpose | | ------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | | `posthog:query-error-tracking-issues-list` | Find suppression candidates by volume and impact; dry-run a candidate filter via `filterGroup` | | `posthog:query-error-tracking-issue-events` | Inspect sampled `$exception` events to confirm the pattern | | `posthog:execute-sql` | Fallback dry-run for filters that need OR groups or operators outside the `filterGroup` allowed list | | `posthog:error-tracking-suppression-rules-list` | Check existing suppression rules | | `posthog:error-tracking-suppression-rules-create` | Create the suppression rule | | `posthog:error-tracking-issues-partial-update` | Hide past data via issue status without dropping events at ingestion |
Workflow
Step 1 — Identify candidates
High occurrences with low distinct users is the strongest noise signal — one user (or one bot) producing many events.
posthog:query-error-tracking-issues-list
{
"status": "active",
"orderBy": "occurrences",
"orderDirection": "DESC",
"dateRange": { "date_from": "-7d" },
"limit": 30,
"volumeResolution": 0
}Look for:
- High `occurrences`, low `users` ratio (e.g., 50,000 occurrences, 3 users → likely
bot or extension loop)
- Exception messages matching known noise patterns: `ResizeObserver loop`,
`Script error.`, extension namespaces (`chrome-extension://`, `moz-extension://`, `safari-extension://`)
- Stack traces dominated by third-party domains the user doesn't control
Step 2 — Confirm the pattern
For each candidate, pull a sample of `$exception` events and check that the pattern matches what you intend to suppress:
posthog:query-error-tracking-issue-events
{
"issueId": "<candidate_issue_id>",
"limit": 10,
"include": ["exception", "stacktrace", "environment", "navigation"]
}`onlyAppFrames` defaults to `true`, but for noise investigation you usually want the third-party frames visible — pass `onlyAppFrames: false` so extension URLs and vendor domains show up in the stack.
Confirm:
- The exception type or message text is consistent across the sample
- The URLs / user agents / browsers don't include real user traffic mixed in with
the noise
- Suppressing this pattern won't hide a future real bug that happens to share
the type
If any sample doesn't match, narrow the filter or skip the candidate.
Step 3 — Scope the filter tightly
Suppression rules are configured with the same filter shape as grouping rules. The `error-tracking-suppression-rules-create` tool description warns explicitly: do **not** create match-all rules and do **not** create overly broad rules. Match on the most specific property combination you can:
| Noise pattern | Recommended filter | | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | | Chrome extension errors | `$exception_sources icontains "chrome-extension://"` | | Firefox extension errors | `$exception_sources icontains "moz-extension://"`
: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.
Repo: posthog/posthog
Other skills on posthog.
- /analyzing-expensive-users
Analyze the most expensive users in AI observability and explain why they cost so much. Use when the user asks about top spenders, expensive users, per-user LLM cost, user-level cost drivers, or patterns behind high AI observability spend.
Open skill - /creating-online-evaluations
Author continuously-running online evaluations in PostHog AI observability, grounded in real failure modes you've identified. Use when the user wants evaluations that automatically score new generations or whole traces going forward — "create an eval to catch X", "continuously
Open skill - /exploring-ai-failures
Find where an AI/LLM application is failing in production and surface the failure patterns, working from real traces. Use when someone wants to understand what's going wrong with an AI feature, find and categorize failure modes, triage errors, or investigate quality issues
Open skill - /exploring-llm-clusters
Investigate AI observability clusters — understand usage patterns in AI/LLM traffic, compare cluster behavior, compute cost/latency metrics, and drill into individual traces within clusters.
Open skill - /exploring-llm-costs
Investigate LLM spend in PostHog — total cost over time, cost by model, provider, user, trace, or custom dimension, token and cache-hit economics, and cost regressions. Use when the user asks "how much are we spending on LLMs?", "which model / user / feature is most expensive?",
Open skill - /exploring-llm-evaluations
Investigate AI observability evaluations — `hog` (deterministic code-based), `llm_judge` (LLM-prompt-based), and `sentiment` (user-message sentiment). Find existing evaluations, inspect their configuration, run them against specific generations, query individual results, and
Open skill

