--- title: "Fix a Sentry issue" description: "Paste a Sentry issue URL and have the Pi coding agent propose a fix — as a reviewable diff or a pull request." --- The **Sentry issue-fix tool** lets you point OpenSRE at a [Sentry](https://sentry.io) issue and have the [Pi](https://pi.dev) coding agent propose a fix. OpenSRE fetches the issue context, runs Pi in your current repository, and returns a summary plus the git diff. By default it **only edits the working tree** so you can review the diff. When you ask it to `open_pr` (and enable the ship switch), it also commits the fix to a fresh branch, pushes it, and opens a **pull request** — it **never pushes to your base/`main` branch**. This is a **mutating** tool — it changes files on disk and can open a PR. It is **disabled by default**: the fix step needs `PI_ISSUE_FIX_ENABLED=1`, Sentry configured, and the Pi CLI installed. Opening a PR needs a **second** switch, `PI_ISSUE_FIX_SHIP_ENABLED=1`, plus a GitHub token. Enable each deliberately. ## Quick reference | Env var | What it does | | --- | --- | | `PI_ISSUE_FIX_ENABLED` | Opt-in switch for the fix step. Set to `1` to enable. Off by default. | | `PI_ISSUE_FIX_SHIP_ENABLED` | Second opt-in required to open a PR (`open_pr`). Off by default. | | `GITHUB_TOKEN` / `GH_TOKEN` | GitHub token used to open the pull request (needs `repo`/`pull_request` write). | | `SENTRY_ORG_SLUG` / `SENTRY_AUTH_TOKEN` | Sentry org + token used to fetch the issue (`SENTRY_URL` for self-hosted). | | `PI_CODING_MODEL` | Pi model used for the fix (shared with the Pi coding tool). | | `PI_CODING_WORKSPACE` | Repository Pi edits. Defaults to the current directory. | | `PI_CODING_TIMEOUT_SECONDS` | Per-run timeout (default 600, clamped 60–1800). | | Parameter | What it does | | --- | --- | | `sentry_url` | The Sentry issue URL to fix (required). | | `open_pr` | When `true`, commit the fix to a fresh branch and open a PR. Defaults to `false` (diff only). | ## Enable it 1. Configure Sentry (org + token) and install/authenticate the Pi CLI: ```bash export SENTRY_ORG_SLUG=your-org export SENTRY_AUTH_TOKEN=... # token with issue read access npm i -g @earendil-works/pi-coding-agent ``` 2. Turn the tool on: ```bash export PI_ISSUE_FIX_ENABLED=1 export PI_CODING_MODEL=anthropic/claude-haiku-4-5 # optional ``` 3. (Optional) Let OpenSRE open the fix as a pull request: ```bash export PI_ISSUE_FIX_SHIP_ENABLED=1 export GITHUB_TOKEN=... # token with PR-create access to the repo ``` ## Using it from the interactive shell Once enabled, just ask in plain language in `opensre` — the action agent recognizes the intent and runs the tool: ``` fix this sentry issue https://your-org.sentry.io/issues/12345/ and open a pull request ``` Say "open a pull request" (or "ship it") to open a PR; leave it out to only get the diff. Use a *fix* verb — "investigate"/"diagnose" routes to the read-only investigation pipeline instead. ## How it works 1. You paste a Sentry issue URL (e.g. `https://your-org.sentry.io/issues/12345/`) and ask OpenSRE to fix it. 2. OpenSRE resolves the issue from Sentry and builds a short, **masked** task (title, error, culprit, location) — your Sentry token is never sent to Pi. 3. Pi edits the current repository to implement the fix. 4. You get back `success`, a `summary`, `changed_files`, and the `diff` to review. 5. If you asked for `open_pr` (and shipping is enabled), OpenSRE commits the change to a fresh `opensre/sentry-fix--` branch, pushes it, opens a PR into your base branch, and returns the `branch_name`, `pr_url`, and `pr_number`. ## Opening a pull request Ask OpenSRE to *fix the issue and open a PR*. The fix always lands on a new namespaced branch and is proposed via PR: - OpenSRE **never** commits to or pushes your base/`main` branch, and never force-pushes. - The PR is opened **into** the repo's default branch from the new branch, with a body linking the Sentry issue and listing the changed files. - If the fix succeeds but the PR can't be opened (e.g. missing token, push rejected), you still get the `diff` and `changed_files` back, plus the `error_kind`, so you can ship it manually. ## Supported URLs - `https://.sentry.io/issues//` - `https://sentry.io/organizations//issues//` - self-hosted `https://sentry..com/organizations//issues//` ## Notes - Without `open_pr`, nothing is committed or pushed; you review the diff and decide what to do. - If the tool is disabled, the URL is unsupported, Sentry is unconfigured, Pi is missing, or a PR can't be opened, it returns a clear `error_kind` instead of silently doing the wrong thing.