What broke
Mostly parameter checks. Everything else needed routine changes.
What changed
Operator imports updated in every DAG, providers upgraded for Airflow 3, and code that called the old REST API or the metadata database rewritten.
How parity was proven
Both versions ran side by side for 2 weeks, with outputs compared in Great Expectations.
Cutover
Rehearsed first, with Airflow 2 kept ready as a rollback.