Problem/Motivation
We have a long-standing policy of tagging core security releases from the previous tag instead of the current branch, to minimise the set of changes involved for sites to update to the security release.
I think this policy dates back to Drupal 7, and as the core release cycle has developed over the past 10 years I'm not sure it is as useful as it used to be.
At the moment, we have multiple supported and development branches:
main - no releases
11.x - no releases
11.4.x - patch and security releases
11.3.x - security only
10.6.x - patch and security releases.
Last month we had some additional overlap with the 11.2 and 10.5 branches, which were security-only for several months.
To release from the previous tag involves staging all of these multiple branches + MRs against the tag in the private security repositories. This adds a lot of overhead to tagging security releases relative to regular core patch releases. It also requires a freeze on all core branches including main for the duration of the window.
Our security-only branches by definition don't get commits other than for security releases, with a couple of exceptions:
1. Updates to core dependencies that have had their own security releases
2. Very occasionally fixes to random or persistent test failures to make the release process more reliable.
In both of those cases, tagging from the previous security tag release causes problems because it will miss the dependency updates. We end up having to incorporate those commits into the security release process, or doing extra 'bonus' patch releases, as we did for 11.2 and 10.6, or leaving dangling commits on the branch in the case of test fixes.
The only branches that can have new commits on them when it's time to release a security release are 11.4.x and 10.6.x anyway.
10.6.x gets very infrequent commits at this point, it's more or less equivalent to 11.3.x - in its last six months of support.
11.4.x does get much more frequent commits but for the past couple of weeks, approximately half of the commits to 11.4.x have been for (larger or smaller) regressions from 11.3.x. Some proportion of sites will update directly from 11.3.x to an 11.4.x security release, and if that does not include fixes for known regressions since the last minor, this can cause the same problem we're trying to solve. You could say they should update to the latest 11.3.x release first but it's impossible to get hundreds of thousands of site owners to follow the same instructions identically.
In this case we've done three out-of-schedule patch releases for 11.4 to incorporate the fixes to those regressions, but we don't always do that, depending on the issue we often wait a couple of weeks for the regular patch window. Additionally, only a tiny fraction of Drupal sites are on 11.4.x, most are on 11.3.x and 10.6.x
There are two cases where releasing from the branch is riskier, and more likely to make it difficult for sites to update promptly to the security release:
Steps to reproduce
Proposed resolution
Between a patch release (usually the first Wednesday of the month) and a security release window (usually the third Wednesday of the month), freeze backports to release branches. The issues can be left at patch (to be ported) or RTBC.
This leaves the branch 'clean' to tag a security release with only those changes. Dependency updates, fixes for critical regressions etc. which we explicitly want to be bundled with a security release could be backported to the branch on a case-by-case basis.
When we reach the release window, we would either either cherry-pick the backports beginning 24-48 hours after the release (to allow time for a paper bag release if something is wrong with the security release), or as soon as we've announced the window will not be used.
In the case of a highly critical zero day when there are already commits on the branch, we would either:
1. Revert all commits since the previous tag, then unrevert them under the release, to allow releasing off the branch.
2. Branch off the tag and release as we do currently.
Comments
Comment #2
catchComment #3
catchAnother thing that makes this less useful than it would be - most sites aren't on the most recent patch release anyway because they don't update to and then deploy to production core patch releases between the time they're released and the next security window.
Note that the numbers below include several releases that actually were security releases, if we have a longer period without security releases in between, a much higher percentage of sites fall behind.
From https://new.drupal.org/project/usage/drupal
Comment #4
longwaveI am +1 to everything mentioned here, the reason this was created was that @catch had already had the idea when I brought it up independently. As one of the few people with the capability of tagging security releases, the additional overhead is painful - especially with the increased cadence of releases recently - and given that we almost always fix more things in patch releases than we break, I think this change would save time and effort for everyone.
I agree that there might be times when we want to fall back to the old method of branching from the previous tag - the highly critical 0-day scenario mentioned in the IS for example - but that should not be the default.
It's worth noting that Symfony and Twig (amongst many other projects) already follow this policy of bundling bug fixes into security releases.
Comment #5
benjifisherThe issue summary lists the current branches: main, 11.x, 11.4.x, 11.3.x, 10.6.x. A month ago, we would also consider 10.5.x.
The proposed change does not affect main nor 11.x, since there are no releases on those branches.
I agree with the proposed change for the security-only branches: 11.3.x and (until recently) 10.5.x. Most of the time, the change makes no difference for these branches, and the exceptions mentioned in the issue summary are commits that should be included in any release.
That leaves two branches: 11.4.x and 10.6.x. I think we should be cautious about changing the policy for these.
From Comment #3:
I tell people all the time that the best practice is to keep up to date, so that regular patch releases can be tested in the regular manner and security releases can be deployed quickly, with minimal testing. Behind that advice is the promise that security releases are carefully designed to be minimally disruptive, more so than regular patch releases. I would like to maintain that promise for the benefit of the sites that follow the best practice, even if they are in the minority.
Have we already done as much as we can to automate the process? I know the release managers have a collection of scripts they use for preparing releases; perhaps they can be improved for the case of preparing security releases.
Comment #6
catchI think that would still be good advice.
For example here's the diff between 11.3.6 (April 8th) and 11.3.7 (security release, April 15th):
There were only five commits to 11.3.x in that time.
Or between 11.3.9 and 11.3.10:
got this by running git log --since 2026-05-06 --before 2026-54-20 --pretty=oneline on the 11.3.x branch.
We're already quite conservative about what goes into patch releases, and I think we'd probably want to be even more conservative if we go ahead here. As mentioned above we could also hold backports to patch release between the patch release date and the security window, and backport them afterwards.
Comment #7
damienmckennaIt has been the Drupal community's recommendation to always do security fixes on their own, to not bundle them with other changes, for core and for contrib. If core's policies change are we also going to stop recommending this process to contrib maintainers too? And if not, why not?
While more complicated, IMHO it's cleaner to do security-only fixes.
Comment #8
godotislateThis seems reasonable. We'd need to make sure not to lose track of outstanding backports, but otherwise this seems straightforward to do.
Comment #9
catch@damienmckenna I think we can still do security-only fixes with this proposal. As noted in #6 for two recent releases, we've had between 5-10 commits in between the patch release and the security release. We can defer backports for a couple of weeks and bring that down to zero. It needs a little bit of monitoring and thought, but we already have that with backports to patch releases or at the moment especially, between majors too where something like 50+% of 11.x backports need a separate MR.
Delaying backports to release branches also has its own benefits in that it gives time for any regressions to surface against the minor branch first. A recent example' was #3045509: EntityFieldManager key/value field map gets out of sync, doesn't recognise bundle fields - a major bugfix, nothing actually wrong with the commit, but it broke contrib modules that were relying on the long-standing buggy behaviour. If we'd known about that before we'd backported it to the release branch, we could have left the commit in the minor branch and skipped the patch-level backport entirely.
In some cases we actively include non-embargoed fixes into security releases (test fixes, dependency updates, potentially fixes for regressions if we think those would be a barrier to updating to the security release) and those could be backported on a case by case basis much easier than now.
@godotislate yeah it would mean keeping track of https://www.drupal.org/project/issues/search/drupal?text=&assigned=&subm... but we already have to do that to an extent. And the worst case if something gets lost in there is that people have to wait for the next minor release. Updated the issue summary to make that the only proposal, that gets us the main benefits to site owners of the current policy, with the minimum of overhead for us.
Currently we have to freeze commits on all branches for 36 hours for a security window, but if we release off the branches I think we could leave the development branches open more or less throughout.