Skip to content

Dependency upgrades have no release valve: majors and grouped PRs wait on review that does not scale #120

Description

@twistedmelonman

The problem

Auto-merge policy today is binary: patch/minor auto-merge, majors and grouped PRs go to manual review. The safety half is right. The review half does not scale — Andrew cannot review each one, and they cannot wait indefinitely, so they accumulate.

"I can't review each one and they can't wait indefinitely. ideally we should have a standard 'accept after a week' system." — 2026-09-10

There is no third state between "merge immediately" and "wait for a human who may never get to it."

Measured state, 2026-09-10

20 open Dependabot PRs fleet-wide. Ages run to 12 days. Of those checked:

State Count Meaning
CLEAN, checks green 3 Mergeable now; waiting only on attention
BEHIND 3 Need a branch update, otherwise fine
RED on own content 2 Genuinely need work (kebab-tax-netlify#280, cleanroom#13)
RED on an unrelated repo-wide failure 5 Blocked by someone else's problem

The cost is concrete, not hypothetical

All five red amelia-boone PRs (#67, #72, #73, #74, #75) were red because of the repo's audit gate failing on advisories unrelated to those PRs — issue #79, red since 2026-08-30. Verified directly: #72's CI failure is FAIL: advisories not in the accepted baseline: GHSA-px8p-9vwx-vf98 fflate, which has nothing to do with the minor-and-patch group it bumps.

So one unfixed red gate held five unrelated dependency PRs hostage for days, and nothing surfaced that. Four of the five should go green once #80 merges.

This is the compounding failure mode: a stalled queue hides which PRs are actually broken, because everything is red for the same borrowed reason.

What exists today

github-workflows/.github/workflows/dependabot-auto-merge.yml already does the hard correctness work and should be built on, not replaced:

  • computes patch-vs-major from previous/new version itself rather than trusting steps.metadata.outputs.update-type (which mislabels reusable-workflow majors as patch)
  • forces any multi-dependency group PR through the namespace-allowlist path, so a major cannot ride along inside a group that looks like a patch
  • keeps a trusted-namespace allowlist for major bumps

The missing piece is purely the time dimension. Every decision is made at PR-open time and never revisited.

Proposed direction (needs design, not adoption as written)

A soak-then-accept tier between auto-merge and indefinite wait:

  • Patch/minor — unchanged, auto-merge immediately.
  • Majors and groups — become eligible for auto-merge after a soak of N days (a week, per the ask) provided CI has been continuously green for that window and the PR has not been touched.
  • Never soak-merge — anything whose checks are red, anything in a repo whose default branch is red (avoids merging into a broken baseline), and any PR a human has explicitly marked hold.
  • Escape hatch — a label that either forces the wait or skips it.

Open questions for the design pass:

  1. Where does the timer live? A scheduled workflow that re-evaluates open Dependabot PRs is the obvious shape, since the existing workflow is pull_request-triggered and cannot observe elapsed time.
  2. Does the soak clock reset when Dependabot force-pushes a rebase? It should, or the soak proves nothing about the code that actually merges.
  3. How does "CI green for the whole window" get verified rather than "CI green right now"? The latter is trivially satisfiable by a single passing run and would not catch a flaky or intermittently red PR.
  4. Should a repo with a red default branch block soak-merges into it? Argues yes, per the amelia-boone case above.
  5. Does this interact with the merge-lock? These would merge without a human-typed lock by construction, which is a deliberate policy decision and should be recorded as one rather than emerge as a side effect.

Why this is worth doing now

The queue is at 20 and the oldest is 12 days. The failure is not that a bad upgrade might land — the existing workflow guards that well. It is that good upgrades do not land, security patches included, and a permanently-stalled queue trains everyone to ignore it. amelia-boone#79 sat red for 11 days on a check that was not a required context; nobody noticed because there was always something red.

Related: #75 (branch protection consistency), the amelia-boone#54 astro major that has been waiting on exactly this kind of decision.

https://claude.ai/code/session_01ESsw699T54JHARkQXrdL3o

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions