Skip to content

🏗️✨:hold dependabot to a week before proposing - #1805

Merged
DerekNonGeneric merged 3 commits into
livefrom
chore/dependency-cooldowns
Aug 13, 2026
Merged

🏗️✨:hold dependabot to a week before proposing#1805
DerekNonGeneric merged 3 commits into
livefrom
chore/dependency-cooldowns

Conversation

@DerekNonGeneric

Copy link
Copy Markdown
Member

Closes the semgrep audit finding dependabot-missing-cooldown, and sets the equivalent wait in the two other places that decide what version gets installed.

A newly published version is where a compromised release arrives. A week is long enough for one to be noticed and pulled, and short enough not to matter for anything else here.

Three layers, because each covers what the others cannot

setting before after
.github/dependabot.yml cooldown.default-days none 7
.renovaterc.json5 minimumReleaseAge 3 days, npm only 7 days, every datasource
pnpm-workspace.yaml minimumReleaseAge none 10080 minutes

Renovate was already partly covered, which surprised me. config:best-practices pulls in security:minimumReleaseAgeNpm — three days, and scoped to matchDatasources: ["npm"]. The pinned GitHub Action digests and the URL-pinned dprint plugins the custom managers watch had no wait at all.

Raising it had to be done as a package rule, not the top-level setting: a preset's packageRules are merged ahead of the repository's own, and the last matching rule wins, so a top-level value would have lost to the preset's 3 days for exactly the packages that matter most. A second rule puts back the preset's lockFileMaintenance: minimumReleaseAge: null, which the catch-all would otherwise undo.

pnpm is the layer that closes the gap that rule leaves open. Renovate waives the wait for lock file maintenance because it cannot validate transitive versions there — so the weekly refresh was a route in for a package published hours earlier. pnpm resolves those, and now applies the same week to them.

Security fixes are not delayed at any layer: Dependabot cooldown does not apply to security updates, Renovate's vulnerabilityAlerts default carries minimumReleaseAge: null, and pnpm waives it for audit --fix advisories.

Why the lockfile is in this PR

pnpm re-verifies every lockfile entry on install, not only newly resolved ones. Turning the setting on made pnpm install fail outright:

[ERR_PNPM_MINIMUM_RELEASE_AGE_VIOLATION] 16 lockfile entries failed verification:
  electron-to-chromium@1.5.403 was published at 2026-08-09T02:02:50.000Z,
  within the minimumReleaseAge cutoff (2026-08-05T03:17:06.827Z)
  …

Those 16 came in with the Aug 9 lock file maintenance. Rebuilding from a fresh resolution moved 11 back on their own. Five were held by exact pins, so three had to be lowered to the newest version old enough to install:

pinned now newest mature published
cssnano 8.0.4 8.0.3 2026-08-04
postcss 8.5.26 8.5.25 2026-07-29
vnu-jar 26.8.6 26.8.4 2026-08-04

Renovate will raise all three again once they have aged, in one grouped PR. That is the policy working rather than churn — and it is what makes this self-sustaining: from now on every lockfile refresh resolves under the wait, so the lockfile stays compliant instead of needing this again.

Setting minimumReleaseAge also turns on minimumReleaseAgeStrict implicitly, which is what we want — an immature pick fails the install rather than quietly adding itself to minimumReleaseAgeExclude.

Considered and rejected: trustLockfile: true would have landed this without any downgrade, by skipping verification of entries already in the lockfile. It also permanently disables the check that catches a lockfile produced with the policy bypassed, which is most of the point.

Verification

  • pnpm install --frozen-lockfile — passes, which it did not before the rebuild
  • nps test — 13/13
  • nps build — 26 copied, 34 written
  • Production build exercised, since cssnano only runs there: main.min.css at 132,800 bytes

Note

Unrelated, but visible from here: Dependabot and Renovate are both configured for npm in this repository, and Dependabot has opened 560 PRs — the most recent, #1700, is still open from October. Worth deciding whether it should stay on npm or be narrowed, but not in this PR.

What the semgrep audit rule asks for. A newly published version is
where a compromised release lands, and a week is long enough for one to
be noticed and pulled. Security updates are not held back by cooldown.

Assisted-by: Claude-Code:claude-opus-5
`config:best-practices` brings in `security:minimumReleaseAgeNpm`, which
waits three days and matches only the npm datasource -- so the pinned
action digests and the URL-pinned dprint plugins had no wait at all.

A preset's package rules are merged ahead of the repository's own and
the last matching rule wins, so this has to be expressed as a rule
rather than as the top-level setting. The second rule puts back what the
preset sets and the first would otherwise undo.

Assisted-by: Claude-Code:claude-opus-5
Renovate can only wait on the versions it proposes. The transitive
versions a lockfile refresh pulls in are resolved by pnpm, and its own
`lockFileMaintenance` rule waives the wait there because it cannot
validate them -- so without this, the weekly refresh was a way in for a
package published hours earlier.

pnpm re-checks every lockfile entry, not just newly resolved ones, so
the lockfile had to be rebuilt from a fresh resolution to satisfy the
policy. Eleven transitives moved back on their own; cssnano, postcss and
vnu-jar are pinned exactly and needed the pin lowered to the newest
version old enough to install. Renovate will raise them again once they
have aged, which is the policy working rather than churn.

Assisted-by: Claude-Code:claude-opus-5
@netlify

netlify Bot commented Aug 12, 2026

Copy link
Copy Markdown

Deploy Preview for gh-pages-openinf ready!

Name Link
🔨 Latest commit b51d7fd
🔍 Latest deploy log https://app.netlify.com/projects/gh-pages-openinf/deploys/6a7d2d636a641e0008fedb01
😎 Deploy Preview https://deploy-preview-1805--gh-pages-openinf.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@socket-security

socket-security Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addedcssnano@​8.0.31001006892100
Updatedpostcss@​8.5.26 ⏵ 8.5.251001008195 +1100
Addedvnu-jar@​26.8.4911008298100

View full report

@DerekNonGeneric
DerekNonGeneric force-pushed the chore/dependency-cooldowns branch 2 times, most recently from 5b38f8f to b51d7fd Compare August 13, 2026 02:35
@DerekNonGeneric DerekNonGeneric changed the title 🏗️✨:wait a week before installing a newly published version 🏗️✨:hold dependabot to a week before proposing Aug 13, 2026
@DerekNonGeneric
DerekNonGeneric merged commit b87d04a into live Aug 13, 2026
13 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant