chore(renovate): refresh config with explicit grouping + soak rules#9
Conversation
Switch `renovate.json5` to an explicit, self-contained config so the Renovate run on this repo can resolve all its preset references. Same effective policy as before, just expressed locally: - SHA-pinned GitHub Actions with `pinDigests: true` - 3-day `minimumReleaseAge` soak on Python deps + GHA - OSV vulnerability alerts (security PRs never batched) - Per-ecosystem grouping (`backend-non-major`, `gha-non-major`) - Major updates isolated to one PR per dep (`groupName: null`) - Lockfile-maintenance bundled into one PR per cycle - `prConcurrentLimit: 4` + `prHourlyLimit: 4` + Monday-only schedule File renamed `renovate.json` → `renovate.json5` so override rationale can live as inline comments. The old file is deleted in this commit (renovate.json has higher precedence than .json5 in Renovate's lookup). Adds `.github/workflows/validate-renovate.yml` that runs `renovate-config-validator --strict --no-global` on any Renovate-config path. The workflow also fails loudly if a higher-precedence `renovate.json` / `.renovaterc` / `.github/renovate.json` is present, so a stray file can't silently override the chosen `.json5` config.
Final Merge Review (Official Score)
SummaryThis PR migrates the Renovate configuration from
IFC: Low-Medium — Renovate config expansion is a well-understood operational task. Sub-Score BreakdownS (Scope) — 5/20
A (Architecture) — 4/20
I (Implementation) — 6/20
R (Risk) — 4/20
Q (Quality) — 8/15
P (Performance/Security) — 3/5
Score CalculationBase Score: S(5) + A(4) + I(6) + R(4) + Q(8) + P(3) = 30 ESF Tier Assessment:
Final Score: 30 × 0.4 = 12 Post-Merge Observations
Code Quality Data (JSON){
"_schema": "code_quality_v5",
"total_score": 12,
"total_factors": "30 × 0.4 (Small ESF) = 12",
"scope_score": 5,
"scope_factors": "2 files, single CI/config subsystem, no new APIs or external integrations, affects repo-wide dependency management behavior",
"architecture_score": 4,
"architecture_factors": "JSON→JSON5 format migration for maintainability, new CI validation workflow as guard rail, defensive higher-precedence file check, no service boundary changes",
"implementation_score": 6,
"implementation_factors": "Layered Renovate grouping rules with intentional null groupName for CVE/major isolation, volume controls, bash script for precedence check, domain knowledge required but no algorithmic complexity",
"risk_score": 4,
"risk_factors": "Low operational risk, easily reversible config change, validation workflow mitigates migration gap risk, defensive checks reduce future risk",
"quality_score": 8,
"quality_factors": "CI validator as automated config testing, thorough inline comments explaining non-obvious decisions, defensive higher-precedence file check, missing explicit changelog of what changed from old config",
"perf_security_score": 3,
"perf_security_factors": "OSV vulnerability alerts with CVE isolation (no batching), SHA-pinning for GHA supply-chain protection, 3-day release soak window, security rationale documented in comments"
} |
Summary
Switch
renovate.json5to an explicit, self-contained config. Resolves theCannot find preset's packagevalidation error that was blocking Renovate from opening PRs on this repo.Same effective policy as before, just expressed locally:
pinDigests: trueminimumReleaseAgesoak on Python deps + GHAbackend-non-major,gha-non-major)groupName: null)prConcurrentLimit: 4+prHourlyLimit: 4+ Monday-only scheduleFile renamed
renovate.json→renovate.json5so override rationale can live as inline comments. Old file deleted in the same commit (renovate.jsonhas higher Renovate lookup precedence).No behaviour change for the deps Renovate would have opened anyway — this just makes the run actually succeed.
Validation gate
Adds
.github/workflows/validate-renovate.ymlthat runsrenovate-config-validator --strict --no-globalon PR + push. Thepaths:filter covers every Renovate config filename (renovate.json,renovate.json5,.renovaterc,.renovaterc.json,.github/renovate.json,.github/renovate.json5) so a PR can't bypass the gate by adding a higher-precedence file; the workflow also fails loudly at run time if any higher-precedence config is present, so a stray file can't silently override the chosen.json5.Test plan
renovate-config-validator --strict --no-global renovate.json5passes locally (Node 24 + renovate@43, LOG_LEVEL=warn, exit 0)Validate Renovate Configworkflow passes on this PRPost-merge verification
Will confirm after merge:
backend-non-major/gha-non-major