fix: exempt untimestamped update types from minimumReleaseAge, enable osvVulnerabilityAlerts - #1256
Open
trieloff wants to merge 1 commit into
Open
fix: exempt untimestamped update types from minimumReleaseAge, enable osvVulnerabilityAlerts#1256trieloff wants to merge 1 commit into
trieloff wants to merge 1 commit into
Conversation
The `external fixes` and `external major` groups apply `minimumReleaseAge: "14 days"`, but several update types carry no usable release timestamp, so Renovate can never mark them as having met the requirement. Because the `renovate/stability-days` status check is computed per branch and any single pending member turns the whole branch yellow, one such update strands the entire grouped PR in a permanently pending state. Since `internalChecksAsSuccess` defaults to false, that silently blocks automerge indefinitely -- waiting does not clear it. Null out `minimumReleaseAge` for the update types Renovate documents as unsupported (pin, pinDigest, bump, lockfileUpdate, lockFileMaintenance, rollback, replacement), mirroring the carve-outs in Renovate's own `security:minimumReleaseAge*` presets, and relax `digest` to `timestamp-optional` to work around renovatebot/renovate#45236. Also enable `osvVulnerabilityAlerts`, which blocks updates to versions OSV has flagged as malicious regardless of age. This covers the case a release-age window structurally cannot: a compromised version that is never detected within the quarantine period. The 14-day window itself is unchanged.
7 tasks
tripodsan
approved these changes
Aug 28, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Keeps the 14-day quarantine from #1135 exactly as-is, but fixes a mechanism that
prevents it from ever going green, and adds a control that covers what a
release-age window structurally cannot.
Two changes:
pin,pinDigest,bump,lockfileUpdate,lockFileMaintenance,rollback,replacement), plus relaxdigesttominimumReleaseAgeBehaviour: "timestamp-optional".osvVulnerabilityAlerts.The 14-day window itself is unchanged.
Why
external fixesandexternal majorboth setminimumReleaseAge: "14 days",and
external fixesmatches["patch", "pin", "digest", "minor"]. Renovatedocuments
pinas not supportingminimumReleaseAgeat all — there is no release timestamp to age — along with
lockFileMaintenance,lockfileUpdate,rollback,bumpandreplacement.Renovate's own
security:minimumReleaseAge*presets null these outdeliberately, and the source comment
states the consequence directly:
This matters more than it looks, because the
renovate/stability-daysstatuscheck is computed per branch, not per package, and any single pending member
turns the whole branch yellow (
lib/workers/repository/update/branch/index.ts):Since
internalChecksAsSuccessdefaults tofalse, a yellow stability checkblocks automerge. So one untimestamped update in a large group holds the entire
grouped PR unmergeable, and unlike a genuinely-too-fresh package, waiting never
clears it.
digestis a related but separate problem: it does have a timestamp at lookuptime, but the branch stage does not always carry it forward. That is
renovatebot/renovate#45236
(open, reproduced on
mainby a third party), whose reporter describes thesymptom as:
timestamp-optionalis the workaround documented in that issue and in thekey-concepts FAQ.
Why
osvVulnerabilityAlertsA release-age window only helps if a malicious release is detected during the
window.
osvVulnerabilityAlertsis orthogonal: it refuses updates to versionsOSV has flagged as malicious regardless of age, marking them
skipReason: malicious-update-proposed. It closes the gap where a compromisegoes unnoticed for longer than 14 days.
Note this does not delay security fixes.
vulnerabilityAlertsalreadydefaults to
minimumReleaseAge: nullandgroupName: null, so CVE fixes bypassthe quarantine and are never batched into the external groups.
Observed impact
adobe/helix-cli#2771("fix(deps): update external fixes") has been open since2026-08-03 with:
while all real CI (CodeQL, Kodiak, WIP, Analyze, Test, Test (Windows)) is green
and only 3 of its 14 packages have any pending newer version. The PR is
mergeable; automerge simply never fires.
Test plan
default.jsonis valid JSONrenovate-schema.jsonvia ajv — both before and after this change, so no schema regression
minimumReleaseAgeconfirmed astype: ["string", "null"]in the schema,so
nullis a legal value in apackageRuleminimumReleaseAgeBehaviour: "timestamp-optional"confirmed against theschema enum
osvVulnerabilityAlertsconfirmed as a top-level booleanrenovate/stability-daysreaches green on a groupedexternal PR, and that automerge fires on schedule
pin/digestupdate sits pending indefinitelyNotes / not in this PR
Splitting
external fixesinto dev vs runtime dependencies is a plausiblefollow-up: smaller groups go quiet more often, so the stability check reaches
green more often. That is a separate change and is deliberately not bundled here.
Renovate also reports grouped pending members are not surfaced in the Dependency
Dashboard's "Pending Status Checks"
(discussion #39778),
which is why this failure mode is hard to see from the dashboard alone.