# Fix Issue

> Find one Sentry issue you are confident you can fix in the current repository and open a draft pull request that fixes it. Use when the user says "fix something from Sentry", "find a Sentry issue to fix", "auto-fix a Sentry bug", or when invoked autonomously from a Claude routine. Requires the Sentry MCP and `gh` CLI to be available.

- Skill: `jshchnz/fix-issue` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jshchnz/fix-issue`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jshchnz/fix-issue/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: jshchnz (https://skillmd.com/u/jshchnz)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jshchnz/fix-issue

---


# fix-issue

End-to-end: pick one fixable Sentry issue, write the patch, push to a `claude/`-prefixed branch, and open a draft PR.

## Inputs

The plugin already configured these via `userConfig`; read them from the environment as `CLAUDE_PLUGIN_OPTION_*`:

- `SENTRY_ORG_SLUG` — required
- `SENTRY_DEFAULT_PROJECT_SLUG` — optional; if set, scope the issue search to it

Auth is handled by the remote MCP at `mcp.sentry.dev` via OAuth — on first use Claude Code opens a browser to authorize. Do not prompt the user for tokens.

If the user passed `$ARGUMENTS`, treat it as a free-form Sentry query filter to append (e.g. "javascript stacktrace.module:checkout/").

## Workflow

### 1. Confirm preconditions

- `gh auth status` must succeed. If not, stop and tell the user to run `gh auth login`.
- `git status` must show a clean working tree. If dirty, stop and ask the user to stash.
- Determine the GitHub `owner/repo` via `gh repo view --json nameWithOwner -q .nameWithOwner`.

### 2. Pull candidate issues

Call the Sentry MCP `search_issues` tool with:

- `organizationSlug`: `SENTRY_ORG_SLUG`
- `projectSlugOrId`: `SENTRY_DEFAULT_PROJECT_SLUG` (omit if unset)
- `query`: `is:unresolved is:unassigned has:stack sort:freq ${ARGUMENTS}` — literal Sentry-syntax filter; append any user filter
- `limit`: 10

(`search_issues` accepts either a `query` field with literal Sentry syntax OR a `naturalLanguageQuery` field. Always pass `query` here — it works whether or not the server has an `EMBEDDED_AGENT_PROVIDER` configured.)

If the call fails with an auth error, tell the user: "The Sentry MCP isn't authorized. Re-run `/plugin enable sentry-workflows` and complete the browser OAuth flow when it opens." and stop.

### 3. Score candidates in parallel

For each candidate, spawn the `issue-scorer` agent (one Agent call per candidate, all in one assistant message so they run in parallel). Each scorer call gets:

- The issue short_id, title, culprit, and platform
- A `get_sentry_resource` result for the issue (so the agent sees the top stack frames and breadcrumbs without re-fetching). Pass the issue short_id as `resourceId` and `SENTRY_ORG_SLUG` as `organizationSlug`.

Each scorer returns JSON `{score: 1-5, fixable: bool, reasoning: string, suspected_files: string[]}`.

### 4. Pick the winner

Filter for `fixable: true` and `score >= 4` AND at least one `suspected_files` entry that exists in the current repo (`ls` or `test -f`). If none qualify, post a one-paragraph summary explaining why each was skipped and exit cleanly. **Never widen the criteria silently.**

### 5. Branch preflight

Before invoking the implementer, check whether a branch for this issue already exists from a previous run.

Let `BRANCH = claude/sentry-fix-<issue-short-id-lowercased>`.

- Run `git show-ref --verify --quiet refs/heads/${BRANCH}`. If the ref exists locally:
  - Run `gh pr list --head ${BRANCH} --state all --json url,state,isDraft --jq '.[0]'`.
  - If a PR exists, skip this issue and report `<short-id> → PR already open: <url>` (or `closed`/`merged` if applicable). Move to the next candidate.
  - If no PR exists, the branch is orphaned. Stop with a clear message: `Local branch ${BRANCH} exists but has no PR. Delete it (\`git branch -D ${BRANCH}\`) and re-run.` Do **not** auto-delete.
- If the ref does not exist, proceed.

### 6. Implement the fix

Hand off to the `fix-implementer` agent with:

- The full issue payload (stack trace, breadcrumbs, tags, event count)
- The scorer's `suspected_files` and `reasoning`
- Branch name: `claude/sentry-fix-<issue-short-id-lowercased>`
- Repo `owner/repo`

The agent implements, runs the project's tests if it can identify them, commits, pushes, and opens a **draft** PR. The PR body must include:

- A link to the Sentry issue (`https://sentry.io/organizations/<org>/issues/<short-id>/`)
- A short root-cause explanation
- What was changed and why
- Test plan (commands run + result)
- A `Closes <issue-short-id>` line (informational; Sentry's GitHub integration links it)

### 7. Update Sentry

Call the Sentry MCP `update_issue` tool to assign the issue to the `whoami` result (the authenticated user). Do not resolve the issue — wait for the PR to merge.

### 8. Report

Print a one-line summary: `<issue-short-id> → <PR URL> (branch: <branch>)`.

## Hard rules

- **Never push to `main`, `master`, or any branch that does not start with `claude/`.** Routines enforce this server-side; respect it locally too.
- **Never run `git push --force` or `--no-verify`.**
- **Never resolve a Sentry issue from this skill** — only `update_issue` to assign. Resolution happens when the PR merges.
- If the issue's stack trace references files outside the current repo, mark it unfixable and move on. Do not invent file paths.
- If you cannot find a clean fix within the scorer's `suspected_files`, abort and report — do not refactor broadly to make the fix work.

## Optional Seer hint

If after step 3 every candidate scored 3 or below and the user invoked the skill with `--use-seer` in `$ARGUMENTS`, call `analyze_issue_with_seer` on the top-frequency issue, then re-run the scorer with Seer's suspected files added to the input. Seer takes 2–5 minutes; warn the user before calling it.

