Skip to content
anavem.com logoanavem.com logo
ReleaseGitHub Dependabot and PyPIMedium severityNewsSupply chain security

GitHub Adds a Default Dependabot Cooldown as PyPI Locks Releases After 14 Days

Two of the biggest package ecosystems reached for the same idea within a fortnight: slow things down, so malicious releases get caught before they reach your build.

On this page

Key takeaways

  • Dependabot version updates now wait three days by default, with no configuration required.
  • Dependabot security updates are unaffected and still open immediately, so patches are never held back.
  • PyPI rejects new files on releases older than 14 days, closing off the poisoning of long-stable versions.
  • PyPI says the technique it just blocked has not been seen in the wild, so the change is preventative.
  • GitHub is explicit that a cooldown does nothing against dormant backdoors, maintainer sabotage or compromised build systems.

What to do now

Medium urgency
  1. Check whether your dependabot.yml already sets a cooldown value and confirm it still reflects your risk tolerance
  2. Consider a shorter window for trusted internal registries and a longer one for busy public registries
  3. Update Python release processes that add wheels to published versions so they cut a new version instead
  4. Keep the surrounding layers in place: lockfile pinning, scoped CI tokens, disabled install scripts, human review before merge

The Dependabot cooldown is now on by default. GitHub said in a changelog entry dated July 14, 2026 that Dependabot waits at least three days after a release lands on its registry before opening a version update pull request, and published the reasoning on July 23. Nine days earlier, on July 22, the Python Package Index announced it now rejects new files uploaded to any release older than 14 days. Both changes treat elapsed time as a security control.

Neither measure stops anyone from publishing malicious code. Both shrink the window in which that code can slip into a build unnoticed, which is where a large share of recent package attacks have lived.

GitHub and PyPI both added time-based supply chain controls in July 2026, a default three-day Dependabot cooldown and a 14-day cutoff for new files on PyPI releases.

Dependabot now delays version update pull requests by three days by default, tunable through the cooldown option in dependabot.yml. Security updates still open right away. PyPI stops accepting new files on releases older than 14 days, so a stolen publishing token can no longer poison a version people already trust.

Affected & context

Event summary

GitHub made a three-day cooldown the default for Dependabot version updates in a changelog entry dated July 14, 2026, and explained the reasoning in a blog post on July 23. The Python Package Index announced on July 22, 2026 that it now rejects new files uploaded to releases older than 14 days. Both measures use elapsed time to reduce the impact of compromised packages and publishing credentials.

Why it matters

Automated dependency tooling is fast enough to pull a poisoned release into a build pipeline before anyone notices it. A short delay removes that path without asking teams to change how they work.

Who is affected

Every repository using Dependabot version updates on github.com, plus Python maintainers who publish wheels or source distributions to already-released versions on PyPI.

Vendors
GitHubPython Software Foundation
Products
GitHub DependabotPyPIGitHub Enterprise Server 3.23
Geography
Global
Industry
Software developmentOpen sourceDevSecOps

What GitHub and PyPI changed

Two package ecosystems added time-based controls within nine days of each other. GitHub made a three-day wait the default for Dependabot version updates, announced in a changelog entry dated July 14, 2026. PyPI announced on July 22 that it no longer accepts new files uploaded to a release once that release is more than 14 days old.

The two measures solve different problems with the same instrument. GitHub is slowing down how fast a fresh release reaches your repository. PyPI is stopping anyone from quietly editing the contents of a release that people already trust.

Neither change blocks a malicious upload at the source. Both shorten the period in which that upload can do damage without anyone looking at it.

How the Dependabot cooldown works

The Dependabot cooldown is a minimum age requirement on a release before Dependabot will act on it. Under the new default, Dependabot waits until a version has been available on its registry for at least three days, then opens the version update pull request as usual. Nothing needs to be configured for this to apply.

One distinction carries most of the weight here, and a lot of the coverage has blurred it. The default applies only to version updates, the routine pull requests that keep dependencies current. Security updates, which respond to a published advisory for a package you already use, still open immediately. A delay there would hold back a fix for a flaw that is already public.

Teams that want a different window can set one through the cooldown option in .github/dependabot.yml, including opting out. GitHub says the default covers all supported ecosystems on github.com and will reach GitHub Enterprise Server in version 3.23.

Pull requests, not merges

Dependabot opens pull requests, it does not merge them. Several reports have described the cooldown as delaying automatic adoption of updates, which overstates what the tool does on its own.

Why GitHub settled on three days

