Glass Box Terrarium, explained from the inside

Last updated · Latest source on GitHub ↗

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

Looking inside

In Terrarium

In .github/dependabot.yml, the npm entry has one group:

.github/dependabot.yml ↗12–14as of
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:

.github/dependabot.yml ↗17–25as of
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.ts refuses a Dependabot pull request that changes any file other than package.json and pnpm-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 the github-actions ecosystem, list every folder that holds an action.yml under directories.

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

Last updated · Latest source on GitHub ↗

Something went wrong

This content couldn’t be loaded. Reloading the page usually fixes it.

Technical details
route: /t/glassbox/guide/git-github/dependabot-grouping