Aligns renovate.json5 with the Renovate configuration of cluster-config, so both repositories behave the same way on the shared jlab-renovate-bot instance.
separateMinorPatch: true (new) — minor and patch arrive as separate PRs.
Global automerge: true, automergeType: "pr", platformAutomerge: true, majors included.
New rule: pinDigests: false for matchManagers: ["custom.regex", "helm-values"].
Kept on purpose: minimumReleaseAge: "3 days" for patch/minor/digest (every merge here publishes a chart), ignorePaths, the ci/** opt-out, every per-chart customManagers block, the nginx even-minor constraint, the qbittorrent tag exclusions, separateMultipleMajor and postUpgradeTasks.
The part that is not a settings change: comments that had become false
A review requirement and validate-charts as a required check are both active on main now. Several passages asserted the opposite in so many words, and they are rewritten rather than left to rot — with the reason the value changed, not just the new value:
renovate.json5, the platformAutomerge: false comment ("validate-charts is not (yet) a required check on either side"). That comment itself named the condition under which true becomes the better value; the condition arrived.
renovate.json5, the automerge rule's "Majors stay manual". The rule is now an age gate, not an automerge switch, and says so.
renovate.json5, the helmv3/subchart block ("A major arrives as a PR to merge by hand") and the mediathekarr block ("automerged under the 'digest' update type in the rule above").
renovate.json5, the searxng comment calling the measured downgrade "unattended".
README.md → "PR policy": rewritten completely.
README.md → "Where this repo lives": says now that validate-chartsis required as the single context the matrix reports under — per chart is the part that is impossible, not required checks as such.
CLAUDE.md, the two forge bullets on auto-merge and required checks. Flagging this explicitly for review, since it is the binding file: the edit is factual (auto-merge waits for the check and the review; validate-charts is required), rules 1–8 of the workflow are untouched.
The knock-on effect, stated once where it belongs: with platformAutomerge: true the PR is armed and the forge merges it when the required check passes and the review exists. Automerging majors is therefore not unattended merging — the review is the gate. That is the same reasoning cluster-config records.
Heads-up: config:best-practices will rewrite the workflow files
It pulls in helpers:pinGitHubActionDigests, so Renovate will start proposing SHA pins for actions/checkout@v7 and friends across .github/workflows/. That is wanted (cluster-config keeps it deliberately), but it is a visible, repo-wide diff and should not arrive as a surprise.
It also pulls in docker:pinDigests, which is why the new pinDigests: false rule exists: an appVersion: is a tag by construction — templates render <repo>:{{ .Chart.AppVersion }} and the chart version's +up suffix is built from the same string — so a digest has nowhere to go. helm-values opts out too, for now: pinning sidecar digests would make every digest change a chart patch plus a publish, and that is its own decision.
The other members of the preset (:configMigration, :pinDevDependencies, abandonments:recommended, security:minimumReleaseAgeNpm, :maintainLockFilesWeekly) are inert in a repository without a package manager.
Known cost, written down rather than discovered
With no hourly limit and 23 charts, the first run after a quiet week can open many PRs at once, and every chart PR starts a k3d install-test. On a Gitea runner a whole matrix runs inside one job, so those queue instead of fanning out. Accepted trade for lifting the caps.
Wiki
Updated and pushed in the same round of work: Renovate (PR policy rewritten), Forge-and-Tooling (auto-merge and the required check), Versioning (majors automerge too, so the order of a stepwise major jump is kept at the review), CI-CD (required check, and why the install-test blocking counts double now), plus Lessons-Learned and searxng, which quoted the searxng downgrade as something that happened "unattended".
Validation
renovate-config-validator could not be run: this workspace has no node/npm/npx at all, so there is no way to execute it here. Said plainly rather than skipped over.
JSON5 parse check, with the parsed result dumped and read back key by key: all top-level settings are as listed above, 7 packageRules and 24 customManagers survive the change unchanged in substance.
Setting-by-setting diff against cluster-config/renovate.json, which is the reference. The deliberate differences are this repo's own: ignorePaths: ["template-chart/**"], the ci/** opt-out, the per-chart managers, the nginx/qbittorrent constraints, postUpgradeTasks, and pinDigests: false on custom.regex + helm-values where cluster-config uses fleet + custom.regex (its manager, our managers, same reason).
ci/run-quantity-render-test.sh: passes, 22 charts exercised, 0 failed. The config is not a chart, so there is no version bump and no install-test fixture entry.
Not verifiable from this workspace, at all: the instance-side behaviour. Whether the shared instance picks up config:best-practices, how many PRs the first run actually opens, and whether auto-merge on Gitea behaves as described can only be observed after the merge, on the instance.
Aligns `renovate.json5` with the Renovate configuration of **cluster-config**, so both repositories behave the same way on the shared `jlab-renovate-bot` instance.
Fixes #34
## What changed in `renovate.json5`
- `extends`: added `config:best-practices` (`:semanticCommitsDisabled` kept).
- `labels`: `["dependencies"]` → `["renovate"]`; `dependencyDashboard: true` now explicit.
- `prHourlyLimit: 4` → `0`, `prConcurrentLimit: 10` → `100`.
- `separateMinorPatch: true` (new) — minor and patch arrive as separate PRs.
- Global `automerge: true`, `automergeType: "pr"`, `platformAutomerge: true`, **majors included**.
- New rule: `pinDigests: false` for `matchManagers: ["custom.regex", "helm-values"]`.
Kept on purpose: `minimumReleaseAge: "3 days"` for patch/minor/digest (every merge here publishes a chart), `ignorePaths`, the `ci/**` opt-out, every per-chart `customManagers` block, the nginx even-minor constraint, the qbittorrent tag exclusions, `separateMultipleMajor` and `postUpgradeTasks`.
## The part that is not a settings change: comments that had become false
A review requirement and `validate-charts` as a required check are both active on `main` now. Several passages asserted the opposite in so many words, and they are rewritten rather than left to rot — with the reason the value changed, not just the new value:
- `renovate.json5`, the `platformAutomerge: false` comment ("validate-charts is not (yet) a required check on either side"). That comment itself named the condition under which `true` becomes the better value; the condition arrived.
- `renovate.json5`, the automerge rule's "Majors stay manual". The rule is now an age gate, not an automerge switch, and says so.
- `renovate.json5`, the `helmv3`/subchart block ("A major arrives as a PR to merge by hand") and the mediathekarr block ("automerged under the 'digest' update type in the rule above").
- `renovate.json5`, the searxng comment calling the measured downgrade "unattended".
- `README.md` → "PR policy": rewritten completely.
- `README.md` → "Where this repo lives": says now that `validate-charts` **is** required as the single context the matrix reports under — *per chart* is the part that is impossible, not required checks as such.
- `CLAUDE.md`, the two forge bullets on auto-merge and required checks. **Flagging this explicitly for review**, since it is the binding file: the edit is factual (auto-merge waits for the check *and* the review; `validate-charts` is required), rules 1–8 of the workflow are untouched.
The knock-on effect, stated once where it belongs: with `platformAutomerge: true` the PR is armed and the forge merges it when the required check passes **and** the review exists. Automerging majors is therefore not unattended merging — the review is the gate. That is the same reasoning cluster-config records.
## Heads-up: `config:best-practices` will rewrite the workflow files
It pulls in `helpers:pinGitHubActionDigests`, so Renovate will start proposing SHA pins for `actions/checkout@v7` and friends across `.github/workflows/`. That is wanted (cluster-config keeps it deliberately), but it is a visible, repo-wide diff and should not arrive as a surprise.
It also pulls in `docker:pinDigests`, which is why the new `pinDigests: false` rule exists: an `appVersion:` is a tag by construction — templates render `<repo>:{{ .Chart.AppVersion }}` and the chart version's `+up` suffix is built from the same string — so a digest has nowhere to go. `helm-values` opts out too, for now: pinning sidecar digests would make every digest change a chart patch plus a publish, and that is its own decision.
The other members of the preset (`:configMigration`, `:pinDevDependencies`, `abandonments:recommended`, `security:minimumReleaseAgeNpm`, `:maintainLockFilesWeekly`) are inert in a repository without a package manager.
## Known cost, written down rather than discovered
With no hourly limit and 23 charts, the first run after a quiet week can open many PRs at once, and every chart PR starts a k3d install-test. On a Gitea runner a whole matrix runs inside one job, so those queue instead of fanning out. Accepted trade for lifting the caps.
## Wiki
Updated and pushed in the same round of work: `Renovate` (PR policy rewritten), `Forge-and-Tooling` (auto-merge and the required check), `Versioning` (majors automerge too, so the order of a stepwise major jump is kept at the review), `CI-CD` (required check, and why the install-test blocking counts double now), plus `Lessons-Learned` and `searxng`, which quoted the searxng downgrade as something that happened "unattended".
## Validation
- **`renovate-config-validator` could not be run**: this workspace has no node/npm/npx at all, so there is no way to execute it here. Said plainly rather than skipped over.
- **JSON5 parse check**, with the parsed result dumped and read back key by key: all top-level settings are as listed above, 7 `packageRules` and 24 `customManagers` survive the change unchanged in substance.
- **Setting-by-setting diff against `cluster-config/renovate.json`**, which is the reference. The deliberate differences are this repo's own: `ignorePaths: ["template-chart/**"]`, the `ci/**` opt-out, the per-chart managers, the nginx/qbittorrent constraints, `postUpgradeTasks`, and `pinDigests: false` on `custom.regex` + `helm-values` where cluster-config uses `fleet` + `custom.regex` (its manager, our managers, same reason).
- **`ci/run-quantity-render-test.sh`**: passes, 22 charts exercised, 0 failed. The config is not a chart, so there is no version bump and no install-test fixture entry.
**Not verifiable from this workspace, at all:** the instance-side behaviour. Whether the shared instance picks up `config:best-practices`, how many PRs the first run actually opens, and whether auto-merge on Gitea behaves as described can only be observed after the merge, on the instance.
The shared jlab-renovate-bot instance serves this repo and cluster-config,
and two repos behaving differently under one bot is a source of surprises
rather than of safety. This adopts cluster-config's configuration:
config:best-practices in extends, labels ["renovate"], no PR caps
(prHourlyLimit 0, prConcurrentLimit 100), separateMinorPatch, an explicit
dependencyDashboard, and global automerge with platformAutomerge.
Two of those choices were previously wrong here and are now right, because
the branch protection on main has caught up: a review requirement and
validate-charts as a required check are both active. platformAutomerge
therefore arms the PR on the forge and Gitea merges it when the check
passes AND the review exists - the review is the gate, which is what makes
automerging majors something other than unattended merging.
Comments that asserted the opposite are rewritten rather than left to rot:
the platformAutomerge: false comment ("not (yet) a required check on either
side"), the "Majors stay manual" rule, the README PR policy bullets and the
required-check paragraph, and the CLAUDE.md forge notes.
config:best-practices pulls in docker:pinDigests, which is switched off
again for custom.regex and helm-values: an appVersion: is a tag by
construction and has nowhere to put a digest. Kept deliberately:
minimumReleaseAge of three days on the routine updates (every merge here
publishes a chart), the ignorePaths and ci/** opt-outs, every per-chart
manager, the nginx and qbittorrent constraints, and postUpgradeTasks.
Fixes#34
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Aligns
renovate.json5with the Renovate configuration of cluster-config, so both repositories behave the same way on the sharedjlab-renovate-botinstance.Fixes #34
What changed in
renovate.json5extends: addedconfig:best-practices(:semanticCommitsDisabledkept).labels:["dependencies"]→["renovate"];dependencyDashboard: truenow explicit.prHourlyLimit: 4→0,prConcurrentLimit: 10→100.separateMinorPatch: true(new) — minor and patch arrive as separate PRs.automerge: true,automergeType: "pr",platformAutomerge: true, majors included.pinDigests: falseformatchManagers: ["custom.regex", "helm-values"].Kept on purpose:
minimumReleaseAge: "3 days"for patch/minor/digest (every merge here publishes a chart),ignorePaths, theci/**opt-out, every per-chartcustomManagersblock, the nginx even-minor constraint, the qbittorrent tag exclusions,separateMultipleMajorandpostUpgradeTasks.The part that is not a settings change: comments that had become false
A review requirement and
validate-chartsas a required check are both active onmainnow. Several passages asserted the opposite in so many words, and they are rewritten rather than left to rot — with the reason the value changed, not just the new value:renovate.json5, theplatformAutomerge: falsecomment ("validate-charts is not (yet) a required check on either side"). That comment itself named the condition under whichtruebecomes the better value; the condition arrived.renovate.json5, the automerge rule's "Majors stay manual". The rule is now an age gate, not an automerge switch, and says so.renovate.json5, thehelmv3/subchart block ("A major arrives as a PR to merge by hand") and the mediathekarr block ("automerged under the 'digest' update type in the rule above").renovate.json5, the searxng comment calling the measured downgrade "unattended".README.md→ "PR policy": rewritten completely.README.md→ "Where this repo lives": says now thatvalidate-chartsis required as the single context the matrix reports under — per chart is the part that is impossible, not required checks as such.CLAUDE.md, the two forge bullets on auto-merge and required checks. Flagging this explicitly for review, since it is the binding file: the edit is factual (auto-merge waits for the check and the review;validate-chartsis required), rules 1–8 of the workflow are untouched.The knock-on effect, stated once where it belongs: with
platformAutomerge: truethe PR is armed and the forge merges it when the required check passes and the review exists. Automerging majors is therefore not unattended merging — the review is the gate. That is the same reasoning cluster-config records.Heads-up:
config:best-practiceswill rewrite the workflow filesIt pulls in
helpers:pinGitHubActionDigests, so Renovate will start proposing SHA pins foractions/checkout@v7and friends across.github/workflows/. That is wanted (cluster-config keeps it deliberately), but it is a visible, repo-wide diff and should not arrive as a surprise.It also pulls in
docker:pinDigests, which is why the newpinDigests: falserule exists: anappVersion:is a tag by construction — templates render<repo>:{{ .Chart.AppVersion }}and the chart version's+upsuffix is built from the same string — so a digest has nowhere to go.helm-valuesopts out too, for now: pinning sidecar digests would make every digest change a chart patch plus a publish, and that is its own decision.The other members of the preset (
:configMigration,:pinDevDependencies,abandonments:recommended,security:minimumReleaseAgeNpm,:maintainLockFilesWeekly) are inert in a repository without a package manager.Known cost, written down rather than discovered
With no hourly limit and 23 charts, the first run after a quiet week can open many PRs at once, and every chart PR starts a k3d install-test. On a Gitea runner a whole matrix runs inside one job, so those queue instead of fanning out. Accepted trade for lifting the caps.
Wiki
Updated and pushed in the same round of work:
Renovate(PR policy rewritten),Forge-and-Tooling(auto-merge and the required check),Versioning(majors automerge too, so the order of a stepwise major jump is kept at the review),CI-CD(required check, and why the install-test blocking counts double now), plusLessons-Learnedandsearxng, which quoted the searxng downgrade as something that happened "unattended".Validation
renovate-config-validatorcould not be run: this workspace has no node/npm/npx at all, so there is no way to execute it here. Said plainly rather than skipped over.packageRulesand 24customManagerssurvive the change unchanged in substance.cluster-config/renovate.json, which is the reference. The deliberate differences are this repo's own:ignorePaths: ["template-chart/**"], theci/**opt-out, the per-chart managers, the nginx/qbittorrent constraints,postUpgradeTasks, andpinDigests: falseoncustom.regex+helm-valueswhere cluster-config usesfleet+custom.regex(its manager, our managers, same reason).ci/run-quantity-render-test.sh: passes, 22 charts exercised, 0 failed. The config is not a chart, so there is no version bump and no install-test fixture entry.Not verifiable from this workspace, at all: the instance-side behaviour. Whether the shared instance picks up
config:best-practices, how many PRs the first run actually opens, and whether auto-merge on Gitea behaves as described can only be observed after the merge, on the instance.The shared jlab-renovate-bot instance serves this repo and cluster-config, and two repos behaving differently under one bot is a source of surprises rather than of safety. This adopts cluster-config's configuration: config:best-practices in extends, labels ["renovate"], no PR caps (prHourlyLimit 0, prConcurrentLimit 100), separateMinorPatch, an explicit dependencyDashboard, and global automerge with platformAutomerge. Two of those choices were previously wrong here and are now right, because the branch protection on main has caught up: a review requirement and validate-charts as a required check are both active. platformAutomerge therefore arms the PR on the forge and Gitea merges it when the check passes AND the review exists - the review is the gate, which is what makes automerging majors something other than unattended merging. Comments that asserted the opposite are rewritten rather than left to rot: the platformAutomerge: false comment ("not (yet) a required check on either side"), the "Majors stay manual" rule, the README PR policy bullets and the required-check paragraph, and the CLAUDE.md forge notes. config:best-practices pulls in docker:pinDigests, which is switched off again for custom.regex and helm-values: an appVersion: is a tag by construction and has nowhere to put a digest. Kept deliberately: minimumReleaseAge of three days on the routine updates (every merge here publishes a chart), the ignorePaths and ci/** opt-outs, every per-chart manager, the nginx and qbittorrent constraints, and postUpgradeTasks. Fixes #34