Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Review and merge open bot PRs: dependency updates from dotnet-maestro, codeflow from dotnet/dotnet, and OneLoc localization PRs. Produces a clickable dashboard with CI status, review state, and suspicious file flags. Use when you want to triage all open bot PRs in one pass.
.claude/skills/dotnet-merge-dependency-updates/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✓→✓ | = Same ✓ | 76% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 56% | 0% |
| case-06 | ✓→✓ | = Same ✓ | 101% | 0% |
| case-07 | ✓→✓ | = Same ✓ | 24% | 0% |
| case-08 | ✓→✓ | = Same ✓ | 21% | 0% |
This skill triages all open bot PRs in the MSBuild repo, produces a review dashboard, then optionally updates branches and bumps versions for merge readiness.
| Category | Author | Title Pattern | Example | |----------|--------|---------------|---------| | Dependency update | dotnet-maestro[bot] | [<branch>] Update dependencies from dotnet/<repo> | [vs18.3] Update dependencies from dotnet/arcade | | Codeflow | dotnet-maestro[bot] | [<branch>] Source code updates from dotnet/dotnet | [vs18.3] Source code updates from dotnet/dotnet | | OneLoc | dotnet-bot | Localized file check-in by OneLocBuild Task: ... | Localized file check-in by OneLocBuild Task: Build definition ID 9434: Build ID ... |
Run two searches in parallel to find all open bot PRs:
Search: is:open author:app/dotnet-maestro repo:dotnet/msbuild
Search: is:open author:dotnet-bot repo:dotnet/msbuild ("OneLocBuild" OR "Localized file check-in")
For each PR, query the following data using gh api graphql. Process PRs in parallel batches for speed.
bashgh api graphql -f query=' query { repository(owner: "dotnet", name: "msbuild") { pullRequest(number: <PR_NUMBER>) { id title baseRefName headRefName mergeable reviewDecision commits(last: 1) { nodes { commit { statusCheckRollup { state } } } } reviews(last: 10) { nodes { state author { login } } } reviewThreads(first: 20) { nodes { isResolved comments(first: 1) { nodes { body author { login } } } } } files(first: 50) { nodes { path additions deletions } totalCount } } } } '
From the response, extract:
statusCheckRollup.state — SUCCESS, FAILURE, PENDING, ERROR, EXPECTED, or null. Map ERROR to failure (❌) and EXPECTED to neutral (⚪) in the dashboard.APPROVED, REVIEW_REQUIRED, CHANGES_REQUESTEDAPPROVED reviewsCHANGES_REQUESTED)totalCount for the file count; use the first 50 file paths from files.nodes for suspicious file detection| PR Category | Expected Files | Flag if... | |-------------|---------------|------------| | Dependency update (arcade) | eng/**, global.json | Any file outside eng/ or global.json | | Dependency update (roslyn/nuget/runtime) | eng/Version.Details.xml, eng/Version.Details.props | Any file outside eng/ | | Codeflow (dotnet/dotnet) | eng/Version.Details.xml | Any src/ files modified | | OneLoc | **/xlf/*.xlf, **/Resources/*.resx | Any non-localization file, or reviewers flagging reverted translations |
For each dependency update PR:
Use the GitHub GraphQL updatePullRequestBranch mutation — the exact equivalent of the "Update branch" button:
bashgh api graphql -f query=' mutation { updatePullRequestBranch(input: {pullRequestId: "<NODE_ID>"}) { pullRequest { number headRefOid } } } '
Skip for vs18.10 and newer vs branches - they don't need to increment the patch version with every dependency update anymore. Only bump for vs* branches that are older than vs18.10.
<VersionPrefix>X.Y.Z</VersionPrefix> from the target branch's eng/Versions.propsX.Y.Z → X.Y.(Z+1)bash git fetch origin <head-branch> git checkout <head-branch> # Edit eng/Versions.props: set <VersionPrefix> to X.Y.(Z+1) git add eng/Versions.props git commit -m "Bump VersionPrefix to X.Y.(Z+1)" git push origin <head-branch>
Note: The <VersionPrefix> line may be inline with <DotNetFinalVersionKind> — preserve that formatting.
Output a single dashboard with all PRs grouped by category. This is the most important output — it lets the user click through and approve/reject each PR.
Format:
## 🚦 Dependency Update PRs
| PR | Branch | CI | Review | Files | Suspicious? | Link |
|----|--------|-----|--------|-------|-------------|------|
| #13281 | main ← roslyn | ✅ SUCCESS | ✅ APPROVED (1) | 2 | ✅ Clean | https://github.com/dotnet/msbuild/pull/13281 |
| #13310 | vs17.10 ← arcade | ❌ FAILURE | 🔶 REVIEW_REQUIRED | 14 | ✅ Clean (eng/ only) | https://github.com/dotnet/msbuild/pull/13310 |
## 🔄 Codeflow PRs
| PR | Branch | CI | Review | Files | Suspicious? | Link |
|----|--------|-----|--------|-------|-------------|------|
| #13258 | vs18.3 ← dotnet/dotnet | ✅ SUCCESS | 🔶 REVIEW_REQUIRED | 1 | ✅ Clean | https://github.com/dotnet/msbuild/pull/13258 |
## 🌐 OneLoc PRs
| PR | Branch | CI | Review | Files | Suspicious? | Link |
|----|--------|-----|--------|-------|-------------|------|
| #13290 | main | ⚪ None | ⛔ CHANGES_REQUESTED | 65 | ⚠️ Reverts translations | https://github.com/dotnet/msbuild/pull/13290 |Status icons:
After the tables, add a summary: > N PRs total. M ready to merge, K need reviews, J have CI failures, L blocked.
The version is defined in eng/Versions.props:
xml<PropertyGroup> <VersionPrefix>18.3.3</VersionPrefix> </PropertyGroup>
| Branch Pattern | VersionPrefix Format | Bump Needed? | Pre-release Label | |---------------|---------------------|-------------|------------------| | main | Major.Minor.0 | No | preview | | vs* | Major.Minor.Patch | Yes (+1) | servicing or preview |
| Problem | Solution | |---------|----------| | updatePullRequestBranch fails | PR may have conflicts GitHub can't auto-resolve — fall back to local git merge | | Push rejected after version bump | Branch was updated by maestro; re-fetch and retry | | VersionPrefix has no patch component (e.g. 18.6.0 on main) | This is main — skip the bump | | OneLoc PR flagged as "reverting translations" | Do NOT merge — wait for updated translations |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 8,176 | 13,598 | +66% | 1 | 1 | 0% | 414 | 2,443 | +490% | 0 | 0 | — |
case-02 | fail→fail | 18,487 | 7,059 | -62% | 1 | 1 | 0% | 3,208 | 2,591 | -19% | 0 | 0 | — |
case-03 | fail→fail | 16,546 | 7,663 | -54% | 1 | 1 | 0% | 2,509 | 2,744 | +9% | 0 | 0 | — |
case-04 | pass→pass | 9,557 | 4,635 | -52% | 1 | 1 | 0% | 1,644 | 2,887 | +76% | 0 | 0 | — |
case-05 | pass→pass | 13,115 | 5,365 | -59% | 1 | 1 | 0% | 1,904 | 2,963 | +56% | 0 | 0 | — |
case-06 | pass→pass | 8,648 | 3,663 | -58% | 1 | 1 | 0% | 1,349 | 2,710 | +101% | 0 | 0 | — |
case-07 | pass→pass | 13,176 | 2,892 | -78% | 1 | 1 | 0% | 2,058 | 2,547 | +24% | 0 | 0 | — |
case-08 | pass→pass | 16,824 | 4,346 | -74% | 1 | 1 | 0% | 2,312 | 2,795 | +21% | 0 | 0 | — |
case-09 | pass→pass | 10,397 | 3,843 | -63% | 1 | 1 | 0% | 1,630 | 2,836 | +74% | 0 | 0 | — |
case-10 | pass→pass | 11,255 | 3,616 | -68% | 1 | 1 | 0% | 1,968 | 2,832 | +44% | 0 | 0 | — |
case-11 | pass→pass | 14,627 | 3,051 | -79% | 1 | 1 | 0% | 2,433 | 2,603 | +7% | 0 | 0 | — |
case-12 | pass→pass | 6,752 | 3,129 | -54% | 1 | 1 | 0% | 1,300 | 2,625 | +102% | 0 | 0 | — |
case-13 | pass→pass | 11,732 | 6,420 | -45% | 1 | 1 | 0% | 2,005 | 3,264 | +63% | 0 | 0 | — |
case-14 | pass→pass | 9,522 | 3,223 | -66% | 1 | 1 | 0% | 1,875 | 2,613 | +39% | 0 | 0 | — |
case-15 | pass→pass | 12,782 | 2,833 | -78% | 1 | 1 | 0% | 2,255 | 2,609 | +16% | 0 | 0 | — |
case-16 | pass→pass | 9,908 | 3,998 | -60% | 1 | 1 | 0% | 1,765 | 2,837 | +61% | 0 | 0 | — |
case-17 | pass→pass | 8,934 | 3,699 | -59% | 1 | 1 | 0% | 1,631 | 2,776 | +70% | 0 | 0 | — |
case-18 | pass→pass | 7,691 | 3,313 | -57% | 1 | 1 | 0% | 1,459 | 2,651 | +82% | 0 | 0 | — |
case-19 | pass→pass | 15,678 | 5,560 | -65% | 1 | 1 | 0% | 2,386 | 2,912 | +22% | 0 | 0 | — |
case-20 | pass→pass | 9,523 | 3,920 | -59% | 1 | 1 | 0% | 1,186 | 2,643 | +123% | 0 | 0 | — |
case-21 | fail→fail | 22,747 | 6,819 | -70% | 1 | 1 | 0% | 3,571 | 2,474 | -31% | 0 | 0 | — |
case-22 | fail→fail | 16,281 | 8,501 | -48% | 1 | 1 | 0% | 2,360 | 2,582 | +9% | 0 | 0 | — |
case-23 | fail→fail | 8,793 | 3,849 | -56% | 1 | 1 | 0% | 1,552 | 2,706 | +74% | 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. 23 cases were attempted, and 18 counted toward the lift figure. The other 5 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 -100 percentage points is the difference between those two pass rates over the 18 comparable cases. 2 cases got worse with the skill loaded, and they are included in that figure.
Other measured skills in the registry, with their headline benchmark lift.