diff --git a/decisions/2026-10-30-renovate-hold-auth-and-self.md b/decisions/2026-10-30-renovate-hold-auth-and-self.md new file mode 100644 index 0000000..26ce70f --- /dev/null +++ b/decisions/2026-10-30-renovate-hold-auth-and-self.md @@ -0,0 +1,52 @@ +--- +date: 2026-10-30 +branch: fix/renovate-hold-auth-and-self +title: Operator decision — the oauth2-proxy sidecar and Renovate's own version never auto-merge +--- + +## What changed + +`renovate.json5` gains two packageRules. Both set `automerge: false` and `addLabels: ["needs-review"]`. +They sit after the auto-merge rule, so they override it at every update type. Each rule's +`description` carries the operator's reason. + +1. **`quay.io/oauth2-proxy/oauth2-proxy`.** This is the single depName emitted for: + - `catalog/render.py` `OAUTH2_PROXY_IMAGE` (custom regex manager); + - the five rendered `apps/wave-*` sidecars; + - `platform/crafty/deployment.yaml` (kubernetes manager). + + **Reason:** since v7.13.0, oauth2-proxy validates refreshed OIDC sessions against the access + token, not the id_token. Every sidecar sets `--cookie-refresh`, and that path is untested against + this Keycloak: the platform oauth2-proxy runs v7.15.5 without `--cookie-refresh`. + `render-golden` and `--selftest` pass on the bump, but both check rendered text, not the binary. +2. **`ghcr.io/renovatebot/renovate`.** This is the job `container.image` in + `.gitea/workflows/renovate.yaml`. The rule also lists `renovatebot/github-action`, so a + reintroduction would be held too. It is not used anywhere today; `ci/lint.sh` rejects it. + + **Reason:** nothing re-validates `renovate.json5` against the new version before it takes + effect. The 39.x `CONFIG_VALIDATION` failure is the precedent. + +## What I verified + +- **The config validates on the pinned 44.167.0.** `renovate-config-validator` printed + `Config validated successfully`. The migration diff is only the pre-existing top-level `docker` + block. +- **The flag change is exactly the intended one.** I used Renovate 44.167.0's own + `resolveConfigPresets` and `applyPackageRules` to evaluate b4ff287's config and this branch's + config against the same updates (the local dry run of the #86 config). Exactly **2 of 29** + branch rows differ: + - `ghcr.io-renovatebot-renovate-44.x`: `automerge=true labels=` → `automerge=false labels=needs-review`; + - `quay.io-oauth2-proxy-oauth2-proxy-7.x`: the same change, and every upgrade in the branch + resolves `false`, the `catalog/render.py` one included. + + The other 27 rows are byte-identical. + +## What I did NOT verify + +- **The three GitHub-hosted branches** in run 357 (`pin-dependencies`, `kubevirt-cdi`, + `intel-intel-device-plugins-for-kubernetes-0.x`) are not in the harness table: my local run has + no github.com token. Neither rule's package names can match them. +- **A live Renovate run with this config.** The next debug-level dispatch should show + `needs-review` on both branches. +- **The oauth2-proxy refresh path itself** remains untested. Exercising it on one app is the + review the label asks for. diff --git a/renovate.json5 b/renovate.json5 index 08c9d2d..35d5a3c 100644 --- a/renovate.json5 +++ b/renovate.json5 @@ -320,6 +320,20 @@ "automerge": false, "addLabels": ["needs-review"] }, + // OPERATOR DECISION 2026-10-30: these two never auto-merge, at ANY update type. Both sit after + // the auto-merge rule (rule 1) so they override it; `needs-review` is added, not replaced. + { + "description": "ADDED 2026-10-30 (operator decision). The oauth2-proxy image, under the ONE depName every source of it emits: catalog/render.py OAUTH2_PROXY_IMAGE (custom regex manager), the rendered apps/wave-* sidecars and platform/crafty/deployment.yaml (kubernetes manager). WHY: since v7.13.0 oauth2-proxy validates REFRESHED OIDC sessions against the ACCESS token instead of the id_token (upstream CHANGELOG, v7.13.0), every sidecar sets --cookie-refresh, and that refresh path has never run against this Keycloak (the platform oauth2-proxy runs v7.15.5 WITHOUT --cookie-refresh). render-golden and render.py --selftest pass on the bump, but both check rendered text, not the binary, so a green gate is not evidence here.", + "matchPackageNames": ["quay.io/oauth2-proxy/oauth2-proxy"], + "automerge": false, + "addLabels": ["needs-review"] + }, + { + "description": "ADDED 2026-10-30 (operator decision). Renovate's OWN version: the job `container.image` pin in .gitea/workflows/renovate.yaml (ghcr.io/renovatebot/renovate), and renovatebot/github-action should it ever be reintroduced (ci/lint.sh rejects it today). WHY: nothing re-validates renovate.json5 against the NEW version before it takes effect. The gate does not run renovate-config-validator, and this exact gap has bitten before: the action's default 39.x rejected this file (managerFilePatterns needs >= 40.2.0) and every run stopped at CONFIG_VALIDATION. Run the validator from the new tag, then merge.", + "matchPackageNames": ["ghcr.io/renovatebot/renovate", "renovatebot/github-action"], + "automerge": false, + "addLabels": ["needs-review"] + }, { "description": "ADDED 2026-10-30. MAJORS WAIT FOR A TICK ON THE DEPENDENCY DASHBOARD instead of opening a PR. They are never auto-merged anyway, and with prConcurrentLimit 5 the dry run's 10 majors would hold every PR slot open indefinitely, starving the patch/minor/digest PRs that can merge on green.", "matchUpdateTypes": ["major"],