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- Check whether your dependabot.yml already sets a cooldown value and confirm it still reflects your risk tolerance
- Consider a shorter window for trusted internal registries and a longer one for busy public registries
- Update Python release processes that add wheels to published versions so they cut a new version instead
- 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
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.
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.
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
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
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
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
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
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.
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
GitHub · Jul 14, 2026 · Primary source
The GitHub Blog · Jul 23, 2026 · Primary source
The Python Package Index Blog · Jul 22, 2026 · Primary source
LWN.net · Jul 22, 2026
Help Net Security · Jul 23, 2026
BleepingComputer · Jul 26, 2026