Apache Airflow 3.3.0stable Released Jul 06, 2026
โš ๏ธ Breaking Change Impact Score: 7/10

Apache Airflow 3.3.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

  • - Fix older and custom secrets backends breaking on Airflow 3.2 (#68302)
  • - Fix Dag run partition key filter breaking on composite keys containing ``|`` (#68459)
Read the original context โ†—
Source flags breaking changes โ€” review applicability
๐Ÿ“„ .MD
โšก Executive Summary (TL;DR)

Apache Airflow 3.3.0. Source highlight: ๐Ÿ“ฆ PyPI: https://pypi.org/project/apache-airflow/3.3.0/

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 (2)

  • - Fix older and custom secrets backends breaking on Airflow 3.2 (#68302)
  • - Fix Dag run partition key filter breaking on composite keys containing ``|`` (#68459)

โœจ New Features & Capabilities (6)

  • Add partition clear support to the REST API matching the CLI, with a ``clearPartitions`` endpoint and ``partition_key``/``partition_date`` window selectors on ``clearDagRuns`` (#68702)
  • Add ``[core] mp_start_method`` and ``[core] mp_forkserver_preload`` configuration options (which can be overridden per ``[scheduler]``/``[triggerer]``/``[dag_processor]``) to control the ``multiprocessing`` start method (#68875)
  • Add a ``durable`` toggle to ``ResumableJobMixin`` to opt out of resumable execution (#68623)
  • Add a ``@result`` decorator to mark a TaskFlow task as the Dag's result task (#64563)
  • Add ``[triggerer] shared_stream_cohort_grace_period`` to reduce missed events on triggerer restart (#68888)
  • Propagate ``partition_date`` from producer Dag runs to consumers of partitioned assets (#67285)

โšก Performance & Enhancements (6)

  • Improve ``airflow dags`` command to use bulk clear (#68280)
  • Improve ``ResumableJobMixin`` crash-recovery observability with better logging (#68206)
  • Enhance ``ResumableJobMixin.get_job_status`` with context for better job status tracking (#68009)
  • Improve creation of ``RuntimeTaskInstance`` in ``TriggerRunner`` for ``start_for_trigger`` functionality (#64298)
  • UI: Improve the Human-In-The-Loop form UX (#68397)
  • Improve standalone authentication documentation for Airflow 3.x (#65330)

๐Ÿ”ง Bug Fixes & Patches (6)

  • Add patch task state API and ``expires_at`` support in the set API (AIP-103) (#67319)
  • Add patching of task group instances in the API (#62812)
  • Fix ``KubernetesExecutor`` scheduler crash caused by a ``pod_override`` that cannot be pickled when running in-cluster (#68831)
  • UI: Fix dashboard alert clamping and collapse controls (#68893)
  • Stabilize mapped-task XCom result ordering in the Dag run ``wait`` endpoint by ordering on ``task_id``/``map_index`` (#68550)
  • Only log task state cleanup when a worker state store backend is configured (#68878)
๐Ÿ“„ View Raw Release Notes (Original Developer Log)
๐Ÿ“ฆ PyPI: https://pypi.org/project/apache-airflow/3.3.0/ ๐Ÿ“š Docs: https://airflow.apache.org/docs/apache-airflow/3.3.0/ ๐Ÿ›  Release Notes: https://airflow.apache.org/docs/apache-airflow/3.3.0/release_notes.html ๐Ÿณ Docker Image: "docker pull apache/airflow:3.3.0" ๐Ÿš Constraints: https://github.com/apache/airflow/tree/constraints-3.3.0 ## Significant Changes ### Asset Partitioning (#64571, #65447, #66030, #66848, #67184, #67475, #67716, #68978) Building on the asset partitioning introduced in 3.2.0, Airflow 3.3.0 substantially expands how a single upstream asset event fans out to partitioned downstream Dag runs. New partition mappers โ€” ``RollupMapper`` (many-to-one), ``FanOutMapper`` (one-to-many), and ``FixedKeyMapper`` + ``SegmentWindow`` (categorical rollup) โ€” compose with time windows (day/week/month/quarter/year) and a ``wait_policy`` (``WaitForAll`` or ``MinimumCount(n)``) to control when partitioned runs fire. Windows can fan out forward or backward in time, and total fan-out per upstream event is bounded by the new ``[scheduler] partition_mapper_max_downstream_keys`` config (configurable per mapper). Airflow 3.3.0 also adds the ``PartitionedAtRuntime`` timetable, which lets a Dag declare that its partition key(s) are assigned when the run starts rather than mapped from an upstream event. For detailed usage instructions, see :doc:`/authoring-and-scheduling/assets`. ### Task and Asset State Store (#65759, #66073, #66160, #66463, #66586, #66859, #67041, #67292, #67319) Airflow 3.3.0 introduces a first-class state store for tasks and assets (AIP-103). Tasks can persist arbitrary key-value state that survives across retries and runs via a new ``task_state_store`` accessor, and assets can carry their own state via ``asset_state_store`` โ€” both available from the Task SDK. State is kept in the metadata database by default, or in a custom worker-side backend (``[workers] state_store_backend``), supports per-key retention with periodic garbage collection and an optional ``clear_on_success``, and is fully manageable through the Core API and Execution API. For detailed usage instructions, see :doc:`/core-concepts/task-and-asset-state-store`. ### Pluggable Retry Policies (#65474) Task retry behaviour is now pluggable (AIP-105). In addition to a fixed ``retries`` count, you can attach a custom retry policy that decides whether and when a task is retried, enabling strategies such as retrying only on specific exceptions or backing off based on custom logic. For detailed usage instructions, see :ref:`concepts:retry-policies`. ### Language Task SDK (Java and Go) (#65958, #67161, #67635, #67699) Airflow 3.3.0 adds a Coordinator layer (AIP-108) that lets individual task implementations be written in non-Python languages while the Dag and its scheduling stay in Python. A task is declared in the Dag with ``@task.stub(queue=...)``; the worker routes it to a configured coordinator (``JavaCoordinator`` for JVM languages, ``ExecutableCoordinator`` for self-contained native binaries such as Go) that runs the task in a language runtime and proxies Variables, Connections, and XComs back through the Execution API. .. warning:: The Coordinator layer and the Java/Go SDKs are experimental in 3.3.0 and may change in future versions based on user feedback. For detailed usage instructions, see :doc:`/authoring-and-scheduling/language-sdks/index`. ### Dag bundle version on clear, rerun, and backfill (#63884) The new ``rerun_with_latest_version`` setting controls whether a cleared, rerun, or backfilled Dag run uses the latest bundle version or the original version from the initial run. The default is resolved by precedence: an explicit request parameter/CLI flag, then the Dag-level ``rerun_with_latest_version``, then ``[core] rerun_with_latest_version``, and finally ``False`` for clear/rerun and ``True`` for backfills (preserving historical behaviour). Airflow 2.x always reran with the latest code; 3.x introduced bundle versioning defaulting to the original version, and this setting gives users control. See :doc:`/administration-and-deployment/dag-bundles` for full details. ### Provider example Dags as dedicated bundles (#66161) Example Dags shipped by provider distributions are now discovered via ``ProvidersManager`` and registered as their own Dag bundles โ€” one per provider, named ``apache-airflow-providers-<distribution>-example-dags`` (or ``<distribution>-example-dags`` for third-party providers). The ``[core] load_examples`` option still gates whether they are registered. REST API clients that filtered ``bundle_name`` by ``"dags-folder"`` for provider-shipped example Dags must update to the new per-provider bundle names; Dag identifiers are unchanged. ### Remote logging resolution decoupled from ``airflow.logging_config`` (#67056) Remote task log handler resolution is now owned by the shared ``airflow_shared.logging.factory`` module and applies a single, well-defined precedence: 1. a user-defined ``[logging] logging_config_class`` exporting ``REMOTE_TASK_LOG`` / ``DEFAULT_REMOTE_CONN_ID`` (existing custom configs keep working); 2. ``ProvidersManager`` scheme dispatch โ€” the scheme of ``[logging] remote_base_log_folder`` selects a provider ``RemoteLogIO`` class, instantiated via a no-argument ``from_config()`` classmethod; 3. a transitional legacy fallback reading ``airflow_local_settings.py`` (to be removed in Airflow 4.0). ``airflow.logging_config.load_logging_config`` is deprecated (it now emits ``DeprecationWarning`` and delegates to new private helpers), and ``configure_logging`` no longer eagerly resolves the remote handler โ€” resolution is lazy on first use. Providers that registered a ``remote-logging:`` block but do not implement ``from_config`` are skipped with a warning and fall through to the legacy path. Migration: replace direct calls to ``airflow.logging_config.load_logging_config()`` with the new helpers, and have provider remote-log handler classes implement a no-argument ``from_config`` classmethod that reads ``airflow.providers.common.compat.sdk.conf``. ### OpenTelemetry timer metrics now use Histogram (#64207) OpenTelemetry timer and timing metrics are now recorded as Histograms instead of Gauges, preserving count, sum, and bucket distribution across recordings. ### Dag-processing "seconds ago" metric is now tagged (#62487) ``dag_processing.last_run.seconds_ago.{dag_file}`` is now a legacy metric. The new ``dag_processing.last_run.seconds_ago`` is emitted with ``file_path``, ``bundle_name`` and ``file_name`` tags (``file_path`` + ``bundle_name`` uniquely identify the Dag file). The legacy metric is still emitted by default and can be disabled via ``[metrics] legacy_names_on``. ### New Deadlines page under Browse (#67586) A new **Deadlines** page is available under the Browse menu, accessible to any role that already has ``can_read`` and ``menu_access`` on **Dag Runs**. ## New Features - Add partition clear support to the REST API matching the CLI, with a ``clearPartitions`` endpoint and ``partition_key``/``partition_date`` window selectors on ``clearDagRuns`` (#68702) - Add ``[core] mp_start_method`` and ``[core] mp_forkserver_preload`` configuration options (which can be overridden per ``[scheduler]``/``[triggerer]``/``[dag_processor]``) to control the ``multiprocessing`` start method (#68875) - Add a ``durable`` toggle to ``ResumableJobMixin`` to opt out of resumable execution (#68623) - Add a ``@result`` decorator to mark a TaskFlow task as the Dag's result task (#64563) - Add ``[triggerer] shared_stream_cohort_grace_period`` to reduce missed events on triggerer restart (#68888) - Propagate ``partition_date`` from producer Dag runs to consumers of partitioned assets (#67285) - Make the task and asset state store accessible from triggers via ``AssetStateStoreAccessors`` (#67839) - Add OpenTelemetry head sampling support (#68591) - Add async XCom ``accessors`` for async tasks (#68299) - Add an async ``aget_hook`` method to ``BaseHook`` for async tasks (#68506) - Allow custom partition ``Window`` subclasses via a plugin registry (#68717) - Support an ``extra`` field for the Coordinator (#68694) - Apply ``rerun_with_latest_version`` to ``TriggerDagRunOperator`` reruns (#67273) - Scope the XCom Execution API to teams in multi-team mode (#68850) - Enforce pool team ownership in the scheduling loop (#68649) - UI: Add team name to the asset graph view (#68457) - Populate ``partition_date`` for partitioned Dag runs whose composite asset key has a single time-based dimension (#68442) - UI: Add a column to the asset store table linking to the task instance that wrote it (#68395) - UI: Add a custom expiration datetime picker for the task store modal (#68394) - UI: Add additional task instance attributes to the task instance details section (#68378) - UI: Add a Details tab to the mapped task instance view (#68340) - UI: Add bulk marking of Dag runs as success or failed from multi-select (#68278) - Add ``--team-name`` support to the pool CLI commands (#68110) - UI: Add a full-screen toggle to the code viewer (#68044) - Add API endpoint support for consumer team asset filtering (#68034) - UI: Add bulk clear selection for task instances (#68029) - Add ``awaiting_input`` task state for Human-in-the-Loop, running off the triggerer (#68028) - Add bulk API to mark Dag runs as success or failed (#67948) - Record writer info for every asset store write for better cross-linkage (#67902) - Register XCom ``output_type`` classes from a worker-side Dag walk (#67875) - Add ``FixedKeyMapper`` and ``SegmentWindow`` for categorical asset-partition rollup (#67716) - Add a bulk ``POST /dags/{dag_id}/clearDagRuns`` API endpoint (#67709) - Return Pydantic model instances through XCom for structured output (#67644) - Add the ability to apply a note when clearing a Dag run or task instances (#67639) - Add ``consumer_teams`` to ``AssetAccessControl`` in the Task SDK (#67625) - Populate trigger ``team_name`` at creation time for multi-team support (#67605) - UI: Add bulk Clear on the Dag Runs list page (#67564) - Add multi-team query filtering to triggerer trigger assignment (#67517) - Add forward fan-out support via the ``forward`` kwarg on ``Window`` (AIP-76) (#67475) - Add patch task state API and ``expires_at`` support in the set API (AIP-103) (#67319) - Add a ``team_name`` column to the trigger table for multi-team triggerer support (#67305) - UI: Add asset and task store views (#67292) - Add a ``--team-name`` CLI argument to the triggerer for multi-team (#67254) - Add an ``allow_global`` option to asset access control (#67251) - Add mTLS and private CA support to the API client and server (#67214) - Add Markdown documentation support for TaskGroups (#67207) - Add a per-mapper ``max_fan_out`` override for partition fan-out cap (#67184) - Add timezone support to the SDK temporal partition mappers (#67164) - Add ``ResumableJobMixin`` with ``SparkSubmitOperator`` for surviving worker failures (#67118) - Add bulk delete for Dag runs (#67095) - Add a ``nav_top_level`` option for plugin nav items (#67084) - Add Core API endpoints for task state and asset state (AIP-103) (#67041) - Replace ``allow_producer_teams`` with ``access_control`` on ``Asset`` (#66954) - Add worker-side custom state backend support (AIP-103) (#66859) - Let partitioned Dag runs fire on a partial upstream window with ``wait_policy`` (#66848) - Consume task-emitted partition keys on asset events (AIP-76) (#66782) - Add per-task state key retention from operators (AIP-103) (#66699) - Add a ``callback_execution_timeout`` config for deadline callbacks (#66609) - Add a ``clear_on_success`` config to wipe task state on success (AIP-103) (#66586) - Add a ``partitions clear`` CLI command to reset DagRun partition fields (#66520) - Make CORS ``allow_credentials`` configurable (#66503) - Add periodic task state garbage collection and retention support (AIP-103) (#66463) - Add URI sanitizers and asset factories for new schemes (#66426) - Add a ``teams sync`` CLI command (#66418) - Add remote log upload support for callback subprocesses (#66379) - Add by-name/by-uri asset state routes and ``AssetUriRef`` support (AIP-103) (#66336) - UI: Add support for rendering multi-type params (#66278) - Filter Dags by teams when registering asset changes (#66168) - Wire up Task SDK communication and context access for task/asset state (AIP-103) (#66160) - UI: Add marking a task group as success or failed (#66146) - Add Execution API endpoints for task and asset states (AIP-103) (#66073) - Add ``FanOutMapper`` for one-to-many partition fan-out (#66030) - Add ``Variable.keys()`` to list variable keys by prefix in the Task SDK (#66022) - Add an ``airflow dags clear`` command for partition-range reprocessing (#66004) - Add a ``memray_detailed_tracing`` option for deeper memory profiling (#65996) - UI: Add support for different graph directions in the asset graph view (#65948) - UI: Add a Clear All Mapped Tasks button (#65813) - Add ``allow_producer_teams`` to the Asset SDK class (#65790) - UI: Show expected duration based on historical average in Dag Run details (#65722) - Add team name to the task context (#65617) - Add an ``on_kill()`` hook to ``BaseTrigger`` to handle user actions on triggers (#65590) - Allow accessing a Dag's members via ``[]`` (#65586) - Add pluggable retry policies for Airflow tasks (AIP-105) (#65474) - Add support for ``format="Duration"`` in params (#65469) - UI: Add pagination to the grid view (#65388) - Add ``partition_key`` to the task context (#65359) - Make the blocked-thread warning threshold configurable (#65009) - Add name fields to SDK deadline alerts (#64926) - Add dynamic interval resolution support via Variables for deadline alerts (#64751) - Add an ``is_backfillable`` property to Dag API responses (#64644) - Return dag-specified results in the dag run wait API (#64577) - Hold a Dag run until all upstream partitions arrive (AIP-76) (#64571) - Add a way to mark a return-value XCom as the dag result (#64522) - Allow accessing a TaskGroup's members via ``[]`` (#64430) - UI: Redo the Gantt chart (#64335) - UI: Add task-level filters to the Dag graph tab (#64271) - UI: Add bulk Clear, Mark Success/Fail, and delete for multiple task instances (#64141) - Check that multi-team is enabled when a team name is provided to the API (#63994) - Add a ``DagRunType`` for operators (#63733) - UI: Add search functionality to the task log viewer (#63467) - Add patching of task group instances in the API (#62812) - Add deadlines API endpoints (#62583) - Add async connection testing via workers for security isolation (#62343) - Add ``run_after`` to ``TriggerDagRunOperator`` (#62259) - UI: Display deadlines on the Dag Run and Overview tabs (#62195) - Re-enable the ``start_from_trigger`` feature with template-field rendering (#55068) - Backfill partitioned Dags by partition-date range (#67537) - Add a producer-side acknowledgement channel to shared-stream triggers (#67523) - UI: Add ``partition_date`` to the Dag run detail page (#68977) - Expose the upstream ``partition_key`` on ``triggering_asset_events`` and ``dag_run.consumed_asset_events`` (AIP-76) (#69120) - Allow ``get``/``set``/``delete``/``clear`` of ``AssetStateStoreAccessor`` to run on the triggerer (#68966) ## Bug Fixes - Fix ``KubernetesExecutor`` scheduler crash caused by a ``pod_override`` that cannot be pickled when running in-cluster (#68831) - UI: Fix dashboard alert clamping and collapse controls (#68893) - Stabilize mapped-task XCom result ordering in the Dag run ``wait`` endpoint by ordering on ``task_id``/``map_index`` (#68550) - Only log task state cleanup when a worker state store backend is configured (#68878) - Fix in-process Execution API loop stopped while transport still in use (#68865) - Fix task state store custom expiry datetime missing timezone on save (#68823) - Do not leak threads from ``InProcessExecutionAPI`` (#68840) - Fix partitioned backfill widening a sub-day window to the whole day (#68718) - UI: Fix inconsistent padding between Dag Runs and Task Instances list views (#68689) - Skip asset-change registration for tasks with no outlets (#68687) - Percent-encode API client path params for keys with slashes (#68667) - Fix bulk create+overwrite silently resetting unset fields on pools and connections (#68645) - Fix triggerer crash when a trigger subclass does not call ``super().__init__()`` (#68636) - Fix Task SDK swallowing errors when ``Variable.set()`` or ``Variable.delete()`` fails (#68542) - Populate ``partition_date`` when manually triggering partitioned Dags (#68458) - Improve warning visibility for invalid JSON when editing variables (#68268) - Fix the triggerer log server port configuration key (#67785) - Enforce ``ti:self`` scope on ``/execution/task-reschedules/{ti}/start_date`` (#67628) - UI: Fix misleading Calendar "Total Runs" coloring behavior (#67595) - Fix Stats not being initialized in the API server lifespan (#68514) - Fix ``BackfillDagRun.partition_key`` type annotation (#68432) - Fix backward compatibility for ``DagRunInfo`` partition fields (#68342) - Fix ``airflow db clean`` failing on foreign-key-referenced ``dag_version`` rows (#68339) - Fix 500 error when listing event logs with a NULL timestamp (#68338) - Fix MySQL downgrade from 3.3.0 for the ``deadline_alert.interval`` JSON conversion (#68337) - Fix older and custom secrets backends breaking on Airflow 3.2 (#68302) - Fix secrets backend connection errors being silently swallowed at DEBUG level (#68301) - UI: Fix the instance name title shown on non-Dag pages (#68288) - Fix scheduler not populating ``partition_date`` for temporal asset partitions (#68266) - UI: Fix wrong language being auto-detected from browser preferences (#68258) - Honor ``retry_policy`` on non-deferrable ``TriggerDagRunOperator`` wait failures (#68254) - Fix scheduler crash loop when the last task instance predates Dag versioning (#68253) - Fix team consumer asset filtering (#68242) - UI: Fix sluggish multi-selection behavior in tables (#68229) - UI: Fix mapped task instance links for tasks without a start date (#68194) - Fix setup/teardown auto-inclusion when clearing or marking tasks (#68193) - UI: Remove redundant columns from the XCom panel on the task instance page (#68188) - UI: Fix Gantt tooltip showing the wrong start date on queued/scheduled segments (#68176) - Fix Java SDK coordinator rejecting IPv4-mapped IPv6 connections (#68169) - Fix Java SDK tasks being rejected by the coordinator connection-ownership check (#68147) - UI: Fix language key for the Dag bundle filter (#68131) - Fix ``DagFileProcessorManager`` silent hang on database lock contention (#68118) - Mask all connection extra and variable values in the API audit log (#68049) - Fix spurious "Failed to detach context" error on Execution API disconnects (#68039) - UI: Fix Dag code highlighting for triple-quoted and escaped-brace f-strings (#68026) - Fix cursor encoding for column-form sort parameters in the REST API (#67973) - Fix ``SimpleAuthManager`` not preserving the deep-link next URL on first login (#67965) - Guard the task stats emission to prevent errors (#67955) - UI: Fix task instance state badge staying stale after a Mark-as action (#67950) - Register nested Pydantic models for XCom deserialization (#67932) - Fix ``example_asset_store`` consumer crash (#67922) - Raise ``InvalidJwtError`` in ``JWTValidator.avalidated_claims()`` when the key ID does not match (#67909) - Fix Kubernetes executor ``pod_override`` being stringified without the cncf provider (#67895) - UI: Prevent duplicate task instance summary stream refreshes after mutations (#67892) - Reject negative ``default_retention_days`` in the Task SDK and core API routes (#67890) - Fix ``none_failed_min_one_success`` trigger rule checks (#67873) - Remove trigger kwargs from the REST API response (#67868) - UI: Fix long parameter names overflowing the Trigger Dag modal (#67859) - Fix misleading log message in the task runner clear-on-success block (#67836) - Fix scheduler crash when logging orphaned task resets (#67822) - UI: Fix dashboard pool summary showing incorrect deferred slot usage (#67818) - Fix trigger datetime deserialization (#67795) - UI: Fix Graph layout for TaskGroup tasks wired to external nodes (#67720) - Fix ``airflow dags clear`` clearing the wrong day for non-UTC partitioned timetables (#67717) - Fix per-index evaluation of ``ONE_FAILED`` in mapped task groups (#67684) - UI: Fix dialog dismissal for the Chakra upgrade (#67674) - UI: Hide dashboard metric percentages when a state count is capped (#67664) - Apply per-file authorization to the dag-source endpoint (#67662) - Fix ``airflow dags next-execution --table`` crash when no next run exists (#67642) - UI: Fix the time picker omitting seconds (#67636) - Filter scheduling-dependencies graph edges by readable-Dag access (#67627) - Mask per-key secrets-backend-kwarg overrides on the Config API (#67622) - Fix ``GET /auth/login`` missing a 400 response in the OpenAPI spec (#67571) - Fix ``GET /pools`` incorrectly documenting a 404 response in the OpenAPI spec (#67570) - Add a compatibility layer for import errors caused by ``AirflowSecretsBackendAccessDenied`` (#67560) - UI: Fix rendering of None child state (#67552) - Fix sort order for mapped task instances (#67551) - Fix import errors total-entries count with multiple Dags per file (#67550) - UI: Prefer active over queued state for collapsed groups (#67543) - Fix callback state not updating from executor events due to a UUID type mismatch (#67542) - Reject wildcard origin in CORS config instead of toggling credentials (#67502) - Guard the finally-block logger in the HTTP access log middleware (#67501) - Strip CR/LF from user-supplied logical date before logging (#67500) - Redact secret-looking query parameters in the HTTP access log (#67498) - UI: Fix Calendar view to respect the user-selected timezone (#67497) - Escape LIKE wildcards in non-search filter parameters (#67496) - Fix missing redaction of secret values in variable JSON (#67495) - Fix bulk CREATE+OVERWRITE team-context authorization bypass (#67493) - UI: Return 400 instead of 500 from ``structure_data`` on a malformed asset expression (#67489) - Fix ``SimpleAuthManager`` redirect to the next URL after login (#67483) - Return 400 instead of 500 from ``materialize_asset`` on invalid input (#67445) - UI: Restore the Monaco find widget in the Dag Code view (#67391) - UI: Fix an HTTPException import that turned a 400 into a 500 in the dags endpoint (#67363) - Restore ``fail_fast`` handling when reschedule exceeds the MySQL ``TIMESTAMP`` limit (#67353) - Fix the Triggered Dag button not being visible during queued/running state (#67327) - Fix variables import with structured falsy values (#67060) - Avoid logging Execution API bearer credentials (#67059) - Sanitize Dag processor metric file names (#67029) - Return a 422 when the database rejects an API payload (#66888) - Prevent ``AlreadyRunningBackfill`` error caused by an invalid date range request (#66874) - Restrict owner-link and extra-link ``href`` values to safe schemes (http, https, mailto, relative) (#66741) - Add a session parameter to the ``BaseStateBackend`` interface to fix custom backends (#66708) - Allow deadline callbacks within the same Dag module (#66702) - UI: Fix relative React plugin bundle URLs in dev mode (#66618) - Validate Dag trigger conf as a JSON object or null (#66617) - Require a trust sentinel for ``state.user`` injection in ``get_user()`` (#66562) - Use ``hmac.compare_digest`` for ``SimpleAuthManager`` password comparison (CWE-208) (#66556) - Set ``SameSite=Lax`` on the ``SimpleAuthManager`` all-admins login cookie (#66502) - Reserve ``/auth`` and ``/pluginsv2`` from plugin URL prefixes (#66501) - Use a cryptographically secure RNG for ``SimpleAuthManager`` passwords (#66500) - Fix Triggerer ``runner_health_check_threshold`` log formatting (#66486) - Fix Dag processor callback cleanup for versioned bundle files (#66484) - Default ``AIRFLOW_UID`` to 50000 in the airflow-init chown lines (#66481) - Strip CR/LF from MySQL URL query values before forwarding to ``my.cnf`` (#66325) - Fix ``CronMixin`` not resolving cron presets before validation (#66102) - Fix ``AirflowSDKConfigParser`` missing the ``mask_secrets`` method (#66077) - Fix ``resolve_xcom_backend`` to rely on the config schema default (#65938) - Fix a missing import cast error in the dag_run API route (#65748) - Mask Dag processor connection and variable responses (#65704) - UI: Show import error for deactivated Dags (#65687) - Forward MySQL SSL params from ``sql_alchemy_conn`` to ``airflow db shell`` (#65575) - Disable SQLite FK checks in the 0111 migration downgrade (#65545) - Handle Variable values that cannot be decrypted gracefully in the stable REST API (#65452) - Retry ``TriggerDagRunOperator`` when the triggered DagRun fails (#65390) - Fix task run exceptions never being caught by Sentry (#65161) - Fix the bulk task instance authorization error message rendering (#64719) - Fix trigger template rendering failure when operator ``template_fields`` differ from trigger attributes (#64715) - Fix ``task_defer`` with non-JSON ``next_kwargs`` in ``TaskInstance`` (#64714) - Add the error as ``context["exception"]`` in ``InProcessTestSupervisor`` (#64568) - Fix NPM security alerts in the simple auth manager (#64309) - Fix Dag run trigger to surface errors instead of swallowing them (#64130) - Fix Task SDK Connection extras built from a URI constructor (#64120) - Add insert/update-on-conflict for rendered task instance fields (#63874) - Fix ``timeout_with_traceback`` crashes on Windows and non-main threads (#63664) - UI: Wrap long lines in the rendered templates view (#63492) - Block path traversal via ".." in ``dag_id`` and ``run_id`` (#63296) - Fix the scheduler health check command in ``docker-compose.yaml`` (#62280) - Fix unmapped task deadlock when upstream tasks are removed (#62034) - Forward termination signals from the supervisor to the task subprocess (#61627) - Check destination team permission when using bulk APIs for connections, variables, and pools (#68573) - Fix the execution API ``/health`` check failing on the empty-path route (#68578) - Fix Dag run partition key filter breaking on composite keys containing ``|`` (#68459) - Fix the partition clear date range for non-UTC partitioned timetables (#68460) - Validate that partition keys are non-empty and within the column length (#68443) - Fix the scheduler serving stale Dag code after an in-place serialized Dag version update (#68558) - Determine the latest Dag version by version number to avoid collisions when timestamps tie (#68389) - Fix new runs and reruns executing an outdated bundle version when the Dag serialization is unchanged (#68336) - Fix remote logging from the task supervisor (#68370) - Upload task logs even when the final state update fails (#67935) - Escape URLs in the Task SDK client when looking up Dag operations (#68129) - Fix task scheduling when multi-team is enabled (#68634) - Fix secret values not being masked in rendered templates when keys use dot or dash separators (#68624) - Fix ``jwt_audience`` for the public API being read from two different config sections (#67494) - Fix duplicate deadline-miss callbacks firing from multiple HA scheduler replicas (#64737) - Fix scheduler crash on non-ASCII Dag names when OpenTelemetry metrics are enabled (#68023) - Fix Dag processor crash on non-ASCII names in OpenTelemetry gauge and timer metrics (#68284) - Report duplicate plugin names as import errors instead of silently ignoring them (#66649) - Require edit permission for async connection tests that update an existing connection (#68127) - Restore the deprecated ``[core] execution_api_server_url`` mapping to ``[workers] execution_api_server_url`` (#63949) - Fix ``dag.test()`` not re-syncing sibling Dags across repeated calls (#66205) - UI: Invalidate per-attempt task instance caches after actions so logs and details are not stale (#67212) - Fix task runner failure on a duplicate task instance success-state update (#63355) - Fix a race condition on the ``order_by`` parameter when listing Dag runs via the REST API (#68948) - Exclude non-successful Dag runs from the ``DeadlineReference.AVERAGE_RUNTIME`` deadline calculation so failed runs no longer skew the computed deadline (#68949) - Allow ``InProcessExecutionAPI`` to start without ``api_auth.jwt_secret`` configured (#68982) - Make ``airflow dags test`` wait for Human-in-the-loop input instead of looping indefinitely on parked HITL tasks (#69104) - Fix the Java coordinator rejecting macOS dual-stack loopback connections (#68973) - Fix an asset-event ingestion crash for Dags using ``FixedKeyMapper`` (#69326) - UI: Fix the details panel header overlapping the tabs (#69318) - Fix new Dag versions being created when a task's ``retry_policy`` was serialized (#69315) - Fix retry-policy overrides not being persisted to task-instance history (#69241) - Fix deadline callback data not being persisted (#69259) ## Miscellaneous - Propagate the resolved task log level and ``[logging] namespace_levels`` to language SDK runtimes (#68712) - Forward run-identity attributes (``dag_id``, ``run_id``, ``run_type``) to the trace sampler so a custom head sampler can differentiate by run kind (#68592) - Remove ``all_map_indices`` from ``task_state_store.clear()`` in the task context (#68880) - Optimize the dag processor by caching bundle-to-team name lookups (#68730) - Rename the misleading ``last_automated_run`` param to ``reference_run`` (#68714) - Add a ``team_name`` tag to the remaining multi-team metrics (#68601) - Add a ``team_name`` tag to dag processor metrics for multi-team deployments (#68599) - Add a ``team_name`` tag to asset metrics for multi-team deployments (#68367) - UI: Persist dashboard alert collapse state and clamp long alerts (#68329) - Optimize bulk variable deletion to avoid N+1 queries (#68508) - UI: Unify the Dag Code tab toolbar styling with the Logs toolbar (#68449) - Optimize bulk Dag run authorization to avoid N+1 team-name queries (#68286) - Improve ``airflow dags`` command to use bulk clear (#68280) - Add the ``task_state_store`` table to the ``airflow db clean`` mechanism (#68218) - Add metrics and traces to ``ResumableJobMixin`` for crash recovery (#68213) - Improve ``ResumableJobMixin`` crash-recovery observability with better logging (#68206) - Pass ``DagRun`` to ``task_instance_mutation_hook`` for run-aware task mutation (#68198) - Add ``team_name`` to multi-team metrics (#68108) - Reduce redundant Dag team lookups in authorization checks (#68020) - Enhance ``ResumableJobMixin.get_job_status`` with context for better job status tracking (#68009) - Propagate OpenTelemetry trace headers from the client to Execution API server-side spans (#67904) - Widen the type hint for the ``DagRun.get_task_instances`` / ``fetch_task_instances`` state parameter (#67880) - UI: Use the bulk clear Dag runs endpoint for bulk Dag run clear (#67846) - Add a ``default`` parameter to the task and asset state ``get()`` method (#67842) - Make core API routes for task and asset states interact only with the database (#67835) - Optimize Dag processor file-queue deduplication from O(N^2) to O(N) (#67750) - Add ``allow_consumer_teams`` and ``allow_global_consumers`` columns to ``TaskOutletAssetReference`` (#67730) - Speed up the Dags list and dashboard queries on large ``DagRun`` tables (#67721) - Make ``partition_key`` provenance-only and inherit it onto asset events (#67718) - Speed up Dag serialization by skipping a redundant asset roundtrip (#67702) - Cache ``BaseOperator.__init__`` signature in operator serialization (#67701) - Optimize ``TaskGroup.topological_sort`` for reverse-declared Dags (#67688) - Update serialization for producer-side asset access control (#67658) - Allow outlets to be added and accessed in ``AssetStateAccessor`` (#67619) - Unify task/asset state storage between the Core API and Execution API (#67547) - Decorate custom state references with an envelope for UI clarity (#67530) - Simplify authoring of task and asset states by allowing JSON types (#67418) - Replace Sphinx Redoc with Swagger for the API docs (#67390) - Emit OpenTelemetry spans around listener hook calls (#67347) - UI: Update verbiage for lower-priority backfill runs (#67338) - Fix N+1 query in the bulk task instance delete endpoint (#67304) - Speed up ``TaskGroup.topological_sort`` with an int-indexed projected sweep (#67288) - UI: Use react-query native error state for bulk action hooks (#67284) - Wrap ``executor.heartbeat()`` in a timer to localize scheduler loop slowdowns (#66808) - Emit ``dagrun.first_task_start_delay`` separately from scheduling delay (#66807) - Share one poll loop across sibling event triggers (#66584) - UI: Upgrade icons, spacing, and default component themes (#66569) - Warn when ``SimpleAuthManager`` runs in a production-shaped deployment (#66563) - Migrate Stackdriver logging config to the ``RemoteLogIO`` pattern (#66513) - Add a ``BundleVersion`` dataclass and ``version_data`` persistence to ``DagVersion`` (#66491) - Avoid lazy-loading timetable fields for latest DagRuns (#66488) - Move ``allow_producer_teams`` to ``DagScheduleAssetReference`` (#66487) - Pass user teams to the ``create_asset_event`` endpoint (#66367) - Load ``USFederalHolidayCalendar`` lazily to reduce memory usage when loading examples (#66303) - Propagate task OpenTelemetry trace context through IPC into Execution API requests (#66151) - Surface worker Dag parse duration in the task log (#66138) - Skip deserializing ``trigger_kwargs`` when loading serialized Dags (#66002) - Honor ``AUTH_ROLE_PUBLIC`` in the FastAPI API server (#65685) - Add extended sysinfo for the Edge worker (#65472) - Clarify logs when a Dag is being processed in the Dag processor (#65196) - Add indexes on ``task_instance.dag_version_id`` and ``dag_run.created_dag_version_id`` (#64818) - Improve creation of ``RuntimeTaskInstance`` in ``TriggerRunner`` for ``start_for_trigger`` functionality (#64298) - Mark the Triggerer supervisor as a server context so it can read metastore connections (#64022) - Load hook metadata from YAML without importing the hook class (#63826) - Add detailed task spans (#63568) - Downgrade logging on query JSON parsing and add a JSON load condition (#62044) - UI: Add a Deadlines section with a time-range selector to the Dashboard page (#68038) - UI: Add a modal for editing notes with Markdown support (#68362) - UI: Improve the Human-In-The-Loop form UX (#68397) - Add a ``team_name`` tag to executor metrics for multi-team deployments (#68593) - Make task and asset state store row size limits configurable (#68133) - UI: Add notification UX for Human-In-The-Loop actions (#68346) - Allow synchronous deadline callbacks (``SyncCallback``) to access Connections and Variables (#65269) - Add a ``team_name`` tag to deadline metrics for multi-team deployments (#68589) - Add a ``team_name`` tag to scheduler metrics for multi-team deployments (#68594) - Defer the Cadwyn import so FastAPI/Starlette stay off the Task SDK worker path, reducing per-worker memory (#69029) ## Doc Only Changes - Complete the Taiwanese Mandarin (``zh-TW``) translation (#68870) - Add missing Korean (``ko``) translations (#68600) - Close German (``de``) translation gaps (#68356) - Add a segment fan-out example to the asset partition example Dag (#68722) - Fix runtime-partition example Dags using unreachable schedules (#68719) - Add an example Dag for the task state store with mapped tasks (#68670) - Fix the gap in the Taiwanese Mandarin (``zh-TW``) translation (#68668) - Add wait-policy examples to the asset partition example Dag (#68658) - Add a contributing guide for language SDKs (#68330) - Add ``sdk.TIRunContext`` documentation for the Go SDK (#68319) - Add a Go Task SDK authoring guide to the docs (#68223) - Update supported-versions doc to mark 2.11.2 as EOL (#68212) - Add documentation for ``ResumableJobMixin`` and resumable tasks (#68136) - Add CLI examples for team-scoped pools (#68111) - Add docs for multi-team triggerer support (#67608) - Clarify trigger rule behavior for the ``removed`` upstream state (#67452) - Fix outdated image links in ``dags.rst`` (#67357) - Add an example and docs for runtime asset partitioning (AIP-76) (#67307) - Add documentation for the Task and Asset Store (AIP-103) (#67299) - Add a dynamic task mapping no-op example (#67022) - Add documentation about adding ``access_control`` to the ``Asset`` object (#66949) - Add a how-to for Dag-level retry via ``on_failure_callback`` (#66277) - Fix documentation after PR 62645 (#65843) - Add documentation for team-based asset event filtering (#65690) - Document ``on_kill()``/``cleanup()`` for triggers (#65671) - Explain ``xcom_pull`` behaviour without ``task_ids`` in the docs (#65406) - Improve standalone authentication documentation for Airflow 3.x (#65330) - Clarify manual Dag run data interval semantics in Airflow 3 (#64740) - Document and test ``xcom_pull`` ``run_id`` usage for triggered Dag runs (#63030) - Update params in the backfill documentation (#61821) - Document the ``apache-airflow-mypy`` package in the core docs (#68561) - Fix typos and formatting in the Fundamentals documentation (#68524) - Complete the Hindi (``hi``) UI translation (#68574) - Fill the Taiwanese Mandarin (``zh-TW``) UI translation gap (#68563) - Document that Dag bundle ``kwargs`` should reference a Connection rather than inline credentials (#69105) - Add example plugins and expand the asset-partitions documentation (#69017) - Java SDK docs: ``JUL`` setup, pinning ``java_executable``, and a config-reload note (#69020) - Correct the example config for the coordinators (#68940)