Carlin Cherry, a product manager working on Dependabot at GitHub, laid out the reasoning on July 23, 2026. The anchor case is the September 2025 npm compromise, where an attacker phished one maintainer's credentials and published trojanised versions of chalk, debug and around a dozen other packages that together see more than 2 billion downloads a week. The code rewrote cryptocurrency wallet addresses in any browser app that loaded it, and the poisoned versions were live for roughly two hours.

Two hours is a quick community response. It is also more than enough for update tooling built to grab the newest release on sight.

The pattern repeats. GitHub points to compromised builds of Solana web3.js, Axios and ua-parser-js, each caught within hours, and to a review of 21 reported incidents between 2018 and 2026 showing the same short lifespan. Its own Advisory Database published more than 6,500 npm malware advisories in the year ending May 2026, up from roughly 6,200 the year before, which works out to about 18 new malicious npm packages catalogued per day.

What PyPI's 14-day rule blocks

PyPI releases used to be open ended. A maintainer could add a wheel or a source distribution to a published version at any point, years later if they wanted, without changing the version number. That flexibility had a sharp edge: anyone holding a stolen publishing token could drop a malicious file into a release that developers had trusted for months.

Seth Larson, Security Developer-in-Residence at the Python Software Foundation, announced on July 22, 2026 that PyPI now refuses those uploads once a release passes 14 days. He is direct about the status of the threat. As far as PyPI is aware the technique has not been abused, and the only thing that stopped it was that attackers had not realised it was possible.

Larson also flags what the change reduces on the operations side. Compromises no longer leave a release in a confusing half state where only some of its files are poisoned, which cuts the cleanup work for PyPI administrators.

The PyPI change took two years to land

The idea first surfaced during the PEP 740 digital attestations discussion in January 2024, then stalled. The blocker was legitimate: some projects add wheels for newly released Python versions to an existing release rather than cutting a new one, and closing the window would break that habit.

The discussion restarted in March 2026 after the LiteLLM and Telnyx packages were compromised through a mutable reference in their use of the Trivy GitHub Action. To size the disruption, PyPI queried its database for projects publishing files to old releases, then looked specifically at cp314 wheels across the top 15,000 packages. Only 56 of those 15,000 had published a Python 3.14 compatible wheel more than 14 days after the release first appeared.

Mike Fiedler, PyPI Safety and Security Engineer, brought the topic to the Packaging Summit at PyCon US 2026. Attendees reached rough consensus that asking maintainers to bump the version was acceptable. Larson's patch merged on July 8, 2026.

Who actually needs to do something?

Most teams need to do nothing. The Dependabot default is already live and requires no configuration, and the practical effect is that routine version bumps show up three days later than they used to.

Two groups should check their setup. Teams that already had a cooldown configured in dependabot.yml keep their own value, so it is worth confirming that value is still what you want now that the platform default has moved. Teams running tightly controlled internal registries may reasonably want a shorter window than three days for those sources.

Python maintainers have a real workflow change. If your release process adds wheels for a new interpreter version to an existing release, that will now fail after two weeks and you need to publish a new version instead. PyPI is explicit that nothing should be built on top of this behaviour yet, because there are no defined semantics for a release that stops accepting files and no API to check that state. Both arrive with the Upload 2.0 API and staged previews under PEP 694.

What a cooldown does not fix

GitHub is unusually clear about the limits of its own control. A cooldown targets one pattern: a malicious version that ships, spreads and gets caught quickly. It does little against a backdoor planted in a release and left dormant, against maintainer sabotage, or against a compromised build system, because in those cases the extra days buy no additional scrutiny.

The recommended layers around it are familiar and worth restating: pin dependencies with lockfiles, disable install scripts in CI where you can, scope the tokens in build pipelines tightly, and review updates before they merge.

Two things are worth watching. Whether other registries follow with defaults rather than opt-in settings, since npm added staged publishing earlier in 2026 and the direction of travel is consistent. And whether PEP 694 lands the formal semantics for closed releases, which is what would let tooling reason about release state instead of guessing.

Timeline

  1. PyPI merges the 14-day restriction

    Seth Larson's patch rejecting new files on old releases is merged into the Warehouse codebase.

    Source: PyPI blog

    Confidence: High

  2. Dependabot cooldown becomes the default

    GitHub's changelog announces that version updates wait at least three days, with no configuration required, across all supported ecosystems on github.com.

    Source: GitHub Changelog

    Confidence: High

  3. PyPI publishes the announcement

    The PyPI blog explains the 14-day cutoff, the data behind it, and the link to PEP 694.

    Source: The Python Package Index Blog

    Confidence: High

  4. GitHub publishes its reasoning

    Carlin Cherry sets out the case for three days, citing advisory database volumes and a review of past incidents.

    Source: The GitHub Blog

    Confidence: High

Impact

