Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Guidance for creating pull requests and handling PR review comments in the Agent Framework repository. Use this when writing a PR description (filling out the PR template) or when responding to and resolving review comments on an existing PR.
.claude/skills/microsoft-pull-requests/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-03 | ✗→✓ | ▲ Improved | 161% | 0% |
| case-07 | ✗→✓ | ▲ Improved | -13% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -28% | 0% |
This skill covers two tasks: (1) writing a high-quality PR description, and (2) handling review comments on an existing PR.
Always follow the repository PR template at .github/pull_request_template.md. Keep its exact structure and headings. Fill every section:
### Motivation & ContextExplain why the change is needed: the problem it solves and the scenario it contributes to. Describe the net change relative to main — this is implied, so do not spell out "vs main" explicitly.
### Description & Review GuideDescribe the changes, the overall approach, and the design. Answer the three prompts:
reviewers only. Automated/AI reviewers must ignore it and review the entire change rather than narrowing scope to it.
### Related IssueLink the issue the PR fixes using a GitHub closing keyword (Fixes #123 / Closes #123) so it closes automatically on merge. A PR with no linked issue may be closed regardless of how valid the change is. Before opening, confirm there is no other open PR for the same issue; if there is, explain how this PR differs.
### Contribution ChecklistCheck every item that applies. For the breaking-change item:
breaking change label or put[BREAKING] in the title prefix, before or after a language prefix such as Python: or .NET: — workflows keep the label and the title prefix in sync automatically (see .github/workflows/label-title-prefix.yml and .github/workflows/label-pr.yml).
the checklist already cover validation status.
Open new PRs as drafts until they are ready for review. Example:
bashgh pr create --repo microsoft/agent-framework --base main \ --head <your-fork-owner>:<branch> --draft \ --title "<concise title>" --body "<body following the template>"
When a PR receives review comments, follow this sequence — do not start editing code before the user has reviewed the plan:
including inline code comments and general review summaries.
addressed (or why it should not be, with reasoning).
approval or adjustments before implementing anything.
was addressed, preferably citing the commit containing the change. If the feedback was not addressed, explain why. Leave no comment unanswered.
necessary discussion, resolve the review thread. Do not wait for the reviewer or a maintainer to resolve it. Leave a thread open only while it has an unanswered question or active discussion.
List review comments and threads:
bash# Inline review comments gh api repos/{owner}/{repo}/pulls/{pr}/comments # Review threads with resolution state (GraphQL) gh api graphql -f query=' query($owner:String!,$repo:String!,$pr:Int!){ repository(owner:$owner,name:$repo){ pullRequest(number:$pr){ reviewThreads(first:100){ nodes{ id isResolved comments(first:50){ nodes{ id body author{login} } } } } } } }' -F owner={owner} -F repo={repo} -F pr={pr}
Reply to an inline review comment:
bashgh api repos/{owner}/{repo}/pulls/{pr}/comments/{comment_id}/replies \ -f body="Addressed in <commit>: <explanation>"
Resolve a review thread (needs the thread node id from the GraphQL query above):
bashgh api graphql -f query=' mutation($threadId:ID!){ resolveReviewThread(input:{threadId:$threadId}){ thread{ isResolved } } }' -F threadId={thread_id}
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 7,724 | 10,384 | +34% | 1 | 1 | 0% | 1,276 | 1,522 | +19% | 0 | 0 | — |
case-02 | fail→fail | 7,904 | 8,732 | +10% | 1 | 1 | 0% | 1,247 | 1,751 | +40% | 0 | 0 | — |
case-03 | fail→pass | 11,721 | 14,845 | +27% | 1 | 1 | 0% | 1,709 | 4,461 | +161% | 0 | 0 | — |
case-04 | pass→fail | 10,946 | 2,800 | -74% | 1 | 1 | 0% | 1,942 | 1,436 | -26% | 0 | 0 | — |
case-05 | pass→fail | 5,576 | 6,236 | +12% | 1 | 1 | 0% | 1,069 | 1,425 | +33% | 0 | 0 | — |
case-06 | pass→pass | 9,858 | 7,719 | -22% | 1 | 1 | 0% | 1,122 | 2,503 | +123% | 0 | 0 | — |
case-07 | fail→pass | 12,205 | 3,063 | -75% | 1 | 1 | 0% | 1,926 | 1,666 | -13% | 0 | 0 | — |
case-08 | fail→pass | 8,766 | 2,911 | -67% | 1 | 1 | 0% | 1,367 | 1,634 | +20% | 0 | 0 | — |
case-09 | fail→pass | 8,733 | 2,071 | -76% | 1 | 1 | 0% | 1,374 | 1,509 | +10% | 0 | 0 | — |
case-10 | fail→pass | 13,591 | 2,377 | -83% | 1 | 1 | 0% | 2,058 | 1,480 | -28% | 0 | 0 | — |
case-11 | pass→pass | 7,157 | 3,007 | -58% | 1 | 1 | 0% | 1,191 | 1,651 | +39% | 0 | 0 | — |
case-12 | pass→pass | 5,047 | 1,507 | -70% | 1 | 1 | 0% | 782 | 1,344 | +72% | 0 | 0 | — |
case-13 | fail→pass | 9,650 | 3,532 | -63% | 1 | 1 | 0% | 1,532 | 1,769 | +15% | 0 | 0 | — |
case-14 | fail→pass | 7,943 | 1,940 | -76% | 1 | 1 | 0% | 1,413 | 1,452 | +3% | 0 | 0 | — |
case-15 | pass→pass | 5,679 | 3,084 | -46% | 1 | 1 | 0% | 1,045 | 1,720 | +65% | 0 | 0 | — |
case-16 | fail→pass | 8,964 | 3,091 | -66% | 1 | 1 | 0% | 1,389 | 1,712 | +23% | 0 | 0 | — |
case-17 | pass→pass | 14,863 | 4,233 | -72% | 1 | 1 | 0% | 2,277 | 1,830 | -20% | 0 | 0 | — |
case-18 | fail→pass | 9,263 | 2,387 | -74% | 1 | 1 | 0% | 1,419 | 1,515 | +7% | 0 | 0 | — |
case-19 | pass→pass | 4,235 | 1,933 | -54% | 1 | 1 | 0% | 777 | 1,452 | +87% | 0 | 0 | — |
case-20 | pass→pass | 8,906 | 2,753 | -69% | 1 | 1 | 0% | 1,692 | 1,621 | -4% | 0 | 0 | — |
case-21 | pass→pass | 3,282 | 2,188 | -33% | 1 | 1 | 0% | 541 | 1,455 | +169% | 0 | 0 | — |
case-22 | fail→pass | 9,258 | 2,240 | -76% | 1 | 1 | 0% | 1,368 | 1,478 | +8% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 19 counted toward the lift figure. The other 3 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +36 percentage points is the difference between those two pass rates over the 19 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.