[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M719GXZM7WD48JW8TN9TPTCS":3,"skill-same:01M719GXZM7WD48JW8TN9TPTCS":86},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":27,"publishedAt":48,"linkOnly":49,"markdownContent":50,"markdownBody":51,"frontMatter":52,"refName":65,"commitSha":66,"skillDirectory":67,"forksCount":68,"repositoryHtmlUrl":69,"repositoryHomepageUrl":6,"ownerHtmlUrl":70,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":71,"install":72,"resources":85},"01M719GXZM7WD48JW8TN9TPTCS","pr-review-response",null,"Teaches agents to reply to PR review comment threads after fixing issues, making resolutions traceable","DeDuva\u002Fsquad","DeDuva","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F8153108?v=4","01M719BQB25861D0TKS3RVHMN2","01M719BQBSWR380PSYDD5M9YD4",1,"MIT","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-cli\u002Ftemplates\u002Fskills\u002Fpr-review-response\u002FSKILL.md",[17,22],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":23,"categoryName":24,"taxonomyType":25,"taxonomyTypeDesc":26},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47],"review","pr review response","pr","pr review","review response","feedback","pull","read","request","threads","mcp-server","server","api","code-review","code","pull-requests","MCP","issues","fix","which","2026-11-10 10:12:30",false,"---\nname: \"pr-review-response\"\ndescription: \"Teaches agents to reply to PR review comment threads after fixing issues, making resolutions traceable\"\ndomain: \"pull-requests, code-review, traceability\"\nconfidence: \"low\"\nsource: \"observed (agents fix review feedback silently — reviewers can't tell which comments were addressed)\"\ntools:\n  - name: \"github-mcp-server-pull_request_read\"\n    description: \"Read PR review threads and comments\"\n    when: \"Step 1 — fetching review comments to understand what needs fixing\"\n  - name: \"gh api (REST)\"\n    description: \"Reply to review comment threads and resolve threads via GraphQL\"\n    when: \"Step 3 — posting reply to each comment thread after fixing\"\n---\n\n## Context\n\nWhen an agent fixes code in response to PR review comments (from Copilot, a human reviewer, or any GitHub reviewer), the fix alone is not enough. The reviewer needs to see — on the PR thread itself — which comments were addressed and how. Without replies, comments stay visually unresolved, reviewers must re-read the entire diff to verify fixes, and there's no traceable link between feedback and resolution.\n\nUse this skill whenever:\n- You are fixing code based on PR review feedback\n- You are addressing Copilot review suggestions\n- You are responding to reviewer-requested changes on a PR\n- A squad member hands you review comments to resolve\n\n## SCOPE\n\n✅ THIS SKILL PRODUCES:\n- Reply comments on each review thread explaining the fix\n- Optionally resolved threads (via GraphQL when appropriate)\n- Commit messages that reference the PR and review context\n\n❌ THIS SKILL DOES NOT PRODUCE:\n- The code fixes themselves (that's the agent's domain work)\n- New review comments or reviews\n- PR descriptions or summaries\n\n## Patterns\n\n### Step 1: Read the review comments\n\n**Using MCP tools (preferred when available):**\n\n```\ngithub-mcp-server-pull_request_read\n  method: \"get_review_comments\"\n  owner: \"{owner}\"\n  repo: \"{repo}\"\n  pullNumber: {pr_number}\n```\n\nThis returns review threads with metadata: `isResolved`, `isOutdated`, `isCollapsed`, and their associated comments. Each comment has an `id` you'll need for replies.\n\n**Using gh CLI (fallback):**\n\n```bash\ngh api repos\u002F{owner}\u002F{repo}\u002Fpulls\u002F{pr_number}\u002Fcomments --paginate\n```\n\nEach comment object contains `id`, `body`, `path`, `line`, and `in_reply_to_id`. Top-level comments have no `in_reply_to_id` — those are the ones you reply to.\n\n### Step 2: Fix the code\n\nMake the actual code changes. This is your normal domain work — the skill doesn't prescribe how to fix, only how to communicate the fix.\n\n**Track what you changed.** For each review comment, note:\n- The comment `id` (top-level, not a reply)\n- The file and line referenced\n- What you actually changed (brief description)\n- The commit SHA after pushing (if available)\n\n### Step 3: Reply to each review thread\n\nAfter fixing and committing, reply to **each** review comment thread individually.\n\n**REST API call (via gh CLI):**\n\n```bash\ngh api repos\u002F{owner}\u002F{repo}\u002Fpulls\u002F{pr_number}\u002Fcomments\u002F{comment_id}\u002Freplies \\\n  -f body=\"Fixed in {sha_short} — {brief description of what was changed}\"\n```\n\n**Important:** `{comment_id}` must be the ID of the **top-level** comment in the thread. You cannot reply to a reply — only to the original review comment.\n\n**Example replies:**\n\n```bash\n# Specific and traceable\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F42\u002Fcomments\u002F18234\u002Freplies \\\n  -f body=\"Fixed in a1b2c3d — switched to path.dirname(squadDirInfo.path) for worktree consistency\"\n\n# When applying a suggested code change\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F42\u002Fcomments\u002F18235\u002Freplies \\\n  -f body=\"Applied suggestion — updated error message to include the file path for debuggability\"\n\n# When pushing back on a suggestion\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F42\u002Fcomments\u002F18236\u002Freplies \\\n  -f body=\"Considered but not applied — this path needs to stay absolute because worktree resolution depends on it. See detectSquadDir() in detect-squad-dir.ts.\"\n```\n\n### Step 4: Resolve threads (optional, GraphQL only)\n\nThread resolution is only available via the GitHub GraphQL API. Use this when your fix fully addresses the comment and no further discussion is needed.\n\n**First, get the thread IDs** (they're different from comment IDs):\n\n```bash\ngh api graphql -f query='\n  query {\n    repository(owner: \"{owner}\", name: \"{repo}\") {\n      pullRequest(number: {pr_number}) {\n        reviewThreads(first: 100) {\n          nodes {\n            id\n            isResolved\n            comments(first: 1) {\n              nodes { body databaseId }\n            }\n          }\n        }\n      }\n    }\n  }\n'\n```\n\nMatch thread IDs to comment IDs using `databaseId`, then resolve:\n\n```bash\ngh api graphql -f query='\n  mutation {\n    resolveReviewThread(input: {threadId: \"{thread_node_id}\"}) {\n      thread { id isResolved }\n    }\n  }\n'\n```\n\n**When to resolve vs. leave open:**\n- ✅ Resolve: You fixed exactly what was requested, no ambiguity\n- ❌ Don't resolve: You pushed back, applied a different fix, or the comment needs further discussion\n- ❌ Don't resolve: The reviewer is a human — let them confirm and resolve themselves\n\n**Rule of thumb:** Agent-to-agent threads (e.g., Copilot review → agent fix) can be resolved by the fixer. Human reviewer threads should be left for the human to resolve.\n\n### Step 5: Commit message traceability\n\nCommit messages should reference the PR context:\n\n```\nfix: address review feedback on PR #{pr_number}\n\n- Switched to path.dirname() for worktree path resolution (comment #18234)\n- Updated error message to include file path (comment #18235)\n\nCo-authored-by: Copilot \u003C223556219+Copilot@users.noreply.github.com>\n```\n\nFor single-comment fixes, a shorter format works:\n\n```\nfix: use path.dirname() for worktree consistency (PR #{pr_number} review)\n\nCo-authored-by: Copilot \u003C223556219+Copilot@users.noreply.github.com>\n```\n\n## AGENT WORKFLOW (Summary)\n\n1. **READ** — Fetch review threads using MCP tool or `gh api`\n2. **FIX** — Make code changes, tracking comment ID → change mapping\n3. **COMMIT** — Push with traceable commit message referencing PR and comments\n4. **REPLY** — Post individual reply to each thread via `gh api ...\u002Freplies`\n5. **RESOLVE** — (Optional) Resolve agent-to-agent threads via GraphQL\n6. **STOP** — Do not batch-reply, do not skip threads, do not resolve human threads\n\n## Examples\n\n### Example: Copilot flags a potential null dereference\n\n**Review comment (id: 55123):**\n> `squadDir` could be undefined here. Consider adding a null check.\n\n**Agent workflow:**\n1. Read the comment via `get_review_comments`\n2. Add the null check in `src\u002Fcli\u002Fcore\u002Fdetect-squad-dir.ts`\n3. Commit: `fix: add null check for squadDir (PR #99 review)`\n4. Reply:\n   ```bash\n   gh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55123\u002Freplies \\\n     -f body=\"Fixed in f4e5d6c — added early return when squadDir is undefined, matching the pattern in loadConfig()\"\n   ```\n5. Resolve the thread (Copilot → agent, safe to resolve)\n\n### Example: Multiple review comments on one PR\n\n**Comments:**\n- id: 55123 — \"Null check needed\" on `detect-squad-dir.ts:42`\n- id: 55124 — \"Consider using path.join()\" on `detect-squad-dir.ts:58`\n- id: 55125 — \"This log message is too verbose\" on `output.ts:15`\n\n**Agent handles each individually:**\n```bash\n# Fix all three, commit\ngit add packages\u002Fsquad-cli\u002Fsrc\u002Fcli\u002Fcore\u002Fdetect-squad-dir.ts packages\u002Fsquad-cli\u002Fsrc\u002Fcli\u002Fcore\u002Foutput.ts\ngit commit -m \"fix: address 3 review comments on PR #99\n\n- Added null check for squadDir (comment #55123)\n- Switched to path.join() for cross-platform paths (comment #55124)\n- Reduced log verbosity to debug level (comment #55125)\"\n\ngit push\n\n# Reply to each thread individually\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55123\u002Freplies \\\n  -f body=\"Fixed — added early return when squadDir is undefined\"\n\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55124\u002Freplies \\\n  -f body=\"Fixed — switched to path.join(squadDir, 'config.json') for cross-platform consistency\"\n\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55125\u002Freplies \\\n  -f body=\"Fixed — changed from console.log to debug() so it only shows with --verbose flag\"\n```\n\n### Example: Handling Copilot suggestion blocks\n\nCopilot sometimes provides `suggestion` blocks with exact code to apply:\n\n**Review comment (id: 55130):**\n````\nConsider using optional chaining:\n```suggestion\nconst name = config?.agent?.name ?? 'default';\n```\n````\n\n**Reply format when applying:**\n```bash\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55130\u002Freplies \\\n  -f body=\"Applied suggestion — using optional chaining with nullish coalescing\"\n```\n\n**Reply format when not applying:**\n```bash\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55130\u002Freplies \\\n  -f body=\"Not applied — config is guaranteed non-null at this point (validated on line 12). Optional chaining would mask errors.\"\n```\n\n### Example: Pushing back on a review comment\n\nNot every review comment should be accepted. When a suggestion is incorrect or doesn't apply:\n\n```bash\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55140\u002Freplies \\\n  -f body=\"Considered but not applied — this file is in the zero-dependency bootstrap set (see copilot-instructions.md § Protected Files). Adding path.join() would require importing from the SDK, which breaks the bootstrap constraint.\"\n```\n\nDo NOT resolve the thread when pushing back. Leave it open for the reviewer to confirm.\n\n## Anti-Patterns\n\n- ❌ **Fixing silently** — Making code changes without replying to the review thread. The reviewer has no way to know which comments were addressed.\n- ❌ **Batch-replying \"all fixed\"** — A single comment saying \"Addressed all review feedback\" on the PR. Each thread needs its own reply so reviewers can verify individually.\n- ❌ **Resolving without explaining** — Marking threads resolved without posting a reply first. The resolution gives no context on what was done.\n- ❌ **Resolving human reviewer threads** — Only resolve threads from automated reviewers (Copilot, bots). Let human reviewers confirm and resolve their own threads.\n- ❌ **Vague replies** — \"Fixed\" or \"Done\" without saying what was changed. The reply should be specific enough that the reviewer doesn't need to re-read the diff.\n- ❌ **Replying before pushing** — Reply after your fix is committed and pushed, not before. The reply should reference actual committed code.\n- ❌ **Ignoring comments you disagree with** — If you don't apply a suggestion, reply explaining why. Silence looks like you missed it.\n- ❌ **Replying to replies** — The REST API only supports replying to top-level review comments. Attempting to reply to a reply will fail with a 404.\n","## Context\n\nWhen an agent fixes code in response to PR review comments (from Copilot, a human reviewer, or any GitHub reviewer), the fix alone is not enough. The reviewer needs to see — on the PR thread itself — which comments were addressed and how. Without replies, comments stay visually unresolved, reviewers must re-read the entire diff to verify fixes, and there's no traceable link between feedback and resolution.\n\nUse this skill whenever:\n- You are fixing code based on PR review feedback\n- You are addressing Copilot review suggestions\n- You are responding to reviewer-requested changes on a PR\n- A squad member hands you review comments to resolve\n\n## SCOPE\n\n✅ THIS SKILL PRODUCES:\n- Reply comments on each review thread explaining the fix\n- Optionally resolved threads (via GraphQL when appropriate)\n- Commit messages that reference the PR and review context\n\n❌ THIS SKILL DOES NOT PRODUCE:\n- The code fixes themselves (that's the agent's domain work)\n- New review comments or reviews\n- PR descriptions or summaries\n\n## Patterns\n\n### Step 1: Read the review comments\n\n**Using MCP tools (preferred when available):**\n\n```\ngithub-mcp-server-pull_request_read\n  method: \"get_review_comments\"\n  owner: \"{owner}\"\n  repo: \"{repo}\"\n  pullNumber: {pr_number}\n```\n\nThis returns review threads with metadata: `isResolved`, `isOutdated`, `isCollapsed`, and their associated comments. Each comment has an `id` you'll need for replies.\n\n**Using gh CLI (fallback):**\n\n```bash\ngh api repos\u002F{owner}\u002F{repo}\u002Fpulls\u002F{pr_number}\u002Fcomments --paginate\n```\n\nEach comment object contains `id`, `body`, `path`, `line`, and `in_reply_to_id`. Top-level comments have no `in_reply_to_id` — those are the ones you reply to.\n\n### Step 2: Fix the code\n\nMake the actual code changes. This is your normal domain work — the skill doesn't prescribe how to fix, only how to communicate the fix.\n\n**Track what you changed.** For each review comment, note:\n- The comment `id` (top-level, not a reply)\n- The file and line referenced\n- What you actually changed (brief description)\n- The commit SHA after pushing (if available)\n\n### Step 3: Reply to each review thread\n\nAfter fixing and committing, reply to **each** review comment thread individually.\n\n**REST API call (via gh CLI):**\n\n```bash\ngh api repos\u002F{owner}\u002F{repo}\u002Fpulls\u002F{pr_number}\u002Fcomments\u002F{comment_id}\u002Freplies \\\n  -f body=\"Fixed in {sha_short} — {brief description of what was changed}\"\n```\n\n**Important:** `{comment_id}` must be the ID of the **top-level** comment in the thread. You cannot reply to a reply — only to the original review comment.\n\n**Example replies:**\n\n```bash\n# Specific and traceable\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F42\u002Fcomments\u002F18234\u002Freplies \\\n  -f body=\"Fixed in a1b2c3d — switched to path.dirname(squadDirInfo.path) for worktree consistency\"\n\n# When applying a suggested code change\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F42\u002Fcomments\u002F18235\u002Freplies \\\n  -f body=\"Applied suggestion — updated error message to include the file path for debuggability\"\n\n# When pushing back on a suggestion\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F42\u002Fcomments\u002F18236\u002Freplies \\\n  -f body=\"Considered but not applied — this path needs to stay absolute because worktree resolution depends on it. See detectSquadDir() in detect-squad-dir.ts.\"\n```\n\n### Step 4: Resolve threads (optional, GraphQL only)\n\nThread resolution is only available via the GitHub GraphQL API. Use this when your fix fully addresses the comment and no further discussion is needed.\n\n**First, get the thread IDs** (they're different from comment IDs):\n\n```bash\ngh api graphql -f query='\n  query {\n    repository(owner: \"{owner}\", name: \"{repo}\") {\n      pullRequest(number: {pr_number}) {\n        reviewThreads(first: 100) {\n          nodes {\n            id\n            isResolved\n            comments(first: 1) {\n              nodes { body databaseId }\n            }\n          }\n        }\n      }\n    }\n  }\n'\n```\n\nMatch thread IDs to comment IDs using `databaseId`, then resolve:\n\n```bash\ngh api graphql -f query='\n  mutation {\n    resolveReviewThread(input: {threadId: \"{thread_node_id}\"}) {\n      thread { id isResolved }\n    }\n  }\n'\n```\n\n**When to resolve vs. leave open:**\n- ✅ Resolve: You fixed exactly what was requested, no ambiguity\n- ❌ Don't resolve: You pushed back, applied a different fix, or the comment needs further discussion\n- ❌ Don't resolve: The reviewer is a human — let them confirm and resolve themselves\n\n**Rule of thumb:** Agent-to-agent threads (e.g., Copilot review → agent fix) can be resolved by the fixer. Human reviewer threads should be left for the human to resolve.\n\n### Step 5: Commit message traceability\n\nCommit messages should reference the PR context:\n\n```\nfix: address review feedback on PR #{pr_number}\n\n- Switched to path.dirname() for worktree path resolution (comment #18234)\n- Updated error message to include file path (comment #18235)\n\nCo-authored-by: Copilot \u003C223556219+Copilot@users.noreply.github.com>\n```\n\nFor single-comment fixes, a shorter format works:\n\n```\nfix: use path.dirname() for worktree consistency (PR #{pr_number} review)\n\nCo-authored-by: Copilot \u003C223556219+Copilot@users.noreply.github.com>\n```\n\n## AGENT WORKFLOW (Summary)\n\n1. **READ** — Fetch review threads using MCP tool or `gh api`\n2. **FIX** — Make code changes, tracking comment ID → change mapping\n3. **COMMIT** — Push with traceable commit message referencing PR and comments\n4. **REPLY** — Post individual reply to each thread via `gh api ...\u002Freplies`\n5. **RESOLVE** — (Optional) Resolve agent-to-agent threads via GraphQL\n6. **STOP** — Do not batch-reply, do not skip threads, do not resolve human threads\n\n## Examples\n\n### Example: Copilot flags a potential null dereference\n\n**Review comment (id: 55123):**\n> `squadDir` could be undefined here. Consider adding a null check.\n\n**Agent workflow:**\n1. Read the comment via `get_review_comments`\n2. Add the null check in `src\u002Fcli\u002Fcore\u002Fdetect-squad-dir.ts`\n3. Commit: `fix: add null check for squadDir (PR #99 review)`\n4. Reply:\n   ```bash\n   gh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55123\u002Freplies \\\n     -f body=\"Fixed in f4e5d6c — added early return when squadDir is undefined, matching the pattern in loadConfig()\"\n   ```\n5. Resolve the thread (Copilot → agent, safe to resolve)\n\n### Example: Multiple review comments on one PR\n\n**Comments:**\n- id: 55123 — \"Null check needed\" on `detect-squad-dir.ts:42`\n- id: 55124 — \"Consider using path.join()\" on `detect-squad-dir.ts:58`\n- id: 55125 — \"This log message is too verbose\" on `output.ts:15`\n\n**Agent handles each individually:**\n```bash\n# Fix all three, commit\ngit add packages\u002Fsquad-cli\u002Fsrc\u002Fcli\u002Fcore\u002Fdetect-squad-dir.ts packages\u002Fsquad-cli\u002Fsrc\u002Fcli\u002Fcore\u002Foutput.ts\ngit commit -m \"fix: address 3 review comments on PR #99\n\n- Added null check for squadDir (comment #55123)\n- Switched to path.join() for cross-platform paths (comment #55124)\n- Reduced log verbosity to debug level (comment #55125)\"\n\ngit push\n\n# Reply to each thread individually\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55123\u002Freplies \\\n  -f body=\"Fixed — added early return when squadDir is undefined\"\n\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55124\u002Freplies \\\n  -f body=\"Fixed — switched to path.join(squadDir, 'config.json') for cross-platform consistency\"\n\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55125\u002Freplies \\\n  -f body=\"Fixed — changed from console.log to debug() so it only shows with --verbose flag\"\n```\n\n### Example: Handling Copilot suggestion blocks\n\nCopilot sometimes provides `suggestion` blocks with exact code to apply:\n\n**Review comment (id: 55130):**\n````\nConsider using optional chaining:\n```suggestion\nconst name = config?.agent?.name ?? 'default';\n```\n````\n\n**Reply format when applying:**\n```bash\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55130\u002Freplies \\\n  -f body=\"Applied suggestion — using optional chaining with nullish coalescing\"\n```\n\n**Reply format when not applying:**\n```bash\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55130\u002Freplies \\\n  -f body=\"Not applied — config is guaranteed non-null at this point (validated on line 12). Optional chaining would mask errors.\"\n```\n\n### Example: Pushing back on a review comment\n\nNot every review comment should be accepted. When a suggestion is incorrect or doesn't apply:\n\n```bash\ngh api repos\u002Fbradygaster\u002Fsquad\u002Fpulls\u002F99\u002Fcomments\u002F55140\u002Freplies \\\n  -f body=\"Considered but not applied — this file is in the zero-dependency bootstrap set (see copilot-instructions.md § Protected Files). Adding path.join() would require importing from the SDK, which breaks the bootstrap constraint.\"\n```\n\nDo NOT resolve the thread when pushing back. Leave it open for the reviewer to confirm.\n\n## Anti-Patterns\n\n- ❌ **Fixing silently** — Making code changes without replying to the review thread. The reviewer has no way to know which comments were addressed.\n- ❌ **Batch-replying \"all fixed\"** — A single comment saying \"Addressed all review feedback\" on the PR. Each thread needs its own reply so reviewers can verify individually.\n- ❌ **Resolving without explaining** — Marking threads resolved without posting a reply first. The resolution gives no context on what was done.\n- ❌ **Resolving human reviewer threads** — Only resolve threads from automated reviewers (Copilot, bots). Let human reviewers confirm and resolve their own threads.\n- ❌ **Vague replies** — \"Fixed\" or \"Done\" without saying what was changed. The reply should be specific enough that the reviewer doesn't need to re-read the diff.\n- ❌ **Replying before pushing** — Reply after your fix is committed and pushed, not before. The reply should reference actual committed code.\n- ❌ **Ignoring comments you disagree with** — If you don't apply a suggestion, reply explaining why. Silence looks like you missed it.\n- ❌ **Replying to replies** — The REST API only supports replying to top-level review comments. Attempting to reply to a reply will fail with a 404.\n",{"name":5,"tools":53,"domain":62,"source":63,"confidence":64,"description":7},[54,58],{"name":55,"when":56,"description":57},"github-mcp-server-pull_request_read","Step 1 — fetching review comments to understand what needs fixing","Read PR review threads and comments",{"name":59,"when":60,"description":61},"gh api (REST)","Step 3 — posting reply to each comment thread after fixing","Reply to review comment threads and resolve threads via GraphQL","pull-requests, code-review, traceability","observed (agents fix review feedback silently — reviewers can't tell which comments were addressed)","low","dev","4ffda80d1bb1043d9169688cf161e53097345c72","packages\u002Fsquad-cli\u002Ftemplates\u002Fskills\u002Fpr-review-response",0,"https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad","https:\u002F\u002Fgithub.com\u002FDeDuva","2026-11-09 20:24:44",{"source":8,"skillName":5,"commands":73,"prompt":83,"zipAvailable":84},[74,77,80],{"tool":75,"command":76},"npx","npx skills add DeDuva\u002Fsquad --skill pr-review-response",{"tool":78,"command":79},"bunx","bunx skills add DeDuva\u002Fsquad --skill pr-review-response",{"tool":81,"command":82},"pnpm","pnpm dlx skills add DeDuva\u002Fsquad --skill pr-review-response","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Fpackages\u002Fsquad-cli\u002Ftemplates\u002Fskills\u002Fpr-review-response\u002FSKILL.md",true,[],[87,99,107,124,144,159],{"skillNo":88,"name":89,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":93,"publishedAt":48},"01M719NE6ZPZT80MKVWFDECJZ3","My Skill","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fmy-skill\u002FSKILL.md",[92],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[94,95,96,97,98],"my","my skill","testing","vitest","tester",{"skillNo":100,"name":101,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":104,"publishedAt":48},"01M719NDJAMEWM8D9H355SCNA8","bad-skill","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftest-fixtures\u002Fskills-test-abb30454\u002Fbad-skill\u002FSKILL.md",[],[105,106],"bad skill","bad",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":48},"01M719NCC1AZ02GHZ1V71YPEV7","squad-conventions","Core conventions and patterns used in the Squad codebase","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fsquad-conventions\u002FSKILL.md",[],[114,115,116,117,118,119,120,121,122,123],"conventions","squad","squad conventions","project-conventions","core","project","manual","high","codebase","patterns",{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":128,"categories":129,"keywords":130,"publishedAt":48},"01M719NAYM17B7X8MGP681EHKQ","rework-rate","Measure and interpret PR rework rate — the emerging 5th DORA metric","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Frework-rate\u002FSKILL.md",[],[131,132,133,134,121,135,136,137,115,138,139,140,30,120,141,142,42,143,41,28],"rate","rework rate","health","analyze","review efficiency","quality","metric","metrics","efficiency","code quality","prs","when","team",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":48},"01M719NA136PDC3SQ10R4R88TH","nap","Context hygiene — compress, prune, archive .squad\u002F state","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fnap\u002FSKILL.md",[],[146,151,152,153,154,155,156,157,115,158],"prune","state","maintenance","context hygiene","archive","hygiene","compress","context",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":169,"publishedAt":48},"01M719N7B4PBQPNXW78TEJY4HQ","e2e-template-testing","End-to-end validation of coordinator and agent template changes","https:\u002F\u002Fgithub.com\u002FDeDuva\u002Fsquad\u002Fblob\u002Fdev\u002Ftemplates\u002Fskills\u002Fe2e-template-testing\u002FSKILL.md",[165,168],{"categoryNo":166,"categoryName":167,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[96,170,171,172,173,174,175,120,176,121,177],"e2e template testing","e2e","template","end","coordinator","development","changes","validation"]