A dependency bot can open more pull requests than a team can thoughtfully review. That is useful only if the team has decided what those pull requests mean. Otherwise, automation replaces an occasional maintenance task with a permanent inbox, and eventually someone proposes merging anything with a green checkmark just to make the queue disappear.
The better question is which changes your engineering system can verify and recover from without a fresh investigation every time. Automate the work you understand. Preserve deliberate review where compatibility, production behavior, or recovery still depends on judgment.
Start by separating two decisions: may the bot prepare an update, and may the system merge it? Broad PR generation can be sensible even when merge permission remains narrow. Keeping those permissions separate lets you improve visibility without pretending every update is routine.
Draw the boundary around behavior
“Automatically update patch releases” sounds like a policy, but a version number is an input to risk assessment, not the assessment itself. A patch to a formatter and a patch to an authentication library are different changes. A minor build-tool update can affect every artifact your organization produces. A major update to a test helper might have a small, well-observed impact.
For each dependency family, write down what it can change. Think beyond whether application code imports it:
- Runtime libraries can alter request processing, serialization, authentication, persistence, and network behavior.
- Build dependencies can change generated code, bundled assets, compiler output, and packaging.
- Test dependencies can change which failures you detect and which results you believe.
- Documentation tools can affect a public site or internal instructions even when they never ship inside an application.
The package manager's development classification helps organize work. It does not prove low risk. A plugin that runs during installation or a compiler used to produce a release participates in your supply chain regardless of where its name appears in a manifest.
The boundaries in Designing Guardrails for AI-Generated Pull Requests apply here too: automation needs a defined scope and trustworthy evidence. The author being a bot does not make the diff self-validating.
Use a risk matrix, then name the exceptions
This is a starting policy for a hypothetical service team, not a universal recommendation. Adjust it to the behavior your tests actually cover.
On a narrow screen, scroll the matrix horizontally to compare the evidence, merge boundary, and recovery owner.
| Dependency and change | Evidence required | Merge boundary | Recovery and owner |
|---|---|---|---|
| Reviewed formatter allowlist, patch update | Clean formatting check; no unexpected source rewrite | Candidate for auto-merge after policy checks | Developer tooling owner; revert lockfile and manifest |
| Test runner, patch or minor | Representative tests still execute; reports and discovery remain correct | Human review until detection behavior is understood | Test infrastructure owner; restore previous test environment |
| Ordinary runtime library, patch | Contract tests for its used API; release notes; deploy observation | Human review by default | Service owner; redeploy known-good artifact |
| Authentication or database client, any version | Critical-path integration tests; compatibility and security review | Explicit owner review | Domain owner; validate rollback against external state |
| Compiler, bundler, native extension, patch or minor | Production build; representative artifact checks | Build owner review | Build owner; retain known-good artifacts and toolchain |
| Major update or migration | Migration plan; compatibility tests; staged release | Planned engineering work | Named project owner; tested recovery or forward-fix path |
An auto-merge candidate needs an owner just as much as a reviewed update. Someone must own the allowlist, notice a broken assumption, and remove permission when an update causes trouble. “The platform team handles dependencies” is insufficient if nobody knows which team owns the application contract.
Use narrow exceptions rather than broad labels. An allowlist of known tools with meaningful verification is easier to defend than “all dev dependencies.” If a dependency changes behavior outside the tests, keep PR generation enabled and require a person to review it.
A small Dependabot example
For an npm project at the repository root, this configuration prepares weekly updates and groups selected development-tool patch and minor releases. It belongs in .github/dependabot.yml in the example reader's repository; it is not a change to this site's automation.
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
open-pull-requests-limit: 5
groups:
formatting-tools:
applies-to: "version-updates"
dependency-type: "development"
patterns:
- "prettier"
- "@prettier/*"
update-types:
- "patch"
- "minor"
The keys and values follow GitHub's Dependabot options reference. The group applies to matching development dependencies and selected version levels. Updates outside the group can still arrive separately, including majors. Group membership does not authorize merging. The open-PR limit applies to version updates, not security-update PRs.
Here, grouping is an inbox decision. It is not permission to auto-merge minor releases; the hypothetical policy above remains narrower. A team could review the grouped PR manually while its formatter patch policy is still being proven.
GitHub auto-merge is a separate repository/PR capability that waits for required reviews and checks. Enabling it must follow your merge policy; this YAML does not enable it.
Keep security remediation explicitly owned and time-sensitive. A weekly version-update schedule is not your vulnerability-response process. Do not silence migration PRs merely because they need human planning: assign them, record the required work, and keep the maintenance obligation visible.
A green check must answer the right question
Before widening merge permissions, take a dependency that changed recently and ask what would have caught a plausible regression. If the answer is “the unit tests probably would,” you have more work to do.
For a JSON library, exercise the payload variants your service actually reads and writes. For a database client, exercise connection handling and transactions against the supported database version. For a build tool, inspect the output that will be deployed rather than treating a successful process exit as sufficient proof.
Check that required jobs run for bot PRs under the repository's permission model. A skipped integration job is not evidence. Do not grant broad secrets to untrusted code just to make the dashboard green; use the supported safe test path and retain human review when necessary.
Then make the verification reproducible. Making Local CI Commands Boring Enough for Humans and AI Agents describes the value of one understandable verification interface. A reviewer should be able to identify what ran, what it covered, and what remains unknown.
Avoid making the bot's queue depend on endlessly retried checks. If an update passes only after unexplained reruns, resolve the uncertainty before merging. A CI Retry Needs a Failure Policy provides the companion policy for that situation.
Group around diagnosis, not convenience
One hundred tiny PRs can consume a team's attention. One enormous PR can hide the dependency that broke production. Neither extreme is efficient.
Group packages when they are intentionally released together or when their combined verification and recovery remain understandable. Keep unrelated critical libraries separate. If a group fails, the reviewer should have a reasonable way to isolate the culprit without turning maintenance into archaeology.
Review the resolved lockfile as well as the manifest. A single direct update can change transitive dependencies, and the visible package name might not be the source of a behavioral difference. A small group that unexpectedly rewrites a large part of the dependency graph deserves another look.
Queue size should reflect review capacity. When maintenance PRs accumulate, identify whether the bottleneck is missing ownership, inadequate tests, incompatible releases, or too much grouping. Raising a limit does not fix those problems.
Recovery includes the released artifact
Reverting a commit is a useful source-control action. It is not automatically a production rollback.
If the update affected generated assets, retain the previous artifact. If it changed data written to an external system, confirm that the older application can read that data. If an install resolves dependencies differently next week, rebuilding an old commit may not reproduce the deployment you intend to restore.
A practical update policy therefore names the release unit, the health signal, and the person who can stop the rollout. For a low-risk tool, that may be a simple revert and rerun. For a runtime migration, it may require a staged deployment and a forward fix rather than an immediate downgrade. Spell out that difference before granting merge permission.
Expand automation with evidence
Start with automatic PR preparation and one narrow candidate class for automatic merging. Observe whether changes receive meaningful verification, whether failures are understandable, and whether owners respond. Record regressions and restore manual review for the affected class when an assumption fails.
The goal is dependable maintenance with less repetitive human work. It is not the largest possible auto-merge percentage. A good system makes ordinary updates boring and consequential updates visible. Automate where you can explain the proof, name the owner, and execute the recovery.
More at Slaptijack.