dependency-update
Review, fix or land dependency updates (Renovate pull requests, the Bun catalog, the Expo SDK, images, actions, Helm charts, OpenTofu providers). Use when a Renovate PR fails CI, the user wants to upg
SKILL.md.claude/skills/dependency-update/SKILL.md
GitHubDependency updates
Renovate runs in this repository's Actions (.github/workflows/renovate.yml, daily;
config in renovate.json5), as the GitHub App, so its pull requests run CI. It
schedules updates before 6am UTC on Mondays and waits until a release is 3 days old.
Everything is pinned: npm and Python packages with their lockfiles, images, actions by
digest, Helm charts, OpenTofu providers, and versions marked with a # renovate: comment.
Reviewing a Renovate pull request
- Read the release notes in its description; majors need the changelog's migration steps.
- Check out the branch and run what CI runs:
bun install,bun run lint,bun run check-types,bun run test;bun run test:integrationfor database, queue, auth or HTTP libraries. - Fix breakages at the cause in the same pull request (principle 1): no pinning back,
no
@ts-ignore.
Special cases
- Bun catalog. Versions shared across workspaces live once in the root
package.jsonworkspaces.catalog; packages say"catalog:". Renovate bumps the catalog entry and runsbun installto refreshbun.lock. By hand: edit the catalog entry, thenbun install. Never give one workspace its own version of a catalog package. - Expo SDK.
expo,expo-*,@expo/*,react-native*,react,react-domand their types are one group: the SDK decides the React Native and React versions. On that branch runbunx expo install --fixinsideapps/mobile(the one tool that must run from its project folder), thenbun run --cwd apps/mobile doctor(expo-doctor). React is in the catalog, so web moves with it: ifexpo installwrites a version over a"catalog:"entry inapps/mobile/package.json, put that version in the root catalog and restore"catalog:". - Playwright.
@playwright/test,playwrightand the rootplaywright-coreare one group, and Renovate reinstalls Playwright's skills in.claude/skillsfrom the new version on that branch. By hand: run the commandsscripts/playwright.test.tsprints when they don't match. - kind. Its PR notes say it: update
SHA256in.github/workflows/kind.ymlto the release'skind-linux-amd64.sha256sumbefore merging. - Postgres majors are disabled: a major needs a dump and restore or pg_upgrade, never a tag bump.
- Playwright.
@playwright/test,playwright,playwright-coreand themcr.microsoft.com/playwrightimage the visual tests run in are one group, since the screenshot baselines depend on the exact browser build. The image's tag (inpackages/ui/package.jsonandscripts/docker-clean.ts) must match the packages' version, whichscripts/pins.test.tschecks. If the image isn't published yet when the packages are, wait for it rather than splitting the group. Runbun run --cwd packages/ui test:visualon the branch; a browser change can move pixels, and thentest:visual:updateand a look at the new screenshots. - Renovate's own config.
bun run lint:renovatevalidatesrenovate.json5in strict mode with the Renovate versionrenovate.ymlpins; the lint job and the pre-commit hook run it. After raisingrenovate-version, run it and fix any setting the new version wants migrated. - Images in
deploy/and the charts:bun run charts:checkrenders and validates them. OpenTofu providers:bun run infra:check. - Python (
apps/ai/uv.lock): Renovate updates the lockfile; locallybun run lint,bun run check-typesandbun run testcover apps/ai too.
Overrides and patches
The root package.json forces a few transitive versions (overrides) and patches one
package (patchedDependencies), each to fix a known vulnerability that its parent pins
exactly. Every entry has a row here, which scripts/overrides.test.ts checks, and the
test fails once a row's "review by" date has passed, as osv-scanner.toml's ignores
expire. When the "drop when" holds, remove the entry and its row, run bun install,
and check that the Security workflow's OSV scan still passes; otherwise move the date
on.
| Package | Pinned to | Why | Drop when | Review by |
|---|---|---|---|---|
mysql2 |
3.23.1 | A credential leak and a decompression bomb in the version the Prisma CLI pins; the migrate image ships it. | Prisma requires 3.23.1 or later. | 2027-03-31 |
deepmerge-ts |
8.0.0 | An advisory in the version @prisma/config pins; the migrate image ships it. |
@prisma/config requires 8.0.0 or later. |
2027-03-31 |
js-yaml |
4.3.2 | An advisory in the version @hey-api/json-schema-ref-parser pins (code generation). |
@hey-api/openapi-ts depends on js-yaml 4.3.2 or later. |
2027-03-31 |
uuid |
11.1.1 | An advisory in the version xcode asks for (Expo's native project tooling, its only user). |
xcode, through @expo/config-plugins, allows uuid 11.1.1 or later. |
2027-03-31 |
next |
the catalog's version | A critical advisory in 16.3.3, which @react-email/ui (the email preview server) pins exactly; the override gives it the web app's Next, which has the fix. |
@react-email/ui depends on a fixed Next. |
2027-01-05 |
decode-uri-component |
patched 0.2.2 | Its fix, 0.5.0, is ESM-only and query-string 7 (Expo Router) requires it, so the patch backports 0.5.0's linear-time decoder instead. osv-scanner.toml ignores the advisory until the entry expires. |
Expo Router moves off query-string 7: drop the patch and the ignore together. | 2027-03-31 |
After merging, the deploy skill covers the rollout to staging.