Closed-loop bug triage from public X/Twitter complaints to clustered, evidence-backed GitHub issues.
Product teams learn about bugs from X/Twitter hours before internal monitoring catches them. This skill automates the pipeline: ingest complaints, classify and cluster them by bug family, scan repos for corroborating evidence, route to owners, and file issues — all with human confirmation gates. Results display directly in the terminal with optional Slack delivery for team review.
~/.claude/channels/x-triage/.env
bun run db:migrate)config/approved-accounts.json and config/approved-searches.json populatedgh) for issue filingVerify environment before starting:
!test -f data/triage.db && echo "DB ready" || echo "Run: bun run db:migrate"
!test -f config/approved-accounts.json && echo "Accounts configured" || echo "Missing: config/approved-accounts.json"
mcp__triage__resolve_username
mcp__triage__fetch_mentions
mcp__triage__search_recent
mcp__triage__fetch_conversation
mcp__triage__fetch_quote_tweets
After intake completes:
assessFreshness() from lib/freshness.ts with the combined post set and the requested window boundaries. If date_confidence is "low" or "medium", pass the warning string to the display step for rendering.DegradationReport objects from intake tool responses. Call buildSourceStatusReport() from lib/source-status.ts to aggregate into a SourceStatusReport. Pass to the display step for rendering between the header and cluster list.For each ingested post:
lib/parser.ts
lib/classifier.ts
lib/redactor.ts
lib/reporter-scorer.ts
config/approved-accounts.json
For each cluster (top 3 repos per cluster):
mcp__triage__search_issues — Match symptoms/errorsmcp__triage__inspect_recent_commits — 7-day commit windowmcp__triage__inspect_code_paths — Affected pathsmcp__triage__check_recent_deploys — Recent releasesAssign evidence tiers (1-4) per evidence-policy.md.
Load evidence tier definitions:
!cat ${CLAUDE_SKILL_DIR}/references/evidence-policy.md
For each cluster, use strict 6-level precedence:
mcp__triage__lookup_service_owner
mcp__triage__lookup_oncall
mcp__triage__parse_codeowners
mcp__triage__lookup_recent_assignees
mcp__triage__lookup_recent_committers
Apply routing overrides from prior runs. Flag stale signals (>30 days).
Load routing precedence rules:
!cat ${CLAUDE_SKILL_DIR}/references/routing-rules.md
Compute severity (low/medium/high/critical) based on:
Load escalation trigger definitions:
!cat ${CLAUDE_SKILL_DIR}/references/escalation-rules.md
Display triage results directly in the terminal as formatted markdown:
Check if claude-code-slack-channel plugin is available via mcp__slack__reply tool. If available, also deliver summary to Slack. If not, skip — terminal output is sufficient. Not an error.
Accept review commands from the user in the terminal. Parse via mcp__triage__parse_review_command.
| Command | Action |
|---|---|
details <#> |
Display full cluster detail |
file <#> |
Generate draft via mcp__triage__create_draft_issue |
dismiss <#> <reason> |
Create noise_suppression override |
merge <#> <issue> |
Link cluster to existing issue |
escalate <#> |
Raise severity |
monitor <#> |
Set cluster to monitoring |
snooze <#> <duration> |
Temporarily suppress |
split <#> |
Split cluster |
reroute <#> |
Change routing |
full-report |
Display all clusters |
confirm file <#> |
File via mcp__triage__confirm_and_file |
After each command executes successfully, display the confirmation message from formatActionConfirmation() (in mcp/triage-server/lib.ts). This provides immediate user feedback for all review actions.
Load override and memory policy when processing review commands:
!cat ${CLAUDE_SKILL_DIR}/references/review-memory-policy.md
Terminal markdown summary with severity-ranked clusters, evidence tiers, team assignments, and interactive command menu. Optionally mirrored to Slack.
/x-bug-triage @AnthropicAI --window 24h
Produces cluster summary, then user interacts:
> details 1
> file 2
> dismiss 3 noise
> confirm file 2
| Error | Cause | Solution |
|---|---|---|
| X_BEARER_TOKEN not set | Missing env config | Create ~/.claude/channels/x-triage/.env |
| Rate limited (429) | X API quota exhausted | Automatic retry with backoff, degrades gracefully |
| No clusters found | No bug-like posts in window | Widen --window or check approved-searches.json |
| Routing uncertain | No routing signals | Manual assignment required — flagged in output |
| Duplicate detected | Issue already filed | Use merge command instead of file |
References: ${CLAUDE_SKILL_DIR}/references/