.claude/skills/posthog-slack-triage/SKILL.md
Format and post triage reports to Slack using optimized mrkdwn layout. Use after generating a triage report to post it to the #support-triage channel or any specified channel.
npx skillsauth add mongo-ai/posthog-triage-agent posthog-slack-triageInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
After the triage report is complete and the operator wants to post it to Slack.
Slack does NOT support standard markdown. Use Slack mrkdwn:
*bold* not **bold**_italic_ not *italic*`code` for inline code (works same as markdown)> for block quotes:emoji_name: for emoji<url|display text> for linksUse this exact structure. It's optimized for scanning in a busy channel.
This is what appears in channel preview and notifications. Must convey severity and topic instantly.
:red_circle: `P1` *One-line problem description*
Priority emoji mapping:
:red_circle: P1 Critical:large_orange_circle: P2 High:large_yellow_circle: P3 Medium:white_circle: P4 LowCompact metadata as inline code blocks — acts as visual "pills".
`Bug` `Session Replay · iOS` `Enterprise · 8h SLA`
Format: `{issue type}` `{product area} · {platform}` `{plan tier} · {SLA}`
2-3 sentences max. Plain text. What the customer is experiencing and the key context. No jargon.
Block-quoted with status emoji per finding:
:white_check_mark: Confirmed finding:warning: Concerning finding or partial match:x: Dead end or no match:mag: *Evidence*
> :white_check_mark: Finding from docs with key detail
> :white_check_mark: `repo#issue` — status, comment count, relevance
> :warning: SDK version outdated — `current` vs latest `new`
> :x: No matching issues for alternate symptom
Inline confidence indicator + one-line explanation.
Confidence mapping:
`Confirmed` with :dart: — evidence proves it`Likely` with :thinking_face: — pattern match, not proven`Suspected` with :question: — needs human verification:dart: *Diagnosis* `Confirmed` One-line root cause explanation.
Numbered with inline code block numbers for visual weight.
:hammer_and_wrench: *Actions*
`1` First action with `specific details`
`2` Second action
`3` Third action
Compact single line for escalation, docs gap, and confidence.
`Escalation: none` `Docs gap: specific suggestion here` `Confidence: High (6/7 verified)`
Or if confidence is Low (<50%):
`Escalation: none` `Docs gap: none` `:warning: Confidence: Low (2/5 verified) — needs human review`
Or if escalating:
`:rotating_light: Escalation: Engineering — replay team` `Severity: High` `Follow-up: 4-8h` `Confidence: High (5/5 verified)`
The confidence line uses the same score from the Evidence Pack.
If confidence is Low, prepend :warning: emoji to make it visually stand out.
:large_orange_circle: `P2` *iOS replay OOM — iPhone 15 Pro Max*
`Bug` `Session Replay · iOS` `Scale · 24h SLA`
Customer app crashes with OOM ~5 min after enabling session replay on high-res devices. Disabling replay fixes it.
:mag: *Evidence*
> :white_check_mark: Docs confirm screenshot mode allocates full-res bitmaps — known memory hog
> :white_check_mark: `posthog-ios#18432` open — 34 comments, fix in progress
> :white_check_mark: Codebase: masking pipeline creates 2+ bitmaps/cycle via `UIGraphicsImageRenderer`
> :warning: Customer on `3.8.1` — latest `3.9.0` has partial fix
:dart: *Diagnosis* `Confirmed` Known bug in screenshot masking pipeline on high-res devices.
:hammer_and_wrench: *Actions*
`1` Upgrade to `posthog-ios 3.9.0`
`2` Increase `throttleDelay`
`3` Switch to wireframe mode
`4` Monitor next release for full fix
`Escalation: none` `Docs gap: add device memory guidance to iOS replay troubleshooting` `Confidence: High (4/4 verified)`
Default: use mcp__slack__slack_send_message_draft (draft mode).
Only use mcp__slack__slack_send_message (direct send) when the operator
explicitly says "post it" or "send it now."
Parameters:
channel_id: The target channel ID (find with slack_search_channels)message: The formatted message following the template aboveTo find a channel ID:
mcp__slack__slack_search_channels(query="support-triage")
For follow-up findings, use thread_ts from the original message to reply
in-thread. Keep the main channel clean — one message per ticket, details in threads.
After posting the internal triage message, always post the customer response draft as a thread reply on the same message. This keeps the internal triage scannable in the channel while making the customer draft immediately accessible without opening the full report file.
:speech_balloon: *Draft Customer Response* — ready to copy into Zendesk/GitHub
---
[Full customer response text from the triage report's Draft Customer Response
section. Copy it verbatim — it's already been through the quality checklist
and voice check.]
---
:warning: _Review before sending. Check Evidence Pack in the full report for
confidence score and any spot-check flags._
`Report:` `{filename from triage-reports/}`
thread_ts from the posted message responsechannel_id + thread_tsWhen posting multiple triage reports at once, post each as its own main message (not as thread replies to a single message). Each ticket gets:
This keeps each ticket independently scannable and threadable.
Always save Slack messages and customer responses to disk, regardless of
whether Slack posting succeeds. These files are the audit trail and a fallback
if Slack auth fails. All files go to triage-reports/ (gitignored).
Save two files per ticket:
| File | Naming | Content |
|------|--------|---------|
| Slack message | YYYYMMDD-HHmmss-slack-{source}-{id}.md | Internal triage (code block) + customer response thread (code block) |
| Customer response | YYYYMMDD-HHmmss-response-{source}-{id}.md | Customer-facing text only, with one-line header |
Example filenames:
20260409-150012-slack-gh-53788.md20260409-150012-response-gh-53788.mdSave two batch files:
| File | Naming | Content |
|------|--------|---------|
| Slack batch | YYYYMMDD-slack-batch.md | All Slack messages, each as a fenced code block under ## N. #issue |
| Customer responses | YYYYMMDD-customer-responses.md | All customer responses, each under ## N. #issue header |
# Response: {one-line issue title}
**Issue:** {URL or ticket reference}
**Date:** {YYYY-MM-DD}
---
{Full customer response text — verbatim from the triage report}
No evidence pack, no internal notes, no emoji. Ready to paste into Zendesk/GitHub.
mcp__slack__slack_send_message_draft by default. Only use
mcp__slack__slack_send_message (direct send) when the operator explicitly
says "post it" or "send it now."
Draft-first prevents unreviewed reports from reaching channels.tools
Diagnose PostHog web analytics issues including missing pageviews, incorrect bounce rates, broken channel attribution, missing UTM data, reverse proxy problems, and discrepancies with other analytics tools.
business
Final synthesis skill. Produce a structured, evidence-graded triage report with a clear root-cause assessment, honest confidence, and a ready-to-send customer response.
tools
Normalize an incoming support ticket into structured investigation inputs: product area, identifiers, scope clues, URLs, timeframe, and likely first diagnostic path.
development
Diagnose PostHog survey issues including surveys not appearing, targeting mismatches, response collection failures, display timing problems, and API-mode survey integration issues.