โ ๏ธ Breaking Change
Impact Score: 7/10
Apache Airflow 2.2.0
Source available โ automated, not human-reviewed
Component: airflow ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.
Analysis updated: 2026-11-01.
Breaking-change evidence from the source
- Pins ``docutils`` to <0.17 until breaking behaviour is fixed (#16133)
โก Executive Summary (TL;DR)
Apache Airflow 2.2.0. Source highlight: AIP-39: Add (customizable) Timetable class to Airflow for richer scheduling behaviour (#15397, #16030,
Who Does This Impact? (Role-Based Analysis)
๐ป Software Engineers & Devs
Check the source notes against the package and APIs you use before upgrading.
๐ Product & Engineering Leads
Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.
โ๏ธ DevOps & Security
Verify the target version, runtime requirements and rollback procedure in the official documentation.
โ ๏ธ Breaking Changes & Deprecations (1)
- - Pins ``docutils`` to <0.17 until breaking behaviour is fixed (#16133)
โจ New Features & Capabilities (6)
- AIP-39: Add (customizable) Timetable class to Airflow for richer scheduling behaviour (#15397, #16030,
- AIP-40: Add Deferrable "Async" Tasks (#15389, #17564, #17565, #17601, #17745, #17747, #17748, #17875,
- Add a Docker Taskflow decorator (#15330, #18739)
- Add Airflow Standalone command (#15826)
- Display alert messages on dashboard from local settings (#18284)
- Advanced Params using json-schema (#17100)
โก Performance & Enhancements (6)
- Small improvements for Airflow UI (#18715, #18795)
- Rename ``processor_poll_interval`` to ``scheduler_idle_sleep_time`` (#18704)
- Check the allowed values for the logging level (#18651)
- Avoid importing DAGs during clean DB installation (#18450)
- Require can_edit on DAG privileges to modify TaskInstances and DagRuns (#16634)
- Make Kubernetes job description fit on one log line (#18377)
๐ง Bug Fixes & Patches (6)
- Fix error on triggering a dag that doesn't exist using ``dagrun_conf`` (#18655)
- Fix ``airflow celery stop`` to accept the pid file. (#17278)
- Make REST API patch user endpoint work the same way as the UI (#18757)
- Properly set ``start_date`` for cleared tasks (#18708)
- Ensure task_instance exists before running update on its state(REST API) (#18642)
- Make ``AirflowDateTimePickerWidget`` a required field (#18602)
๐ View Raw Release Notes (Original Developer Log)
### New Features
- AIP-39: Add (customizable) Timetable class to Airflow for richer scheduling behaviour (#15397, #16030,
#16352, #17030, #17122, #17414, #17552, #17755, #17989, #18084, #18088, #18244, #18266, #18420, #18434,
#18421, #18475, #18499, #18573, #18522, #18729, #18706, #18742, #18786, #18804)
- AIP-40: Add Deferrable "Async" Tasks (#15389, #17564, #17565, #17601, #17745, #17747, #17748, #17875,
#17876, #18129, #18210, #18214, #18552, #18728, #18414)
- Add a Docker Taskflow decorator (#15330, #18739)
- Add Airflow Standalone command (#15826)
- Display alert messages on dashboard from local settings (#18284)
- Advanced Params using json-schema (#17100)
- Ability to test connections from UI or API (#15795, #18750)
- Add Next Run to UI (#17732)
- Add default weight rule configuration option (#18627)
- Add a calendar field to choose the execution date of the DAG when triggering it (#16141)
- Allow setting specific ``cwd`` for BashOperator (#17751)
- Show import errors in DAG views (#17818)
- Add pre/post execution hooks [Experimental] (#17576)
- Added table to view providers in Airflow ui under admin tab (#15385)
- Adds secrets backend/logging/auth information to provider yaml (#17625)
- Add date format filters to Jinja environment (#17451)
- Introduce ``RESTARTING`` state (#16681)
- Webserver: Unpause DAG on manual trigger (#16569)
- API endpoint to create new user (#16609)
- Add ``insert_args`` for support transfer replace (#15825)
- Add recursive flag to glob in filesystem sensor (#16894)
- Add conn to jinja template context (#16686)
- Add ``default_args`` for ``TaskGroup`` (#16557)
- Allow adding duplicate connections from UI (#15574)
- Allow specifying multiple URLs via the CORS config option (#17941)
- Implement API endpoint for DAG deletion (#17980)
- Add DAG run endpoint for marking a dagrun success or failed(#17839)
- Add support for ``kinit`` options ``[-f|-F]`` and ``[-a|-A]`` (#17816)
- Queue support for ``DaskExecutor`` using Dask Worker Resources (#16829, #18720)
- Make auto refresh interval configurable (#18107)
### Improvements
- Small improvements for Airflow UI (#18715, #18795)
- Rename ``processor_poll_interval`` to ``scheduler_idle_sleep_time`` (#18704)
- Check the allowed values for the logging level (#18651)
- Fix error on triggering a dag that doesn't exist using ``dagrun_conf`` (#18655)
- Add muldelete action to ``TaskInstanceModelView`` (#18438)
- Avoid importing DAGs during clean DB installation (#18450)
- Require can_edit on DAG privileges to modify TaskInstances and DagRuns (#16634)
- Make Kubernetes job description fit on one log line (#18377)
- Always draw borders if task instance state is null or undefined (#18033)
- Inclusive Language (#18349)
- Improved log handling for zombie tasks (#18277)
- Adding ``Variable.update`` method and improving detection of variable key collisions (#18159)
- Add note about params on trigger DAG page (#18166)
- Change ``TaskInstance`` and ``TaskReschedule`` PK from ``execution_date`` to ``run_id`` (#17719)
- Adding ``TaskGroup`` support in ``BaseOperator.chain()`` (#17456)
- Advises the kernel to not cache log files generated by Airflow (#18054)
- Allow filtering DAGS by tags in the REST API (#18090)
- Optimize imports of Providers Manager (#18052)
- Adds capability of Warnings for incompatible community providers (#18020)
- Serialize the ``template_ext`` attribute to show it in UI (#17985)
- Add ``robots.txt`` and ``X-Robots-Tag`` header (#17946)
- Refactor ``BranchDayOfWeekOperator``, ``DayOfWeekSensor`` (#17940)
- Update error message to guide the user into self-help mostly (#17929)
- Update to Celery 5 (#17397)
- Avoid redirect loop for users with no permissions (#17838)
- Improve graph view load time for dags with open groups (#17821)
- Add links to provider's documentation (#17736)
- Remove Marshmallow schema warnings (#17753)
- Rename ``none_failed_or_skipped`` by ``none_failed_min_one_success`` trigger rule (#17683)
- Remove ``[core] store_dag_code`` & use DB to get Dag Code (#16342)
- Rename ``task_concurrency`` to ``max_active_tis_per_dag`` (#17708)
- Import Hooks lazily individually in providers manager (#17682)
- Adding support for multiple task-ids in the external task sensor (#17339)
- Replace ``execution_date`` with ``run_id`` in airflow tasks run command (#16666)
- Avoid endless redirect loop when user has no roles (#17613)
- Make output from users cli command more consistent (#17642)
- Open relative extra links in place (#17477)
- Move ``worker_log_server_port`` option to the logging section (#17621)
- Use gunicorn to serve logs generated by worker (#17591)
- Improve validation of Group id (#17578)
- Simplify 404 page (#17501)
- Add XCom.clear so it's hookable in custom XCom backend (#17405)
- Add deprecation notice for ``SubDagOperator`` (#17488)
- Support DAGS folder being in different location on scheduler and runners (#16860)
- Remove /dagrun/create and disable edit form generated by F.A.B (#17376)
- Enable specifying dictionary paths in ``template_fields_renderers`` (#17321)
- error early if virtualenv is missing (#15788)
- Handle connection parameters added to Extra and custom fields (#17269)
- Fix ``airflow celery stop`` to accept the pid file. (#17278)
- Remove DAG refresh buttons (#17263)
- Deprecate dummy trigger rule in favor of always (#17144)
- Be verbose about failure to import ``airflow_local_settings`` (#17195)
- Include exit code in ``AirflowException`` str when ``BashOperator`` fails. (#17151)
- Adding EdgeModifier support for chain() (#17099)
- Only allows supported field types to be used in custom connections (#17194)
- Secrets backend failover (#16404)
- Warn on Webserver when using ``SQLite`` or ``SequentialExecutor`` (#17133)
- Extend ``init_containers`` defined in ``pod_override`` (#17537)
- Client-side filter dag dependencies (#16253)
- Improve executor validation in CLI (#17071)
- Prevent running ``airflow db init/upgrade`` migrations and setup in parallel. (#17078)
- Update ``chain()`` and ``cross_downstream()`` to support ``XComArgs`` (#16732)
- Improve graph view refresh (#16696)
- When a task instance fails with exception, log it (#16805)
- Set process title for ``serve-logs`` and ``LocalExecutor`` (#16644)
- Rename ``test_cycle`` to ``check_cycle`` (#16617)
- Set process title for Worker when using ``LocalExecutor`` (#16623)
- Add schema as ``DbApiHook`` instance attribute (#16521, #17423)
- Improve compatibility with MSSQL (#9973)
- Add transparency for unsupported connection type (#16220)
- Call resource based fab methods (#16190)
- Format more dates with timezone (#16129)
- Replace deprecated ``dag.sub_dag`` with ``dag.partial_subset`` (#16179)
- Treat ``AirflowSensorTimeout`` as immediate failure without retrying (#12058)
- Marking success/failed automatically clears failed downstream tasks (#13037)
- Add close/open indicator for import dag errors (#16073)
- Add collapsible import errors (#16072)
- Always return a response in TI's ``action_clear`` view (#15980)
- Add cli command to delete user by email (#15873)
- Use resource and action names for FAB permissions (#16410)
- Rename DAG concurrency (``[core] dag_concurrency``) settings for easier understanding (#16267, #18730)
- Calendar UI improvements (#16226)
- Refactor: ``SKIPPED`` should not be logged again as ``SUCCESS`` (#14822)
- Remove version limits for dnspython (#18046, #18162)
- Accept custom run ID in TriggerDagRunOperator (#18788)
### Bug Fixes
- Make REST API patch user endpoint work the same way as the UI (#18757)
- Properly set ``start_date`` for cleared tasks (#18708)
- Ensure task_instance exists before running update on its state(REST API) (#18642)
- Make ``AirflowDateTimePickerWidget`` a required field (#18602)
- Retry deadlocked transactions on deleting old rendered task fields (#18616)
- Fix `retry_exponential_backoff` divide by zero error when retry delay is zero (#17003)
- Improve how UI handles datetimes (#18611, #18700)
- Bugfix: dag_bag.get_dag should return None, not raise exception (#18554)
- Only show the task modal if it is a valid instance (#18570)
- Fix accessing rendered ``{{ task.x }}`` attributes from within templates (#18516)
- Add missing email type of connection (#18502)
- Don't use flash for "same-page" UI messages. (#18462)
- Fix task group tooltip (#18406)
- Properly fix dagrun update state endpoint (#18370)
- Properly handle ti state difference between executor and scheduler (#17819)
- Fix stuck "queued" tasks in KubernetesExecutor (#18152)
- Don't permanently add zip DAGs to ``sys.path`` (#18384)
- Fix random deadlocks in MSSQL database (#18362)
- Deactivating DAGs which have been removed from files (#17121)
- When syncing dags to db remove ``dag_tag`` rows that are now unused (#8231)
- Graceful scheduler shutdown on error (#18092)
- Fix mini scheduler not respecting ``wait_for_downstream`` dep (#18338)
- Pass exception to ``run_finished_callback`` for Debug Executor (#17983)
- Make ``XCom.get_one`` return full, not abbreviated values (#18274)
- Use try/except when closing temporary file in task_runner (#18269)
- show next run if not none (#18273)
- Fix DB session handling in ``XCom.set`` (#18240)
- Sort adopted tasks in ``_check_for_stalled_adopted_tasks`` method (#18208)
- Fix external_executor_id not being set for manually run jobs (#17207)
- Fix deleting of zipped Dags in Serialized Dag Table (#18243)
- Return explicit error on user-add for duplicated email (#18224)
- Remove loading dots even when last run data is empty (#18230)
- Swap dag import error dropdown icons (#18207)
- Automatically create section when migrating config (#16814)
- Set encoding to utf-8 by default while reading task logs (#17965)
- Set task state to failed when pod is DELETED while running (#18095)
- Apply parent dag permissions to subdags (#18160)
- Change id collation for MySQL to case-sensitive (#18072)
- Logs task launch exception in ``StandardTaskRunner`` (#17967)
- Applied permissions to ``self._error_file`` (#15947)
- Hide variable import form if user lacks permission (#18000)
- Fix blank dag dependencies view (#17990)
- Add missing menu access for dag dependencies and configurations pages (#17450)
- Fix passing Jinja templates in ``DateTimeSensor`` (#17959)
- Fixing bug which restricted the visibility of ImportErrors (#17924)
- Fix grammar in ``traceback.html`` (#17942)
- Fix ``DagRunState`` enum query for ``MySQLdb`` driver (#17886)
- Fixed button size in "Actions" group. (#17902)
- Fix log links on graph TI modal (#17862)
- Only show import errors for DAGs a user can access (#17835)
- Show all import_errors from zip files (#17759)
- fix EXTRA_LOGGER_NAMES param and related docs (#17808)
- Use one interpreter for Airflow and gunicorn (#17805)
- Fix: Mysql 5.7 id utf8mb3 (#14535)
- Fix dag_processing.last_duration metric random holes (#17769)
- Automatically use ``utf8mb3_general_ci`` collation for MySQL (#17729)
- Fix wrong query on running tis (#17631)
- Add root to tree refresh url (#17633)
- Do not delete running DAG from the UI (#17630)
- Rescue if a DagRun's DAG was removed from db (#17544)
- fix: filter condition of ``TaskInstance`` does not work #17535 (#17548)
- Regression on pid reset to allow task start after heartbeat (#17333)
- Dont use TaskInstance in CeleryExecutor.trigger_tasks (#16248)
- Remove locks for upgrades in MSSQL (#17213)
- Create virtualenv via python call (#17156)
- Ensure a DAG is acyclic when running ``DAG.cli()`` (#17105)
- Translate non-ascii characters (#17057)
- Change the logic of ``None`` comparison in ``model_list`` template (#16893)
- Have UI and POST /task_instances_state API endpoint have same behaviour (#16539)
- ensure task is skipped if missing sla (#16719)
- Fix direct use of ``cached_property`` module (#16710)
- Fix TI success confirm page (#16650)
- Cattrs 1.7.0 released by the end of May 2021 break lineage usage (#16173)
- Fix Celery executor getting stuck randomly because of reset_signals in multiprocessing (#15989)
- Modify return value check in python virtualenv jinja template (#16049)
- Fix dag dependency search (#15924)
- Make custom JSON encoder support ``Decimal`` (#16383)
- Bugfix: Allow clearing tasks with just ``dag_id`` and empty ``subdir`` (#16513)
- Convert port value to a number before calling test connection (#16497)
- Handle missing/null serialized DAG dependencies (#16393)
- Correctly set ``dag.fileloc`` when using the ``@dag`` decorator (#16384)
- Fix TI success/failure links (#16233)
- Correctly implement autocomplete early return in ``airflow/www/views.py`` (#15940)
- Backport fix to allow pickling of Loggers to Python 3.6 (#18798)
- Fix bug that Backfill job fail to run when there are tasks run into ``reschedule`` state (#17305, #18806)
### Doc only changes
- Update ``dagbag_size`` documentation (#18824)
- Update documentation about bundle extras (#18828)
- Fix wrong Postgres ``search_path`` set up instructions (#17600)
- Remove ``AIRFLOW_GID`` from Docker images (#18747)
- Improve error message for BranchPythonOperator when no task_id to follow (#18471)
- Improve guidance to users telling them what to do on import timeout (#18478)
- Explain scheduler fine-tuning better (#18356)
- Added example JSON for airflow pools import (#18376)
- Add ``sla_miss_callback`` section to the documentation (#18305)
- Explain sentry default environment variable for subprocess hook (#18346)
- Refactor installation pages (#18282)
- Improves installing from sources pages for all components (#18251)
- Doc: Use ``closer.lua`` script for downloading sources (#18179)
- Improves quick-start docker-compose warnings and documentation (#18164)
- Production-level support for MSSQL (#18382)
- Update non-working example in documentation (#18067)
- Improve the description of how to handle dynamic task generation (#17963)
- Remove default_args pattern + added get_current_context() use for Core Airflow example DAGs (#16866)
- Update max_tis_per_query to better render on the webpage (#17971)
- Adds Github Oauth example with team based authorization (#17896)
- Update docker.rst (#17882)
- Example xcom update (#17749)
- Add doc warning about connections added via envvars (#17915)
- fix wrong documents around upgrade-check.rst (#17903)
- Add Brent to Committers list (#17873)
- Improves documentation about modules management (#17757)
- Remove deprecated metrics from metrics.rst (#17772)
- Make sure "production-readiness" of docker-compose is well explained (#17731)
- Doc: Update Upgrade to v2 docs with Airflow 1.10.x EOL dates (#17710)
- Doc: Replace deprecated param from docstrings (#17709)
- docs(dagowner): describe dag owner more carefully (#17699)
- docs(impersonation): update note so avoid misintrepretation (#17701)
- Docs: Make ``DAG.is_active`` read-only in API (#17667)
- Improve cross-links to operators and hooks references (#17622)
- Update documentation regarding Python 3.9 support (#17611)
- Fix MySQL database character set instruction (#17603)
- Document overriding ``XCom.clear`` for data lifecycle management (#17589)
- Path correction in docs for airflow core (#17567)
- docs(celery): reworded, add actual multiple queues example (#17541)
- Doc: Add FAQ to speed up parsing with tons of dag files (#17519)
- Improve image building documentation for new users (#17409)
- Doc: Strip unnecessary arguments from MariaDB JIRA URL (#17296)
- Update warning about MariaDB and multiple schedulers (#17287)
- Doc: Recommend using same configs on all Airflow components (#17146)
- Move docs about masking to a new page (#17007)
- Docs: Suggest use of Env vars instead of Airflow Vars in best practises doc (#16926)
- Docs: Better description for ``pod_template_file`` (#16861)
- Add Aneesh Joseph as Airflow Committer (#16835)
- Docs: Added new pipeline example for the tutorial docs (#16548)
- Remove upstart from docs (#16672)
- Add new committers: ``Jed`` and ``TP`` (#16671)
- Docs: Fix ``flask-ouathlib`` to ``flask-oauthlib`` in Upgrading docs (#16320)
- Docs: Fix creating a connection docs (#16312)
- Docs: Fix url for ``Elasticsearch`` (#16275)
- Small improvements for README.md files (#16244)
- Fix docs for ``dag_concurrency`` (#16177)
- Check syntatic correctness for code-snippets (#16005)
- Improvements for Docker Image docs (#14843)
- Add proper link for wheel packages in docs. (#15999)
- Add Docs for ``default_pool`` slots (#15997)
- Add memory usage warning in quick-start documentation (#15967)
- Update example ``KubernetesExecutor`` ``git-sync`` pod template file (#15904)
- Docs: Fix Taskflow API docs (#16574)
- Added new pipeline example for the tutorial docs (#16084)
- Updating the DAG docstring to include ``render_template_as_native_obj`` (#16534)
- Update docs on setting up SMTP (#16523)
- Docs: Fix API verb from ``POST`` to ``PATCH`` (#16511)
### Misc/Internal
- Renaming variables to be consistent with code logic (#18685)
- Simplify strings previously split across lines (#18679)
- fix exception string of ``BranchPythonOperator`` (#18623)
- Add multiple roles when creating users (#18617)
- Move FABs base Security Manager into Airflow. (#16647)
- Remove unnecessary css state colors (#18461)
- Update ``boto3`` to ``<1.19`` (#18389)
- Improve coverage for ``airflow.security.kerberos module`` (#18258)
- Fix kinesis test (#18337)
- Fix provider test acessing importlib-resources (#18228)
- Silence warnings in tests from using SubDagOperator (#18275)
- Fix usage of ``range(len())`` to ``enumerate`` (#18174)
- Test coverage on the autocomplete view (#15943)
- Update version added fields in airflow/config_templates/config.yml (#18128)
- Add "packaging" to core requirements (#18122)
- Adds LoggingMixins to BaseTrigger (#18106)
- Limit colorlog version (6.x is incompatible) (#18099)
- Fix building docs in ``main`` builds (#18035)
- Remove upper-limit on ``tenacity`` (#17593)
- Remove redundant ``numpy`` dependency (#17594)
- Bump ``mysql-connector-python`` to latest version (#17596)
- Make ``pandas`` an optional core dependency (#17575)
- Add more typing to airflow.utils.helpers (#15582)
- Chore: Some code cleanup in ``airflow/utils/db.py`` (#17090)
- Refactor: Remove processor_factory from DAG processing (#16659)
- Remove AbstractDagFileProcessorProcess from dag processing (#16816)
- Update TaskGroup typing (#16811)
- Update ``click`` to 8.x (#16779)
- Remove remaining Pylint disables (#16760)
- Remove duplicated try, there is already a try in create_session (#16701)
- Removes pylint from our toolchain (#16682)
- Refactor usage of unneeded function call (#16653)
- Add type annotations to setup.py (#16658)
- Remove SQLAlchemy <1.4 constraint (#16630) (Note: our dependencies still have a requirement on <1.4)
- Refactor ``dag.clear`` method (#16086)
- Use ``DAG_ACTIONS`` constant (#16232)
- Use updated ``_get_all_non_dag_permissions`` method (#16317)
- Add updated-name wrappers for built-in FAB methods (#16077)
- Pins ``docutils`` to <0.17 until breaking behaviour is fixed (#16133)
- Remove ``TaskInstance.log_filepath`` attribute (#15217)
- Removes unnecessary function call in ``airflow/www/app.py`` (#15956)
- Move ``plyvel`` to google provider extra (#15812)
- Update permission migrations to use new naming scheme (#16400)
- Use resource and action names for FAB (#16380)
- Swap out calls to ``find_permission_view_menu`` for ``get_permission`` wrapper (#16377)
- Fix deprecated default for ``fab_logging_level`` to ``WARNING`` (#18783)
- Allow running tasks from UI when using ``CeleryKubernetesExecutor`` (#18441)