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.
72
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
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:
Dependency updates + Codeflow:
Search: is:open author:app/dotnet-maestro repo:dotnet/msbuildOneLoc localization:
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.
gh 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:
gh 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)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:
<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 |
c88db8e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.