That is a very good set of questions - and I am glad we start discussing it,

I had a lot of thoughts about that recently - because of Airflow NPM
dependencies behaviour when comparing to - for example Python. I think we
largely figured good aproach for it in Python

*Tl;DR; NPM and lock mechanism is a bit problematic for us and I think even
for convenience packages we look for ways to give our users ways to update
their dependencies for released convenience packages.*

*First a bit of context - how we do Python (and convenience images) in
Airflow:*

Let me explain how we do it in Airflow for Python, and how I am thinking we
can do something similar for NPM.

For Airflow Python we almost always use lower-bound but non-upper-bound
dependencies - i.e we specify "pytorch>x.y.a" but we very, very rarely
(only when we have a good reason do `sqlalchemy>x.y.z,<2` - when we
**know** we are not compatible with Sqlalchemy 2. This usually happens when
our dependencies have a well defined release process, and usually
semver-like guarantees, and it also means that 1.x has patchlevel releases
with security fixes we can depend on. Whenever we upper-bound a dependency
we make a comment why, we open an issue describing it and add link to the
issue to the comment and the issue explains conditions and what is blocking
us from removing the upper-binding  (and we periodically review and remove
those when conditions are met or even run a project to do so - like it
happens at the very moment with sqlalchemy 2 upgrade: [1]

This means that our users are usually absolutely free to upgrade the
dependencies (after sufficient testing) - we are **not** blocking them.
This is a very strong policy we have and the main idea is that when we
release our software - applying any "future" fixes to CVEs in our
dependencies might heppen in two ways:

* our future release will include those fixed versions (automatically as we
do not upper-bind and we are testing latest versions and highest
resolutions of our dependencies in canary build 8 times a day to make sure
we fix all incompatibilities
* USER is responsible to upgrade and test older releases and get those
dependencies upgraded

Even in CRA - we are steward, not manufacturer - so it's manufacturers
responsibility to "put software on the market without known, exploitable
vulnerabilities" - so it's on THEM not us to make sure whenever a
vulnerability is found in one of our deps, to upgrade those.

There are some nuances - of course any **new** version of such upper-bound
dependency might break airflow - that's why we produce a "golden set" of
dependencies that we knew as "working" during the release - and we publish
them as "constraints" that we recommend our users to use when they want to
install released airflow version in a reproducible way. Then, after they do
it, and if they want to upgrade to a new version of dependency that has
fixed a vulnerability they can do it "on top of that". The first paragraph
of our "installing from PyPI" describes this process here [2]

Effectively it means that the users of ours have two choices:

* if they want to upgrade dependencies in released software - in vast
majority of cases we are not blocking them from that and it's on them to
make sure it happens
* or they can wait until we release a new version of Airflow with (pretty
much automatically) those deps upgraded by us

There are edge-cases of course that are handled individually but those are
exceptions rather than a rule even if in Airflow we have in total 750+
dependencies - it works nicely with this setup if you ask me. And it not
only works for "sources" we release but also for convenience packages
(whl/sdist) that we also publish.

*How is NPM different ?*

Now - NPM is a different beast altogether - because by package.lock and
minifying the javascript with it, we are effectively blocking our users
from doing similar things - upgrading the npm deps - without actually
taking the sources, modifying them and rebuilding the packages. Which 95%+
of our users will never do. I understand (and I am happy with) the fact
that ASF releases sources and the rest is just "convenience packages" - yet
many of our users (including the vast majority of future manufacturers who
will release Airflow) are mainly consuming our .whl package. We make them
reproducible and we also publish them at "https://downloads.apache.org"; -
similarly as our sources, so users can easily do binary artifact
comparison with our signed/checksummed binaries) - but they will have
really hard time if we tell them - if you want to upgrade NPM dependencies
you need to rebuild all packages from the sources and you need to modify
the package.lock in those sources before. That's mostly a non-go. They will
expect ASF to release updated versions with those dependencies upgraded and
even more - they will likely **demand** us to release patchlevels for old
releases (2.7.45, where 3.2.1 is already available) with those dependencies
bumped. I do  not like it. Our policy for releases is that we release only
the latest MINOR branch with patchlevel fixes. Full stop. If a user wants
to update a dependency in an older version we want THEM to  do it (and
manufacturers will be on a hook for that) - but we do not want us to have
to do anything other than tell manufacturers how they can do it and send
them to the page which explains how. And it should be easy for end users to
apply it.

I want to figure out if that would be possible with NPM. My initial idea is
to produce a separate convenience source package with only things that npm
needs and make it possible to build such a "patch" package by anyone and
add a procedure explaining how you can build and test such a patch with
latest dependencies. Very similarly as we do with our docker containers. We
explain our users already - that when they want to update some of the
container images they use, we will generally **never** re-build those
released images, but they are absolutely free to rebuild the containers
themselves and use latest dependencies from debian available - also they
can extend such images with updated new version of python packages.  We
have a dedicated chapter about it in our documentation [3]

*Why do I think such a "npm-only rebuild" instructions are needed ?*

Now - maybe such a tooling (to easily rebuild and replace packages for NPM
packages already exists ? Or maybe from our side it's just a matter of
writing some custom package builder script to do so? Such a tooling also
should include some rudimentary (or even quite comprehensive) regression
tests that will allow such a user to be reasonably sure that the newly
released dependencies do not break their build.

I still have not looked at details - but for me having this is quite a game
changer that gives you worry-free release mechanism:

* make sure that when you release - you bump deps to latest (fairly easy)
* when you release a version - freeze the latest "minor" release - and do
not worry about 3rd-party released in-between - you explicitly explain that
you "freeze" the versions (as we do with docker container)
* then, put it on the users and make it easy so that they can build and use
a hassle-free way (replacement of compiled code with NPM) that contains the
SAME code we released in that version but with updated NPM dependencies.

This will give us a very powerful leverage to discuss things with
manufacturers who - undoubtedly - will start banging our doors at the day
CRA is going to be effective with "Release a new version of Airflow with
those dependency issues fixed ASAP:". In which case our response will be
"here is the link that explains how you can do it yourself, we never
release old versions because dependencies that were "latest" at the moment
of release have some vulnerabilities - but here is the instruction on how
you can do it yourself'. And BTW -  We accept any donation to us if you
want our security team to work even better as currently it's purely
volunteers and your money as manufacturer would be very helpful to improve
our processes".

I hope it might be helpful in the discussion (though probably far too long
for anyone to get thus far).

Links referred to:

[1] Issue with sqlalchemy 2 upgrade :
https://github.com/apache/airflow/issues/56735
[2] Installing from PyPI using "golden set"  + upgrading to latest Python
dependencies
https://airflow.apache.org/docs/apache-airflow/stable/installation/installing-from-pypi.html
[3] What should I do if my security scan shows critical and high
vulnerabilities in the image?
https://airflow.apache.org/docs/docker-stack/index.html#what-should-i-do-if-my-security-scan-shows-critical-and-high-vulnerabilities-in-the-image






On Fri, Oct 31, 2025 at 10:48 AM Piotr P. Karwasz <[email protected]>
wrote:

> Hi Bryan,
>
> On 31.10.2025 07:57, Bryan Ellis wrote:
> > Question:
> >
> > If a Dependabot PR appears during the middle of a release vote — and it
> > updates a sub-dependency to fix a security issue — **does that invalidate
> > or terminate the vote?**
>
>
> No, only the release manager has the authority to cancel a vote.
>
> > What exactly are we voting on?
> >
> > 1. **The "release vote package"** — the tarball uploaded to `dist/dev`,
> > created using `npm pack`, representing what a consumer would receive when
> > installing the package.
> > 2. **The Git release tag** — the tag created in the repository, which a
> > consumer could also install directly (e.g., `npm install
> > github:apache/project-repo#1.0.0`).
> > 3. **The repository clone** — a developer clones the repo, checks out the
> > release tag, and runs `npm install` within the repository.
>
>
> This is consistent across the ASF: votes are cast on the source release
> package, which must be sufficient for a user to build and test the
> release [1]. Only the source package constitutes an official act of the
> Foundation.
>
> Compiled artifacts (such as those published to NPM) are provided as a
> convenience to users, but they are not considered an official ASF release.
>
> These rules exist because, in compiled languages, it’s difficult to
> verify that a compiled artifact precisely matches the source. However,
> thanks to reproducible-build efforts, projects like Log4j also verify
> the reproducibility of JARs whenever possible. This verification is a
> prerequisite for allowing releases to be built via GitHub Actions (i.e.,
> on infrastructure not owned or directly controlled by the release manager).
>
> ## Vulnerabilities in dependencies
>
> If a vulnerability is disclosed in any dependency of the project, I
> generally follow this rule of thumb:
>
> - If you ship the dependency, you effectively own it. You should make a
>   reasonable effort to release versions without “known exploitable
>   vulnerabilities”.
> - If you do not ship the dependency, it’s sufficient to document its
>   presence. You don’t need to block or reissue a release solely because
>   of it.
>
> If your packages include an `npm-shrinkwrap.json` file, I would pause
> the release to assess the potential impact of the vulnerability. Without
> it, you can assume that users will receive the same Dependabot PR and
> handle the update independently.
>
>
> Piotr
>
> [1] https://www.apache.org/legal/release-policy.html#artifacts
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail:
> [email protected]
>
>

Reply via email to