Routine dependency updates now arrive three days later on GitHub by default, and Python release workflows that add files to old versions will start failing. Both effects are small operationally and remove a well-documented attack path.

Business impact

Minimal. Dependency currency slips by three days on version updates, while security patches keep their existing speed.

Technical impact

Version update pull requests are delayed by a minimum release age. PyPI uploads to releases older than 14 days are rejected outright.

Security impact

Removes the fast path by which a short-lived poisoned release reaches a build, and closes off retroactive poisoning of established PyPI releases.

Affected audience: Development teams using Dependabot, Python package maintainers, Platform and DevSecOps engineers, MSPs and consultancies managing client pipelines

Action required.

Technical details

Attack vector
Not applicable. These are defensive platform changes rather than a vulnerability. The pattern they address is publication of a malicious package version, or upload of a malicious file to an existing release using stolen publishing credentials.
MITRE ATT&CK
T1195.002 Supply Chain Compromise: Compromise Software Supply Chain

Mitigations

  • Keep the default three-day Dependabot cooldown, or tune it per ecosystem
  • Pin dependencies with lockfiles
  • Disable install scripts in CI where possible
  • Scope build pipeline tokens narrowly
  • Review dependency updates before merge rather than auto-merging

Technical references

Response

Vendor statement

GitHub says the three-day default applies only to version updates and that security updates still open right away, since delaying those would hold back a fix for an already public flaw.

Customer guidance

GitHub points users to the cooldown option in .github/dependabot.yml to set a different window or opt out, and recommends lockfiles, scoped tokens, disabled CI install scripts and pre-merge review as surrounding layers. PyPI advises maintainers to publish a new version rather than adding files to an old release, and says the new behaviour should not be relied on programmatically yet.

Response status: Resolved

Patch available: No

Workaround available: No

Updates

  1. Initial draft

    First version, built from the GitHub changelog of July 14, 2026, the GitHub blog of July 23, and the PyPI blog of July 22.

    Update source

FAQ

Does the Dependabot cooldown delay security fixes?

No. The three-day default applies only to version updates, the routine pull requests that keep dependencies current. Dependabot security updates, which respond to a published advisory affecting a package you use, still open immediately. GitHub's stated reason is that delaying them would hold back a fix for a flaw that is already public.

Can I change or turn off the cooldown?

Yes. The cooldown option in .github/dependabot.yml still controls the behaviour, so you can set a longer or shorter window or opt out entirely. GitHub suggests a shorter window may suit tightly controlled internal packages, while projects pulling from busy public registries may prefer longer. Existing configured values are unaffected by the new default.

Why 14 days for PyPI releases?

PyPI needed a window that closes the poisoning path without breaking maintainers who add wheels for new Python versions to an existing release. It queried its database and found that among the top 15,000 projects, only 56 had published a Python 3.14 compatible wheel more than 14 days after the release first appeared.

Has anyone actually poisoned an old PyPI release?

Not that PyPI is aware of. Seth Larson wrote that the technique has not been abused, and that nothing technical had prevented it beyond attackers not realising it was possible. The change is preventative. The March 2026 LiteLLM and Telnyx compromises restarted the discussion but used a different route, a mutable reference in their Trivy GitHub Action usage.

What do I do if my release workflow adds wheels later?

Publish a new version instead. That was the rough consensus reached at the PyCon US 2026 Packaging Summit, where PyPI Safety and Security Engineer Mike Fiedler brought the proposal. Uploads to a release will now fail once it passes 14 days, so a workflow that builds wheels for a newly released interpreter needs to target a fresh version number.

The bottom line

GitHub made a three-day cooldown the default for Dependabot version updates, and PyPI stopped accepting new files on releases older than 14 days. Both changes shipped in July 2026 and both use elapsed time to limit supply chain damage.

Waiting is now a first-class supply chain control, and it is free, but it only covers the fast-moving attacks that get caught quickly.

What happens next

Watch whether other registries move from opt-in delays to defaults, and whether PEP 694 delivers the formal semantics that would let tooling reason about closed releases.

What to do

Check your dependabot.yml cooldown value, and audit any Python release workflow that adds files to already-published versions.

Sources

  1. GitHub · Jul 14, 2026 · Primary source

  2. The GitHub Blog · Jul 23, 2026 · Primary source

  3. The Python Package Index Blog · Jul 22, 2026 · Primary source

  4. LWN.net · Jul 22, 2026

  5. Help Net Security · Jul 23, 2026

  6. BleepingComputer · Jul 26, 2026

Reader actions
Was this helpful?
Rate this articleRate
7 readers viewed this article

Reader reviews

Rate this articleBe the first to rate
No written reviews yetRate the article above, or be the first to share your experience.