Skip to content

ci: consolidate dependency automation on Renovate - #631

Merged
unional merged 2 commits into
mainfrom
chore/dependency-automation
Sep 1, 2026
Merged

ci: consolidate dependency automation on Renovate#631
unional merged 2 commits into
mainfrom
chore/dependency-automation

Conversation

@unional

@unional unional commented Sep 1, 2026

Copy link
Copy Markdown
Collaborator

19 dependency PRs were open, the oldest from February 2025. This is not a backlog anyone neglected — the automation was structurally incapable of merging any of them, for three independent reasons, none of which produces a visible failure anywhere.

Why nothing merged

# Mechanism Fault
1 .github/mergify.yml (extends unional/.github) every rule ends in merge: { method: rebase }. This repo has allow_rebase_merge: false — merge commits only. Mergify asks for a method the repo refuses and the PR sits CLEAN forever.
2 the same file's Renovate rule gates on label=safe-update. Nothing applies that label: .github/renovate.json extended github>unional/renovate-preset, which is two lines (config:base + :preserveSemverRanges) and sets no labels.
3 .github/workflows/automerge-dependabot.yml gh pr merge --auto --rebase — fails for reason 1 too.

Reasons 1 and 2 are independent: fixing either alone still merges nothing.

One updater, one merge mechanism

Renovate, with GitHub-native auto-merge. platformAutomerge: true arms GitHub's own auto-merge, which feeds the merge queue instead of bypassing it the way a bot's own merge action does.

