[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-sentry-sdk-feature-implementation":3,"mdc-1qlvsg-key":35,"related-repo-sentry-sdk-feature-implementation":1432,"related-org-sentry-sdk-feature-implementation":1536},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":24,"repoUrl":25,"updatedAt":26,"license":27,"forks":28,"topics":29,"repo":31,"sourceUrl":33,"mdContent":34},"sdk-feature-implementation","implement features across Sentry SDKs","Implement a feature across Sentry SDK repositories by spawning parallel agents. Use when you have Linear initiatives\u002Fprojects\u002Fissues and want to create draft PRs. Triggers on \"implement across SDKs\", \"spawn SDK agents\", \"SDK implementation\", \"parallel SDK implementation\", \"continue SDK rollout\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"sentry","Sentry","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsentry.png","getsentry",[13,17,20,21],{"name":14,"slug":15,"type":16},"Operations","operations","tag",{"name":18,"slug":19,"type":16},"SDK","sdk",{"name":9,"slug":8,"type":16},{"name":22,"slug":23,"type":16},"Pull Requests","pull-requests",2,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fsdk-skills","2026-04-06T18:14:55.930879",null,0,[30],"tag-production",{"repoUrl":25,"stars":24,"forks":28,"topics":32,"description":27},[30],"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fsdk-skills\u002Ftree\u002FHEAD\u002Fplugins\u002Fsentry-sdk-skills\u002Fskills\u002Fsdk-feature-implementation","---\nname: sdk-feature-implementation\ndescription: Implement a feature across Sentry SDK repositories by spawning parallel agents. Use when you have Linear initiatives\u002Fprojects\u002Fissues and want to create draft PRs. Triggers on \"implement across SDKs\", \"spawn SDK agents\", \"SDK implementation\", \"parallel SDK implementation\", \"continue SDK rollout\".\nallowed-tools: Read Grep Glob Bash WebFetch Task AskUserQuestion mcp__linear-server__query_data mcp__linear-server__get_project mcp__linear-server__get_issue mcp__linear-server__list_issues mcp__linear-server__get_initiative mcp__linear-server__list_comments mcp__linear-server__save_project mcp__linear-server__update_project\ncompatibility: \"Requires the Linear MCP server (github.com\u002Flinear\u002Flinear-mcp) for context gathering and tracking. Requires gh CLI installed and authenticated for all GitHub operations (PRs, branches, CI logs).\"\n---\n\n# SDK Feature Implementation\n\nImplement a feature across Sentry SDK repositories by spawning parallel agents that create draft PRs.\n\n## Repo Access\n\nOnly operate on repos listed in [SDK_REPOS.md](..\u002F..\u002FSDK_REPOS.md). Only repos with Enabled=Yes are included by default. All repos are under the `getsentry` GitHub org.\n\nUse `gh` CLI for all GitHub operations (PRs, branches, CI logs). Use Linear MCP for all context gathering and tracking.\n\n## Instructions\n\n### Step 1: Gather Context\n\n**Linear MCP is the primary source for all context gathering.** The user needs to provide enough context to know **what** to implement and **where**. Accept any of these starting points:\n\n- **Linear initiative** (ideal) — fetch with `mcp__linear-server__get_initiative` to get the overview, then drill into projects\u002Fissues per SDK team\n- **Linear project or issue** — extract spec, reference PRs, and target repo from the description\n- **Spec URL + target repos** — user provides directly\n- **Single repo + description** — implement in just one SDK\n\nFrom the provided context, extract:\n- **Spec URL** — look for links to specs\u002FRFCs in Linear issue\u002Fproject descriptions\n- **Reference implementation PRs** — look for PR links in Linear issue attachments or descriptions\n- **Target repos** — determine which SDK repos to implement in\n- **GitHub issue numbers** — found in Linear issue attachments (GitHub links are auto-attached)\n\n**Context gathering flow:**\n1. `mcp__linear-server__get_initiative` — get initiative overview and linked projects\n2. `mcp__linear-server__get_project` — get project details for target SDK teams\n3. `mcp__linear-server__get_issue` — get detailed requirements, spec links, and GitHub issue attachments from each issue\n4. `mcp__linear-server__list_comments` — check for additional context or decisions in issue comments\n\nLinear issues have GitHub issue\u002FPR links as **attachments** — use these to find the corresponding GitHub issue numbers without needing to search GitHub directly.\n\n### Step 2: Fetch and Summarize Spec\n\nIf a spec URL was found, use `WebFetch` to read it. Otherwise, gather requirements from Linear issue descriptions and `gh issue view \u003Cnumber> --repo getsentry\u002F\u003Crepo-name>` for GitHub issue details. Present a concise summary:\n- Feature name\n- Key requirements (bulleted list)\n- SDK-specific considerations\n- Breaking changes or deprecations\n\nAsk the user to confirm the summary is accurate before proceeding.\n\n### Step 2.5: Identify SDK Dependencies\n\nHybrid SDKs depend on native SDKs for their platform layers:\n- **sentry-react-native** and **sentry-capacitor** wrap `@sentry\u002Fcore` (JS) + sentry-cocoa (iOS) + sentry-java (Android)\n- **sentry-dart** (Flutter) has its own Dart implementation but uses sentry-cocoa (iOS) and sentry-java (Android) for native crash reporting and trace context in crash envelopes\n- **sentry-unity** and **sentry-kotlin-multiplatform** also depend on sentry-cocoa and sentry-java\n\nWhen implementing across both hybrid and native SDKs:\n- **Implement native SDKs (Cocoa, Java) first** — hybrid SDKs can't compile native bridge code until those are released\n- **JS wrapper SDKs** (React Native, Capacitor) may already have the feature via `@sentry\u002Fcore` — check before implementing from scratch. If `@sentry\u002Fcore` already has it, the work is: expose options in SDK types, pass through to native bridge, add tests\n- **Hybrid SDK PRs should note** in \"Next steps\" which native SDK PRs must merge and be released before the hybrid SDK is fully functional\n- **Only spawn ONE agent per repo.** If a repo already has a worktree\u002Fbranch from a previous run, reuse it\n\n### Step 3: Check Implementation State\n\nFor each target repo, check for existing PRs:\n\n- **First check Linear** — issue attachments contain links to GitHub PRs that were auto-linked\n- **Then check GitHub** for PR status using `gh pr list --repo getsentry\u002F\u003Crepo-name> --search \"\u003Cfeature-keyword>\" --json number,title,state,isDraft,url`\n- For PR details: `gh pr view \u003Cnumber> --repo getsentry\u002F\u003Crepo-name> --json state,isDraft,mergeable,statusCheckRollup`\n\nPresent a matrix:\n\n```\n| SDK Repo | GH Issue | Existing PR | CI Status | Action |\n|----------|----------|-------------|-----------|--------|\n| sentry-rust | #123 | None | — | Implement |\n| sentry-go | #124 | #200 (draft) | Failing | Fix CI |\n| sentry-python | #100 | #150 (merged) | — | Skip |\n```\n\nThis handles \"continue from where you left off\" naturally. Ask the user to confirm the action plan.\n\n### Step 4: Spawn Implementation Agents\n\n1. Read `references\u002Fagent-prompt.md` for the implementation agent prompt template.\n2. Fill in `\u003Crepo-name>`, `\u003Cspec-summary>`, `\u003Creference-prs>`, `\u003Cfeature-name>`, and `\u003Cissue-number>` for each SDK.\n3. **Ask the user before spawning agents.** Show them how many agents will be spawned and for which SDKs.\n4. Spawn agents **in parallel**. Each agent clones the repo and creates a git worktree internally for isolation.\n\n### Step 5: Verify with CI\n\nLocal tests should have already passed during implementation. Use CI as final verification.\n\nAfter agents create draft PRs, check CI status with `gh pr view \u003Cnumber> --repo getsentry\u002F\u003Crepo-name> --json statusCheckRollup`.\n\nIf CI fails:\n\n1. **Fetch the actual failure logs** — don't guess:\n   ```bash\n   gh run list --repo getsentry\u002F\u003Crepo-name> --branch feat\u002F\u003Cfeature-name> --limit 5\n   gh run view \u003Crun-id> --repo getsentry\u002F\u003Crepo-name> --log-failed\n   ```\n\n2. **Fix the issue directly** or spawn a fix agent with the CI error output included in the prompt.\n\n3. The fix should:\n   - Read the failing files locally in the worktree\n   - Reproduce and verify the fix locally\n   - Push fixes with `git push`\n\n4. Re-check CI status after the fix.\n\n**Expect 2-3 CI fix iterations.** Common issues:\n- **Formatting** — Run formatters with resolved dependencies (e.g., `dart pub get` before `dart format`)\n- **Linting** — Unnecessary imports, public API exposure for `@internal` functions\n- **API stability** — Some SDKs (Cocoa, Java) have API baseline checks; regenerate if you changed public API\n- **Doc sync tests** — Some SDKs check that all options are documented in sentry-docs; add to allowlist if docs PR is separate\n- **Changelog** — Some SDKs verify changelog entries exist for new features\n\nRun CI-monitoring agents in the background so multiple PRs can be checked in parallel.\n\n### Step 5.5: Address Review Feedback\n\nAfter CI passes, check for automated review feedback (Cursor bot, Danger, Sentry bot, etc.):\n\n```bash\ngh api repos\u002Fgetsentry\u002F\u003Crepo-name>\u002Fpulls\u002F\u003Cnumber>\u002Fcomments\ngh api repos\u002Fgetsentry\u002F\u003Crepo-name>\u002Fissues\u002F\u003Cnumber>\u002Fcomments\n```\n\n- Address valid feedback with code fixes and reply referencing the fix commit\n- Reply to false positives with reasoning\n- Common automated feedback: missing option allowlists, public API exposure, test coverage gaps\n\n### Step 6: Create Documentation PRs\n\nFor each SDK implementation, check if sentry-docs needs updates:\n\n1. Search sentry-docs for existing documentation related to the feature (e.g., configuration options pages, feature-specific guides, platform includes)\n2. Add or update documentation as needed — new options, new guides, or updated platform-specific includes\n3. Create docs PRs following the sentry-docs PR template (`.github\u002FPULL_REQUEST_TEMPLATE.md`)\n4. Link docs PRs from the SDK PRs\n\nCreate separate docs PRs per SDK — don't bundle multiple platforms into one PR.\n\n### Step 7: Collect Results\n\nOnce all agents complete and CI passes:\n\n1. **Present a results table**:\n   ```\n   | SDK Repo | GH Issue | Draft PR | CI Status | Docs PR | Notes |\n   |----------|----------|----------|-----------|---------|-------|\n   | sentry-rust | #123 | #456 | Passing | #789 | Ready for review |\n   | sentry-go | #124 | #457 | Failing | — | Test timeout, needs manual fix |\n   ```\n\n2. **Link to Linear** (if available):\n   - For each SDK that has a Linear project, use `mcp__linear-server__save_project` to add the PR links to the project description\n   - Note: `mcp__linear-server__query_data` is **read-only** — always use `mcp__linear-server__save_project` for writes\n\n3. **Summary**: What was done and what needs manual follow-up.\n\n## Notes\n\n- Always confirm with the user before spawning agents — never auto-create without approval\n- **Use Linear MCP for all context gathering** (specs, requirements, issue details, project status). Use `gh` CLI for all GitHub operations (PRs, branches, CI logs, pushing code)\n- Only operate on repos listed in [SDK_REPOS.md](..\u002F..\u002FSDK_REPOS.md)\n- For large rollouts (10+ SDKs), consider batching in groups of 5 to avoid rate limits\n- If a reference implementation is not available, the agent should still attempt implementation based on the spec alone, but flag it for extra review\n- Implementation agents clone the repo and use `git worktree` for isolated working directories\n- Run tests locally before creating PRs. CI serves as final verification\n- Use the **`linear-sdk-rollout`** skill first if Linear projects\u002Fissues don't exist yet\n\n## Example Usage\n\nUser: \"Implement strict trace continuation across Rust, Go, and Java SDKs\"\n\nResponse flow:\n1. Gather context — get initiative, projects, and issues from Linear MCP\n2. Fetch spec, confirm summary with user\n3. Check existing PRs — Rust has nothing, Go has a failing draft, Java has nothing\n4. Confirm plan: spawn 2 new agents (Rust, Java) + 1 fix agent (Go)\n5. Spawn agents in parallel with worktree isolation\n6. Monitor CI, fix failures (expect 2-3 iterations)\n7. Create docs PRs for each SDK\n8. Present results table, link to Linear\n",{"data":36,"body":39},{"name":4,"description":6,"allowed-tools":37,"compatibility":38},"Read Grep Glob Bash WebFetch Task AskUserQuestion mcp__linear-server__query_data mcp__linear-server__get_project mcp__linear-server__get_issue mcp__linear-server__list_issues mcp__linear-server__get_initiative mcp__linear-server__list_comments mcp__linear-server__save_project mcp__linear-server__update_project","Requires the Linear MCP server (github.com\u002Flinear\u002Flinear-mcp) for context gathering and tracking. Requires gh CLI installed and authenticated for all GitHub operations (PRs, branches, CI logs).",{"type":40,"children":41},"root",[42,50,56,63,85,98,104,111,136,189,194,237,245,292,304,310,331,354,359,365,370,424,429,486,492,497,537,542,554,559,565,646,652,657,670,675,897,907,984,989,995,1000,1124,1142,1148,1153,1183,1188,1194,1199,1284,1290,1367,1373,1378,1383,1426],{"type":43,"tag":44,"props":45,"children":46},"element","h1",{"id":4},[47],{"type":48,"value":49},"text","SDK Feature Implementation",{"type":43,"tag":51,"props":52,"children":53},"p",{},[54],{"type":48,"value":55},"Implement a feature across Sentry SDK repositories by spawning parallel agents that create draft PRs.",{"type":43,"tag":57,"props":58,"children":60},"h2",{"id":59},"repo-access",[61],{"type":48,"value":62},"Repo Access",{"type":43,"tag":51,"props":64,"children":65},{},[66,68,75,77,83],{"type":48,"value":67},"Only operate on repos listed in ",{"type":43,"tag":69,"props":70,"children":72},"a",{"href":71},"..\u002F..\u002FSDK_REPOS.md",[73],{"type":48,"value":74},"SDK_REPOS.md",{"type":48,"value":76},". Only repos with Enabled=Yes are included by default. All repos are under the ",{"type":43,"tag":78,"props":79,"children":81},"code",{"className":80},[],[82],{"type":48,"value":11},{"type":48,"value":84}," GitHub org.",{"type":43,"tag":51,"props":86,"children":87},{},[88,90,96],{"type":48,"value":89},"Use ",{"type":43,"tag":78,"props":91,"children":93},{"className":92},[],[94],{"type":48,"value":95},"gh",{"type":48,"value":97}," CLI for all GitHub operations (PRs, branches, CI logs). Use Linear MCP for all context gathering and tracking.",{"type":43,"tag":57,"props":99,"children":101},{"id":100},"instructions",[102],{"type":48,"value":103},"Instructions",{"type":43,"tag":105,"props":106,"children":108},"h3",{"id":107},"step-1-gather-context",[109],{"type":48,"value":110},"Step 1: Gather Context",{"type":43,"tag":51,"props":112,"children":113},{},[114,120,122,127,129,134],{"type":43,"tag":115,"props":116,"children":117},"strong",{},[118],{"type":48,"value":119},"Linear MCP is the primary source for all context gathering.",{"type":48,"value":121}," The user needs to provide enough context to know ",{"type":43,"tag":115,"props":123,"children":124},{},[125],{"type":48,"value":126},"what",{"type":48,"value":128}," to implement and ",{"type":43,"tag":115,"props":130,"children":131},{},[132],{"type":48,"value":133},"where",{"type":48,"value":135},". Accept any of these starting points:",{"type":43,"tag":137,"props":138,"children":139},"ul",{},[140,159,169,179],{"type":43,"tag":141,"props":142,"children":143},"li",{},[144,149,151,157],{"type":43,"tag":115,"props":145,"children":146},{},[147],{"type":48,"value":148},"Linear initiative",{"type":48,"value":150}," (ideal) — fetch with ",{"type":43,"tag":78,"props":152,"children":154},{"className":153},[],[155],{"type":48,"value":156},"mcp__linear-server__get_initiative",{"type":48,"value":158}," to get the overview, then drill into projects\u002Fissues per SDK team",{"type":43,"tag":141,"props":160,"children":161},{},[162,167],{"type":43,"tag":115,"props":163,"children":164},{},[165],{"type":48,"value":166},"Linear project or issue",{"type":48,"value":168}," — extract spec, reference PRs, and target repo from the description",{"type":43,"tag":141,"props":170,"children":171},{},[172,177],{"type":43,"tag":115,"props":173,"children":174},{},[175],{"type":48,"value":176},"Spec URL + target repos",{"type":48,"value":178}," — user provides directly",{"type":43,"tag":141,"props":180,"children":181},{},[182,187],{"type":43,"tag":115,"props":183,"children":184},{},[185],{"type":48,"value":186},"Single repo + description",{"type":48,"value":188}," — implement in just one SDK",{"type":43,"tag":51,"props":190,"children":191},{},[192],{"type":48,"value":193},"From the provided context, extract:",{"type":43,"tag":137,"props":195,"children":196},{},[197,207,217,227],{"type":43,"tag":141,"props":198,"children":199},{},[200,205],{"type":43,"tag":115,"props":201,"children":202},{},[203],{"type":48,"value":204},"Spec URL",{"type":48,"value":206}," — look for links to specs\u002FRFCs in Linear issue\u002Fproject descriptions",{"type":43,"tag":141,"props":208,"children":209},{},[210,215],{"type":43,"tag":115,"props":211,"children":212},{},[213],{"type":48,"value":214},"Reference implementation PRs",{"type":48,"value":216}," — look for PR links in Linear issue attachments or descriptions",{"type":43,"tag":141,"props":218,"children":219},{},[220,225],{"type":43,"tag":115,"props":221,"children":222},{},[223],{"type":48,"value":224},"Target repos",{"type":48,"value":226}," — determine which SDK repos to implement in",{"type":43,"tag":141,"props":228,"children":229},{},[230,235],{"type":43,"tag":115,"props":231,"children":232},{},[233],{"type":48,"value":234},"GitHub issue numbers",{"type":48,"value":236}," — found in Linear issue attachments (GitHub links are auto-attached)",{"type":43,"tag":51,"props":238,"children":239},{},[240],{"type":43,"tag":115,"props":241,"children":242},{},[243],{"type":48,"value":244},"Context gathering flow:",{"type":43,"tag":246,"props":247,"children":248},"ol",{},[249,259,270,281],{"type":43,"tag":141,"props":250,"children":251},{},[252,257],{"type":43,"tag":78,"props":253,"children":255},{"className":254},[],[256],{"type":48,"value":156},{"type":48,"value":258}," — get initiative overview and linked projects",{"type":43,"tag":141,"props":260,"children":261},{},[262,268],{"type":43,"tag":78,"props":263,"children":265},{"className":264},[],[266],{"type":48,"value":267},"mcp__linear-server__get_project",{"type":48,"value":269}," — get project details for target SDK teams",{"type":43,"tag":141,"props":271,"children":272},{},[273,279],{"type":43,"tag":78,"props":274,"children":276},{"className":275},[],[277],{"type":48,"value":278},"mcp__linear-server__get_issue",{"type":48,"value":280}," — get detailed requirements, spec links, and GitHub issue attachments from each issue",{"type":43,"tag":141,"props":282,"children":283},{},[284,290],{"type":43,"tag":78,"props":285,"children":287},{"className":286},[],[288],{"type":48,"value":289},"mcp__linear-server__list_comments",{"type":48,"value":291}," — check for additional context or decisions in issue comments",{"type":43,"tag":51,"props":293,"children":294},{},[295,297,302],{"type":48,"value":296},"Linear issues have GitHub issue\u002FPR links as ",{"type":43,"tag":115,"props":298,"children":299},{},[300],{"type":48,"value":301},"attachments",{"type":48,"value":303}," — use these to find the corresponding GitHub issue numbers without needing to search GitHub directly.",{"type":43,"tag":105,"props":305,"children":307},{"id":306},"step-2-fetch-and-summarize-spec",[308],{"type":48,"value":309},"Step 2: Fetch and Summarize Spec",{"type":43,"tag":51,"props":311,"children":312},{},[313,315,321,323,329],{"type":48,"value":314},"If a spec URL was found, use ",{"type":43,"tag":78,"props":316,"children":318},{"className":317},[],[319],{"type":48,"value":320},"WebFetch",{"type":48,"value":322}," to read it. Otherwise, gather requirements from Linear issue descriptions and ",{"type":43,"tag":78,"props":324,"children":326},{"className":325},[],[327],{"type":48,"value":328},"gh issue view \u003Cnumber> --repo getsentry\u002F\u003Crepo-name>",{"type":48,"value":330}," for GitHub issue details. Present a concise summary:",{"type":43,"tag":137,"props":332,"children":333},{},[334,339,344,349],{"type":43,"tag":141,"props":335,"children":336},{},[337],{"type":48,"value":338},"Feature name",{"type":43,"tag":141,"props":340,"children":341},{},[342],{"type":48,"value":343},"Key requirements (bulleted list)",{"type":43,"tag":141,"props":345,"children":346},{},[347],{"type":48,"value":348},"SDK-specific considerations",{"type":43,"tag":141,"props":350,"children":351},{},[352],{"type":48,"value":353},"Breaking changes or deprecations",{"type":43,"tag":51,"props":355,"children":356},{},[357],{"type":48,"value":358},"Ask the user to confirm the summary is accurate before proceeding.",{"type":43,"tag":105,"props":360,"children":362},{"id":361},"step-25-identify-sdk-dependencies",[363],{"type":48,"value":364},"Step 2.5: Identify SDK Dependencies",{"type":43,"tag":51,"props":366,"children":367},{},[368],{"type":48,"value":369},"Hybrid SDKs depend on native SDKs for their platform layers:",{"type":43,"tag":137,"props":371,"children":372},{},[373,398,408],{"type":43,"tag":141,"props":374,"children":375},{},[376,381,383,388,390,396],{"type":43,"tag":115,"props":377,"children":378},{},[379],{"type":48,"value":380},"sentry-react-native",{"type":48,"value":382}," and ",{"type":43,"tag":115,"props":384,"children":385},{},[386],{"type":48,"value":387},"sentry-capacitor",{"type":48,"value":389}," wrap ",{"type":43,"tag":78,"props":391,"children":393},{"className":392},[],[394],{"type":48,"value":395},"@sentry\u002Fcore",{"type":48,"value":397}," (JS) + sentry-cocoa (iOS) + sentry-java (Android)",{"type":43,"tag":141,"props":399,"children":400},{},[401,406],{"type":43,"tag":115,"props":402,"children":403},{},[404],{"type":48,"value":405},"sentry-dart",{"type":48,"value":407}," (Flutter) has its own Dart implementation but uses sentry-cocoa (iOS) and sentry-java (Android) for native crash reporting and trace context in crash envelopes",{"type":43,"tag":141,"props":409,"children":410},{},[411,416,417,422],{"type":43,"tag":115,"props":412,"children":413},{},[414],{"type":48,"value":415},"sentry-unity",{"type":48,"value":382},{"type":43,"tag":115,"props":418,"children":419},{},[420],{"type":48,"value":421},"sentry-kotlin-multiplatform",{"type":48,"value":423}," also depend on sentry-cocoa and sentry-java",{"type":43,"tag":51,"props":425,"children":426},{},[427],{"type":48,"value":428},"When implementing across both hybrid and native SDKs:",{"type":43,"tag":137,"props":430,"children":431},{},[432,442,466,476],{"type":43,"tag":141,"props":433,"children":434},{},[435,440],{"type":43,"tag":115,"props":436,"children":437},{},[438],{"type":48,"value":439},"Implement native SDKs (Cocoa, Java) first",{"type":48,"value":441}," — hybrid SDKs can't compile native bridge code until those are released",{"type":43,"tag":141,"props":443,"children":444},{},[445,450,452,457,459,464],{"type":43,"tag":115,"props":446,"children":447},{},[448],{"type":48,"value":449},"JS wrapper SDKs",{"type":48,"value":451}," (React Native, Capacitor) may already have the feature via ",{"type":43,"tag":78,"props":453,"children":455},{"className":454},[],[456],{"type":48,"value":395},{"type":48,"value":458}," — check before implementing from scratch. If ",{"type":43,"tag":78,"props":460,"children":462},{"className":461},[],[463],{"type":48,"value":395},{"type":48,"value":465}," already has it, the work is: expose options in SDK types, pass through to native bridge, add tests",{"type":43,"tag":141,"props":467,"children":468},{},[469,474],{"type":43,"tag":115,"props":470,"children":471},{},[472],{"type":48,"value":473},"Hybrid SDK PRs should note",{"type":48,"value":475}," in \"Next steps\" which native SDK PRs must merge and be released before the hybrid SDK is fully functional",{"type":43,"tag":141,"props":477,"children":478},{},[479,484],{"type":43,"tag":115,"props":480,"children":481},{},[482],{"type":48,"value":483},"Only spawn ONE agent per repo.",{"type":48,"value":485}," If a repo already has a worktree\u002Fbranch from a previous run, reuse it",{"type":43,"tag":105,"props":487,"children":489},{"id":488},"step-3-check-implementation-state",[490],{"type":48,"value":491},"Step 3: Check Implementation State",{"type":43,"tag":51,"props":493,"children":494},{},[495],{"type":48,"value":496},"For each target repo, check for existing PRs:",{"type":43,"tag":137,"props":498,"children":499},{},[500,510,526],{"type":43,"tag":141,"props":501,"children":502},{},[503,508],{"type":43,"tag":115,"props":504,"children":505},{},[506],{"type":48,"value":507},"First check Linear",{"type":48,"value":509}," — issue attachments contain links to GitHub PRs that were auto-linked",{"type":43,"tag":141,"props":511,"children":512},{},[513,518,520],{"type":43,"tag":115,"props":514,"children":515},{},[516],{"type":48,"value":517},"Then check GitHub",{"type":48,"value":519}," for PR status using ",{"type":43,"tag":78,"props":521,"children":523},{"className":522},[],[524],{"type":48,"value":525},"gh pr list --repo getsentry\u002F\u003Crepo-name> --search \"\u003Cfeature-keyword>\" --json number,title,state,isDraft,url",{"type":43,"tag":141,"props":527,"children":528},{},[529,531],{"type":48,"value":530},"For PR details: ",{"type":43,"tag":78,"props":532,"children":534},{"className":533},[],[535],{"type":48,"value":536},"gh pr view \u003Cnumber> --repo getsentry\u002F\u003Crepo-name> --json state,isDraft,mergeable,statusCheckRollup",{"type":43,"tag":51,"props":538,"children":539},{},[540],{"type":48,"value":541},"Present a matrix:",{"type":43,"tag":543,"props":544,"children":548},"pre",{"className":545,"code":547,"language":48},[546],"language-text","| SDK Repo | GH Issue | Existing PR | CI Status | Action |\n|----------|----------|-------------|-----------|--------|\n| sentry-rust | #123 | None | — | Implement |\n| sentry-go | #124 | #200 (draft) | Failing | Fix CI |\n| sentry-python | #100 | #150 (merged) | — | Skip |\n",[549],{"type":43,"tag":78,"props":550,"children":552},{"__ignoreMap":551},"",[553],{"type":48,"value":547},{"type":43,"tag":51,"props":555,"children":556},{},[557],{"type":48,"value":558},"This handles \"continue from where you left off\" naturally. Ask the user to confirm the action plan.",{"type":43,"tag":105,"props":560,"children":562},{"id":561},"step-4-spawn-implementation-agents",[563],{"type":48,"value":564},"Step 4: Spawn Implementation Agents",{"type":43,"tag":246,"props":566,"children":567},{},[568,581,624,634],{"type":43,"tag":141,"props":569,"children":570},{},[571,573,579],{"type":48,"value":572},"Read ",{"type":43,"tag":78,"props":574,"children":576},{"className":575},[],[577],{"type":48,"value":578},"references\u002Fagent-prompt.md",{"type":48,"value":580}," for the implementation agent prompt template.",{"type":43,"tag":141,"props":582,"children":583},{},[584,586,592,594,600,601,607,608,614,616,622],{"type":48,"value":585},"Fill in ",{"type":43,"tag":78,"props":587,"children":589},{"className":588},[],[590],{"type":48,"value":591},"\u003Crepo-name>",{"type":48,"value":593},", ",{"type":43,"tag":78,"props":595,"children":597},{"className":596},[],[598],{"type":48,"value":599},"\u003Cspec-summary>",{"type":48,"value":593},{"type":43,"tag":78,"props":602,"children":604},{"className":603},[],[605],{"type":48,"value":606},"\u003Creference-prs>",{"type":48,"value":593},{"type":43,"tag":78,"props":609,"children":611},{"className":610},[],[612],{"type":48,"value":613},"\u003Cfeature-name>",{"type":48,"value":615},", and ",{"type":43,"tag":78,"props":617,"children":619},{"className":618},[],[620],{"type":48,"value":621},"\u003Cissue-number>",{"type":48,"value":623}," for each SDK.",{"type":43,"tag":141,"props":625,"children":626},{},[627,632],{"type":43,"tag":115,"props":628,"children":629},{},[630],{"type":48,"value":631},"Ask the user before spawning agents.",{"type":48,"value":633}," Show them how many agents will be spawned and for which SDKs.",{"type":43,"tag":141,"props":635,"children":636},{},[637,639,644],{"type":48,"value":638},"Spawn agents ",{"type":43,"tag":115,"props":640,"children":641},{},[642],{"type":48,"value":643},"in parallel",{"type":48,"value":645},". Each agent clones the repo and creates a git worktree internally for isolation.",{"type":43,"tag":105,"props":647,"children":649},{"id":648},"step-5-verify-with-ci",[650],{"type":48,"value":651},"Step 5: Verify with CI",{"type":43,"tag":51,"props":653,"children":654},{},[655],{"type":48,"value":656},"Local tests should have already passed during implementation. Use CI as final verification.",{"type":43,"tag":51,"props":658,"children":659},{},[660,662,668],{"type":48,"value":661},"After agents create draft PRs, check CI status with ",{"type":43,"tag":78,"props":663,"children":665},{"className":664},[],[666],{"type":48,"value":667},"gh pr view \u003Cnumber> --repo getsentry\u002F\u003Crepo-name> --json statusCheckRollup",{"type":48,"value":669},".",{"type":43,"tag":51,"props":671,"children":672},{},[673],{"type":48,"value":674},"If CI fails:",{"type":43,"tag":246,"props":676,"children":677},{},[678,853,863,892],{"type":43,"tag":141,"props":679,"children":680},{},[681,686,688],{"type":43,"tag":115,"props":682,"children":683},{},[684],{"type":48,"value":685},"Fetch the actual failure logs",{"type":48,"value":687}," — don't guess:",{"type":43,"tag":543,"props":689,"children":693},{"className":690,"code":691,"language":692,"meta":551,"style":551},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","gh run list --repo getsentry\u002F\u003Crepo-name> --branch feat\u002F\u003Cfeature-name> --limit 5\ngh run view \u003Crun-id> --repo getsentry\u002F\u003Crepo-name> --log-failed\n","bash",[694],{"type":43,"tag":78,"props":695,"children":696},{"__ignoreMap":551},[697,789],{"type":43,"tag":698,"props":699,"children":702},"span",{"class":700,"line":701},"line",1,[703,708,714,719,724,729,735,740,746,751,756,761,765,770,774,778,783],{"type":43,"tag":698,"props":704,"children":706},{"style":705},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[707],{"type":48,"value":95},{"type":43,"tag":698,"props":709,"children":711},{"style":710},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[712],{"type":48,"value":713}," run",{"type":43,"tag":698,"props":715,"children":716},{"style":710},[717],{"type":48,"value":718}," list",{"type":43,"tag":698,"props":720,"children":721},{"style":710},[722],{"type":48,"value":723}," --repo",{"type":43,"tag":698,"props":725,"children":726},{"style":710},[727],{"type":48,"value":728}," getsentry\u002F",{"type":43,"tag":698,"props":730,"children":732},{"style":731},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[733],{"type":48,"value":734},"\u003C",{"type":43,"tag":698,"props":736,"children":737},{"style":710},[738],{"type":48,"value":739},"repo-nam",{"type":43,"tag":698,"props":741,"children":743},{"style":742},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[744],{"type":48,"value":745},"e",{"type":43,"tag":698,"props":747,"children":748},{"style":731},[749],{"type":48,"value":750},">",{"type":43,"tag":698,"props":752,"children":753},{"style":710},[754],{"type":48,"value":755}," --branch",{"type":43,"tag":698,"props":757,"children":758},{"style":710},[759],{"type":48,"value":760}," feat\u002F",{"type":43,"tag":698,"props":762,"children":763},{"style":731},[764],{"type":48,"value":734},{"type":43,"tag":698,"props":766,"children":767},{"style":710},[768],{"type":48,"value":769},"feature-nam",{"type":43,"tag":698,"props":771,"children":772},{"style":742},[773],{"type":48,"value":745},{"type":43,"tag":698,"props":775,"children":776},{"style":731},[777],{"type":48,"value":750},{"type":43,"tag":698,"props":779,"children":780},{"style":710},[781],{"type":48,"value":782}," --limit",{"type":43,"tag":698,"props":784,"children":786},{"style":785},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[787],{"type":48,"value":788}," 5\n",{"type":43,"tag":698,"props":790,"children":791},{"class":700,"line":24},[792,796,800,805,810,815,820,824,828,832,836,840,844,848],{"type":43,"tag":698,"props":793,"children":794},{"style":705},[795],{"type":48,"value":95},{"type":43,"tag":698,"props":797,"children":798},{"style":710},[799],{"type":48,"value":713},{"type":43,"tag":698,"props":801,"children":802},{"style":710},[803],{"type":48,"value":804}," view",{"type":43,"tag":698,"props":806,"children":807},{"style":731},[808],{"type":48,"value":809}," \u003C",{"type":43,"tag":698,"props":811,"children":812},{"style":710},[813],{"type":48,"value":814},"run-i",{"type":43,"tag":698,"props":816,"children":817},{"style":742},[818],{"type":48,"value":819},"d",{"type":43,"tag":698,"props":821,"children":822},{"style":731},[823],{"type":48,"value":750},{"type":43,"tag":698,"props":825,"children":826},{"style":710},[827],{"type":48,"value":723},{"type":43,"tag":698,"props":829,"children":830},{"style":710},[831],{"type":48,"value":728},{"type":43,"tag":698,"props":833,"children":834},{"style":731},[835],{"type":48,"value":734},{"type":43,"tag":698,"props":837,"children":838},{"style":710},[839],{"type":48,"value":739},{"type":43,"tag":698,"props":841,"children":842},{"style":742},[843],{"type":48,"value":745},{"type":43,"tag":698,"props":845,"children":846},{"style":731},[847],{"type":48,"value":750},{"type":43,"tag":698,"props":849,"children":850},{"style":710},[851],{"type":48,"value":852}," --log-failed\n",{"type":43,"tag":141,"props":854,"children":855},{},[856,861],{"type":43,"tag":115,"props":857,"children":858},{},[859],{"type":48,"value":860},"Fix the issue directly",{"type":48,"value":862}," or spawn a fix agent with the CI error output included in the prompt.",{"type":43,"tag":141,"props":864,"children":865},{},[866,868],{"type":48,"value":867},"The fix should:",{"type":43,"tag":137,"props":869,"children":870},{},[871,876,881],{"type":43,"tag":141,"props":872,"children":873},{},[874],{"type":48,"value":875},"Read the failing files locally in the worktree",{"type":43,"tag":141,"props":877,"children":878},{},[879],{"type":48,"value":880},"Reproduce and verify the fix locally",{"type":43,"tag":141,"props":882,"children":883},{},[884,886],{"type":48,"value":885},"Push fixes with ",{"type":43,"tag":78,"props":887,"children":889},{"className":888},[],[890],{"type":48,"value":891},"git push",{"type":43,"tag":141,"props":893,"children":894},{},[895],{"type":48,"value":896},"Re-check CI status after the fix.",{"type":43,"tag":51,"props":898,"children":899},{},[900,905],{"type":43,"tag":115,"props":901,"children":902},{},[903],{"type":48,"value":904},"Expect 2-3 CI fix iterations.",{"type":48,"value":906}," Common issues:",{"type":43,"tag":137,"props":908,"children":909},{},[910,936,954,964,974],{"type":43,"tag":141,"props":911,"children":912},{},[913,918,920,926,928,934],{"type":43,"tag":115,"props":914,"children":915},{},[916],{"type":48,"value":917},"Formatting",{"type":48,"value":919}," — Run formatters with resolved dependencies (e.g., ",{"type":43,"tag":78,"props":921,"children":923},{"className":922},[],[924],{"type":48,"value":925},"dart pub get",{"type":48,"value":927}," before ",{"type":43,"tag":78,"props":929,"children":931},{"className":930},[],[932],{"type":48,"value":933},"dart format",{"type":48,"value":935},")",{"type":43,"tag":141,"props":937,"children":938},{},[939,944,946,952],{"type":43,"tag":115,"props":940,"children":941},{},[942],{"type":48,"value":943},"Linting",{"type":48,"value":945}," — Unnecessary imports, public API exposure for ",{"type":43,"tag":78,"props":947,"children":949},{"className":948},[],[950],{"type":48,"value":951},"@internal",{"type":48,"value":953}," functions",{"type":43,"tag":141,"props":955,"children":956},{},[957,962],{"type":43,"tag":115,"props":958,"children":959},{},[960],{"type":48,"value":961},"API stability",{"type":48,"value":963}," — Some SDKs (Cocoa, Java) have API baseline checks; regenerate if you changed public API",{"type":43,"tag":141,"props":965,"children":966},{},[967,972],{"type":43,"tag":115,"props":968,"children":969},{},[970],{"type":48,"value":971},"Doc sync tests",{"type":48,"value":973}," — Some SDKs check that all options are documented in sentry-docs; add to allowlist if docs PR is separate",{"type":43,"tag":141,"props":975,"children":976},{},[977,982],{"type":43,"tag":115,"props":978,"children":979},{},[980],{"type":48,"value":981},"Changelog",{"type":48,"value":983}," — Some SDKs verify changelog entries exist for new features",{"type":43,"tag":51,"props":985,"children":986},{},[987],{"type":48,"value":988},"Run CI-monitoring agents in the background so multiple PRs can be checked in parallel.",{"type":43,"tag":105,"props":990,"children":992},{"id":991},"step-55-address-review-feedback",[993],{"type":48,"value":994},"Step 5.5: Address Review Feedback",{"type":43,"tag":51,"props":996,"children":997},{},[998],{"type":48,"value":999},"After CI passes, check for automated review feedback (Cursor bot, Danger, Sentry bot, etc.):",{"type":43,"tag":543,"props":1001,"children":1003},{"className":690,"code":1002,"language":692,"meta":551,"style":551},"gh api repos\u002Fgetsentry\u002F\u003Crepo-name>\u002Fpulls\u002F\u003Cnumber>\u002Fcomments\ngh api repos\u002Fgetsentry\u002F\u003Crepo-name>\u002Fissues\u002F\u003Cnumber>\u002Fcomments\n",[1004],{"type":43,"tag":78,"props":1005,"children":1006},{"__ignoreMap":551},[1007,1068],{"type":43,"tag":698,"props":1008,"children":1009},{"class":700,"line":701},[1010,1014,1019,1024,1028,1032,1036,1040,1045,1049,1054,1059,1063],{"type":43,"tag":698,"props":1011,"children":1012},{"style":705},[1013],{"type":48,"value":95},{"type":43,"tag":698,"props":1015,"children":1016},{"style":710},[1017],{"type":48,"value":1018}," api",{"type":43,"tag":698,"props":1020,"children":1021},{"style":710},[1022],{"type":48,"value":1023}," repos\u002Fgetsentry\u002F",{"type":43,"tag":698,"props":1025,"children":1026},{"style":731},[1027],{"type":48,"value":734},{"type":43,"tag":698,"props":1029,"children":1030},{"style":710},[1031],{"type":48,"value":739},{"type":43,"tag":698,"props":1033,"children":1034},{"style":742},[1035],{"type":48,"value":745},{"type":43,"tag":698,"props":1037,"children":1038},{"style":731},[1039],{"type":48,"value":750},{"type":43,"tag":698,"props":1041,"children":1042},{"style":710},[1043],{"type":48,"value":1044},"\u002Fpulls\u002F",{"type":43,"tag":698,"props":1046,"children":1047},{"style":731},[1048],{"type":48,"value":734},{"type":43,"tag":698,"props":1050,"children":1051},{"style":710},[1052],{"type":48,"value":1053},"numbe",{"type":43,"tag":698,"props":1055,"children":1056},{"style":742},[1057],{"type":48,"value":1058},"r",{"type":43,"tag":698,"props":1060,"children":1061},{"style":731},[1062],{"type":48,"value":750},{"type":43,"tag":698,"props":1064,"children":1065},{"style":710},[1066],{"type":48,"value":1067},"\u002Fcomments\n",{"type":43,"tag":698,"props":1069,"children":1070},{"class":700,"line":24},[1071,1075,1079,1083,1087,1091,1095,1099,1104,1108,1112,1116,1120],{"type":43,"tag":698,"props":1072,"children":1073},{"style":705},[1074],{"type":48,"value":95},{"type":43,"tag":698,"props":1076,"children":1077},{"style":710},[1078],{"type":48,"value":1018},{"type":43,"tag":698,"props":1080,"children":1081},{"style":710},[1082],{"type":48,"value":1023},{"type":43,"tag":698,"props":1084,"children":1085},{"style":731},[1086],{"type":48,"value":734},{"type":43,"tag":698,"props":1088,"children":1089},{"style":710},[1090],{"type":48,"value":739},{"type":43,"tag":698,"props":1092,"children":1093},{"style":742},[1094],{"type":48,"value":745},{"type":43,"tag":698,"props":1096,"children":1097},{"style":731},[1098],{"type":48,"value":750},{"type":43,"tag":698,"props":1100,"children":1101},{"style":710},[1102],{"type":48,"value":1103},"\u002Fissues\u002F",{"type":43,"tag":698,"props":1105,"children":1106},{"style":731},[1107],{"type":48,"value":734},{"type":43,"tag":698,"props":1109,"children":1110},{"style":710},[1111],{"type":48,"value":1053},{"type":43,"tag":698,"props":1113,"children":1114},{"style":742},[1115],{"type":48,"value":1058},{"type":43,"tag":698,"props":1117,"children":1118},{"style":731},[1119],{"type":48,"value":750},{"type":43,"tag":698,"props":1121,"children":1122},{"style":710},[1123],{"type":48,"value":1067},{"type":43,"tag":137,"props":1125,"children":1126},{},[1127,1132,1137],{"type":43,"tag":141,"props":1128,"children":1129},{},[1130],{"type":48,"value":1131},"Address valid feedback with code fixes and reply referencing the fix commit",{"type":43,"tag":141,"props":1133,"children":1134},{},[1135],{"type":48,"value":1136},"Reply to false positives with reasoning",{"type":43,"tag":141,"props":1138,"children":1139},{},[1140],{"type":48,"value":1141},"Common automated feedback: missing option allowlists, public API exposure, test coverage gaps",{"type":43,"tag":105,"props":1143,"children":1145},{"id":1144},"step-6-create-documentation-prs",[1146],{"type":48,"value":1147},"Step 6: Create Documentation PRs",{"type":43,"tag":51,"props":1149,"children":1150},{},[1151],{"type":48,"value":1152},"For each SDK implementation, check if sentry-docs needs updates:",{"type":43,"tag":246,"props":1154,"children":1155},{},[1156,1161,1166,1178],{"type":43,"tag":141,"props":1157,"children":1158},{},[1159],{"type":48,"value":1160},"Search sentry-docs for existing documentation related to the feature (e.g., configuration options pages, feature-specific guides, platform includes)",{"type":43,"tag":141,"props":1162,"children":1163},{},[1164],{"type":48,"value":1165},"Add or update documentation as needed — new options, new guides, or updated platform-specific includes",{"type":43,"tag":141,"props":1167,"children":1168},{},[1169,1171,1177],{"type":48,"value":1170},"Create docs PRs following the sentry-docs PR template (",{"type":43,"tag":78,"props":1172,"children":1174},{"className":1173},[],[1175],{"type":48,"value":1176},".github\u002FPULL_REQUEST_TEMPLATE.md",{"type":48,"value":935},{"type":43,"tag":141,"props":1179,"children":1180},{},[1181],{"type":48,"value":1182},"Link docs PRs from the SDK PRs",{"type":43,"tag":51,"props":1184,"children":1185},{},[1186],{"type":48,"value":1187},"Create separate docs PRs per SDK — don't bundle multiple platforms into one PR.",{"type":43,"tag":105,"props":1189,"children":1191},{"id":1190},"step-7-collect-results",[1192],{"type":48,"value":1193},"Step 7: Collect Results",{"type":43,"tag":51,"props":1195,"children":1196},{},[1197],{"type":48,"value":1198},"Once all agents complete and CI passes:",{"type":43,"tag":246,"props":1200,"children":1201},{},[1202,1221,1274],{"type":43,"tag":141,"props":1203,"children":1204},{},[1205,1210,1212],{"type":43,"tag":115,"props":1206,"children":1207},{},[1208],{"type":48,"value":1209},"Present a results table",{"type":48,"value":1211},":",{"type":43,"tag":543,"props":1213,"children":1216},{"className":1214,"code":1215,"language":48},[546],"| SDK Repo | GH Issue | Draft PR | CI Status | Docs PR | Notes |\n|----------|----------|----------|-----------|---------|-------|\n| sentry-rust | #123 | #456 | Passing | #789 | Ready for review |\n| sentry-go | #124 | #457 | Failing | — | Test timeout, needs manual fix |\n",[1217],{"type":43,"tag":78,"props":1218,"children":1219},{"__ignoreMap":551},[1220],{"type":48,"value":1215},{"type":43,"tag":141,"props":1222,"children":1223},{},[1224,1229,1231],{"type":43,"tag":115,"props":1225,"children":1226},{},[1227],{"type":48,"value":1228},"Link to Linear",{"type":48,"value":1230}," (if available):",{"type":43,"tag":137,"props":1232,"children":1233},{},[1234,1247],{"type":43,"tag":141,"props":1235,"children":1236},{},[1237,1239,1245],{"type":48,"value":1238},"For each SDK that has a Linear project, use ",{"type":43,"tag":78,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":48,"value":1244},"mcp__linear-server__save_project",{"type":48,"value":1246}," to add the PR links to the project description",{"type":43,"tag":141,"props":1248,"children":1249},{},[1250,1252,1258,1260,1265,1267,1272],{"type":48,"value":1251},"Note: ",{"type":43,"tag":78,"props":1253,"children":1255},{"className":1254},[],[1256],{"type":48,"value":1257},"mcp__linear-server__query_data",{"type":48,"value":1259}," is ",{"type":43,"tag":115,"props":1261,"children":1262},{},[1263],{"type":48,"value":1264},"read-only",{"type":48,"value":1266}," — always use ",{"type":43,"tag":78,"props":1268,"children":1270},{"className":1269},[],[1271],{"type":48,"value":1244},{"type":48,"value":1273}," for writes",{"type":43,"tag":141,"props":1275,"children":1276},{},[1277,1282],{"type":43,"tag":115,"props":1278,"children":1279},{},[1280],{"type":48,"value":1281},"Summary",{"type":48,"value":1283},": What was done and what needs manual follow-up.",{"type":43,"tag":57,"props":1285,"children":1287},{"id":1286},"notes",[1288],{"type":48,"value":1289},"Notes",{"type":43,"tag":137,"props":1291,"children":1292},{},[1293,1298,1315,1323,1328,1333,1346,1351],{"type":43,"tag":141,"props":1294,"children":1295},{},[1296],{"type":48,"value":1297},"Always confirm with the user before spawning agents — never auto-create without approval",{"type":43,"tag":141,"props":1299,"children":1300},{},[1301,1306,1308,1313],{"type":43,"tag":115,"props":1302,"children":1303},{},[1304],{"type":48,"value":1305},"Use Linear MCP for all context gathering",{"type":48,"value":1307}," (specs, requirements, issue details, project status). Use ",{"type":43,"tag":78,"props":1309,"children":1311},{"className":1310},[],[1312],{"type":48,"value":95},{"type":48,"value":1314}," CLI for all GitHub operations (PRs, branches, CI logs, pushing code)",{"type":43,"tag":141,"props":1316,"children":1317},{},[1318,1319],{"type":48,"value":67},{"type":43,"tag":69,"props":1320,"children":1321},{"href":71},[1322],{"type":48,"value":74},{"type":43,"tag":141,"props":1324,"children":1325},{},[1326],{"type":48,"value":1327},"For large rollouts (10+ SDKs), consider batching in groups of 5 to avoid rate limits",{"type":43,"tag":141,"props":1329,"children":1330},{},[1331],{"type":48,"value":1332},"If a reference implementation is not available, the agent should still attempt implementation based on the spec alone, but flag it for extra review",{"type":43,"tag":141,"props":1334,"children":1335},{},[1336,1338,1344],{"type":48,"value":1337},"Implementation agents clone the repo and use ",{"type":43,"tag":78,"props":1339,"children":1341},{"className":1340},[],[1342],{"type":48,"value":1343},"git worktree",{"type":48,"value":1345}," for isolated working directories",{"type":43,"tag":141,"props":1347,"children":1348},{},[1349],{"type":48,"value":1350},"Run tests locally before creating PRs. CI serves as final verification",{"type":43,"tag":141,"props":1352,"children":1353},{},[1354,1356,1365],{"type":48,"value":1355},"Use the ",{"type":43,"tag":115,"props":1357,"children":1358},{},[1359],{"type":43,"tag":78,"props":1360,"children":1362},{"className":1361},[],[1363],{"type":48,"value":1364},"linear-sdk-rollout",{"type":48,"value":1366}," skill first if Linear projects\u002Fissues don't exist yet",{"type":43,"tag":57,"props":1368,"children":1370},{"id":1369},"example-usage",[1371],{"type":48,"value":1372},"Example Usage",{"type":43,"tag":51,"props":1374,"children":1375},{},[1376],{"type":48,"value":1377},"User: \"Implement strict trace continuation across Rust, Go, and Java SDKs\"",{"type":43,"tag":51,"props":1379,"children":1380},{},[1381],{"type":48,"value":1382},"Response flow:",{"type":43,"tag":246,"props":1384,"children":1385},{},[1386,1391,1396,1401,1406,1411,1416,1421],{"type":43,"tag":141,"props":1387,"children":1388},{},[1389],{"type":48,"value":1390},"Gather context — get initiative, projects, and issues from Linear MCP",{"type":43,"tag":141,"props":1392,"children":1393},{},[1394],{"type":48,"value":1395},"Fetch spec, confirm summary with user",{"type":43,"tag":141,"props":1397,"children":1398},{},[1399],{"type":48,"value":1400},"Check existing PRs — Rust has nothing, Go has a failing draft, Java has nothing",{"type":43,"tag":141,"props":1402,"children":1403},{},[1404],{"type":48,"value":1405},"Confirm plan: spawn 2 new agents (Rust, Java) + 1 fix agent (Go)",{"type":43,"tag":141,"props":1407,"children":1408},{},[1409],{"type":48,"value":1410},"Spawn agents in parallel with worktree isolation",{"type":43,"tag":141,"props":1412,"children":1413},{},[1414],{"type":48,"value":1415},"Monitor CI, fix failures (expect 2-3 iterations)",{"type":43,"tag":141,"props":1417,"children":1418},{},[1419],{"type":48,"value":1420},"Create docs PRs for each SDK",{"type":43,"tag":141,"props":1422,"children":1423},{},[1424],{"type":48,"value":1425},"Present results table, link to Linear",{"type":43,"tag":1427,"props":1428,"children":1429},"style",{},[1430],{"type":48,"value":1431},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1433,"total":1535},[1434,1451,1468,1481,1499,1510,1517],{"slug":1435,"name":1435,"fn":1436,"description":1437,"org":1438,"tags":1439,"stars":24,"repoUrl":25,"updatedAt":1450},"contributing-md","generate standardized CONTRIBUTING.md files","Generate or align a CONTRIBUTING.md for a Sentry SDK repository with the develop.sentry.dev standard template. Use when asked to \"create contributing.md\", \"update contributing.md\", \"align contributing docs\", \"standardize contributor docs\", or when the contributing guide is outdated, missing sections, or does not exist.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1440,1443,1446,1447],{"name":1441,"slug":1442,"type":16},"Documentation","documentation",{"name":1444,"slug":1445,"type":16},"GitHub","github",{"name":9,"slug":8,"type":16},{"name":1448,"slug":1449,"type":16},"Technical Writing","technical-writing","2026-04-06T18:14:57.157686",{"slug":1452,"name":1452,"fn":1453,"description":1454,"org":1455,"tags":1456,"stars":24,"repoUrl":25,"updatedAt":1467},"daily-update","generate async daily standup updates","Generate a formatted async daily standup message for the Sentry SDK team channel. Use when asked to create a \"daily update\", \"async daily\", \"standup update\", or \"async team update\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1457,1460,1463,1464],{"name":1458,"slug":1459,"type":16},"Communications","communications",{"name":1461,"slug":1462,"type":16},"Productivity","productivity",{"name":9,"slug":8,"type":16},{"name":1465,"slug":1466,"type":16},"Standup","standup","2026-04-06T18:14:53.472546",{"slug":1469,"name":1469,"fn":1470,"description":1471,"org":1472,"tags":1473,"stars":24,"repoUrl":25,"updatedAt":1480},"linear-initiative","create Linear projects from initiatives","Creates Linear projects for SDK repositories based on a Linear initiative. Use when rolling out a feature across multiple SDKs, creating SDK projects from initiative, or setting up cross-SDK alignment work.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1474,1475,1478,1479],{"name":14,"slug":15,"type":16},{"name":1476,"slug":1477,"type":16},"Product Management","product-management",{"name":18,"slug":19,"type":16},{"name":9,"slug":8,"type":16},"2026-04-06T18:14:54.704594",{"slug":1482,"name":1482,"fn":1483,"description":1484,"org":1485,"tags":1486,"stars":24,"repoUrl":25,"updatedAt":1498},"linear-sdk-telemetry-labeler","classify and label Linear issues with telemetry data","Classify and apply SDK Telemetry labels to Linear issues based on their title and description. Use when triaging issues related to SDK telemetry signals: errors, traces, spans, profiles, replays, logs, metrics, cron checks, client reports, user feedbacks, or attachments. Triggers: \"sdk telemetry label\", \"telemetry labeler\", \"label telemetry issues\", \"tag telemetry\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1487,1490,1493,1494,1495],{"name":1488,"slug":1489,"type":16},"Linear","linear",{"name":1491,"slug":1492,"type":16},"Observability","observability",{"name":18,"slug":19,"type":16},{"name":9,"slug":8,"type":16},{"name":1496,"slug":1497,"type":16},"Triage","triage","2026-04-06T18:15:00.931727",{"slug":1500,"name":1500,"fn":1501,"description":1502,"org":1503,"tags":1504,"stars":24,"repoUrl":25,"updatedAt":1509},"linear-type-labeler","classify and label Linear issues","Classify and apply Type labels to Linear issues based on their title and description.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1505,1506,1507,1508],{"name":14,"slug":15,"type":16},{"name":1461,"slug":1462,"type":16},{"name":9,"slug":8,"type":16},{"name":1496,"slug":1497,"type":16},"2026-04-06T18:14:58.40989",{"slug":4,"name":4,"fn":5,"description":6,"org":1511,"tags":1512,"stars":24,"repoUrl":25,"updatedAt":26},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1513,1514,1515,1516],{"name":14,"slug":15,"type":16},{"name":22,"slug":23,"type":16},{"name":18,"slug":19,"type":16},{"name":9,"slug":8,"type":16},{"slug":1518,"name":1518,"fn":1519,"description":1520,"org":1521,"tags":1522,"stars":24,"repoUrl":25,"updatedAt":1534},"span-convention-review","review OTel tracing span changes","Review OpenTelemetry tracing span changes in SDK repositories for conformance to Sentry Conventions and OTel Semantic Conventions. Use when reviewing span instrumentation, \"review spans\", \"check span conventions\", \"span review\", \"OTel span check\", \"tracing convention review\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1523,1526,1527,1530,1531],{"name":1524,"slug":1525,"type":16},"Code Review","code-review",{"name":1491,"slug":1492,"type":16},{"name":1528,"slug":1529,"type":16},"OpenTelemetry","opentelemetry",{"name":9,"slug":8,"type":16},{"name":1532,"slug":1533,"type":16},"Tracing","tracing","2026-04-06T18:14:59.655998",7,{"items":1537,"total":1707},[1538,1563,1577,1590,1600,1617,1633,1645,1655,1666,1676,1694],{"slug":1539,"name":1539,"fn":1540,"description":1541,"org":1542,"tags":1543,"stars":1560,"repoUrl":1561,"updatedAt":1562},"xcodebuildmcp","build and test Apple apps with XcodeBuildMCP","Official skill for XcodeBuildMCP. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1544,1547,1550,1553,1554,1557],{"name":1545,"slug":1546,"type":16},"Debugging","debugging",{"name":1548,"slug":1549,"type":16},"iOS","ios",{"name":1551,"slug":1552,"type":16},"macOS","macos",{"name":9,"slug":8,"type":16},{"name":1555,"slug":1556,"type":16},"Testing","testing",{"name":1558,"slug":1559,"type":16},"Xcode","xcode",6176,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002FXcodeBuildMCP","2026-04-06T18:13:34.8719",{"slug":1564,"name":1564,"fn":1565,"description":1566,"org":1567,"tags":1568,"stars":1560,"repoUrl":1561,"updatedAt":1576},"xcodebuildmcp-cli","build and test Apple apps via CLI","Official skill for the XcodeBuildMCP CLI. Use when doing iOS\u002FmacOS\u002FwatchOS\u002FtvOS\u002FvisionOS work (build, test, run, debug, log, UI automation).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1569,1572,1573,1574,1575],{"name":1570,"slug":1571,"type":16},"CLI","cli",{"name":1548,"slug":1549,"type":16},{"name":1551,"slug":1552,"type":16},{"name":1555,"slug":1556,"type":16},{"name":1558,"slug":1559,"type":16},"2026-04-06T18:13:36.13414",{"slug":1578,"name":1578,"fn":1579,"description":1580,"org":1581,"tags":1582,"stars":1587,"repoUrl":1588,"updatedAt":1589},"agents-md","maintain project instruction files","Creates and maintains concise AGENTS.md and CLAUDE.md project instruction files. Use when asked to create AGENTS.md, update AGENTS.md, maintain agent docs, set up CLAUDE.md, document repository agent conventions, or keep coding-agent instructions minimal and reference-backed.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1583,1584],{"name":1441,"slug":1442,"type":16},{"name":1585,"slug":1586,"type":16},"Engineering","engineering",861,"https:\u002F\u002Fgithub.com\u002Fgetsentry\u002Fskills","2026-05-15T06:16:29.695991",{"slug":1591,"name":1591,"fn":1592,"description":1593,"org":1594,"tags":1595,"stars":1587,"repoUrl":1588,"updatedAt":1599},"blog-writing-guide","write and review engineering blog posts","Write, review, and improve blog posts for the Sentry engineering blog following Sentry's specific writing standards, voice, and quality bar. Use this skill whenever someone asks to write a blog post, draft a technical article, review blog content, improve a draft, write a product announcement, create an engineering deep-dive, or produce any written content destined for the Sentry blog or developer audience. Also trigger when the user mentions \"blog post,\" \"blog draft,\" \"write-up,\" \"announcement post,\" \"engineering post,\" \"deep dive,\" \"postmortem,\" or asks for help with technical writing for Sentry. Even if the user just says \"help me write about [feature\u002Ftopic]\" — if it sounds like it could become a Sentry blog post, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1596,1597,1598],{"name":1458,"slug":1459,"type":16},{"name":9,"slug":8,"type":16},{"name":1448,"slug":1449,"type":16},"2026-05-15T06:16:33.38217",{"slug":1601,"name":1601,"fn":1602,"description":1603,"org":1604,"tags":1605,"stars":1587,"repoUrl":1588,"updatedAt":1616},"brand-guidelines","write copy following Sentry brand guidelines","Write copy following Sentry brand guidelines. Use when writing UI text, error messages, empty states, onboarding flows, 404 pages, documentation, marketing copy, or any user-facing content. Covers both Plain Speech (default) and Sentry Voice tones.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1606,1609,1612,1613],{"name":1607,"slug":1608,"type":16},"Branding","branding",{"name":1610,"slug":1611,"type":16},"Content Creation","content-creation",{"name":9,"slug":8,"type":16},{"name":1614,"slug":1615,"type":16},"UX Copy","ux-copy","2026-05-15T06:16:22.395707",{"slug":1618,"name":1618,"fn":1619,"description":1620,"org":1621,"tags":1622,"stars":1587,"repoUrl":1588,"updatedAt":1632},"claude-settings-audit","generate Claude Code settings permissions","Analyze a repository to generate recommended Claude Code settings.json permissions. Use when setting up a new project, auditing existing settings, or determining which read-only bash commands to allow. Detects tech stack, build tools, and monorepo structure.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1623,1626,1629],{"name":1624,"slug":1625,"type":16},"Claude Code","claude-code",{"name":1627,"slug":1628,"type":16},"Configuration","configuration",{"name":1630,"slug":1631,"type":16},"Security","security","2026-05-15T06:16:44.335977",{"slug":1525,"name":1525,"fn":1634,"description":1635,"org":1636,"tags":1637,"stars":1587,"repoUrl":1588,"updatedAt":1644},"perform code reviews for Sentry projects","Perform code reviews following Sentry engineering practices. Use when reviewing pull requests, examining code changes, or providing feedback on code quality. Covers security, performance, testing, and design review.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1638,1639,1640,1643],{"name":1524,"slug":1525,"type":16},{"name":1585,"slug":1586,"type":16},{"name":1641,"slug":1642,"type":16},"Performance","performance",{"name":1630,"slug":1631,"type":16},"2026-05-15T06:16:35.824864",{"slug":1646,"name":1646,"fn":1647,"description":1648,"org":1649,"tags":1650,"stars":1587,"repoUrl":1588,"updatedAt":1654},"code-simplifier","simplify and refine source code","Simplifies and refines code for clarity, consistency, and maintainability while preserving all functionality. Use when asked to \"simplify code\", \"clean up code\", \"refactor for clarity\", \"improve readability\", or review recently modified code for elegance. Focuses on project-specific best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1651],{"name":1652,"slug":1653,"type":16},"Code Analysis","code-analysis","2026-05-15T06:16:32.127981",{"slug":1656,"name":1656,"fn":1657,"description":1658,"org":1659,"tags":1660,"stars":1587,"repoUrl":1588,"updatedAt":1665},"commit","create commits with Sentry conventions","Use for every request to commit changes or draft a commit message. Creates Sentry-style conventional commits with issue references.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1661,1664],{"name":1662,"slug":1663,"type":16},"Git","git",{"name":9,"slug":8,"type":16},"2026-07-18T05:15:10.723937",{"slug":1667,"name":1667,"fn":1668,"description":1669,"org":1670,"tags":1671,"stars":1587,"repoUrl":1588,"updatedAt":1675},"create-branch","create git branches for Sentry workflows","Create a git branch following Sentry naming conventions. Use when asked to \"create a branch\", \"new branch\", \"start a branch\", \"make a branch\", \"switch to a new branch\", or when starting new work on the default branch.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1672,1673,1674],{"name":1585,"slug":1586,"type":16},{"name":1662,"slug":1663,"type":16},{"name":9,"slug":8,"type":16},"2026-05-15T06:16:39.458431",{"slug":1677,"name":1677,"fn":1678,"description":1679,"org":1680,"tags":1681,"stars":1587,"repoUrl":1588,"updatedAt":1693},"django-access-review","review Django access control and IDOR","Django access control and IDOR security review. Use when reviewing Django views, DRF viewsets, ORM queries, or any Python\u002FDjango code handling user authorization. Trigger keywords: \"IDOR\", \"access control\", \"authorization\", \"Django permissions\", \"object permissions\", \"tenant isolation\", \"broken access\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1682,1685,1686,1689,1692],{"name":1683,"slug":1684,"type":16},"Access Control","access-control",{"name":1652,"slug":1653,"type":16},{"name":1687,"slug":1688,"type":16},"Django","django",{"name":1690,"slug":1691,"type":16},"Python","python",{"name":1630,"slug":1631,"type":16},"2026-05-15T06:16:43.098698",{"slug":1695,"name":1695,"fn":1696,"description":1697,"org":1698,"tags":1699,"stars":1587,"repoUrl":1588,"updatedAt":1706},"django-perf-review","review and optimize Django performance","Django performance code review. Use when asked to \"review Django performance\", \"find N+1 queries\", \"optimize Django\", \"check queryset performance\", \"database performance\", \"Django ORM issues\", or audit Django code for performance problems.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1700,1701,1704,1705],{"name":1524,"slug":1525,"type":16},{"name":1702,"slug":1703,"type":16},"Database","database",{"name":1687,"slug":1688,"type":16},{"name":1641,"slug":1642,"type":16},"2026-05-15T06:16:24.832813",88]