Safeguard
Application Security•

A Dependency Update Policy With Cooldowns and Grouped PRs

A cooldown slows routine updates but must never slow a security fix. A working Dependabot policy, using the PyJWT 2.14.0 release as the test case.

Safeguard Security Team
4 min read

On September 28, 2026, PyJWT 2.14.0 shipped with fixes for several signature verification bypasses, including CVE-2026-102272, where a public JWK with a UTF-8 byte-order mark could be treated as an HMAC secret. That release is the test of any dependency update policy: your tooling should hold back routine bumps for a few days and still put this one in front of a human at once.

Dependabot supports both halves of that. Here is how to configure it, from GitHub's options reference.

What's affected

PyJWT 2.13.0 up to, but not including, 2.14.0 is affected in a mixed-algorithm verification path. Any project pinned there needs the update. The policy question is how it reaches you.

Dependabot has two update kinds with different rules:

  • Version updates follow your dependabot.yml schedule. They are where cooldown and most grouping apply.
  • Security updates open when an advisory matches a dependency. GitHub's docs state that cooldown is only for version updates, so a vulnerability fix is not delayed by it.

How to check if you're exposed

pip show pyjwt | grep -i '^version'
grep -rn "pyjwt" requirements*.txt pyproject.toml poetry.lock uv.lock 2>/dev/null

Then check your policy file: cat .github/dependabot.yml. If it has no cooldown block, GitHub's reference says a default 3 day cooldown applies to version updates.

What to do now

  1. Upgrade PyJWT to 2.14.0 or later where you use it.
  2. Set an explicit cooldown, longer for major versions than patches.
  3. Group routine updates so a weekly run opens a few pull requests, not forty.
  4. Keep security updates in their own group, and keep them out of the cooldown.
  5. Exempt packages you control or must track closely, with exclude.

A policy that does this:

version: 2
updates:
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
    cooldown:
      default-days: 5
      semver-major-days: 30
      semver-minor-days: 14
      semver-patch-days: 3
      exclude:
        - "our-internal-*"
    groups:
      routine:
        applies-to: version-updates
        patterns:
          - "*"
        update-types:
          - "minor"
          - "patch"
      security:
        applies-to: security-updates
        patterns:
          - "*"

Per the reference, exclude wins over include, an update type without its own day count falls back to default-days, and a dependency that matches several groups lands in the first one. Major updates stay as individual pull requests here because they are not in the routine group, which keeps breaking changes reviewable.

How this could have been avoided

A cooldown is a control against a different failure: a compromised or broken release that is yanked within days. It would not have helped with PyJWT, where the new release is the fix. The risk to avoid is a policy that blurs the two.

  • Separate the paths. Version updates wait. Security updates do not.
  • Alert on the advisory, not on the release. A matching advisory should page a person.
  • Review the group, not each line. Grouped minor and patch updates still run CI on the combined change.
  • Pin by lockfile and hash, so a cooldown on new versions is not undone by a floating range at install time.

Why it matters

Update policy is where supply chain caution and patch speed pull against each other. Delay raises your odds of skipping a bad release, and the same delay raises your exposure to a real vulnerability if it applies to fixes.

The configuration above resolves it by kind rather than by compromise: routine work waits and batches, and advisory work goes through immediately. Write that rule down in the repository, next to the YAML, so the next person who edits it knows why.

Try it yourself

Take one repository, add the cooldown and groups blocks, and let one weekly run complete. Count the pull requests before and after. Then look for a pending security update and confirm it is not grouped with, or held by, the routine rules.

Click through it at your own pace, or open it full screen.

Quick check

Does a Dependabot cooldown delay security updates?

No. GitHub's documentation says the cooldown option applies only to version updates, not security updates.

What happens if you configure no cooldown at all?

GitHub's reference says Dependabot applies a 3 day cooldown to version updates by default.

Sources

Never miss an update

Weekly insights on software supply chain security, delivered to your inbox.

Self-healing security runs on Safeguard.

Your first fix PR is minutes away.

No sales call required, even your agent can complete the purchase over MCP.