[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BVT2W5WRRB46R068646G5M":3,"skill-same:01M6BVT2W5WRRB46R068646G5M":68},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":51,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6BVT2W5WRRB46R068646G5M","fix-sentry-issue",null,"Investigates the most actionable open Sentry issue for force-production, locates the root cause in source code, and opens a fix PR. Use when asked to look at Sentry, fix a Sentry issue, or investigate production errors.","artsy\u002Fforce","artsy","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F546231?v=4","01M6BVSTECNPYTPBN8PTGZSAJY","Artsy","01M6BVSTJGAXMT1K56W2A2NSSM",638,"MIT","https:\u002F\u002Fgithub.com\u002Fartsy\u002Fforce\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffix-sentry-issue\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"issue","fix sentry","fix","fix sentry issue","sentry","investigate","open","Production","use","look","pr","actionable","errors","fix pr","at","for","source","root cause","when","code","2026-11-10 10:12:30",false,"---\nname: fix-sentry-issue\ndescription: Investigates the most actionable open Sentry issue for force-production, locates the root cause in source code, and opens a fix PR. Use when asked to look at Sentry, fix a Sentry issue, or investigate production errors.\n---\n\n# Fix a Sentry issue\n\n## Prerequisites\n\nYou need the Sentry MCP server connected to Claude Code. Run this once:\n\n```sh\nclaude mcp add --transport http sentry https:\u002F\u002Fmcp.sentry.dev\u002Fmcp\n```\n\nThen authenticate when prompted.\n\n---\n\nSentry org: `artsynet` — project: `force-production`\n\n## Check Sentry MCP is available\n\nBefore doing anything else, verify the Sentry MCP tools are accessible by attempting to call `mcp__sentry__whoami`. If the call fails or the tool is not available, stop immediately and tell the user:\n\n> The Sentry MCP server is not connected. Use `\u002Fmcp` to reconnect it, or run `claude mcp add --transport http sentry https:\u002F\u002Fmcp.sentry.dev\u002Fmcp` if it hasn't been added yet. Then start a new session and try again.\n\nDo not attempt to work around this using the REST API, environment variables, or subagents.\n\n---\n\nUse this checklist to track progress:\n\n- [ ] Verify Sentry MCP is available\n- [ ] Find the most actionable issue\n- [ ] Confirm with user\n- [ ] Investigate root cause\n- [ ] Locate source code\n- [ ] Implement fix\n- [ ] Verify quality\n- [ ] Open PR\n\n---\n\n## Find the most actionable issue\n\nQuery `mcp__sentry__search_issues` with:\n\n- `organizationSlug: artsynet`\n- `projectSlugOrId: force-production`\n- `query: is:unresolved`\n- `sort: freq`\n\nPick the issue that best matches all of these criteria. The best candidate will match most of them:\n\n- **High event volume** relative to user count — many events per user suggests repeated crashing, not a one-off\n- **First-party stack frames** — the stack trace includes files under `src\u002F` (TypeScript filenames, not minified bundle references); issues where every frame is inside `react-dom` or `node_modules` are usually not fixable here\n- **Not a browser\u002Fenvironment quirk** — skip issues where the top user agents are legacy browsers, bots, or where the culprit is a third-party script\n- **Not a stale-build hydration error** — `removeChild` \u002F hydration crashes on routes other than a known-bad one are often caused by users running old cached JS with no source maps; these don't have a code fix\n- **Not already assigned or in progress**\n\nIf a specific issue ID was provided by the user, skip this step and use that instead.\n\n---\n\n## Confirm with user\n\nPresent the chosen issue (title, event count, Sentry URL) and use `AskUserQuestion` to ask whether to proceed with it or pick the next candidate. This prevents the skill from duplicating work when a fix is already in flight but not yet merged.\n\n---\n\n## Investigate root cause\n\n1. Use `mcp__sentry__get_sentry_resource` on the issue URL to get full details including the stack trace\n2. Find a representative recent event using `mcp__sentry__search_events` or `mcp__sentry__search_issue_events` — prefer events where the stack trace resolves to TypeScript filenames (source maps present)\n3. Read the stack trace carefully:\n   - Identify the **first frame that is in first-party code** (`src\u002F`) — that is the bug site, not the deepest React internals frame\n   - Note the component name, file path, and line number\n4. Check whether multiple events share the same root frame, or whether the issue groups unrelated bugs under one fingerprint\n\nCommon patterns seen in this codebase:\n\n- **State mutation during render**: calling `dispatch` \u002F `setState` inside a render prop callback (e.g., `SystemQueryRenderer`'s `render` prop runs during React's render phase — any state update there causes hydration crashes)\n- **React Rules of Hooks violations**: calling hooks conditionally or after an early `return`\n- **Unsafe property access**: calling `.toString()` or similar on a value that can be `undefined` at runtime\n\n---\n\n## Locate source code\n\nUse the file path and line number from the stack trace to read the relevant source files. Understand:\n\n- What the component is doing\n- Why the crash occurs\n- What the correct behavior should be\n\n---\n\n## Implement fix\n\n- Create a feature branch: `git checkout -b \u003Cyour-name>\u002Ffix\u002F\u003Cshort-description>`\n- Make the minimal fix — do not refactor surrounding code\n- Do not push directly to `main`\n\n---\n\n## Verify quality\n\nRun all three checks and fix any issues before committing:\n\n```sh\nyarn type-check\nyarn jest $(git ls-files --modified --others --exclude-standard)\nyarn lint $(git ls-files --modified --others --exclude-standard)\n```\n\n---\n\n## Open PR\n\nOpen a PR with:\n\n- A short title following Conventional Commits style (`fix: ...`)\n- A **What** section explaining the bug\n- A **Fix** section explaining the change\n- A **Related** section linking to the Sentry issue (e.g., `https:\u002F\u002Fartsynet.sentry.io\u002Fissues\u002FFORCE-PRODUCTION-XXXX`) and noting whether this fully fixes or only reduces the issue\n\n> **IMPORTANT — do not auto-resolve the Sentry issue prematurely.**\n> Never use `Fixes FORCE-PRODUCTION-XXXX` or `Closes FORCE-PRODUCTION-XXXX` in a commit message. Sentry's GitHub integration treats these as trigger keywords and will resolve the issue immediately when the branch is pushed — before the fix is deployed. Reference the Sentry issue only as a URL in the PR body, never as a keyword in a commit message.\n\n## Celebrate\n\nIndicate you are done with a \u002Fbeep\n","# Fix a Sentry issue\n\n## Prerequisites\n\nYou need the Sentry MCP server connected to Claude Code. Run this once:\n\n```sh\nclaude mcp add --transport http sentry https:\u002F\u002Fmcp.sentry.dev\u002Fmcp\n```\n\nThen authenticate when prompted.\n\n---\n\nSentry org: `artsynet` — project: `force-production`\n\n## Check Sentry MCP is available\n\nBefore doing anything else, verify the Sentry MCP tools are accessible by attempting to call `mcp__sentry__whoami`. If the call fails or the tool is not available, stop immediately and tell the user:\n\n> The Sentry MCP server is not connected. Use `\u002Fmcp` to reconnect it, or run `claude mcp add --transport http sentry https:\u002F\u002Fmcp.sentry.dev\u002Fmcp` if it hasn't been added yet. Then start a new session and try again.\n\nDo not attempt to work around this using the REST API, environment variables, or subagents.\n\n---\n\nUse this checklist to track progress:\n\n- [ ] Verify Sentry MCP is available\n- [ ] Find the most actionable issue\n- [ ] Confirm with user\n- [ ] Investigate root cause\n- [ ] Locate source code\n- [ ] Implement fix\n- [ ] Verify quality\n- [ ] Open PR\n\n---\n\n## Find the most actionable issue\n\nQuery `mcp__sentry__search_issues` with:\n\n- `organizationSlug: artsynet`\n- `projectSlugOrId: force-production`\n- `query: is:unresolved`\n- `sort: freq`\n\nPick the issue that best matches all of these criteria. The best candidate will match most of them:\n\n- **High event volume** relative to user count — many events per user suggests repeated crashing, not a one-off\n- **First-party stack frames** — the stack trace includes files under `src\u002F` (TypeScript filenames, not minified bundle references); issues where every frame is inside `react-dom` or `node_modules` are usually not fixable here\n- **Not a browser\u002Fenvironment quirk** — skip issues where the top user agents are legacy browsers, bots, or where the culprit is a third-party script\n- **Not a stale-build hydration error** — `removeChild` \u002F hydration crashes on routes other than a known-bad one are often caused by users running old cached JS with no source maps; these don't have a code fix\n- **Not already assigned or in progress**\n\nIf a specific issue ID was provided by the user, skip this step and use that instead.\n\n---\n\n## Confirm with user\n\nPresent the chosen issue (title, event count, Sentry URL) and use `AskUserQuestion` to ask whether to proceed with it or pick the next candidate. This prevents the skill from duplicating work when a fix is already in flight but not yet merged.\n\n---\n\n## Investigate root cause\n\n1. Use `mcp__sentry__get_sentry_resource` on the issue URL to get full details including the stack trace\n2. Find a representative recent event using `mcp__sentry__search_events` or `mcp__sentry__search_issue_events` — prefer events where the stack trace resolves to TypeScript filenames (source maps present)\n3. Read the stack trace carefully:\n   - Identify the **first frame that is in first-party code** (`src\u002F`) — that is the bug site, not the deepest React internals frame\n   - Note the component name, file path, and line number\n4. Check whether multiple events share the same root frame, or whether the issue groups unrelated bugs under one fingerprint\n\nCommon patterns seen in this codebase:\n\n- **State mutation during render**: calling `dispatch` \u002F `setState` inside a render prop callback (e.g., `SystemQueryRenderer`'s `render` prop runs during React's render phase — any state update there causes hydration crashes)\n- **React Rules of Hooks violations**: calling hooks conditionally or after an early `return`\n- **Unsafe property access**: calling `.toString()` or similar on a value that can be `undefined` at runtime\n\n---\n\n## Locate source code\n\nUse the file path and line number from the stack trace to read the relevant source files. Understand:\n\n- What the component is doing\n- Why the crash occurs\n- What the correct behavior should be\n\n---\n\n## Implement fix\n\n- Create a feature branch: `git checkout -b \u003Cyour-name>\u002Ffix\u002F\u003Cshort-description>`\n- Make the minimal fix — do not refactor surrounding code\n- Do not push directly to `main`\n\n---\n\n## Verify quality\n\nRun all three checks and fix any issues before committing:\n\n```sh\nyarn type-check\nyarn jest $(git ls-files --modified --others --exclude-standard)\nyarn lint $(git ls-files --modified --others --exclude-standard)\n```\n\n---\n\n## Open PR\n\nOpen a PR with:\n\n- A short title following Conventional Commits style (`fix: ...`)\n- A **What** section explaining the bug\n- A **Fix** section explaining the change\n- A **Related** section linking to the Sentry issue (e.g., `https:\u002F\u002Fartsynet.sentry.io\u002Fissues\u002FFORCE-PRODUCTION-XXXX`) and noting whether this fully fixes or only reduces the issue\n\n> **IMPORTANT — do not auto-resolve the Sentry issue prematurely.**\n> Never use `Fixes FORCE-PRODUCTION-XXXX` or `Closes FORCE-PRODUCTION-XXXX` in a commit message. Sentry's GitHub integration treats these as trigger keywords and will resolve the issue immediately when the branch is pushed — before the fix is deployed. Reference the Sentry issue only as a URL in the PR body, never as a keyword in a commit message.\n\n## Celebrate\n\nIndicate you are done with a \u002Fbeep\n",{"name":5,"description":7},"main","aca22c69f8b9d4f0bf9396e78f248d720b3f234d",".claude\u002Fskills\u002Ffix-sentry-issue",151,"https:\u002F\u002Fgithub.com\u002Fartsy\u002Fforce","https:\u002F\u002Fwww.artsy.net","https:\u002F\u002Fgithub.com\u002Fartsy","https:\u002F\u002Fartsy.github.io","Artsy.net Team","2026-11-11 02:39:27",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add artsy\u002Fforce --skill fix-sentry-issue",{"tool":60,"command":61},"bunx","bunx skills add artsy\u002Fforce --skill fix-sentry-issue",{"tool":63,"command":64},"pnpm","pnpm dlx skills add artsy\u002Fforce --skill fix-sentry-issue","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fartsy\u002Fforce\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Ffix-sentry-issue\u002FSKILL.md",true,[],[69,79],{"skillNo":70,"name":71,"nameZh":6,"description":72,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":73,"categories":74,"keywords":75,"publishedAt":39},"01M6BVT18KJD870VWK6PKX928Z","beep","Play a system beep. Use when asked to beep, play a beep, issue a system beep etc.","https:\u002F\u002Fgithub.com\u002Fartsy\u002Fforce\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fbeep\u002FSKILL.md",[],[71,37,19,27,76,77,78],"system","Bash","play",{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":39},"01M6BVSZ46BVPNH3CWRVHY745C","adding-a-new-app-route","Fully wires up a new route with required boilerplate, following this repo's conventions for subapps. Use when user wants to add a new route or app or subapp or page or screen.","https:\u002F\u002Fgithub.com\u002Fartsy\u002Fforce\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fadding-a-new-app-route\u002FSKILL.md",[],[86,87,88,89,90,37,34,91,92,93,94,95,27,96,97,98,71],"route","app","new","adding a new app route","add","with","boilerplate","screen","conventions","up","user","repo","page"]