Managing Renovate PRs¶
A practical guide for reviewing, merging, and troubleshooting the dependency update PRs that Renovate creates each Wednesday.
For background on tiering and policies, see Automatic updates.
How Renovate PRs arrive¶
Renovate runs on a Wednesday schedule and opens PRs against main.
After every merge to main it also re-evaluates open PRs — rebasing
them or regenerating lock files as needed. This is normal and expected.
Vulnerability alert PRs bypass the schedule and appear immediately.
Tier 1 and Tier 2 alerts target clinical-live as hotfix/sec-*
branches; Tier 3 alerts target main.
Triage workflow¶
1. Check CI status¶
Every Renovate PR runs through the same branch CI pipeline as feature work. Start by filtering the PR list:
- CI passing → safe to review and merge
- CI failing → investigate before merging (see Troubleshooting below)
2. Identify the tier¶
| Label | Tier | Merge policy |
|---|---|---|
tier-1-clinical |
Tier 1 — Clinical | Never automerge. Safety review required. |
| (no tier label) + infrastructure package | Tier 2 — Infrastructure | No automerge. Code review required. |
devDependency / @types/* / GitHub Actions / pre-commit |
Tier 3 — Tooling | Automerge on CI pass. Merge manually if automerge is not enabled. |
major-version-bump |
Any tier | Extra caution — check changelogs for breaking changes. |
3. Review the diff¶
For minor and patch updates the diff is usually just package.json,
yarn.lock, poetry.lock, or pyproject.toml. For major updates:
- Read the upstream changelog (linked in the PR body by Renovate)
- Check for breaking changes, deprecated APIs, or new peer dependencies
- Look for migration guides
4. Merge order¶
When multiple Renovate PRs are open, merge in this order:
- Backend-only PRs (Poetry / pytest / pre-commit) — no frontend lockfile interaction
- Tier 3 tooling (eslint plugins, type definitions, devDeps) — low risk, quick wins
- Grouped minor/patch (the weekly
npm-pip-weeklyPR) — broadest but lowest risk per package - Infrastructure (FastAPI, Mantine, React, Docker images) — review changelogs
- Major version bumps — one at a time, verify locally if needed
After each merge, Renovate rebases the remaining PRs. Wait for CI to re-run before merging the next one.
Handling major version bumps¶
Major bumps (labelled major-version-bump) often require code changes.
- Check out the Renovate branch locally:
git fetch origin
git checkout renovate/<branch-name>
- Run the project and tests:
cd frontend && yarn install && yarn typecheck:all && yarn unit-test:run
cd ../backend && poetry install && poetry run pytest -q
-
Fix any breakages, commit to the Renovate branch, and push. CI will re-run on the PR.
-
If multiple major bumps are interdependent (e.g. Vite 8 +
@vitejs/plugin-reactv6 +vite-tsconfig-pathsv6), merge them in dependency order or ask Renovate to group them by adding apackageRulesentry inrenovate.json.
Hotfix PRs (vulnerability alerts)¶
Tier 1 and Tier 2 vulnerability alerts create hotfix/sec-* branches
targeting clinical-live.
- Review the security advisory linked in the PR
- Verify CI passes
- Get the required approval (clinical-live requires 1 reviewer)
- Merge to
clinical-live - The hotfix back-merge workflow automatically creates a PR to bring
the fix into
main
Troubleshooting¶
yarn install --immutable fails¶
Cause: Renovate regenerated yarn.lock with a different Yarn
version than the project expects.
Fix: Ensure "packageManager": "yarn@<version>" is set in
frontend/package.json. This tells both Corepack and Renovate which
exact Yarn binary to use. After merging the fix to main, Renovate
rebases its branches and regenerates lock files correctly.
Peer dependency warnings¶
Warnings like YN0086: Some peer dependencies are incorrectly met are
usually harmless unless they cause --immutable to fail. If they do,
add a resolutions entry to frontend/package.json to pin the
conflicting package.
All frontend PRs fail CI simultaneously¶
This usually means something changed on main that breaks the lockfile
(e.g. a new dependency was added without committing yarn.lock). Fix
main first — Renovate will rebase automatically.
Renovate recreates a closed PR¶
Renovate reopens or recreates PRs unless you tell it not to. To permanently ignore an update, add a comment on the PR:
@renovate ignore this dependency
Or to ignore just this major version:
@renovate ignore this major version
Slack notifications¶
When a Renovate PR fails CI, the Slack notification shows:
- Title:
Renovate TypeScript <task> checks failed(instead ofFeature) - Icon: Renovate bot avatar (for legacy incoming webhooks)
This helps distinguish dependency failures from feature work at a glance.