.github/renovate.json now carries the config directly rather than extending the two-line preset:

  • minor / patch / pin / digest, and all devDependency updates → automerge.
  • majors of anything a consumer resolves → manual, under a major- branch prefix.
  • minimumReleaseAge: "3 days" mirrors the 24h npm soak in .npmrc at the PR level, so Renovate does not open a PR for a package that just landed. vulnerabilityAlerts drops that to 1 day and automerges.
  • ignorePaths adds old/**. Renovate had been filing PRs against old/checker, which is not a pnpm workspace member, is not installed, and is now private. chore(deps): update dependency @types/jest to v30 #560 (@types/jest v30) was one of those.
  • ts-5.4 / ts-5.5 disabled. They are npm aliases pinning those exact TypeScript minors so test:type proves the emitted declarations still compile on the oldest supported compilers. Bumping them to ~5.9.0 deletes the matrix. chore(deps): update dependency ts-5.4 to ~5.9.0 #530 and chore(deps): update dependency ts-5.5 to ~5.9.0 #531 had been asking to do precisely that since February 2025.

.github/mergify.yml and the Dependabot automerge workflow are deleted. Dependabot's version updates are retired in favour of Renovate — the two were filing the same bump twice (#624 and #625 are both vitest 4.1.0).

Incidental fix

@size-limit/esbuild-why had been automerged to ^12.0.0 while size-limit and @size-limit/preset-small-lib stayed on ^11.1.5 — a plugin a full major ahead of the host it plugs into. All three now on ^13.0.3.

Release impact

None. No changeset. Nothing here reaches the published artifact: CI config, lint-time tooling, and a devDependency.

pnpm verify green locally: 7/7 turbo tasks, including size on size-limit 13.

Nineteen dependency PRs were open, the oldest from February 2025. The cause
was not neglect; the automation was structurally incapable of merging any of
them, for three independent reasons.

1. `.github/mergify.yml` extends `unional/.github`, whose rules all end in
   `merge: { method: rebase }`. This repo has `allow_rebase_merge: false`
   (merge commits only). Mergify asks for a merge method the repo refuses,
   and the PR just sits `CLEAN` forever.

2. Even had rebase been allowed, the Renovate rule there gates on
   `label=safe-update`. Nothing applies that label: this repo's Renovate
   config extended `github>unional/renovate-preset`, which is two lines
   (`config:base` + `:preserveSemverRanges`) and sets no labels at all.

3. `.github/workflows/automerge-dependabot.yml` runs
   `gh pr merge --auto --rebase`, which fails for reason 1 as well.

So: one updater, one merge mechanism, both native.

- `.github/renovate.json` now carries the full config instead of extending a
  two-line preset. `platformAutomerge: true` uses GitHub's own auto-merge,
  which feeds the merge queue rather than bypassing it. Minor/patch/pin/digest
  and all devDependency updates automerge; majors of anything a consumer
  resolves stay manual under a `major-` branch prefix.
- `minimumReleaseAge: "3 days"` mirrors the 24h npm soak in `.npmrc` at the
  PR level, so Renovate does not even open a PR for a package that just
  landed. `vulnerabilityAlerts` drops that to 1 day and automerges.
- `ignorePaths` adds `old/**`. Renovate was filing PRs against
  `old/checker`, which is not a pnpm workspace member, is not installed, and
  is now `private`. PR #560 (`@types/jest` v30) was one of those.
- `ts-5.4` and `ts-5.5` are disabled. They are npm aliases pinning those
  exact TypeScript minors so `test:type` proves the emitted declarations
  still compile on the oldest supported compilers. Bumping them to 5.9
  deletes the matrix. PRs #530 and #531 had been asking to do exactly that
  since February 2025.
- Deleted `.github/mergify.yml` and the Dependabot automerge workflow.

Also aligns the size-limit packages. `@size-limit/esbuild-why` had been
automerged to `^12.0.0` while `size-limit` and `@size-limit/preset-small-lib`
stayed on `^11.1.5` — a plugin a major ahead of the host it plugs into. All
three now on `^13.0.3`.

No changeset: nothing here reaches the published artifact.

`pnpm verify` green: 7/7 turbo tasks.
@changeset-bot

changeset-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown

⚠️ No Changeset found

Latest commit: c616f76

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Click here to learn what changesets are, and how to add one.

Click here if you're a maintainer who wants to add a changeset to this PR

@mergify

mergify Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Tick the box to add this pull request to the merge queue (same as @mergifyio queue).

  • Queue this pull request

@codecov

codecov Bot commented Sep 1, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (ddc2621) to head (c616f76).

Additional details and impacted files
@@            Coverage Diff            @@
##              main      #631   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files           53        53           
  Lines          279       279           
  Branches        51        51           
=========================================
  Hits           279       279           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@unional
unional merged commit a2d0323 into main Sep 1, 2026
10 checks passed
@unional
unional deleted the chore/dependency-automation branch September 1, 2026 16:39
unional added a commit that referenced this pull request Sep 1, 2026
Consolidates four Renovate PRs that could not merge themselves. The
automation fault behind that is fixed in #631; these are just the
updates that were sitting behind it.

| dep | from | to | supersedes |
| --- | --- | --- | --- |
| `packageManager` pnpm | 11.1.3 | 11.25.0 | #616 |
| `@commitlint/cli` + `@commitlint/config-conventional` | `^20.0.0` |
`^21.0.0` | #620 |
| `turbo` | 2.9.14 | 2.10.12 | #633 |
| `actions/checkout` in `codeql-analysis.yml` | v6 | v7 | #634 |

## The one major worth reading about

**commitlint 21.0.0.** Its entire breaking change is `chore!: minimum
node version v22` — engines bumped to `>=22` across all 39 of its
packages, dropping Node 18 and 20. Everything after that in the 20 ->
21.2.2 range is a feature or a fix (`--default-config` flag, pure-ESM
preset resolution, a `--from`/`--to` guard). CI runs `lts/*` and
`lts/-1`, both comfortably above 22, and commitlint is a dev-only tool
that never reaches a consumer.

The other three are a pnpm minor, a turbo minor, and an action major
that is a checkout bump.

## Hooks verified, not assumed

A commitlint bump is exactly the kind of change that can silently stop
enforcing anything, so it was checked rather than trusted:

```
$ echo "bad message" | pnpm exec commitlint          -> exit 1  (type-empty)
$ echo "fix: a good message" | pnpm exec commitlint  -> exit 0
$ git ls-files -s .husky/commit-msg                  -> 100755
```

The executable bit matters — committed `100644` means git skips the hook
entirely and commitlint never runs. It is correct here.

## Verification

- `pnpm verify` green: **7/7 turbo tasks** on pnpm 11.25.0 and turbo
2.10.12.
- `pnpm install --frozen-lockfile` clean against the committed lockfile.

**No changeset** — none of this reaches the published artifact.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant