Bug
The Review Responder agent cannot resolve review threads because it hallucminates thread node IDs. The GitHub MCP tools don't expose PRRT_ thread node IDs to the agent, so the agent fabricates plausible-looking IDs based on the example format in the tool description. These fake IDs fail when the handler calls the GraphQL resolveReviewThread mutation.
With required_conversation_resolution: true, unresolved threads block auto-merge. This breaks the autonomous pipeline for any PR where Copilot leaves inline comments.
Evidence
Our PRs
| PR |
Responder ran? |
Replies posted? |
Threads resolved? |
Outcome |
| #91 |
Yes |
Yes (1/1) |
No — resolve failed |
Manually resolved |
| #106 |
Yes |
Yes (2/2) |
No — resolve failed |
Closed, re-dispatched |
| #112 |
Yes |
Yes (3/3) |
No — resolve failed |
Stuck |
PR #112 Logs (run 23120336057)
Agent emitted 8 safe-output messages in correct order (resolve before push):
Message 1/8: add_labels ✅
Message 2/8: resolve_pull_request_review_thread ❌ — Could not resolve to a node with the global id of 'PRRT_kwDOOIiPrc6djnf7'
Message 3/8: reply_to_pull_request_review_comment ✅
Message 4/8: resolve_pull_request_review_thread ❌ — Could not resolve to a node with the global id of 'PRRT_kwDOOIiPrc6djnf_'
Message 5/8: reply_to_pull_request_review_comment ✅
Message 6/8: reply_to_pull_request_review_comment ✅
Message 7/8: resolve_pull_request_review_thread ❌ (same error pattern)
Message 8/8: push_to_pull_request_branch ✅
Thread ID Comparison
Agent provided: PRRT_kwDOOIiPrc6djnf7 (prefix kwDOOIiPrc)
Actual thread IDs: PRRT_kwDORibwsM50cYP7 (prefix kwDORibwsM)
Completely different base node IDs. The agent fabricated the IDs — they don't correspond to any real objects.
Meanwhile, reply_to_pull_request_review_comment succeeded for all 3 threads. The reply tool uses a different identifier (comment-level ID) that the agent can discover from the MCP tools.
gh-aw's Own Smoke Tests Confirm This
gh-aw's smoke tests consistently skip "Resolve Review Thread" because the agent can't discover thread IDs:
Smoke #20998 (2026-03-14): ⚠️ skipped — could not obtain PRRT node ID via available tools
Smoke #17210 (2026-02-20): ⚠️ Skipped (PRRT_ thread IDs unavailable without GraphQL)
Smoke #19689 (2026-03-05): ⚠️ Skipped — GraphQL not available to fetch PRRT_ node IDs
This has been a known gap for at least a month.
Root Cause Analysis
What the GitHub MCP Server Does
In github/github-mcp-server (pkg/github/pullrequests.go):
-
get_review_comments method queries review threads via GraphQL:
type reviewThreadNode struct {
ID githubv4.ID // <-- PRRT_ node ID IS queried
IsResolved githubv4.Boolean
IsOutdated githubv4.Boolean
Comments struct { ... }
}
-
The response is converted via convertToMinimalReviewThreadsResponse() before being returned to the agent. It's unclear whether this conversion preserves the thread ID field.
-
The tool description for resolve_pull_request_review_thread says:
"Get thread IDs from pull_request_read with method get_review_comments."
The Gap
Either:
convertToMinimalReviewThreadsResponse() strips the ID field (so the agent never sees it)
- Or the gh-aw agent doesn't use the MCP server's
get_review_comments (uses a different, older tool that doesn't return thread IDs)
- Or the agent calls the right tool but doesn't parse the thread ID from the response
Whatever the cause, the agent can see thread content (comments, line numbers, file paths) but NOT thread node IDs. It then fabricates IDs based on the PRRT_kwDO... example in the tool description.
Impact
The autonomous pipeline is broken for any PR with Copilot inline comments:
- Implementer creates PR ✅
- Copilot reviews with inline comments ✅
- Review Responder addresses comments, replies ✅
- Review Responder fails to resolve threads ❌
- Quality Gate approves ✅
- Auto-merge blocked by unresolved threads ❌
Every such PR requires manual thread resolution.
Workaround
Manually resolve threads via GraphQL:
# Get real thread IDs
gh api graphql -f query='query { repository(owner:"OWNER",name:"REPO") { pullRequest(number:N) { reviewThreads(first:20) { nodes { id isResolved } } } } }'
# Resolve each
gh api graphql -f query='mutation { resolveReviewThread(input:{threadId:"PRRT_xxx"}) { thread { isResolved } } }'
When to Revisit
Monitor:
github/github-mcp-server for changes to convertToMinimalReviewThreadsResponse() or reviewThreadNode serialization
github/gh-aw smoke tests — when test 14 "Resolve Review Thread" starts passing instead of being skipped
- gh-aw releases for changelog mentions of thread resolution fixes
Related
Bug
The Review Responder agent cannot resolve review threads because it hallucminates thread node IDs. The GitHub MCP tools don't expose
PRRT_thread node IDs to the agent, so the agent fabricates plausible-looking IDs based on the example format in the tool description. These fake IDs fail when the handler calls the GraphQLresolveReviewThreadmutation.With
required_conversation_resolution: true, unresolved threads block auto-merge. This breaks the autonomous pipeline for any PR where Copilot leaves inline comments.Evidence
Our PRs
PR #112 Logs (run 23120336057)
Agent emitted 8 safe-output messages in correct order (resolve before push):
Thread ID Comparison
Agent provided:
PRRT_kwDOOIiPrc6djnf7(prefixkwDOOIiPrc)Actual thread IDs:
PRRT_kwDORibwsM50cYP7(prefixkwDORibwsM)Completely different base node IDs. The agent fabricated the IDs — they don't correspond to any real objects.
Meanwhile,
reply_to_pull_request_review_commentsucceeded for all 3 threads. The reply tool uses a different identifier (comment-level ID) that the agent can discover from the MCP tools.gh-aw's Own Smoke Tests Confirm This
gh-aw's smoke tests consistently skip "Resolve Review Thread" because the agent can't discover thread IDs:
Smoke #20998 (2026-03-14):
⚠️ skipped — could not obtain PRRT node ID via available toolsSmoke #17210 (2026-02-20):
⚠️ Skipped (PRRT_ thread IDs unavailable without GraphQL)Smoke #19689 (2026-03-05):
⚠️ Skipped — GraphQL not available to fetch PRRT_ node IDsThis has been a known gap for at least a month.
Root Cause Analysis
What the GitHub MCP Server Does
In
github/github-mcp-server(pkg/github/pullrequests.go):get_review_commentsmethod queries review threads via GraphQL:The response is converted via
convertToMinimalReviewThreadsResponse()before being returned to the agent. It's unclear whether this conversion preserves the threadIDfield.The tool description for
resolve_pull_request_review_threadsays:The Gap
Either:
convertToMinimalReviewThreadsResponse()strips theIDfield (so the agent never sees it)get_review_comments(uses a different, older tool that doesn't return thread IDs)Whatever the cause, the agent can see thread content (comments, line numbers, file paths) but NOT thread node IDs. It then fabricates IDs based on the
PRRT_kwDO...example in the tool description.Impact
The autonomous pipeline is broken for any PR with Copilot inline comments:
Every such PR requires manual thread resolution.
Workaround
Manually resolve threads via GraphQL:
When to Revisit
Monitor:
github/github-mcp-serverfor changes toconvertToMinimalReviewThreadsResponse()orreviewThreadNodeserializationgithub/gh-awsmoke tests — when test 14 "Resolve Review Thread" starts passing instead of being skippedRelated