From Sentry Workflows
Weekly Sentry grooming pass. Closes stale unresolved issues, re-opens resolved issues that regressed, and assigns owners to high-impact unassigned issues. Use when the user says "groom Sentry", "clean up Sentry issues", "weekly Sentry triage", or when invoked autonomously from a routine.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sentry-workflows:groom-staleThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Three-pass triage that uses only the Sentry MCP — no git operations, no PRs. Safe for unattended runs.
Three-pass triage that uses only the Sentry MCP — no git operations, no PRs. Safe for unattended runs.
SENTRY_ORG_SLUG — requiredSENTRY_DEFAULT_PROJECT_SLUG — optionalSTALE_AGE_DAYS — default 30 (from userConfig)If $ARGUMENTS contains --dry-run, log every decision but do not call update_issue. Default behavior is to apply changes.
All passes use search_issues with the query field (literal Sentry syntax). To pull deeper details on a single issue, use get_sentry_resource with the issue short_id as resourceId.
search_issues with query: "is:unresolved lastSeen:-${STALE_AGE_DAYS}d sort:lastSeen", limit: 50. For each result where:
STALE_AGE_DAYS days is zero (verify via get_sentry_resource event count), ANDfirstSeen < now − 60d)call update_issue with status: "ignored". Track these in a digest section labelled Closed as stale.
search_issues with query: "is:resolved lastSeen:-7d sort:lastSeen", limit: 50. These are resolved issues seeing new events in the last week — almost always regressions. For each one:
get_sentry_resource).update_issue with status: "unresolved".Track these as Re-opened regressions. Do not also assign — leave that for humans or for Pass 3.
search_issues with query: "is:unresolved is:unassigned has:stack sort:freq", limit: 20. For each:
get_sentry_resource to read the top-of-stack file path.git log -n 5 --format='%an|%ae' -- <file> in the current repo to find the most recent authors. If the file doesn't exist in the current repo, skip — this skill is conservative and won't guess owners across repos.find_teams / member lookup; if there's a matching member, call update_issue with assignedTo: "user:<member-id>".find_projects) via assignedTo: "team:<team-slug>".Track these as Assigned. Cap this pass at 20 assignments per run to avoid notification storms.
Print a markdown digest to stdout:
# Sentry grooming digest — <ISO date>
**Org**: <org> **Project**: <project or "all">
## Closed as stale (N)
- <SHORT-ID> <title> — last seen <relative time>
## Re-opened regressions (N)
- <SHORT-ID> <title> — <N> new events since resolve
## Assigned (N)
- <SHORT-ID> → @<handle> (suspected from <file>)
## Skipped (N)
- <SHORT-ID> — <reason>
If a Slack connector is enabled on the user's claude.ai account, also post the digest to the channel the user has configured (the routine prompt asks for the channel; for interactive use just print).
update_issue to ignored is the strongest action.--dry-run produces the same digest but skips every write call.Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub jshchnz/sentry-workflows-plugin --plugin sentry-workflows