PR Finalize Review
microsoft/garnet
Checks that a pull request's title and description match its implementation and reviews the code for Garnet best practices, reporting findings without posting them.
Checks that a pull request's title and description match its implementation and reviews the code for best practices before merge, without posting anything.
$ npx skills add dotnet/maui --skill pr-finalize -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install dotnet/maui pr-finalize --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.github/skills/pr-finalize .claude/skills/pr-finalize && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "pr-finalize" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/pr-finalize into .claude/skills/pr-finalize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-finalize", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/dotnet/maui/tree/main/.github/skills/pr-finalizeType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add dotnet/maui --skill pr-finalize -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install dotnet/maui pr-finalize --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.github/skills/pr-finalize .agents/skills/pr-finalize && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "pr-finalize" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/pr-finalize into .agents/skills/pr-finalize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-finalize", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dotnet/maui --skill pr-finalize -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install dotnet/maui pr-finalize --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.github/skills/pr-finalize .cursor/skills/pr-finalize && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "pr-finalize" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/pr-finalize into .cursor/skills/pr-finalize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-finalize", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/dotnet/maui.git --path .github/skills/pr-finalize--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add dotnet/maui --skill pr-finalize -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install dotnet/maui pr-finalize --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.github/skills/pr-finalize .gemini/skills/pr-finalize && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "pr-finalize" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/pr-finalize into .gemini/skills/pr-finalize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-finalize", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install dotnet/maui pr-finalizeInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add dotnet/maui --skill pr-finalize -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .github/skills && cp -r skills-src/.github/skills/pr-finalize .github/skills/pr-finalize && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "pr-finalize" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/pr-finalize into .github/skills/pr-finalize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-finalize", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add dotnet/maui --skill pr-finalize -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install dotnet/maui pr-finalize --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/dotnet/maui.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.github/skills/pr-finalize .opencode/skills/pr-finalize && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "pr-finalize" agent skill from https://github.com/dotnet/maui/tree/main/.github/skills/pr-finalize into .opencode/skills/pr-finalize/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "pr-finalize", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
pr-finalizeChecks that a pull request's title and description match its implementation and reviews the code for best practices before merge, without posting anything.
The skill works in two phases: first it verifies that the PR title and description match what the code does, then it reviews the code for best practices and potential issues. It stands alone and can be used on any PR. It is analysis only. The agent must never approve or request changes with the GitHub CLI, and never post comments itself; findings go to pr-finalize-summary.md, and the summary is only posted or used when a user explicitly asks for PR finalization.
For the description, the core principle is to preserve quality. The agent evaluates the existing text first, keeps a thorough description rather than swapping in a generic template, adds only missing required elements such as a NOTE block or issue links, and rewrites only when the text is stale, inaccurate or missing key information. Current state comes from gh pr view with JSON fields, so no local checkout is needed. Lessons extraction, test writing and build failure investigation are left to other skills. The excerpt is cut off in the evaluation workflow.
5 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b926f05. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
PR Finalize loads about 3.1k tokens when it runs, and up to ~3.8k if it reads all its reference files. Until then it costs about 116 tokens; SKILL.md has 1,068 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from dotnet/maui at commit b926f05, republished under its MIT licence (© dotnet). 1,068 words, ~3,124 tokens.
.claude/skills/pr-finalize/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Ensures PR title and description accurately reflect the implementation, and performs a code review for best practices before merge.
Standalone skill - Can be used on any PR, not just PRs reviewed by the pr-review skill.
AI agents must NEVER use --approve or --request-changes flags.
| Action | Allowed? | Why |
|---|---|---|
gh pr review --approve | ❌ NEVER | Approval is a human decision |
gh pr review --request-changes | ❌ NEVER | Blocking PRs is a human decision |
This skill is ANALYSIS ONLY. Never post comments using gh commands.
| Action | Allowed? | Why |
|---|---|---|
gh pr review --comment | ❌ NEVER | Review-PR.ps1 handles posting via scripts |
gh pr comment | ❌ NEVER | Review-PR.ps1 handles posting via scripts |
| Analyze and report findings | ✅ YES | This is the skill's purpose |
Correct workflow:
pr-finalize-summary.mdReview-PR.ps1 flow. Only post or use the summary when a user explicitly asks for PR finalization.Only humans control when comments are posted. Your job is to analyze and present findings.
Review existing description BEFORE suggesting changes. Many PR authors write excellent, detailed descriptions. Your job is to:
# Get current state (no local checkout required)
gh pr view XXXXX --json title,body
gh pr view XXXXX --json files --jq '.files[].path'
# Review commit messages (helpful for squash/merge commit quality)
gh pr view XXXXX --json commits --jq '.commits[].messageHeadline'
# Review actual code changes
gh pr diff XXXXX
# Optional: if the PR branch is checked out locally
git diff origin/main...HEADBefore suggesting changes, evaluate the current description:
| Quality Indicator | Look For |
|---|---|
| Structure | Clear sections, headers, organized flow |
| Technical depth | File-by-file changes, specific code references |
| Scanability | Easy to find what changed and where |
| Accuracy | Matches actual diff - not stale or incorrect |
| Completeness | Platforms, breaking changes, testing info |
Ask: "Is the existing description better than what my template would produce?"
The title becomes the commit message headline. Make it searchable and informative.
| Requirement | Good | Bad |
|---|---|---|
| Platform prefix (if specific) | [iOS] Fix Shell back button | Fix Shell back button |
| Describes behavior, not issue | [iOS] SafeArea: Return Empty for non-ISafeAreaView views | Fix #23892 |
| Captures the "what" | Return Empty for non-ISafeAreaView | Fix SafeArea bug |
| Notes model change if applicable | (opt-in model) | (omitted) |
| No noise prefixes | [iOS] Fix... | [PR agent] Fix... |
[Platform] Component: What changed (model change if any)Examples:
[iOS] SafeArea: Return Empty for non-ISafeAreaView views (opt-in model)[Android] CollectionView: Fix scroll position reset on item update[Windows] Shell: Use NavigationView instead of custom flyoutPR description should:
.github/PULL_REQUEST_TEMPLATE.md ("Description of Change" and "Issues Fixed"). The skill adds additional structured fields (Root cause, Fix, Key insight, etc.) as recommended enhancements for better agent context.### Description of Change
[Must match actual implementation]
### Issues Fixed
Fixes #XXXXXThe title and description become the commit message. Future agents searching git history will use this to understand:
| Element | Purpose | Example |
|---|---|---|
| Root cause | Why the bug occurred | "Non-ISafeAreaView views falling through to return baseSafeArea" |
| Fix approach | What the code now does | "Return SafeAreaPadding.Empty for views without interface" |
| Philosophy/model change | If behavior model changed | "Before: opt-out. After: opt-in via interface" |
| Key interfaces/types | Types agents need to know | "ISafeAreaView, ISafeAreaView2 = opt-in contract" |
| What NOT to do | Failed approaches to avoid | "Don't use Element type in Platform layer" |
| Architectural constraints | Layer boundaries, type availability | "Platform layer cannot reference Controls types" |
| Edge cases | Known limitations or risks | "Legacy layouts are [Obsolete], custom views need interface" |
When try-fix or debugging revealed failed approaches, document them:
### What NOT to Do (for future agents)
- ❌ **Don't use [Type] in [Layer]** - [Why it fails]
- ❌ **Don't use [Pattern]** - [Why it's brittle/wrong]
- ❌ **Don't [Approach]** - [Why it doesn't work]This prevents future agents from repeating failed experiments.
When a fix changes the behavioral model (not just fixing a bug), call it out explicitly:
**This is a philosophy change:**
- **Before:** [Old behavior model]
- **After:** [New behavior model]Example: "Before: Safe area applied by default (opt-out). After: Only views implementing ISafeAreaView get safe area (opt-in)."
| Problem | Cause | Solution |
|---|---|---|
| Description doesn't match code | Implementation changed during review | Update description to match actual diff |
| Missing root cause | Author focused on "what" not "why" | Add root cause from issue/analysis |
| References wrong approach | Started with A, switched to B | Update to describe final approach |
| Missing NOTE block | Author didn't use template | Prepend NOTE block, keep rest |
| Good description replaced | Agent used template blindly | Evaluate existing quality first |
## PR #XXXXX Finalization Review
### ✅ Title: [Good / Needs Update]
**Current:** "Existing title"
**Recommended:** "[Platform] Improved title" (if needed)
### ✅ Description: Excellent - Keep As-Is
**Quality assessment:**
- Structure: ✅ Clear sections with headers
- Technical depth: ✅ File-by-file breakdown
- Accuracy: ✅ Matches implementation
- Completeness: ✅ Platforms, breaking changes noted
**Only addition needed:**
- ❌ Missing NOTE block - prepend to top
**Action:** Add NOTE block, preserve everything else.Use structured template only when existing description is inadequate:
### Root Cause
[Why the bug occurred - be specific about the code path]
### Description of Change
[What the code now does]
**This is a philosophy change:** (if applicable)
- **Before:** [Old model]
- **After:** [New model]
[Cross-platform alignment notes if relevant]
### Key Technical Details
**[Relevant interfaces/types]:**
- `InterfaceA` - [What it does]
- `InterfaceB` - [What it does]
**[Category] that [work/don't work]:**
- List of types/views affected
### What NOT to Do (for future agents)
- ❌ **Don't [approach 1]** - [Why it fails]
- ❌ **Don't [approach 2]** - [Why it's wrong]
- ❌ **Don't [approach 3]** - [Constraint that prevents it]
### Edge Cases
| Scenario | Risk | Mitigation |
|----------|------|------------|
| [Case 1] | Low/Medium/High | [How to handle] |
| [Case 2] | Low/Medium/High | [How to handle] |
### Issues Fixed
Fixes #XXXXX
### Platforms Tested
- [x] iOS
- [x] Android
- [ ] Windows
- [ ] Mac## Changes Made
### 1. **PickerHandler.iOS.cs** - MacCatalyst-specific improvements
#### Added UIAlertController instance field
- Declared `UIAlertController? pickerController` as instance field...
#### Improved picker dismiss logic
- Moved picker dismiss logic from event handler to "Done" button action
- Removed `EditingDidEnd` event handler causing duplicate dismiss calls
## Platforms Affected
- **MacCatalyst** (primary)
- iOS (no behavior changes, shared code)
## Breaking Changes
NoneVerdict: Excellent - file-by-file breakdown, specific changes, platforms, breaking changes. Keep it.
Fixed the issue mentioned in #30897Verdict: Inadequate - no detail on what changed. Use template.
After verifying title/description, perform a code review to catch best practice violations and potential issues before merge.
When reviewing code changes, focus on:
# Get the PR diff
gh pr diff XXXXX
# Review specific files
gh pr diff XXXXX -- path/to/file.cs## Code Review Findings
### 🔴 Critical Issues
**[Issue Title]**
- **File:** [path/to/file.cs]
- **Problem:** [Description]
- **Recommendation:** [Code fix or approach]
### 🟡 Suggestions
- [Suggestion 1]
- [Suggestion 2]
### ✅ Looks Good
- [Positive observation 1]
- [Positive observation 2]The pr-finalize skill is ANALYSIS ONLY. Never post comments using gh pr review or gh pr comment.
| Action | Allowed? | Why |
|---|---|---|
gh pr review --comment | ❌ NEVER | Review-PR.ps1 handles posting via scripts |
gh pr comment | ❌ NEVER | Review-PR.ps1 handles posting via scripts |
| Analyze and report findings | ✅ YES | This is the skill's purpose |
Workflow:
pr-finalize-summary.mdReview-PR.ps1 flow. Only post or use the summary when a user explicitly asks for PR finalization.The user controls when comments are posted. Your job is to analyze and present findings.
See references/complete-example.md for a full agent-optimized PR description showing all elements above applied to a real SafeArea fix.
© dotnet, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (references) in .github/skills/pr-finalize of dotnet/maui.
Open the folder on GitHubat commit b926f05
PR Finalize next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| PR Finalize this skilldotnet/maui | 23k | — | ~3.1k | Automated safety check: Pass | MIT | |
| PR Finalize Reviewmicrosoft/garnet | 12k | — | ~3.1k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| GitHub Review Iterationprisma/orm | 48k | — | ~2.2k | Automated safety check: Pass | Apache-2.0 | |
| PR Review State Fetchprisma/orm | 48k | — | ~767 | Automated safety check: Pass | Apache-2.0 | |
| Fastlane Pull Request Reviewfastlane/fastlane | 42k | — | ~550 | Automated safety check: Pass | MIT |
microsoft/garnet
Checks that a pull request's title and description match its implementation and reviews the code for Garnet best practices, reporting findings without posting them.
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
prisma/orm
Runs a loop on a GitHub pull request: fetch review state, triage comments into actions, implement them and resolve threads, repeating until nothing actionable is left.
prisma/orm
Fetches a pull request's canonical review state as JSON, validates it, and renders markdown, a text summary and triage target files from it using bundled scripts.
fastlane/fastlane
Reviews a fastlane pull request against its linked issue and the project guides, separating blocking from non-blocking findings and handling vulnerabilities privately.
remix-run/react-router
Packages finished React Router work into a draft pull request: branch, commit, push, a written PR body and the right GitHub labels.
dotnet/maui
Mines local Copilot CLI session logs for dotnet/maui to rank costly or failing runs, tag recurring failure modes, propose repo edits and emit guard evals.
dotnet/maui
Reviews the tests added in a pull request for fix coverage, quality, edge cases and test type, and recommends lighter test types where they would do.
dotnet/maui
Produces evidence-backed ship-readiness verdicts for .NET MAUI Servicing Releases and Previews, and drafts public-safe release handoff pages from the result.
dotnet/maui
Interprets pinned managed benchmark evidence for a dotnet/maui pull request and writes a narrative for the performance review workflow, without running or publishing anything.
dotnet/maui
Adds MAUI-specific guardrails on top of the maestro-cli skill and Maestro MCP tools for darc, BAR, and channel or feed lookups in dotnet/maui.
dotnet/maui
Adds dotnet/maui-specific context for investigating failing PR checks and broken nightly builds: pipelines, Helix logs, binlogs and merge-readiness verdicts.
Works with
Categories
Checks that a pull request's title and description match its implementation and reviews the code for best practices before merge, without posting anything. The skill works in two phases: first it verifies that the PR title and description match what the code does, then it reviews the code for best practices and potential issues. It stands alone and can be used on any PR.
PR Finalize fits situations like: asked to finalize a PR before merging; checking that a PR title and description match the code; reviewing a commit message for best practices; re-checking a PR after its implementation changed during review.
Run `npx skills add dotnet/maui --skill pr-finalize -a claude-code`. Or copy the skill folder (.github/skills/pr-finalize in dotnet/maui) into .claude/skills/pr-finalize in your project. Claude Code loads it when a task matches its description.
Run `npx skills add dotnet/maui --skill pr-finalize -a codex`. Or copy the skill folder (.github/skills/pr-finalize in dotnet/maui) into .agents/skills/pr-finalize in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dotnet/maui --skill pr-finalize -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/pr-finalize, .gemini/skills/pr-finalize, .github/skills/pr-finalize and .opencode/skills/pr-finalize in your project.
Going by SKILL.md and its folder, PR Finalize needs the command-line tools its instructions call (gh and git). Our summary lists: The GitHub CLI (`gh`) with access to the repository.
SKILL.md contains no URLs. Its commands use gh and git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
PR Finalize is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 701 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with PR Finalize: PR Finalize Review (microsoft/garnet, 12k stars), PR Babysitter (openinterpreter/openinterpreter, 69k stars), GitHub Review Iteration (prisma/orm, 48k stars) and PR Review State Fetch (prisma/orm, 48k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
dotnet (a GitHub organization, an official publisher) maintains it in dotnet/maui, which has 23,321 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on October 8, 2026.
Source: dotnet/maui on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.