Upgrading to Airflow 3 breaks DAGs that rely on legacy Airflow 1 and Airflow 2 patterns. The release removes deprecated execution contexts, older scheduling arguments, and direct database access from worker tasks.
Removed execution context keys
The legacy execution_date context key and its helpers are gone. DAG authors must use modern interval keys instead:
# Airflow 2 legacy syntax (removed in Airflow 3): run_date = context["execution_date"] yesterday = context["yesterday_ds"] # Airflow 3 syntax: start = context["data_interval_start"] end = context["data_interval_end"] logical = context["logical_date"]
The keys prev_ds, next_ds, and yesterday_ds were removed because they assumed fixed daily intervals and caused subtle bugs with custom timetables.
Removed components and features
SubDAGs are completely removed. Pipelines using SubDAGs must migrate to TaskGroups or independent DAGs triggered by assets. Classic SLAs (Service Level Agreements) are also removed in favor of Deadline Alerts and alert callbacks, because the legacy SLA engine frequently missed checks or fired spurious alerts. SequentialExecutor is removed; local development environments use LocalExecutor.
Scheduling and task changes
The schedule_interval argument on DAG objects is removed; code must use schedule. The default value of catchup changed from True to False. If a new DAG needs to run historical intervals upon deployment, you must set catchup=True explicitly.
Finally, worker tasks can no longer open metadata database sessions. Any custom operator importing from airflow.settings import Session or querying internal ORM models breaks. Code must interact through airflow.sdk and the Task Execution API, while external API clients migrate from REST API v1 to the v2 endpoints.