chore: make Renovate group, automerge, and refresh dependencies - #648
Conversation
Renovate has not executed on this repo since 2026-01-29 (stale Dependency Dashboard, zero renovate/* branches, 7 months of drift). The root cause is outside the repo -- the config file has exactly one commit in its history and validates clean -- but the config would not have delivered good dependency flow even while running, so fix it for when service resumes. - Group all ten @docusaurus/* packages into one PR; they publish in lockstep and any solo bump breaks the build. - Group react + react-dom. - Automerge patch/minor devDependencies once the branch is fully green; hold 0.x minors, all majors, and Docusaurus minors for review. - Gate the TypeScript 5 -> 7 major behind Dependency Dashboard approval. - Enable monthly lockFileMaintenance, the only way transitive deps move now that all direct ranges are pinned exact. - Raise prConcurrentLimit 2 -> 10 and prHourlyLimit 2 -> 4 to clear the backlog. - platformAutomerge: false so Renovate waits on the full build, which is not one of main's required status checks. - Keep minimumReleaseAge and internalChecksFilter as-is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Code Review
This pull request significantly expands the Renovate configuration in renovate.json by defining schedules, limits, and granular package rules for automerging, pinning digests, and grouping dependencies like Docusaurus and React. Feedback was provided to simplify the rules for 0.x minor updates and major updates by combining them into a single rule using the breaking update type.
| { | ||
| "description": "For 0.x releases a minor bump is a breaking change under semver, so require review. Currently affects @easyops-cn/docusaurus-search-local and @harperfast/code-guidelines.", | ||
| "matchCurrentVersion": "/^0\\./", | ||
| "matchUpdateTypes": ["minor"], | ||
| "automerge": false | ||
| }, | ||
| { | ||
| "description": "Never automerge a major update.", | ||
| "matchUpdateTypes": ["major"], | ||
| "automerge": false | ||
| }, |
There was a problem hiding this comment.
You can simplify these two rules into a single one by using the breaking value for matchUpdateTypes. Renovate considers major updates (e.g., 1.x -> 2.x) and minor updates for 0.x packages (e.g., 0.1.x -> 0.2.x) as breaking changes. This makes the configuration more concise and semantic.
{
"description": "Never automerge breaking changes (major updates, or minor updates for 0.x packages).",
"matchUpdateTypes": ["breaking"],
"automerge": false
},There was a problem hiding this comment.
Checked this one carefully and I'm not taking it - breaking is not a valid matchUpdateTypes value, and the way it fails is the problem.
Renovate 44.48.2's own shipped types (dist/config/types.d.ts:444):
type UpdateType = 'major' | 'minor' | 'patch' | 'pin' | 'digest' | 'pinDigest'
| 'lockFileMaintenance' | 'lockfileUpdate' | 'rollback' | 'bump' | 'replacement';No breaking. The published renovate-schema.json enum agrees.
The dangerous part is that nothing would have caught this. The schema's matchUpdateTypes is an anyOf whose second branch is a bare {"type": "string"}, so any string validates. I confirmed it with a control: a rule using matchUpdateTypes: ["definitelyNotAnUpdateType"] passes renovate-config-validator --strict with "Config validated successfully."
So had I applied this, the rule would have validated clean, silently matched nothing, and let major bumps and 0.x minors fall through to the automerge default - merged with no review. A verbose config is much cheaper than that.
Keeping the two explicit rules. They're wordier but they demonstrably match what they say: matchUpdateTypes: ["major"], and matchCurrentVersion: "/^0\\./" + matchUpdateTypes: ["minor"] for the 0.x case.
sent with Claude Opus 5
| "description": "Automerge patch and minor devDependency updates. Every dependency in this repo is a devDependency, and Renovate PRs run the full Docusaurus build (Deploy PR Preview) plus tsc and prettier --check, so a green branch is strong evidence.", | ||
| "matchDepTypes": ["devDependencies"], | ||
| "matchUpdateTypes": ["minor", "patch"], | ||
| "automerge": true |
There was a problem hiding this comment.
This also automerges patch/minor updates to @signalwire/docusaurus-plugin-llms-txt, but PR CI only builds; it does not run the flat-Markdown assertions at .github/workflows/deploy.yaml:64. A plugin regression that still lets Docusaurus build but stops emitting per-section Markdown, llms.txt, or llms-full.txt would pass .github/workflows/pr-preview.yaml:65 and validation, merge automatically here, then fail the GitHub Pages deployment. Please either run the same artifact verification on PRs before enabling automerge, or add a later package rule with automerge: false for this plugin.
Why
Renovate has not run on this repository since 2026-01-29. The last Renovate PR was #432 (created 2026-01-28), and the Dependency Dashboard has been frozen since 2026-01-29 even though Renovate rewrites that issue on every single run. Seven months of drift has accumulated:
@docusaurus/*(10 packages)@easyops-cn/docusaurus-search-localprettierreact/react-domtypescriptThis PR cannot restart Renovate — the root cause is outside the repository. It fixes the config so that dependencies actually flow well once service resumes, and records the diagnosis.
Diagnosis
Ranked conclusion
#1 —
documentationis not enabled in the Renovate app's repository selection (or is disabled on the Mend side). This is the only hypothesis consistent with every observation.The decisive evidence is a cross-repo comparison. The
renovateGitHub App (installation84209395) is installed on the org with"repository_selection": "selected"— an explicit allowlist exists:renovate.json?harperharper-prodocumentationskillsskillsis the control that makes this conclusive: it has had a validrenovate.jsonfor months, yet Renovate has never opened an onboarding PR, never created a Dependency Dashboard, and never opened a dependency PR there. Two repos with valid configs get no service at all; two get service the same day. That pattern is governed by repository selection and Mend-side enablement, not by file contents.Proven in this repo
renovate.jsonhas exactly one commit in its entire history (032ed16d, 2026-01-14, Automate dependency management with Renovate and Socket #416) and was never modified afterward. A file that never changed cannot explain a behavior change on 2026-01-29.renovate-config-validatorpasses on the old file, including--strict.renovate.jsonat the repo root. No.github/renovate.json, norenovate.json5, no.renovaterc*, and norenovatekey inpackage.json. (Multiple config files would itself be a fatal error.)HarperFast/harperhas no Renovate workflow among its 26 workflows, so it is not self-hosted via Actions. PR Update dependency prettier to v3.8.1 #432 here andharper#2286are both authored by the sameapp/renovatebot. Same Mend cloud app on both repos.mainrequires 0 approving reviews,enforce_admins: false,strict: false,block_creations: false. Nothing blocks branch creation or merge — and branch protection could not prevent Renovate from rewriting the Dependency Dashboard issue anyway.@harperfast/code-guidelines@0.1.2is public on npm.documentationis ~20 MB;harperis ~227 MB (11x larger) and runs fine.renovate in:title, and dashboard Dependency Dashboard #420 has zero comments.HarperDB/documentationstill redirects toHarperFast/documentation(samecreated_at, 2022-08-19). A stale full-name cache on Mend's side cannot be ruled out from here, but it would not explainskills.reviewersFromCodeOwners..github/CODEOWNERSexists and is valid.Could not test from here — needs the owner's browser
84209395) → Repository access.Healthy:
documentation(andskills) appear in the selected-repositories list.Broken: they are absent. Fix by adding them.
Healthy: the repo is listed, shows Enabled, and has a job log entry within the last ~24 hours.
Broken: "repository not found / not installed", an explicit disabled state, or a last job dated on or near 2026-01-29.
Config changes
Grouping
@docusaurus/**grouped into onedocusaurus monorepoPR. Verified that all ten packages — includingtsconfig,types, andmodule-type-aliases— publish 3.10.2 in lockstep, so grouping them is correct and any solo bump breaks the build. Renovate's built-ingroup:monorepospreset (part ofconfig:recommended) already recognizes Docusaurus, so this is partly belt-and-braces, but making it explicit removes the dependency on every package'srepositorymetadata resolving correctly and gives the group a place to hang the automerge policy below.react+react-domgrouped. Same reason, smaller blast radius.Automerge
devDependenciesautomerge withautomergeType: "pr". Every dependency here is a devDependency, and I confirmed empirically that Renovate PRs get a fullnpm run build:Deploy PR Previewran and succeeded on PR Update dependency prettier to v3.8.1 #432 at creation time, because that workflow's path filter includespackage.jsonandpackage-lock.json. So a green branch really does mean the site builds.platformAutomerge: false— this one is deliberate and worth flagging.main's required status checks are onlyTypeScript Check,Lint Check, andFormat Check. The build is not a required check. GitHub-native auto-merge (Renovate's default) merges as soon as required checks pass, so it would have merged dependency bumps without ever waiting for the Docusaurus build. Turning it off makes Renovate wait for the whole branch to be green, build included.automergeSchedule: ["at any time"]so the weekly PR schedule does not also delay merges by up to a week.0.xminors (a minor is a breaking change below 1.0 — currently@easyops-cn/docusaurus-search-localand@harperfast/code-guidelines); and Docusaurus minors, since a minor can change rendering without failing the build and the PR preview deployment deserves a human look. Docusaurus patches still automerge.TypeScript 5.9.3 → 7.0.2
Gated behind
dependencyDashboardApproval: truerather than pinned or blocked. TypeScript 7 is a full compiler rewrite and@docusaurus/tsconfig3.x is not validated against it. Dashboard approval keeps the upgrade visible and one click away without a PR nagging in the queue — whereas anallowedVersionspin would quietly hide it.lockFileMaintenanceEnabled, monthly, automerged. Note this differs from
harperandskills, which both disable it — and the difference is justified: all direct dependencies here were pinned to exact versions in #433, so lockfile maintenance is now the only mechanism by which transitive dependencies ever get security or bug fixes. Monthly keeps the noise low, and it is gated by the same green-build requirement.prConcurrentLimit: 2 → 10,prHourlyLimit: 2 → 4A limit of 2 throttles hard against a 7-month backlog, and with
minimumReleaseAge: "7 days"a blocked queue can stay blocked for weeks. 10 is alsoconfig:recommended's own default. Grouping means the backlog is only ~6 PRs, so this should drain in one run; consider lowering back to ~5 once caught up.schedule/timezone/semanticCommitsAdded to match
harperandskills, which both use the identicalAmerica/New_York+before 9am on Monday+semanticCommits: "enabled"triple. This makes all three org configs consistent and produceschore(deps):prefixes like the other repos.Verification caveat: because of this schedule, the first run after the app-side fix will appear on a Monday morning ET. Do not read the quiet days in between as the outage continuing — use the dashboard checkbox to force a run.
Kept unchanged, as intended
minimumReleaseAge: "7 days",internalChecksFilter: "strict", andreviewersFromCodeOwners: true.Also noticed (not changed here)
npm run lintisecho 0;— a no-op. The requiredLint Checkstatus therefore provides no signal at all. Two ofmain's three required checks are meaningful (tsc,prettier --check); the third is theater.platformAutomergehad to be disabled above. AddingDeploy PR Previewtomain's required checks would be the cleaner fix and would let native auto-merge be used again.Cleanup PR Previewfailed on PR Update dependency prettier to v3.8.1 #432's close-event run. Unrelated to Renovate, but it is failing.Verification
renovate-config-validator --strictpasses. (It caught a real error in my first draft:before 9am on the first Monday of the monthis not a parseable schedule.)npm run format:writethennpm run format:check— clean.npm run build— succeeds. The broken-anchor warnings are pre-existing onmainand unrelated.Only
renovate.jsonis modified;package.jsonandpackage-lock.jsonare untouched.🤖 Generated with Claude Code