Git & GitHubLesson
Dependabot grouping
Left to its defaults, Dependabot opens one pull request for every dependency that has a newer version. Terrarium groups updates instead: its minor and patch npm updates share one group while a major npm update still arrives alone, and its GitHub Actions updates of every size share another.
Know Dependabot groups already? Skip to In Terrarium.
Outside the box · General
The concept
Dependabot version updates are configured in .github/dependabot.yml. The file has version: 2 and a list of updates. Each entry names one package in package-ecosystem, with the directory or directories that hold its manifests, and a schedule.interval for how often to look.
By default each outdated dependency gets its own pull request. A groups entry names a rule, and every update that matches it is combined into a single pull request. patterns match dependency names, with * as a wildcard, and update-types limits a group to major, minor or patch releases. An update that matches several rules goes into the first; one that matches none still gets its own pull request.
cooldown delays version updates: a new release isn't considered until it is a set number of days old. A 3-day cooldown applies even when cooldown isn't set, and default-days changes it. It applies to version updates only, never to security updates.
Full referenceGitHub Docs: Dependabot options reference
In Terrarium
In .github/dependabot.yml, the npm entry has one group:
12 groups:
13 npm-minor-patch:
14 update-types: [minor, patch]
It takes every minor and patch update. A major update matches no rule and arrives as a pull request of its own. The Actions entry groups by name instead:
17 - package-ecosystem: github-actions
18 directories: [/, /.github/actions/gate]
19 schedule:
20 interval: weekly
21 cooldown:
22 default-days: 3
23 groups:
24 github-actions:
25 patterns: ["*"]
patterns: ["*"] takes every update, whatever its size. For Actions, / reads only .github/workflows/ and a root action.yml; the second directory adds .github/actions/gate, where the 's composite action lives (Composite actions). Each entry sets default-days: 3, which restates the default cooldown.
A runs the dependabot-sweep (.agents/skills/dependabot-sweep/SKILL.md), which reviews each Dependabot pull request: it turns a major update into an issue, and lands an npm minor or patch pull request only when its checks are green, no release notes show a breaking or deprecation change that affects Terrarium, it adds no direct dependency and no bumped package is 0.x. It lands one with scripts/github/merge-pr.ts, whose dependabotBumpRefusal applies the Dependabot exception in ADR-0004 (docs/adr/0004-objective-safety-gate.md). For an Actions pull request, the sweep posts its verdict and a person merges it. merge-pr.ts never checks a Dependabot pull request against the list, and .github/dependabot.yml isn't on that list.
Why it's built this way
- Groups follow the merge line. ADR-0004 (docs/adr/0004-objective-safety-gate.md) lets an agent merge a minor or patch npm bump but keeps a major for a person. So the npm group holds only minor and patch updates, the set an agent may land, and each major arrives alone. The cost: a group merges or waits as one, so one unsafe bump holds back the rest. .github/dependabot.yml.
- Actions updates wait for a person. A Dependabot pull request for Actions edits workflow and action files, and
merge-pr.tsrefuses a Dependabot pull request that changes any file other thanpackage.jsonandpnpm-lock.yaml, so the sweep can't land it. The cost: even an Actions patch waits for someone. .agents/skills/dependabot-sweep/SKILL.md.
What to watch for
- A group is a pull request, not a review. One grouped pull request can hold many updates; read every bumped package's release notes before you merge it.
/doesn't reach a nested action. For thegithub-actionsecosystem, list every folder that holds anaction.ymlunderdirectories.
Try it in your project
Add one groups entry with update-types: [minor, patch] to the npm entry of your dependabot.yml, and compare the pull requests of the next check with the last one.
Where next
- LessonMerge gate
- LessonPull requests
- LessonAuthor trust
- LessonProtected paths
- LessonComposite actions
Last updated · Latest source on GitHub ↗