+1 (non-binding)

Thanks for preparing the release!

I tested 3.4.0rc1 from PyPI against Airflow 3.4.0 in Breeze (SQLite,
example Dags), and the official smoke test passed. I also ran a few extra
checks: the client loads the details of all 246 example Dags, as well as
Dag runs and task instances, and the new 3.4.0 features I tried work as
expected (draining a Dag, filtering Dag runs by tags, the is_scheduled
filter, asset events by partition_key, job filters, Dag version diff and
bundle details). The SHA-512 of the SVN wheel matches, and the wheel
installs and passes the same smoke test.

One non-blocking note: the "Non-interactive smoke test" commands in the
release guide don't work as written. The version variable is set on the
host and never reaches the Breeze container, and the wheel path should be
/dist instead of /opt/airflow/dist. The airflowctl guide has the same
issue. This only affects the docs, not the release, and I opened a PR to
update it: https://github.com/apache/airflow/pull/76870

Best,
Kevin

On Mon, Nov 9, 2026 at 7:14 AM Rahul Vats <[email protected]> wrote:

> Hey fellow Airflowers,
>
> The release candidate for Apache Airflow Python Client 3.4.0rc1 is now
> available for testing!
>
> This email is calling for a vote on the release, which will last at least
> 72 hours, from Mon, Nov 9, 2026 at 12:00 PM UTC
> until Thursday, Nov 12, 2026 at 12:00 PM UTC, and until 3 binding +1 votes
> have been received.
>
> Consider this my (binding) +1.
>
> Airflow Client 3.4.0rc1 is available at:
> https://dist.apache.org/repos/dist/dev/airflow/clients/python/3.4.0rc1/
>
> The apache_airflow_client-3.4.0.tar.gz is an sdist release that contains
> INSTALL instructions, and also
> is the official source release.
>
> The apache_airflow_client-3.4.0-py3-none-any.whl is a binary wheel release
> that pip can install.
>
> Those packages do not contain .rc* version as, when approved, they will be
> released as the final version.
>
> The rc packages are also available at PyPI (with rc suffix) and you can
> install it with pip as usual:
> https://pypi.org/project/apache-airflow-client/3.4.0rc1/
>
> Public keys are available at:
> https://dist.apache.org/repos/dist/release/airflow/KEYS
>
> Only votes from PMC members are binding, but all members of the community
> are encouraged to test the release and vote with "(non-binding)".
>
> The test procedure for PMC members is described in:
>
> https://github.com/apache/airflow/blob/main/dev/README_RELEASE_PYTHON_CLIENT.md\#verify-the-release-candidate-by-pmc-members
>
> The test procedure for contributors and members of the community who would
> like to test this RC is described in:
>
> https://github.com/apache/airflow/blob/main/dev/README_RELEASE_PYTHON_CLIENT.md\#verify-the-release-candidate-by-contributors
>
> *Changelog:*
>
> ## New Features:
>
> - Let plugins add their own actions to Dag, run and task instance rows
> (#75427)
> - Add an API endpoint comparing two stored Dag versions (#73322)
> - Allow filtering the Dag runs list by Dag tags (#70861)
> - Add a draining state for graceful Dag pausing (#72407)
> - Add bulk pause, drain and unpause actions to the Dags list (#73055)
> - Add a Dag bundle detail endpoint listing the files in a bundle (#73009)
> - Add an `is_scheduled` filter to the REST API (#72029)
> - Add an API endpoint for backfill Dag run entries (#67381)
> - Add a bundle-version parameter to the Dag run trigger endpoint (#61550)
> - Add an exact-match `uri` filter to `GET /assets` (#69489)
> - Add `partition_key` and `partition_key_regexp_pattern` filters for asset
> events (#64610)
> - Add extra-field filtering for asset events (#64611)
> - Add filters and pagination to the jobs list (#68616)
> - Add an Asset Tab plugin (#69986)
> - Add React plugin support to Dag and task overviews (#69992)
> - Add `owner_display_name` substring and prefix filters to the Dag list
> (#70583)
> - Add a team column and filter to the Dag run and task instance lists
> (#70241)
> - Add a team column and filter to the jobs list (#73295)
> - Add a team column and filter to the XComs list (#72158)
> - Add a team column and filter to the audit log (#71916)
> - Add a team filter to the Human-in-the-loop task instances listing
> (#73726)
> - Add Task Loops: expose loop iterations and outcomes via
> `loop_id`/`iteration` filters and a `LoopIterationResponse` (#74354)
> - Read current task executions by exact loop region
> (`region_id`/`region_index`) and try (#74350)
> - Clear selected task-loop work and regenerate only what was replaced
> (#74349)
> - Describe a task at a specific Dag version via the task endpoint (#74365)
> - Filter task instances by `loop_id` and a single loop pass (#74931)
>
> ## Improvements:
>
> - Expose the retry deadline on task instances and reset run fields when a
> retry starts (#76028)
> - Surface the retry-policy decision on task instances (#73030)
> - Attribute log, asset-event and asset-state writes to the task attempt
> (#74347)
> - Expose an `in_loop` flag on task instances (#74352)
> - Give every mapped expansion a loop region, including a `409` on region
> conflicts (#74346)
> - Let loop gates record human-readable decisions (#74932)
> - Number task loop iterations from one instead of zero (#75260)
> - Deprecate cyclic TaskGroup dependencies, adding a `task group cycle` Dag
> warning (#73746)
> - Scope plugin views on any entity field, not a fixed criteria set (#74278)
> - Allow scoping plugin tabs to specific Dags and tasks (#69148)
> - Add a `team_name` attribute to plugins for multi-team (#69502)
> - Allow a Job to be associated with several teams (#73561)
> - Expand the health endpoint reporting (#70416)
> - Add `source_reference` and `language` to the warning, import-error and
> Dag source models (#72474)
> - Add a `duplicate dag id` Dag warning type (#68791)
> - Show Dag bundle versions and refresh times (#72909)
> - Show the owning team in asset dependencies (#71446)
> - Show the owning team on Dag, Dag run and task instance detail responses
> (#70312)
> - Add `owner_display_name` to the audit log (#68833)
> - Return a `file_token` on Dag import errors for requesting a reparse
> (#72896)
> - Allow explicit runs to drain a paused Dag (#73763)
> - Type `asset_expression` in the REST API so consumers need not cast
> through unknown (#67725)
> - Document HTTP statuses that route helpers raise (#74027)
> - Keep OpenAPI error responses in sync with the statuses routes raise
> (#71647)
> - Document favorite Dag's 409 and return a readable conflict message
> (#73411)
> - Make `latest_dag_version` a required field on the Dag details response
> (#74247)
>
> ## Bug Fixes:
>
> - Clear retry-policy state when a task instance is cleared (#75646)
> - Reject non-positive `max_active_runs` when creating a backfill (#75320)
> - Reject blank pool names and variable keys in the REST API (#75258)
> - Fix HTTP 500 when ordering the Dag list by state or start date (#75148)
> - Refuse a Human-in-the-loop response for a request the task has since
> replaced (#74982)
> - Filter the jobs `is_alive` check in SQL so pagination stays correct
> (#73684)
> - Discard a task instance's stored task-state values when it is cleared
> (#72100)
> - Clear all task instances in a task group, not just the first page
> (#73547)
> - Require a request body on the asset materialize endpoint (#73328)
> - Hide unreadable assets in the asset expression served by
> `next_run_assets` (#72864)
> - Stop reporting components as degraded after an instance restart (#73222)
> - Return asset events for Dag runs without a start date (#71379)
> - Fix the Dag detail HTTP 500 for Dags without a `fileloc` (#69110)
>

Reply via email to