Add dependabot-consolidation skill - #1060
Merged
jasonleenaylor merged 8 commits intoAug 14, 2026
Merged
Conversation
Adds a skill that combines several open Dependabot pull requests into one branch and one pull request. It enumerates the open Dependabot PRs, cherry-picks them onto fresh main in a dedicated worktree, trims the commit bodies so they satisfy the commit-message guidelines, verifies locally, then pushes and opens the combined PR behind three confirmation gates. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Dependabot cannot tell a dependency from a deliberate pin. The skill now reads the comment block above every changed package version line and stops when it names a version, explains why the current one was chosen, or gives a retest procedure. It also separates the two outcomes: drop the bump when a comment forbids it, or refresh the comment when it merely names the old version. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1060 +/- ##
=======================================
Coverage 38.04% 38.04%
=======================================
Files 1499 1499
Lines 350117 350108 -9
Branches 40233 40231 -2
=======================================
+ Hits 133196 133204 +8
+ Misses 187634 187619 -15
+ Partials 29287 29285 -2 🚀 New features to boost your workflow:
|
NUnit Tests 1 files ±0 1 suites ±0 11m 39s ⏱️ +11s Results for commit da83958. ± Comparison against base commit 1674067. This pull request removes 10 and adds 9 tests. Note that renamed tests count towards both.♻️ This comment has been updated with latest results. |
Adds two package-manifest checks the pin guard did not cover: a version property must not be rewritten into a literal, since a third of the root entries resolve through Build/SilVersions.props, and the Build/Src Include/Update layering over the root file must survive a bump. Notes NativeBuild.csproj as the only project that opts out of central package management. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The guard stopped on any comment mentioning a version, which over-triggers: most pin comments cite a floor, and NuGet floors cannot be violated by bumping up. The skill now resolves the depending package's nuspec, reads whether the range is a floor or a bracketed exact/capped range, and only treats the bracketed kind as blocking. This splits pins into constraint-driven, which the package graph can settle, and empirically-driven, which no manifest expresses and which therefore need a dependabot ignore entry. Also covers the case where the external package is bumped in the same batch, moving the floors the comments quote. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
PR #984 proposed the DependencyModel version documented as breaking ICU initialization and its build-and-test job passed, so CI cannot detect this class of failure at all. The guard said a green CI was insufficient because of the category filter; the stronger and correct statement is that a green CI is not evidence either way. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A retest procedure written into a comment is not self-validating. Running the DependencyModel procedure against 9.0.17, the version it was written to catch, produced zero Icu.NativeMethods hits, so a pass on a newer version proves nothing. The guard now requires running the procedure against the known-bad version first, and warns that flaky failures can look like signal. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Restoring the PR #1000 tree with its own SIL.LCModel and LibPalaso versions and forcing DependencyModel to 9.0.17 still produces zero Icu.NativeMethods hits, so the failure is unreproducible rather than hidden by newer packages. States the rule that an unreproducible justification keeps a pin and stops bumps against it, rather than clearing it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
johnml1135
approved these changes
Aug 14, 2026
Halves the skill to its decision rules: drops the wrong-tool section and compresses the investigation narratives into the rules they produced. Adds an anticipate-only Paratext section: a watchlist of packages whose bumps can affect the merged lexicon plugin that Paratext loads into its own process, an AssemblyRef diff of the merged plugin between base and branch builds, and instructions to hand any contract change to the user as deliberate follow-up work rather than fixing it mid-run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
jasonleenaylor
deleted the
claude/dependabot-consolidation-skill-f98aba
branch
August 14, 2026 21:26
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Quick Summary
Adds
.claude/skills/dependabot-consolidation/SKILL.md, a skill that combinesseveral open Dependabot pull requests into one branch and one pull request.
Dependabot opens a PR per ecosystem group, and each one triggers a full
Build Debug and run testscycle. This month that was three PRs for fifteendependency bumps. The skill folds them into a single reviewable PR that costs
one CI cycle.
It also fixes a problem that has nothing to do with volume: Dependabot PRs in
this repository cannot go green.
CI.ymlpassessecrets.CODECOV_TOKENtothe coverage upload, Dependabot-triggered PRs do not receive repository
secrets, and
Verify Codecov upload succeededfails even when every testpasses. A combined PR runs from a repository-owned branch and can actually
report green.
What it does
app/dependabot, reads their committrailers to count dependencies and flag major bumps, and presents a plan.
.claude/worktrees/and branches offfresh
origin/main, so stale Dependabot branches are rebased byconstruction.
the original author date.
.github/commit-guidelines.md. Dependabot'smarkdown link lines exceed the 80-column body limit and fail the
Check commit messagesjob. Bodies that are already compliant are leftbyte-identical.
stops rather than silently reverting a deliberate pin (see below).
git log --check, the commit-message rules, andbuild.ps1 -BuildTestswhen the batch touches package manifests.once it is green.
Three confirmation gates: the plan, the push, and the closes. A cherry-pick
conflict aborts the whole run and reports the retry command. A red CI reports
and stops without closing anything.
The pin guard
Dependabot cannot tell a dependency from a pin.
Directory.Packages.propshasa
Transitive Pinsblock whose entries exist specifically to hold a version,each documented by a comment, and Dependabot bumps them and leaves the comment
behind saying the opposite.
This was not hypothetical during validation. #1059 initially carried a bump of
Microsoft.Extensions.DependencyModelfrom 9.0.16 to 9.0.18, reverting a pinthat #1000 established after reproducing a
TypeInitializationExceptiononIcu.NativeMethodsin the .NET Framework test host — and CI went green anyway,because the documented retest procedure requires a full
test.ps1whileCI.ymlruns withTestCategory!=LongRunning&TestCategory!=ByHand&....The skill now reads the comment block above every changed version line and
stops when it names a version, explains why the current one was chosen, or
gives a retest procedure. It distinguishes a comment that forbids the bump
(drop that line, keep the rest of the batch) from one that merely names the
old version (take the bump, refresh the comment).
Two further checks cover central package management structure that Dependabot
does not model:
read
Version="$(SilLcmVersion)"orVersion="$(SilLibPalasoVersion)", withthe value in
Build/SilVersions.props. Literalizing one silently breaks thesingle source of truth for every package sharing it.
Build/Src/Directory.Packages.propsimports the root and layers
Includefor build-only packages andUpdatetooverride a root pin, so a package can be declared twice with different
versions on purpose —
Microsoft.Extensions.DependencyModelis 9.0.16 at theroot and 2.1.0 in Build/Src. Bumping one site and not the other widens a
deliberate split.
Verified on this batch: no
.csprojdeclares a version for any pinned package(
NativeBuild.csprojis the only central-package-management opt-out, and itsentries are property-driven), the
Include/Updateinvariant holds, and noproperty reference was rewritten.
Scope
The skill only combines pull requests that already exist. If the goal is fewer
PRs each month, the fix is the
groups:blocks in.github/dependabot.yml,and the skill says so rather than pretending to solve it.
Validation
Executed end to end against the three real Dependabot PRs that were open,
producing #1059:
main, no conflicts, authorship and datespreserved.
build.ps1 -BuildTestswith seeded native artifacts: 0 warnings, 0 errors.project.assets.jsonthat the bumped SIL versions were theones that actually restored, rather than local dev packages shadowing them.
Build Debug and run testsandCheck commit messages— the two jobs that fail on the source PRs.evidence here: a green CI that was nonetheless wrong.
The conflict/abort path is the one branch not exercised, since none of the
three PRs conflicted.
Notes for reviewers
Documentation only; no product code changes and nothing in
Src/**.Two follow-ups this surfaced, both out of scope here:
Microsoft.Extensions.DependencyModelwill be proposed again every monthuntil it is added to the
ignore:block in.github/dependabot.yml.Docs/workflows/pull-request-workflow.mdlistsfeature/,bugfix/,hotfix/, anddocs/branch prefixes but notchore/, which is in live useon the remote and is what this skill generates.
🤖 Generated with Claude Code
This change is