| name | copilot-feedback-resolver |
| description | Process and resolve GitHub Copilot automated PR review comments. Use when the user says "check copilot review", "handle copilot comments", "resolve copilot feedback", "address copilot suggestions", or mentions Copilot PR comments. Also use after PR creation when Copilot has left automated review comments. |
Copilot Feedback Resolver
Process and resolve GitHub Copilot's automated PR review comments systematically.
⛔ PR Comments Prohibition (CRITICAL)
NEVER leave comments directly on GitHub PRs. This is strictly forbidden:
- ❌
gh pr review --comment- FORBIDDEN - ❌
gh pr comment- FORBIDDEN - ❌ Any GraphQL mutation that creates new reviews or PR-level comments - FORBIDDEN
- ❌ Responding to human review comments - FORBIDDEN
This skill ONLY processes GitHub Copilot threads. Never interact with threads created by human reviewers.
Permitted operations:
- ✅ Reply to EXISTING Copilot threads using
addPullRequestReviewThreadReply - ✅ Resolve Copilot threads using
resolveReviewThread
⚠️ CRITICAL REQUIREMENTS ⚠️
YOU MUST RESOLVE THREADS AFTER ADDRESSING THEM
After fixing any Copilot feedback, you MUST:
- Push the code changes (
git push) - Resolve EACH thread using the GraphQL mutation (see below)
- Verify resolution by re-querying the PR
Addressing feedback without resolving the thread is INCOMPLETE WORK.
The thread resolution is NOT optional - it's the primary deliverable of this skill. Code changes alone are insufficient.
Thread Resolution Mutation (USE THIS!)
IMPORTANT: Use inline values, NOT $variable syntax. The $ character causes shell escaping issues (Expected VAR_SIGN, actual: UNKNOWN_CHAR).
# Replace THREAD_ID with actual thread ID (e.g., PRRT_kwDONZ...)
gh api graphql -f query='
mutation {
resolveReviewThread(input: {threadId: "THREAD_ID"}) {
thread { isResolved }
}
}'
You MUST call this mutation for EVERY thread you address.
YOU MUST UPDATE COPILOT-INSTRUCTIONS.MD FOR INCORRECT FEEDBACK
When Copilot feedback is categorized as INCORRECT (conflicts with project conventions/patterns), you MUST:
- Update
.github/copilot-instructions.mdto document the correct pattern - This prevents Copilot from flagging the same or similar things in future PRs
- The update should be concise and explain why the pattern is intentional
Failure to update copilot-instructions.md = INCOMPLETE WORK for Incorrect category feedback.
CRITICAL: File Structure Requirements
Copilot only reads the first ~4000 characters for PR reviews. Therefore:
- Review instructions MUST go at the TOP of the file, in a dedicated section
- Use a specific review-targeted section like
## PR Review Checklist (CRITICAL)as the first section - Keep the review section under 4000 characters - measure with
head -c 4000 .github/copilot-instructions.md | wc -c - If exceeding 4000 chars, COMPRESS the section:
- Remove redundant words
- Use terse bullet points
- Combine related items
- Move non-review guidance below the 4000 char threshold
Example structure:
# GitHub Copilot Instructions
## PR Review Checklist (CRITICAL)
<!-- KEEP THIS SECTION UNDER 4000 CHARS - Copilot only reads first ~4000 -->
- **Pattern X**: Intentional, do not flag
- **Pattern Y**: Required for Z reason
## Code Style
<!-- Less critical sections go below -->
After updating, verify: head -c 4000 .github/copilot-instructions.md | tail -5 should show content from the review section, not unrelated sections.
Prerequisites
CRITICAL: Load the fx-dev:github skill FIRST before running any GitHub API operations. This skill provides essential patterns and error handling for gh CLI commands.
WHEN TO USE THIS SKILL
USE THIS SKILL PROACTIVELY when ANY of the following occur:
- User says "check copilot review" / "handle copilot comments" / "resolve copilot feedback"
- User mentions "copilot" and "PR" or "comments" in the same context
- After PR creation when you notice Copilot has reviewed the PR
- User says "address copilot suggestions" / "deal with copilot"
- As part of the PR workflow after
pr-revieweragent completes - When PR checks show Copilot has left review comments
Invocation: Use the Skill tool with skill="fx-dev:copilot-feedback-resolver"
Processing Rules
ONLY process UNRESOLVED comments. NEVER touch, modify, or re-process already resolved comments. Skip them entirely.
Core Workflow
1. Fetch Unresolved Copilot Threads
Query review threads using GraphQL.
IMPORTANT: Use inline values, NOT $variable syntax. The $ character causes shell escaping issues.
# Replace OWNER, REPO, PR_NUMBER with actual values
gh api graphql -f query='
query {
repository(owner: "OWNER", name: "REPO") {
pullRequest(number: PR_NUMBER) {
reviewThreads(first: 100) {
nodes {
id
isResolved
comments(first: 10) {
nodes {
author { login }
body
}
}
}
}
}
}
}'
Filter for: isResolved: false AND author is Copilot (github-actions bot or copilot signature)
2. Categorize Each Comment
For each unresolved Copilot comment:
| Category | Indicator | Action |
|---|---|---|
| Nitpick | Contains [nitpick] prefix |
Auto-resolve immediately |
| Outdated | Refers to code that no longer exists | Reply with explanation, resolve |
| Incorrect | Misunderstands project conventions | Reply with explanation, resolve, update copilot-instructions.md |
| Valid | Current, actionable concern | Delegate to coder agent to fix |
3. Resolve Threads
Use GraphQL mutation to resolve.
IMPORTANT: Use inline values, NOT $variable syntax.
# Replace THREAD_ID with actual thread ID (e.g., PRRT_kwDONZ...)
gh api graphql -f query='
mutation {
resolveReviewThread(input: {threadId: "THREAD_ID"}) {
thread { isResolved }
}
}'
4. Handle Each Category
Nitpicks ([nitpick] prefix)
- Resolve immediately without changes
- Optional brief acknowledgment reply
Outdated/Incorrect Copilot Comments
CRITICAL: Reply directly to the Copilot review thread, NOT to the PR.
Use GraphQL to add a reply to the specific Copilot thread.
IMPORTANT: Use inline values, NOT $variable syntax.
# Replace THREAD_ID and message with actual values
gh api graphql -f query='
mutation {
addPullRequestReviewThreadReply(input: {
pullRequestReviewThreadId: "PRRT_xxx",
body: "Your explanation here"
}) {
comment { id }
}
}'
⛔ FORBIDDEN COMMANDS - NEVER USE:
gh pr review <PR_NUMBER> --comment- adds PR-level comments, not thread repliesgh pr comment- adds PR-level comments- Any interaction with human reviewer threads
- Reply to the thread with professional explanation:
- Outdated: "This comment refers to code refactored in commit abc123. The issue is no longer applicable."
- Incorrect: "This conflicts with our [convention name] convention. [Brief explanation]. See [reference file] for project guidelines."
- Resolve the thread using the mutation from section 3
- Update
.github/copilot-instructions.mdto prevent recurrence:- Add to "## Code Reviews" section
- Example: "- Do not suggest removing
.sr-onlyclasses - required accessibility utilities" - If symlink: Follow it and edit target file
Valid Concerns
- Delegate to coder agent with:
- PR number and title
- File and line number
- Copilot comment text
- Thread ID for resolution after fix
- Ensure coder pushes changes and resolves thread
5. Verify Completion
- Push any changes:
git push - Re-query PR to confirm ALL Copilot threads resolved
- Report summary of actions taken
Reply Templates
For outdated comments:
This comment refers to code that has been refactored in commit [hash]. The issue is no longer applicable.
For incorrect/convention conflicts:
This suggestion conflicts with our [convention name] convention. [Brief explanation of why]. See [reference file] for project guidelines.
Success Criteria
Task is INCOMPLETE until ALL of these are done:
- ✅ All code changes pushed to the PR branch
- ✅ EVERY addressed thread resolved via GraphQL mutation (not just code fixed!)
- ✅ For INCORRECT feedback:
.github/copilot-instructions.mdupdated to prevent recurrence - ✅ Re-query confirms
isResolved: truefor all processed threads - ✅ Output summary table (see format below)
Required Output: Thread Summary Table
You MUST output this table after processing all threads:
| Thread ID | File:Line | Category | Action Taken | Status |
|-----------|-----------|----------|--------------|--------|
| PRRT_xxx | src/foo.ts:42 | Nitpick | Auto-resolved | ✅ Resolved |
| PRRT_yyy | src/bar.ts:15 | Valid | Fixed null check | ✅ Resolved |
| PRRT_zzz | lib/util.js:8 | Outdated | Code refactored | ✅ Resolved |
Column definitions:
- Thread ID: GraphQL thread ID (truncated for readability)
- File:Line: Location of the comment
- Category: Nitpick, Valid, Outdated, or Incorrect
- Action Taken: Brief description of resolution (10 words max)
- Status: ✅ Resolved, ❌ Failed, or ⏳ Pending
Common failure mode: Fixing code but forgetting to resolve the threads. This leaves the PR with unresolved conversations even though the issues are fixed. ALWAYS run the resolution mutation after pushing code.
Error Handling
- API failures: Retry with proper auth
- Thread ID issues: Use alternative queries
- Delegation failures: Attempt simple fixes directly
- Partial resolution is better than none