This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch v3-2-test
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/v3-2-test by this push:
     new a927451394f [Experimental] Split ci-amd-arm.yml into ARM canary and 
AMD per-PR workflows (#66348) (#66664)
a927451394f is described below

commit a927451394fefdda8c0dd58e395578fda3693e61
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sun May 10 20:19:51 2026 +0200

    [Experimental] Split ci-amd-arm.yml into ARM canary and AMD per-PR 
workflows (#66348) (#66664)
    
    * Split ci-amd-arm.yml into ci-arm.yml (canary) and ci-amd.yml (per-PR) 
wrappers
    
    Replaces the combined ci-amd-arm.yml workflow with two thin wrappers 
carrying
    the full pipeline inline:
    
    - ci-arm.yml: schedule (canary cron) + workflow_dispatch only;
      runs on linux/arm64.
    - ci-amd.yml: pull_request + push (to v3-N-test etc) + workflow_dispatch;
      runs on linux/amd64. No schedule for now; ARM keeps the canary slot.
    
    Each wrapper carries the full pipeline jobs identically except for platform 
/
    runner-type / triggers, so per-job UI grouping is preserved on the GitHub
    Actions page. The runtime cross-mapping in selective_checks.runner_type is
    left in place because is_disabled_integration still consumes it; the API
    lookup against the now-removed ci-amd-arm.yml falls back to AMD harmlessly.
    
    References to the old file name are updated in:
    README.md, dev/update_github_branch_config.py, ci-notification.yml,
    e2e-flaky-tests-report.yml, scripts/ci/analyze_e2e_flaky_tests.py,
    dev/README_AIRFLOW3_DEV.md, dev/README_RELEASE_AIRFLOW.md,
    generated/PYPI_README.md, update-constraints-on-push*.yml,
    release_dockerhub_image.yml.
    
    * Add prek hook that asserts ci-arm.yml and ci-amd.yml stay in sync
    
    The two CI workflow files are physical copies of each other (GH Actions
    has no cross-file YAML include) — they should differ only in:
    
    - header intro comment
    - workflow name (ARM vs AMD)
    - triggers (schedule vs pull_request+push)
    - concurrency group prefix
    - build-info platform / runner-type outputs
    - print-platform job name + echo
    
    Drift outside this set is a bug. The new
    `scripts/ci/prek/check_ci_workflows_in_sync.py` normalizes both files
    against the documented divergences (regex line rules + arch-only block
    removals) and asserts the rest matches byte-for-byte. Wired up as a
    local prek hook gated on either workflow file changing.
    
    Local UX: when run interactively, the script also diffs each file
    against `upstream/main` (falls back to `origin/main`, then `main`) and
    attributes the drift — "only ci-arm.yml changed since baseline; mirror
    to ci-amd.yml" with the exact diff to copy, OR "add to LINE_RULES /
    ARM_ONLY_BLOCK in this script if intentional". Falls back to the
    non-attribution view in CI / non-TTY runs. Set `FORCE_INTERACTIVE=1`
    to opt in from a non-TTY shell.
    
    (cherry picked from commit 8f9363715516dd5b8c5c1bafe007a84fa5122390)
---
 .github/workflows/{ci-amd-arm.yml => ci-amd.yml}   |  31 +-
 .github/workflows/{ci-amd-arm.yml => ci-arm.yml}   |  40 +--
 .github/workflows/ci-notification.yml              |   4 +-
 .github/workflows/e2e-flaky-tests-report.yml       |   5 +-
 .github/workflows/release_dockerhub_image.yml      |   2 +-
 .../update-constraints-on-push-stable.yml          |   2 +-
 .github/workflows/update-constraints-on-push.yml   |   2 +-
 .pre-commit-config.yaml                            |   7 +
 README.md                                          |  28 +-
 dev/README_AIRFLOW3_DEV.md                         |   2 +-
 dev/README_RELEASE_AIRFLOW.md                      |   2 +-
 dev/breeze/doc/images/output_build-docs.txt        |   2 +-
 dev/breeze/doc/images/output_ci-image_build.txt    |   2 +-
 .../images/output_ci-image_export-mount-cache.txt  |   2 +-
 .../images/output_ci-image_import-mount-cache.txt  |   2 +-
 dev/breeze/doc/images/output_ci-image_load.txt     |   2 +-
 dev/breeze/doc/images/output_ci-image_pull.txt     |   2 +-
 dev/breeze/doc/images/output_ci-image_save.txt     |   2 +-
 dev/breeze/doc/images/output_ci-image_verify.txt   |   2 +-
 dev/breeze/doc/images/output_ci_fix-ownership.txt  |   2 +-
 dev/breeze/doc/images/output_ci_free-space.txt     |   2 +-
 .../doc/images/output_ci_get-workflow-info.txt     |   2 +-
 dev/breeze/doc/images/output_ci_resource-check.txt |   2 +-
 .../doc/images/output_ci_selective-check.txt       |   2 +-
 dev/breeze/doc/images/output_ci_set-milestone.txt  |   2 +-
 dev/breeze/doc/images/output_ci_upgrade.txt        |   2 +-
 dev/breeze/doc/images/output_cleanup.txt           |   2 +-
 dev/breeze/doc/images/output_doctor.txt            |   2 +-
 dev/breeze/doc/images/output_down.txt              |   2 +-
 dev/breeze/doc/images/output_exec.txt              |   2 +-
 .../doc/images/output_generate-migration-file.txt  |   2 +-
 dev/breeze/doc/images/output_issues_unassign.txt   |   2 +-
 .../doc/images/output_k8s_build-k8s-image.txt      |   2 +-
 .../doc/images/output_k8s_configure-cluster.txt    |   2 +-
 .../doc/images/output_k8s_create-cluster.txt       |   2 +-
 .../doc/images/output_k8s_delete-cluster.txt       |   2 +-
 .../doc/images/output_k8s_deploy-airflow.txt       |   2 +-
 .../doc/images/output_k8s_deploy-cluster.txt       |   2 +-
 dev/breeze/doc/images/output_k8s_dev.txt           |   2 +-
 dev/breeze/doc/images/output_k8s_k9s.txt           |   2 +-
 dev/breeze/doc/images/output_k8s_logs.txt          |   2 +-
 .../doc/images/output_k8s_run-complete-tests.txt   |   2 +-
 dev/breeze/doc/images/output_k8s_setup-env.txt     |   2 +-
 dev/breeze/doc/images/output_k8s_shell.txt         |   2 +-
 dev/breeze/doc/images/output_k8s_status.txt        |   2 +-
 dev/breeze/doc/images/output_k8s_tests.txt         |   2 +-
 .../doc/images/output_k8s_upload-k8s-image.txt     |   2 +-
 dev/breeze/doc/images/output_pr_auto-triage.txt    |   2 +-
 dev/breeze/doc/images/output_prod-image_build.txt  |   2 +-
 dev/breeze/doc/images/output_prod-image_load.txt   |   2 +-
 dev/breeze/doc/images/output_prod-image_pull.txt   |   2 +-
 dev/breeze/doc/images/output_prod-image_save.txt   |   2 +-
 dev/breeze/doc/images/output_prod-image_verify.txt |   2 +-
 dev/breeze/doc/images/output_registry_backfill.txt |   2 +-
 .../doc/images/output_registry_extract-data.txt    |   2 +-
 .../images/output_registry_publish-versions.txt    |   2 +-
 ...tput_release-management_add-back-references.txt |   2 +-
 ...tput_release-management_check-release-files.txt |   2 +-
 ...ase-management_clean-old-provider-artifacts.txt |   2 +-
 ...elease-management_constraints-version-check.txt |   2 +-
 ...tput_release-management_create-minor-branch.txt |   2 +-
 ...put_release-management_generate-constraints.txt |   2 +-
 ...ease-management_generate-issue-content-core.txt |   2 +-
 ...anagement_generate-issue-content-helm-chart.txt |   2 +-
 ...management_generate-issue-content-providers.txt |   2 +-
 ...ease-management_generate-providers-metadata.txt |   2 +-
 ...e-management_install-provider-distributions.txt |   2 +-
 ...output_release-management_merge-prod-images.txt |   2 +-
 ...anagement_prepare-airflow-ctl-distributions.txt |   2 +-
 ...se-management_prepare-airflow-distributions.txt |   2 +-
 ...lease-management_prepare-helm-chart-package.txt |   2 +-
 ...lease-management_prepare-helm-chart-tarball.txt |   2 +-
 ...lease-management_prepare-mypy-distributions.txt |   2 +-
 ...e-management_prepare-provider-distributions.txt |   2 +-
 ...e-management_prepare-provider-documentation.txt |   2 +-
 ...ut_release-management_prepare-python-client.txt |   2 +-
 .../output_release-management_prepare-tarball.txt  |   2 +-
 ...e-management_prepare-task-sdk-distributions.txt |   2 +-
 ...utput_release-management_publish-docs-to-s3.txt |   2 +-
 .../output_release-management_publish-docs.txt     |   2 +-
 ...tput_release-management_release-prod-images.txt |   2 +-
 .../output_release-management_start-rc-process.txt |   2 +-
 .../output_release-management_start-release.txt    |   2 +-
 .../output_release-management_tag-providers.txt    |   2 +-
 ...utput_release-management_update-constraints.txt |   2 +-
 ...se-management_update-providers-next-version.txt |   2 +-
 ...se-management_verify-provider-distributions.txt |   2 +-
 .../output_release-management_verify-rc-by-pmc.txt |   2 +-
 dev/breeze/doc/images/output_run.txt               |   2 +-
 .../output_sbom_build-all-airflow-images.txt       |   2 +-
 .../output_sbom_export-dependency-information.txt  |   2 +-
 ...output_sbom_generate-providers-requirements.txt |   2 +-
 .../images/output_sbom_update-sbom-information.txt |   2 +-
 .../doc/images/output_setup_autocomplete.txt       |   2 +-
 .../output_setup_check-all-params-in-groups.txt    |   2 +-
 dev/breeze/doc/images/output_setup_config.txt      |   2 +-
 .../output_setup_regenerate-command-images.txt     |   2 +-
 .../output_setup_synchronize-local-mounts.txt      |   2 +-
 dev/breeze/doc/images/output_setup_version.txt     |   2 +-
 dev/breeze/doc/images/output_shell.svg             |   2 +-
 dev/breeze/doc/images/output_shell.txt             |   2 +-
 dev/breeze/doc/images/output_start-airflow.svg     |   2 +-
 dev/breeze/doc/images/output_start-airflow.txt     |   2 +-
 ...utput_testing_airflow-ctl-integration-tests.txt |   2 +-
 .../images/output_testing_airflow-ctl-tests.txt    |   2 +-
 .../images/output_testing_airflow-e2e-tests.txt    |   2 +-
 .../output_testing_core-integration-tests.txt      |   2 +-
 .../doc/images/output_testing_core-tests.txt       |   2 +-
 .../images/output_testing_docker-compose-tests.txt |   2 +-
 .../doc/images/output_testing_helm-tests.txt       |   2 +-
 .../output_testing_providers-integration-tests.txt |   2 +-
 .../doc/images/output_testing_providers-tests.txt  |   2 +-
 .../output_testing_python-api-client-tests.txt     |   2 +-
 .../doc/images/output_testing_system-tests.txt     |   2 +-
 .../output_testing_task-sdk-integration-tests.txt  |   2 +-
 .../doc/images/output_testing_task-sdk-tests.txt   |   2 +-
 .../doc/images/output_testing_ui-e2e-tests.txt     |   2 +-
 .../output_ui_check-translation-completeness.txt   |   2 +-
 dev/breeze/doc/images/output_ui_compile-assets.txt |   2 +-
 .../images/output_workflow-run_publish-docs.txt    |   2 +-
 .../src/airflow_breeze/utils/selective_checks.py   |   6 +
 generated/PYPI_README.md                           |  28 +-
 scripts/ci/analyze_e2e_flaky_tests.py              |   4 +-
 scripts/ci/prek/check_ci_workflows_in_sync.py      | 375 +++++++++++++++++++++
 124 files changed, 567 insertions(+), 189 deletions(-)

diff --git a/.github/workflows/ci-amd-arm.yml b/.github/workflows/ci-amd.yml
similarity index 98%
copy from .github/workflows/ci-amd-arm.yml
copy to .github/workflows/ci-amd.yml
index ed11af2ca82..350575c848b 100644
--- a/.github/workflows/ci-amd-arm.yml
+++ b/.github/workflows/ci-amd.yml
@@ -16,10 +16,15 @@
 # under the License.
 #
 ---
-name: Tests
+# AMD CI workflow. Triggered on every PR and on push to release branches.
+# Companion to `ci-arm.yml`, which runs the same pipeline on ARM as the
+# scheduled canary. The two workflows are physical copies of each other
+# (GitHub Actions has no cross-file YAML include), differing only in their
+# trigger surface, the hardcoded `runner-type` / `platform` values in
+# `build-info`'s outputs, and the architecture-specific print-platform job.
+# Edit both files together when changing pipeline shape.
+name: Tests (AMD)
 on:  # yamllint disable-line rule:truthy
-  schedule:
-    - cron: '28 1,3,7,9,13,15,19,21 * * *'
   push:
     branches:
       - v[0-9]+-[0-9]+-test
@@ -43,7 +48,7 @@ env:
   VERBOSE: "true"
 
 concurrency:
-  group: ci-amd-arm-${{ github.event.pull_request.number || github.ref }}
+  group: ci-amd-${{ github.event.pull_request.number || github.ref }}
   cancel-in-progress: true
 
 jobs:
@@ -90,7 +95,9 @@ jobs:
       latest-versions-only: ${{ 
steps.selective-checks.outputs.latest-versions-only }}
       mysql-exclude: ${{ steps.selective-checks.outputs.mysql-exclude }}
       mysql-versions: ${{ steps.selective-checks.outputs.mysql-versions }}
-      platform: ${{ steps.selective-checks.outputs.platform }}
+      # platform / runner-type are hardcoded per workflow file (this is the
+      # AMD copy). The matching ARM copy lives in ci-arm.yml.
+      platform: "linux/amd64"
       postgres-exclude: ${{ steps.selective-checks.outputs.postgres-exclude }}
       postgres-versions: ${{ steps.selective-checks.outputs.postgres-versions 
}}
       prod-image-build: ${{ steps.selective-checks.outputs.prod-image-build }}
@@ -119,7 +126,7 @@ jobs:
       run-task-sdk-integration-tests: ${{ 
steps.selective-checks.outputs.run-task-sdk-integration-tests }}
       run-breeze-integration-tests: ${{ 
steps.selective-checks.outputs.run-breeze-integration-tests }}
       run-scripts-tests: ${{ steps.selective-checks.outputs.run-scripts-tests 
}}
-      runner-type: ${{ steps.selective-checks.outputs.runner-type }}
+      runner-type: '["ubuntu-22.04"]'
       run-ui-tests: ${{ steps.selective-checks.outputs.run-ui-tests }}
       run-ui-e2e-tests: ${{ steps.selective-checks.outputs.run-ui-e2e-tests }}
       run-unit-tests: ${{ steps.selective-checks.outputs.run-unit-tests }}
@@ -197,20 +204,10 @@ jobs:
         env:
           PR_LABELS: ${{ steps.source-run-info.outputs.pr-labels }}
 
-  print-platform-arm:
-    name: "Platform: ARM"
-    needs: [build-info]
-    runs-on: ["ubuntu-22.04"]
-    if: needs.build-info.outputs.platform == 'linux/arm64'
-    steps:
-      - name: "Print architecture"
-        run: "echo '## Architecture: ARM' >> $GITHUB_STEP_SUMMARY"
-
-  print-platform-amd:
+  print-platform:
     name: "Platform: AMD"
     needs: [build-info]
     runs-on: ["ubuntu-22.04"]
-    if: needs.build-info.outputs.platform == 'linux/amd64'
     steps:
       - name: "Print architecture"
         run: "echo '## Architecture: AMD' >> $GITHUB_STEP_SUMMARY"
diff --git a/.github/workflows/ci-amd-arm.yml b/.github/workflows/ci-arm.yml
similarity index 98%
rename from .github/workflows/ci-amd-arm.yml
rename to .github/workflows/ci-arm.yml
index ed11af2ca82..4addb776950 100644
--- a/.github/workflows/ci-amd-arm.yml
+++ b/.github/workflows/ci-arm.yml
@@ -16,21 +16,17 @@
 # under the License.
 #
 ---
-name: Tests
+# ARM canary CI workflow. Triggered on the canary cron only — ARM runners are
+# reserved for the scheduled slot. Companion to `ci-amd.yml`, which runs the
+# same pipeline on AMD for every PR and push. The two workflows are physical
+# copies of each other (GitHub Actions has no cross-file YAML include),
+# differing only in their trigger surface, the hardcoded `runner-type` /
+# `platform` values in `build-info`'s outputs, and the architecture-specific
+# print-platform job. Edit both files together when changing pipeline shape.
+name: Tests (ARM)
 on:  # yamllint disable-line rule:truthy
   schedule:
     - cron: '28 1,3,7,9,13,15,19,21 * * *'
-  push:
-    branches:
-      - v[0-9]+-[0-9]+-test
-      - providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
-  pull_request:
-    branches:
-      - main
-      - v[0-9]+-[0-9]+-test
-      - v[0-9]+-[0-9]+-stable
-      - providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
-    types: [opened, reopened, synchronize, ready_for_review]
   workflow_dispatch:
 permissions:
   # All other permissions are set to none by default
@@ -43,7 +39,7 @@ env:
   VERBOSE: "true"
 
 concurrency:
-  group: ci-amd-arm-${{ github.event.pull_request.number || github.ref }}
+  group: ci-arm-${{ github.event.pull_request.number || github.ref }}
   cancel-in-progress: true
 
 jobs:
@@ -90,7 +86,9 @@ jobs:
       latest-versions-only: ${{ 
steps.selective-checks.outputs.latest-versions-only }}
       mysql-exclude: ${{ steps.selective-checks.outputs.mysql-exclude }}
       mysql-versions: ${{ steps.selective-checks.outputs.mysql-versions }}
-      platform: ${{ steps.selective-checks.outputs.platform }}
+      # platform / runner-type are hardcoded per workflow file (this is the
+      # ARM copy). The matching AMD copy lives in ci-amd.yml.
+      platform: "linux/arm64"
       postgres-exclude: ${{ steps.selective-checks.outputs.postgres-exclude }}
       postgres-versions: ${{ steps.selective-checks.outputs.postgres-versions 
}}
       prod-image-build: ${{ steps.selective-checks.outputs.prod-image-build }}
@@ -119,7 +117,7 @@ jobs:
       run-task-sdk-integration-tests: ${{ 
steps.selective-checks.outputs.run-task-sdk-integration-tests }}
       run-breeze-integration-tests: ${{ 
steps.selective-checks.outputs.run-breeze-integration-tests }}
       run-scripts-tests: ${{ steps.selective-checks.outputs.run-scripts-tests 
}}
-      runner-type: ${{ steps.selective-checks.outputs.runner-type }}
+      runner-type: '["ubuntu-22.04-arm"]'
       run-ui-tests: ${{ steps.selective-checks.outputs.run-ui-tests }}
       run-ui-e2e-tests: ${{ steps.selective-checks.outputs.run-ui-e2e-tests }}
       run-unit-tests: ${{ steps.selective-checks.outputs.run-unit-tests }}
@@ -197,24 +195,14 @@ jobs:
         env:
           PR_LABELS: ${{ steps.source-run-info.outputs.pr-labels }}
 
-  print-platform-arm:
+  print-platform:
     name: "Platform: ARM"
     needs: [build-info]
     runs-on: ["ubuntu-22.04"]
-    if: needs.build-info.outputs.platform == 'linux/arm64'
     steps:
       - name: "Print architecture"
         run: "echo '## Architecture: ARM' >> $GITHUB_STEP_SUMMARY"
 
-  print-platform-amd:
-    name: "Platform: AMD"
-    needs: [build-info]
-    runs-on: ["ubuntu-22.04"]
-    if: needs.build-info.outputs.platform == 'linux/amd64'
-    steps:
-      - name: "Print architecture"
-        run: "echo '## Architecture: AMD' >> $GITHUB_STEP_SUMMARY"
-
   basic-tests:
     name: "Basic tests"
     needs: [build-info]
diff --git a/.github/workflows/ci-notification.yml 
b/.github/workflows/ci-notification.yml
index 6bb7b830a78..b59cabc8b25 100644
--- a/.github/workflows/ci-notification.yml
+++ b/.github/workflows/ci-notification.yml
@@ -37,7 +37,9 @@ jobs:
     strategy:
       matrix:
         branch: ["v3-2-test"]
-        workflow-id: ["ci-amd-arm.yml"]
+        # Track AMD; ARM is the canary slot and is reported separately by
+        # `ci-arm.yml`'s notify-slack job on schedule events.
+        workflow-id: ["ci-amd.yml"]
     runs-on: ubuntu-latest
     steps:
       - name: "Checkout ${{ github.ref }} ( ${{ github.sha }} )"
diff --git a/.github/workflows/e2e-flaky-tests-report.yml 
b/.github/workflows/e2e-flaky-tests-report.yml
index 7eb2cdf9542..caa27063468 100644
--- a/.github/workflows/e2e-flaky-tests-report.yml
+++ b/.github/workflows/e2e-flaky-tests-report.yml
@@ -46,7 +46,10 @@ jobs:
         env:
           GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
           MAX_RUNS: "10"
-          WORKFLOW_NAME: "ci-amd-arm.yml"
+          # E2E test runs come from the AMD workflow (every PR / push to main
+          # goes through it). The ARM canary is too sparse to drive flakiness
+          # analysis, so we keep the report tied to AMD.
+          WORKFLOW_NAME: "ci-amd.yml"
           BRANCH: "main"
           OUTPUT_FILE: "slack-message.json"
 
diff --git a/.github/workflows/release_dockerhub_image.yml 
b/.github/workflows/release_dockerhub_image.yml
index a1326e74d76..dbff0e42201 100644
--- a/.github/workflows/release_dockerhub_image.yml
+++ b/.github/workflows/release_dockerhub_image.yml
@@ -92,7 +92,7 @@ jobs:
       - name: "Install Breeze"
         uses: ./.github/actions/breeze
       - name: "Save github context to file"
-        # See ci-amd-arm.yml for the full rationale: avoids ARG_MAX on big PRs 
by writing the
+        # See ci-amd.yml for the full rationale: avoids ARG_MAX on big PRs by 
writing the
         # github context to a file, and the single-quoted heredoc makes the 
zizmor
         # template-injection finding a false positive (no bash expansion 
happens inside it).
         shell: bash
diff --git a/.github/workflows/update-constraints-on-push-stable.yml 
b/.github/workflows/update-constraints-on-push-stable.yml
index 0fe7d6d5445..389c153c5b7 100644
--- a/.github/workflows/update-constraints-on-push-stable.yml
+++ b/.github/workflows/update-constraints-on-push-stable.yml
@@ -60,7 +60,7 @@ jobs:
         uses: ./.github/actions/breeze
         id: breeze
       - name: "Save github context to file"
-        # See ci-amd-arm.yml for the full rationale: avoids ARG_MAX on big PRs 
by writing the
+        # See ci-amd.yml for the full rationale: avoids ARG_MAX on big PRs by 
writing the
         # github context to a file, and the single-quoted heredoc makes the 
zizmor
         # template-injection finding a false positive (no bash expansion 
happens inside it).
         shell: bash
diff --git a/.github/workflows/update-constraints-on-push.yml 
b/.github/workflows/update-constraints-on-push.yml
index eb9b202e581..f8aee692467 100644
--- a/.github/workflows/update-constraints-on-push.yml
+++ b/.github/workflows/update-constraints-on-push.yml
@@ -63,7 +63,7 @@ jobs:
         uses: ./.github/actions/breeze
         id: breeze
       - name: "Save github context to file"
-        # See ci-amd-arm.yml for the full rationale: avoids ARG_MAX on big PRs 
by writing the
+        # See ci-amd.yml for the full rationale: avoids ARG_MAX on big PRs by 
writing the
         # github context to a file, and the single-quoted heredoc makes the 
zizmor
         # template-injection finding a false positive (no bash expansion 
happens inside it).
         shell: bash
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0b913692a4c..cc1f41c4685 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -235,6 +235,13 @@ repos:
           ^pyproject\.toml$
         pass_filenames: false
         require_serial: true
+      - id: check-ci-workflows-in-sync
+        name: Check ci-arm.yml and ci-amd.yml stay in sync
+        entry: ./scripts/ci/prek/check_ci_workflows_in_sync.py
+        language: python
+        files: ^\.github/workflows/ci-(arm|amd)\.yml$
+        pass_filenames: false
+        require_serial: true
       - id: sync-uv-min-version-markers
         name: Sync `# sync-uv-min-version` markers with [tool.uv] 
required-version
         entry: ./scripts/ci/prek/sync_uv_min_version_markers.py
diff --git a/README.md b/README.md
index 9e45b8907b8..a6592439616 100644
--- a/README.md
+++ b/README.md
@@ -30,8 +30,8 @@
 
 | Version | Build Status                                                       
                                                                                
             |
 
|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Main    | [![GitHub Build 
main](https://github.com/apache/airflow/actions/workflows/ci-amd-arm.yml/badge.svg)](https://github.com/apache/airflow/actions)
                 |
-| 3.x     | [![GitHub Build 
3.1](https://github.com/apache/airflow/actions/workflows/ci-amd-arm.yml/badge.svg?branch=v3-1-test)](https://github.com/apache/airflow/actions)
 |
+| Main    | [![GitHub Build 
main](https://github.com/apache/airflow/actions/workflows/ci-amd.yml/badge.svg)](https://github.com/apache/airflow/actions)
                 |
+| 3.x     | [![GitHub Build 
3.2](https://github.com/apache/airflow/actions/workflows/ci-amd.yml/badge.svg?branch=v3-2-test)](https://github.com/apache/airflow/actions)
 |
 | 2.x     | [![GitHub Build 
2.11](https://github.com/apache/airflow/actions/workflows/ci.yml/badge.svg?branch=v2-11-test)](https://github.com/apache/airflow/actions)
       |
 
 
@@ -98,14 +98,14 @@ Airflow is not a streaming solution, but it is often used 
to process real-time d
 
 Apache Airflow is tested with:
 
-|            | Main version (dev)                 | Stable version (3.2.1)     
  | Stable version (2.11.2)      |
-|------------|-----------------------------------|------------------------------|------------------------------|
-| Python     | 3.10, 3.11, 3.12, 3.13, 3.14       | 3.10, 3.11, 3.12, 3.13, 
3.14 | 3.10, 3.11, 3.12             |
-| Platform   | AMD64/ARM64                       | AMD64/ARM64                 
 | AMD64/ARM64(\*)              |
-| Kubernetes | 1.30, 1.31, 1.32, 1.33, 1.34, 1.35 | 1.30, 1.31, 1.32, 1.33     
  | 1.26, 1.27, 1.28, 1.29, 1.30 |
-| PostgreSQL | 14, 15, 16, 17, 18                | 13, 14, 15, 16, 17          
 | 12, 13, 14, 15, 16           |
-| MySQL      | 8.0, 8.4, Innovation              | 8.0, 8.4, Innovation        
 | 8.0, Innovation              |
-| SQLite     | 3.15.0+                           | 3.15.0+                     
 | 3.15.0+                      |
+|            | Main version (dev)                 | Stable version (3.2.0)     
         | Stable version (2.11.2)      |
+|------------|------------------------------------|-------------------------------------|------------------------------|
+| Python     | 3.10, 3.11, 3.12, 3.13, 3.14       | 3.10, 3.11, 3.12, 3.13, 
3.14        | 3.10, 3.11, 3.12             |
+| Platform   | AMD64/ARM64                        | AMD64/ARM64                
         | AMD64/ARM64(\*)              |
+| Kubernetes | 1.30, 1.31, 1.32, 1.33, 1.34, 1.35 | 1.30, 1.31, 1.32, 1.33, 
1.34, 1.35  | 1.26, 1.27, 1.28, 1.29, 1.30 |
+| PostgreSQL | 14, 15, 16, 17, 18                 | 14, 15, 16, 17, 18         
         | 12, 13, 14, 15, 16           |
+| MySQL      | 8.0, 8.4, Innovation               | 8.0, 8.4, Innovation       
         | 8.0, Innovation              |
+| SQLite     | 3.15.0+                            | 3.15.0+                    
         | 3.15.0+                      |
 
 \* Experimental
 
@@ -171,15 +171,15 @@ them to the appropriate format and workflow that your 
tool requires.
 
 
 ```bash
-pip install 'apache-airflow==3.2.1' \
- --constraint 
"https://raw.githubusercontent.com/apache/airflow/constraints-3.2.1/constraints-3.10.txt";
+pip install 'apache-airflow==3.2.0' \
+ --constraint 
"https://raw.githubusercontent.com/apache/airflow/constraints-3.2.0/constraints-3.10.txt";
 ```
 
 2. Installing with extras (i.e., postgres, google)
 
 ```bash
-pip install 'apache-airflow[postgres,google]==3.2.1' \
- --constraint 
"https://raw.githubusercontent.com/apache/airflow/constraints-3.2.1/constraints-3.10.txt";
+pip install 'apache-airflow[postgres,google]==3.2.0' \
+ --constraint 
"https://raw.githubusercontent.com/apache/airflow/constraints-3.2.0/constraints-3.10.txt";
 ```
 
 For information on installing provider distributions, check
diff --git a/dev/README_AIRFLOW3_DEV.md b/dev/README_AIRFLOW3_DEV.md
index 3c19a28cf6c..17de81521cb 100644
--- a/dev/README_AIRFLOW3_DEV.md
+++ b/dev/README_AIRFLOW3_DEV.md
@@ -72,7 +72,7 @@ PRs should **never** target `v3-1-stable` directly unless 
explicitly instructed
 > likely need additional changes before GA. However, when using this shortcut, 
 > the release manager **must**
 > verify that the `v3-X-test` push CI action ("Tests" workflow) has succeeded 
 > before cutting the RC. You can
 > check this at:
-> 
https://github.com/apache/airflow/actions/workflows/ci-amd-arm.yml?query=event%3Apush+branch%3Av3-2-test
+> 
https://github.com/apache/airflow/actions/workflows/ci-amd.yml?query=event%3Apush+branch%3Av3-2-test
 > (adjust the branch filter for the relevant `v3-X-test` branch).
 
 ## Developing for Airflow 3
diff --git a/dev/README_RELEASE_AIRFLOW.md b/dev/README_RELEASE_AIRFLOW.md
index a7c508e554c..36ef4c331df 100644
--- a/dev/README_RELEASE_AIRFLOW.md
+++ b/dev/README_RELEASE_AIRFLOW.md
@@ -533,7 +533,7 @@ still works but is no longer recommended.
 > likely need additional changes before GA. However, when using this shortcut, 
 > the release manager **must**
 > verify that the `v3-X-test` push CI action ("Tests" workflow) has succeeded 
 > before cutting the RC. You can
 > check this at:
-> 
https://github.com/apache/airflow/actions/workflows/ci-amd-arm.yml?query=event%3Apush+branch%3Av3-2-test
+> 
https://github.com/apache/airflow/actions/workflows/ci-amd.yml?query=event%3Apush+branch%3Av3-2-test
 > (adjust the branch filter for the relevant `v3-X-test` branch).
 
 - When the PR is approved (or when using the shortcut above), install 
`dev/breeze` in a virtualenv:
diff --git a/dev/breeze/doc/images/output_build-docs.txt 
b/dev/breeze/doc/images/output_build-docs.txt
index b94beee13be..ea24111dadf 100644
--- a/dev/breeze/doc/images/output_build-docs.txt
+++ b/dev/breeze/doc/images/output_build-docs.txt
@@ -1 +1 @@
-773708c31df1241d861ccd24c4f9d850
+5023b820002e3f33104ae46d617645c4
diff --git a/dev/breeze/doc/images/output_ci-image_build.txt 
b/dev/breeze/doc/images/output_ci-image_build.txt
index 0d5f5e8b8ed..4d06edb479b 100644
--- a/dev/breeze/doc/images/output_ci-image_build.txt
+++ b/dev/breeze/doc/images/output_ci-image_build.txt
@@ -1 +1 @@
-7798356a133bc45002b2d00dea58a174
+6f9021a610b04f0853dcb38f80059cc2
diff --git a/dev/breeze/doc/images/output_ci-image_export-mount-cache.txt 
b/dev/breeze/doc/images/output_ci-image_export-mount-cache.txt
index 32ac052a83f..f9bae543c43 100644
--- a/dev/breeze/doc/images/output_ci-image_export-mount-cache.txt
+++ b/dev/breeze/doc/images/output_ci-image_export-mount-cache.txt
@@ -1 +1 @@
-dca0cd678dae89b1e35317bbc130a106
+390efb28399cac005e2fe192c2c8fa3c
diff --git a/dev/breeze/doc/images/output_ci-image_import-mount-cache.txt 
b/dev/breeze/doc/images/output_ci-image_import-mount-cache.txt
index d6f503d06e5..6f7766e809a 100644
--- a/dev/breeze/doc/images/output_ci-image_import-mount-cache.txt
+++ b/dev/breeze/doc/images/output_ci-image_import-mount-cache.txt
@@ -1 +1 @@
-f9ca33618f97321e3e5a410474d84420
+b2e325b92a7dda14681676c6bf050191
diff --git a/dev/breeze/doc/images/output_ci-image_load.txt 
b/dev/breeze/doc/images/output_ci-image_load.txt
index 7e10a45f247..2f2f4d04205 100644
--- a/dev/breeze/doc/images/output_ci-image_load.txt
+++ b/dev/breeze/doc/images/output_ci-image_load.txt
@@ -1 +1 @@
-d919d32cd79055fbb8ed65c33a3f047d
+baf0bfe0e270b6982bbfbfd97707a1ba
diff --git a/dev/breeze/doc/images/output_ci-image_pull.txt 
b/dev/breeze/doc/images/output_ci-image_pull.txt
index ef0884ededa..fb2ef908512 100644
--- a/dev/breeze/doc/images/output_ci-image_pull.txt
+++ b/dev/breeze/doc/images/output_ci-image_pull.txt
@@ -1 +1 @@
-3251ba2079b1e67c196db34289a7b980
+fc42909eb684d7821ff2a3575a7e1073
diff --git a/dev/breeze/doc/images/output_ci-image_save.txt 
b/dev/breeze/doc/images/output_ci-image_save.txt
index 0480e0b4a8a..5c490055adb 100644
--- a/dev/breeze/doc/images/output_ci-image_save.txt
+++ b/dev/breeze/doc/images/output_ci-image_save.txt
@@ -1 +1 @@
-b8db67fe0fb1717432c68048b783038d
+b2ccfc3115708e08a384ff6852145485
diff --git a/dev/breeze/doc/images/output_ci-image_verify.txt 
b/dev/breeze/doc/images/output_ci-image_verify.txt
index 1e2a2241916..d62405260cc 100644
--- a/dev/breeze/doc/images/output_ci-image_verify.txt
+++ b/dev/breeze/doc/images/output_ci-image_verify.txt
@@ -1 +1 @@
-b1a6deb8e99fc88f9ee887b07982abb9
+59daf613dc467f3f1f923bcf7d24eb88
diff --git a/dev/breeze/doc/images/output_ci_fix-ownership.txt 
b/dev/breeze/doc/images/output_ci_fix-ownership.txt
index 744858849d1..195b864d2d0 100644
--- a/dev/breeze/doc/images/output_ci_fix-ownership.txt
+++ b/dev/breeze/doc/images/output_ci_fix-ownership.txt
@@ -1 +1 @@
-9a350b9a01617c0d91b74895c471998d
+3cb498e57408220f1e519fd87b3591fd
diff --git a/dev/breeze/doc/images/output_ci_free-space.txt 
b/dev/breeze/doc/images/output_ci_free-space.txt
index fcd3e8380ae..6d05cae2891 100644
--- a/dev/breeze/doc/images/output_ci_free-space.txt
+++ b/dev/breeze/doc/images/output_ci_free-space.txt
@@ -1 +1 @@
-5463f176d0f234b70c339a6327b04fc1
+f09f3a00b5184fc32f8f2a83e2b2d85e
diff --git a/dev/breeze/doc/images/output_ci_get-workflow-info.txt 
b/dev/breeze/doc/images/output_ci_get-workflow-info.txt
index 9215605ee86..cb32fa3aba5 100644
--- a/dev/breeze/doc/images/output_ci_get-workflow-info.txt
+++ b/dev/breeze/doc/images/output_ci_get-workflow-info.txt
@@ -1 +1 @@
-b356e9aec5dc0c6b7a6748aa944a9097
+31cc2b4c6d1a1aafaf748d35d156dd05
diff --git a/dev/breeze/doc/images/output_ci_resource-check.txt 
b/dev/breeze/doc/images/output_ci_resource-check.txt
index 133407b13ab..3acf87fec0d 100644
--- a/dev/breeze/doc/images/output_ci_resource-check.txt
+++ b/dev/breeze/doc/images/output_ci_resource-check.txt
@@ -1 +1 @@
-78faaccb656e7115091c3eb33e1db52e
+aba60bb91a07cb067da939e93308ed07
diff --git a/dev/breeze/doc/images/output_ci_selective-check.txt 
b/dev/breeze/doc/images/output_ci_selective-check.txt
index 5c3f254d10c..49fcc692fa5 100644
--- a/dev/breeze/doc/images/output_ci_selective-check.txt
+++ b/dev/breeze/doc/images/output_ci_selective-check.txt
@@ -1 +1 @@
-07f0b9236b55157c0c48349d1e7fc716
+dece9e901b05dabcb3af55c27b61410d
diff --git a/dev/breeze/doc/images/output_ci_set-milestone.txt 
b/dev/breeze/doc/images/output_ci_set-milestone.txt
index 0e7e7b79451..2333f800620 100644
--- a/dev/breeze/doc/images/output_ci_set-milestone.txt
+++ b/dev/breeze/doc/images/output_ci_set-milestone.txt
@@ -1 +1 @@
-da6dcbf0c7c951081f6ed7082a849024
+7e6437d4c374aba8a6c9f459d3237ae0
diff --git a/dev/breeze/doc/images/output_ci_upgrade.txt 
b/dev/breeze/doc/images/output_ci_upgrade.txt
index 446a9b367cc..b4279b39938 100644
--- a/dev/breeze/doc/images/output_ci_upgrade.txt
+++ b/dev/breeze/doc/images/output_ci_upgrade.txt
@@ -1 +1 @@
-cd82673ad278d0e427562e69237116e6
+98c7d919cdbf65fa4a8f774650c007e4
diff --git a/dev/breeze/doc/images/output_cleanup.txt 
b/dev/breeze/doc/images/output_cleanup.txt
index 8e5b3135835..24d8db6ddc9 100644
--- a/dev/breeze/doc/images/output_cleanup.txt
+++ b/dev/breeze/doc/images/output_cleanup.txt
@@ -1 +1 @@
-c48fa924ab93157f3782106db4e4c564
+0a2dfb9e5d5e65d602ff2399a0949925
diff --git a/dev/breeze/doc/images/output_doctor.txt 
b/dev/breeze/doc/images/output_doctor.txt
index 848ff3a141b..6f3c5acf194 100644
--- a/dev/breeze/doc/images/output_doctor.txt
+++ b/dev/breeze/doc/images/output_doctor.txt
@@ -1 +1 @@
-0062c127f9be56656573a21d3ca22ed1
+d79232c4903a1ffaacb5eb3b944f354e
diff --git a/dev/breeze/doc/images/output_down.txt 
b/dev/breeze/doc/images/output_down.txt
index 9ffc1b9234d..c0200cc3228 100644
--- a/dev/breeze/doc/images/output_down.txt
+++ b/dev/breeze/doc/images/output_down.txt
@@ -1 +1 @@
-c0823111aee5a9b4832219380463cbea
+5c5712f40f3397d077afce24bc6b5d4d
diff --git a/dev/breeze/doc/images/output_exec.txt 
b/dev/breeze/doc/images/output_exec.txt
index fb30562c126..b3ad835922b 100644
--- a/dev/breeze/doc/images/output_exec.txt
+++ b/dev/breeze/doc/images/output_exec.txt
@@ -1 +1 @@
-b7253a38538f0d76fa005c4aa1ee2730
+0c19dd1538b155da498dd37640c9327e
diff --git a/dev/breeze/doc/images/output_generate-migration-file.txt 
b/dev/breeze/doc/images/output_generate-migration-file.txt
index 465ee6e2c8f..bc99ac073a2 100644
--- a/dev/breeze/doc/images/output_generate-migration-file.txt
+++ b/dev/breeze/doc/images/output_generate-migration-file.txt
@@ -1 +1 @@
-17abdd8a6f454801c5d7a62f108e4af0
+af32528c0276154a8b806a7c31e129dc
diff --git a/dev/breeze/doc/images/output_issues_unassign.txt 
b/dev/breeze/doc/images/output_issues_unassign.txt
index f068eeb8ac8..f876d66b189 100644
--- a/dev/breeze/doc/images/output_issues_unassign.txt
+++ b/dev/breeze/doc/images/output_issues_unassign.txt
@@ -1 +1 @@
-0980c196ed32f8a4d18adaee0c1d4e2b
+acac77b3df954d6b8aff4d11fafedee6
diff --git a/dev/breeze/doc/images/output_k8s_build-k8s-image.txt 
b/dev/breeze/doc/images/output_k8s_build-k8s-image.txt
index f8d906e6b89..e3c40f12db5 100644
--- a/dev/breeze/doc/images/output_k8s_build-k8s-image.txt
+++ b/dev/breeze/doc/images/output_k8s_build-k8s-image.txt
@@ -1 +1 @@
-b0aad03ecd34c29f7a4dcb228c80f52e
+72bed3d7d7894504f270fe40239e1b9b
diff --git a/dev/breeze/doc/images/output_k8s_configure-cluster.txt 
b/dev/breeze/doc/images/output_k8s_configure-cluster.txt
index 93a8fd7719a..73ef5f5decd 100644
--- a/dev/breeze/doc/images/output_k8s_configure-cluster.txt
+++ b/dev/breeze/doc/images/output_k8s_configure-cluster.txt
@@ -1 +1 @@
-cd279fe254076d65388174b6a3d7f91a
+f2b5ff2738e80212ec1afb4fd0a3b1d5
diff --git a/dev/breeze/doc/images/output_k8s_create-cluster.txt 
b/dev/breeze/doc/images/output_k8s_create-cluster.txt
index 33331013c17..257f2e33b7e 100644
--- a/dev/breeze/doc/images/output_k8s_create-cluster.txt
+++ b/dev/breeze/doc/images/output_k8s_create-cluster.txt
@@ -1 +1 @@
-0e5b77c6711ca067ef42651e2303d4ac
+bda47ffc8ebdaf681ed2bdec16574ec3
diff --git a/dev/breeze/doc/images/output_k8s_delete-cluster.txt 
b/dev/breeze/doc/images/output_k8s_delete-cluster.txt
index c4325b42571..cf72922b112 100644
--- a/dev/breeze/doc/images/output_k8s_delete-cluster.txt
+++ b/dev/breeze/doc/images/output_k8s_delete-cluster.txt
@@ -1 +1 @@
-fee7401ccb099fa284ef144654c4b2c6
+ad00903ae7f5ff3cb8f21bc2e4cf1387
diff --git a/dev/breeze/doc/images/output_k8s_deploy-airflow.txt 
b/dev/breeze/doc/images/output_k8s_deploy-airflow.txt
index ea0bdf6c51d..f4c4c5620af 100644
--- a/dev/breeze/doc/images/output_k8s_deploy-airflow.txt
+++ b/dev/breeze/doc/images/output_k8s_deploy-airflow.txt
@@ -1 +1 @@
-ff2638b43ba5c3be45c1b684c6240a69
+3ce1a62e91cffceefefd09619cb6eb52
diff --git a/dev/breeze/doc/images/output_k8s_deploy-cluster.txt 
b/dev/breeze/doc/images/output_k8s_deploy-cluster.txt
index c78f9e0f0bb..fa099647e20 100644
--- a/dev/breeze/doc/images/output_k8s_deploy-cluster.txt
+++ b/dev/breeze/doc/images/output_k8s_deploy-cluster.txt
@@ -1 +1 @@
-d2d591b44c79354f83acc1cd5f7618d1
+6b82815ccbac7e68a900d84d9b2be1cd
diff --git a/dev/breeze/doc/images/output_k8s_dev.txt 
b/dev/breeze/doc/images/output_k8s_dev.txt
index 07332651c42..e111aa2516d 100644
--- a/dev/breeze/doc/images/output_k8s_dev.txt
+++ b/dev/breeze/doc/images/output_k8s_dev.txt
@@ -1 +1 @@
-4357e08b16b300332ddb4dbf9789f9f6
+a5232fad87953eb4ddfe6344b5080b2f
diff --git a/dev/breeze/doc/images/output_k8s_k9s.txt 
b/dev/breeze/doc/images/output_k8s_k9s.txt
index f42a27e5ab4..eb49e665e92 100644
--- a/dev/breeze/doc/images/output_k8s_k9s.txt
+++ b/dev/breeze/doc/images/output_k8s_k9s.txt
@@ -1 +1 @@
-642687535a9bd119c4b18fb853615640
+81eeaa4e9ab9ab7ec358057d6e4e0968
diff --git a/dev/breeze/doc/images/output_k8s_logs.txt 
b/dev/breeze/doc/images/output_k8s_logs.txt
index 7ca19863f89..92c22fe0ca6 100644
--- a/dev/breeze/doc/images/output_k8s_logs.txt
+++ b/dev/breeze/doc/images/output_k8s_logs.txt
@@ -1 +1 @@
-9c1b08ff80101f04d3b35660005f326c
+efc8b5f82c4b23809d8e692f0a62dbad
diff --git a/dev/breeze/doc/images/output_k8s_run-complete-tests.txt 
b/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
index d6ef9cf230d..68b2b5a3319 100644
--- a/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
+++ b/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
@@ -1 +1 @@
-d527256816eeaad37919aea33b4aa0b6
+7cc20839aa0a13776ae3b70c48b5a522
diff --git a/dev/breeze/doc/images/output_k8s_setup-env.txt 
b/dev/breeze/doc/images/output_k8s_setup-env.txt
index 3ff7701f59c..a7859612ac1 100644
--- a/dev/breeze/doc/images/output_k8s_setup-env.txt
+++ b/dev/breeze/doc/images/output_k8s_setup-env.txt
@@ -1 +1 @@
-fa874dd017a7904593f8c33e31380c79
+df0eb05952e6885c632edc7a0624506e
diff --git a/dev/breeze/doc/images/output_k8s_shell.txt 
b/dev/breeze/doc/images/output_k8s_shell.txt
index 9ad213f0d3f..84c5b435e6f 100644
--- a/dev/breeze/doc/images/output_k8s_shell.txt
+++ b/dev/breeze/doc/images/output_k8s_shell.txt
@@ -1 +1 @@
-e73ff34e57ab87fd9da11c82e8bc75d2
+2b3987215e9ca3cf742199fba144c0e2
diff --git a/dev/breeze/doc/images/output_k8s_status.txt 
b/dev/breeze/doc/images/output_k8s_status.txt
index aeb8fc26660..4494c25300b 100644
--- a/dev/breeze/doc/images/output_k8s_status.txt
+++ b/dev/breeze/doc/images/output_k8s_status.txt
@@ -1 +1 @@
-58c22a8b2da6ef1406751793398ca8b4
+3acd959fabaea5b0e6b08d11e2f98be5
diff --git a/dev/breeze/doc/images/output_k8s_tests.txt 
b/dev/breeze/doc/images/output_k8s_tests.txt
index def266501c7..459e3cd1d2d 100644
--- a/dev/breeze/doc/images/output_k8s_tests.txt
+++ b/dev/breeze/doc/images/output_k8s_tests.txt
@@ -1 +1 @@
-9d43b6a388f1a1d27a4b9a7882d480e8
+7a1170264859cd3fc078681755907622
diff --git a/dev/breeze/doc/images/output_k8s_upload-k8s-image.txt 
b/dev/breeze/doc/images/output_k8s_upload-k8s-image.txt
index c745aa99b88..bf42134049f 100644
--- a/dev/breeze/doc/images/output_k8s_upload-k8s-image.txt
+++ b/dev/breeze/doc/images/output_k8s_upload-k8s-image.txt
@@ -1 +1 @@
-d3df7bfd0a00839583a6ba8a14ab1626
+3309c346f42feddbf81134a844fd84a5
diff --git a/dev/breeze/doc/images/output_pr_auto-triage.txt 
b/dev/breeze/doc/images/output_pr_auto-triage.txt
index fe8684a66c3..9083b385575 100644
--- a/dev/breeze/doc/images/output_pr_auto-triage.txt
+++ b/dev/breeze/doc/images/output_pr_auto-triage.txt
@@ -1 +1 @@
-640d7f0c5dfb6d651727247974229425
+0dbf8ae00f0620d12477ece9fda0ab6d
diff --git a/dev/breeze/doc/images/output_prod-image_build.txt 
b/dev/breeze/doc/images/output_prod-image_build.txt
index ca70c4faa31..d7e65161edd 100644
--- a/dev/breeze/doc/images/output_prod-image_build.txt
+++ b/dev/breeze/doc/images/output_prod-image_build.txt
@@ -1 +1 @@
-5e9c8c08d742ffa088519b84cdcd12ea
+9e7d3206e8ca56abb72cae9ec1342822
diff --git a/dev/breeze/doc/images/output_prod-image_load.txt 
b/dev/breeze/doc/images/output_prod-image_load.txt
index f53600a7886..2fe77812506 100644
--- a/dev/breeze/doc/images/output_prod-image_load.txt
+++ b/dev/breeze/doc/images/output_prod-image_load.txt
@@ -1 +1 @@
-f27e839e0922eca043c6685150d309a5
+63c87a78c6a0ef9bd1172b0099cf3351
diff --git a/dev/breeze/doc/images/output_prod-image_pull.txt 
b/dev/breeze/doc/images/output_prod-image_pull.txt
index 2cf1b3b03f3..fa188f44b61 100644
--- a/dev/breeze/doc/images/output_prod-image_pull.txt
+++ b/dev/breeze/doc/images/output_prod-image_pull.txt
@@ -1 +1 @@
-354d53de69f66f13ca75c97154e78acf
+943b61b60f81476638e74ab0e5ba451e
diff --git a/dev/breeze/doc/images/output_prod-image_save.txt 
b/dev/breeze/doc/images/output_prod-image_save.txt
index cd074a47eeb..b2e74c178e6 100644
--- a/dev/breeze/doc/images/output_prod-image_save.txt
+++ b/dev/breeze/doc/images/output_prod-image_save.txt
@@ -1 +1 @@
-75b76351fd6e0b9c9b15f95f8320580e
+501704529422b306b8cfc28ee28d3f55
diff --git a/dev/breeze/doc/images/output_prod-image_verify.txt 
b/dev/breeze/doc/images/output_prod-image_verify.txt
index 77a49bbf22d..f431e6eae9d 100644
--- a/dev/breeze/doc/images/output_prod-image_verify.txt
+++ b/dev/breeze/doc/images/output_prod-image_verify.txt
@@ -1 +1 @@
-e9aa872361d9d782fb489f390df32349
+f95887aff9ae25fe203629e01c2fe25d
diff --git a/dev/breeze/doc/images/output_registry_backfill.txt 
b/dev/breeze/doc/images/output_registry_backfill.txt
index baa713f381a..a6c2643c303 100644
--- a/dev/breeze/doc/images/output_registry_backfill.txt
+++ b/dev/breeze/doc/images/output_registry_backfill.txt
@@ -1 +1 @@
-c7ec8adadd6e4f0cfd792a00c428e8e3
+ae5a02b96d38958e1b732eef27e22743
diff --git a/dev/breeze/doc/images/output_registry_extract-data.txt 
b/dev/breeze/doc/images/output_registry_extract-data.txt
index 01f0685f693..a5b0e70c052 100644
--- a/dev/breeze/doc/images/output_registry_extract-data.txt
+++ b/dev/breeze/doc/images/output_registry_extract-data.txt
@@ -1 +1 @@
-8d49c8fa1983d39f05a5add21b1e7172
+602ea508f9bcf0d5c2f97a220f5ee6d2
diff --git a/dev/breeze/doc/images/output_registry_publish-versions.txt 
b/dev/breeze/doc/images/output_registry_publish-versions.txt
index 87ec90bfa13..b3bf16f2409 100644
--- a/dev/breeze/doc/images/output_registry_publish-versions.txt
+++ b/dev/breeze/doc/images/output_registry_publish-versions.txt
@@ -1 +1 @@
-b26208c9d3432eaf1d11bce4a287d82b
+60aa5a1adc37e2165177e7881a838707
diff --git 
a/dev/breeze/doc/images/output_release-management_add-back-references.txt 
b/dev/breeze/doc/images/output_release-management_add-back-references.txt
index 61381087033..1738c0ec0c0 100644
--- a/dev/breeze/doc/images/output_release-management_add-back-references.txt
+++ b/dev/breeze/doc/images/output_release-management_add-back-references.txt
@@ -1 +1 @@
-b4654ebd46094a96811efaec9cef0b80
+057958044be14599b5b0039ec507b6ca
diff --git 
a/dev/breeze/doc/images/output_release-management_check-release-files.txt 
b/dev/breeze/doc/images/output_release-management_check-release-files.txt
index 7229b275127..e3b08d31a5e 100644
--- a/dev/breeze/doc/images/output_release-management_check-release-files.txt
+++ b/dev/breeze/doc/images/output_release-management_check-release-files.txt
@@ -1 +1 @@
-648165a2800b8651d176d9778ecd96a3
+4d7d540413a5955a51eaf7d035ff31bc
diff --git 
a/dev/breeze/doc/images/output_release-management_clean-old-provider-artifacts.txt
 
b/dev/breeze/doc/images/output_release-management_clean-old-provider-artifacts.txt
index 4edf34897dc..a7826a4a7a5 100644
--- 
a/dev/breeze/doc/images/output_release-management_clean-old-provider-artifacts.txt
+++ 
b/dev/breeze/doc/images/output_release-management_clean-old-provider-artifacts.txt
@@ -1 +1 @@
-2be42faedac6e0807d5ff895850350b1
+0d6898918777adbd6576972fe59dc2f7
diff --git 
a/dev/breeze/doc/images/output_release-management_constraints-version-check.txt 
b/dev/breeze/doc/images/output_release-management_constraints-version-check.txt
index 6959bc944dd..5f4e9134458 100644
--- 
a/dev/breeze/doc/images/output_release-management_constraints-version-check.txt
+++ 
b/dev/breeze/doc/images/output_release-management_constraints-version-check.txt
@@ -1 +1 @@
-333b3097d268808466dd5d33e88dada4
+69595e717626710cce603db050e76a21
diff --git 
a/dev/breeze/doc/images/output_release-management_create-minor-branch.txt 
b/dev/breeze/doc/images/output_release-management_create-minor-branch.txt
index 049d17b9f14..95896eb6a4f 100644
--- a/dev/breeze/doc/images/output_release-management_create-minor-branch.txt
+++ b/dev/breeze/doc/images/output_release-management_create-minor-branch.txt
@@ -1 +1 @@
-01495a0ad3c811a4d54d12de34818bbb
+72d85ebed1d067a94eace68825d55848
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-constraints.txt 
b/dev/breeze/doc/images/output_release-management_generate-constraints.txt
index 3bd12bcce16..6b4ef06da4a 100644
--- a/dev/breeze/doc/images/output_release-management_generate-constraints.txt
+++ b/dev/breeze/doc/images/output_release-management_generate-constraints.txt
@@ -1 +1 @@
-1e05462af1f8749ae02ccc79f9d40422
+8f5434ddc6564b1a2b026a63424eecea
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-issue-content-core.txt
 
b/dev/breeze/doc/images/output_release-management_generate-issue-content-core.txt
index 96c77b3f300..d0a9e0a1cb0 100644
--- 
a/dev/breeze/doc/images/output_release-management_generate-issue-content-core.txt
+++ 
b/dev/breeze/doc/images/output_release-management_generate-issue-content-core.txt
@@ -1 +1 @@
-e8e5a148b595f092733ecd1de8d5ff83
+80bb575675cea0b47b61d6ac65dec28f
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-issue-content-helm-chart.txt
 
b/dev/breeze/doc/images/output_release-management_generate-issue-content-helm-chart.txt
index b0b4f20c1bd..d4cd28e21cb 100644
--- 
a/dev/breeze/doc/images/output_release-management_generate-issue-content-helm-chart.txt
+++ 
b/dev/breeze/doc/images/output_release-management_generate-issue-content-helm-chart.txt
@@ -1 +1 @@
-8b831c945a031adf581c10d056f2f8cb
+ddb64b2373109f1f7bee6abc2d62d636
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-issue-content-providers.txt
 
b/dev/breeze/doc/images/output_release-management_generate-issue-content-providers.txt
index e6e491130d4..0a88b97dfc4 100644
--- 
a/dev/breeze/doc/images/output_release-management_generate-issue-content-providers.txt
+++ 
b/dev/breeze/doc/images/output_release-management_generate-issue-content-providers.txt
@@ -1 +1 @@
-3784a30daef839c40d1728db89d14eec
+20f849b3a6098cf813098a97bf220006
diff --git 
a/dev/breeze/doc/images/output_release-management_generate-providers-metadata.txt
 
b/dev/breeze/doc/images/output_release-management_generate-providers-metadata.txt
index 69b019acadb..84245824641 100644
--- 
a/dev/breeze/doc/images/output_release-management_generate-providers-metadata.txt
+++ 
b/dev/breeze/doc/images/output_release-management_generate-providers-metadata.txt
@@ -1 +1 @@
-8032b4cd7d4700fad274499dc09600a2
+a9a87df8382a9faa57e6b79356f4295f
diff --git 
a/dev/breeze/doc/images/output_release-management_install-provider-distributions.txt
 
b/dev/breeze/doc/images/output_release-management_install-provider-distributions.txt
index 8522b5eed09..e80b971b250 100644
--- 
a/dev/breeze/doc/images/output_release-management_install-provider-distributions.txt
+++ 
b/dev/breeze/doc/images/output_release-management_install-provider-distributions.txt
@@ -1 +1 @@
-50d5237415adf86e0305d8f9a7101622
+e27a6e759f82c1fb8639a32f8f6ef1ff
diff --git 
a/dev/breeze/doc/images/output_release-management_merge-prod-images.txt 
b/dev/breeze/doc/images/output_release-management_merge-prod-images.txt
index 5b3dad52ab7..0c477d4b585 100644
--- a/dev/breeze/doc/images/output_release-management_merge-prod-images.txt
+++ b/dev/breeze/doc/images/output_release-management_merge-prod-images.txt
@@ -1 +1 @@
-fdffd3058df3b2fa320ff1cc1451ec17
+f7bc7460a2910c50776b6f702ecb2bc8
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-airflow-ctl-distributions.txt
 
b/dev/breeze/doc/images/output_release-management_prepare-airflow-ctl-distributions.txt
index be56ef03f8c..f4299494cc4 100644
--- 
a/dev/breeze/doc/images/output_release-management_prepare-airflow-ctl-distributions.txt
+++ 
b/dev/breeze/doc/images/output_release-management_prepare-airflow-ctl-distributions.txt
@@ -1 +1 @@
-78b65572bc4eae79e93da71d792164fe
+b40148a43101cec687cce3c378c52c50
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.txt
 
b/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.txt
index 5abdcb47485..57792ecf073 100644
--- 
a/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.txt
+++ 
b/dev/breeze/doc/images/output_release-management_prepare-airflow-distributions.txt
@@ -1 +1 @@
-183d19e51977a7ffd727580bdf6ea8ef
+2ef5b359a3cc686b973f408aef6b5803
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-helm-chart-package.txt
 
b/dev/breeze/doc/images/output_release-management_prepare-helm-chart-package.txt
index bc3fe5f3e60..675e69663de 100644
--- 
a/dev/breeze/doc/images/output_release-management_prepare-helm-chart-package.txt
+++ 
b/dev/breeze/doc/images/output_release-management_prepare-helm-chart-package.txt
@@ -1 +1 @@
-4820cdc0da993867f28caab6ab5fc7dc
+535e58ad4fd6139c86bd3b89fcec1964
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-helm-chart-tarball.txt
 
b/dev/breeze/doc/images/output_release-management_prepare-helm-chart-tarball.txt
index 70249d65b3c..0f74190a744 100644
--- 
a/dev/breeze/doc/images/output_release-management_prepare-helm-chart-tarball.txt
+++ 
b/dev/breeze/doc/images/output_release-management_prepare-helm-chart-tarball.txt
@@ -1 +1 @@
-cfb2d856454f9e86bea23396118c5e30
+465b09b0f0fd9898cdc3ff006ef86b61
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-mypy-distributions.txt
 
b/dev/breeze/doc/images/output_release-management_prepare-mypy-distributions.txt
index 65abb49b363..5c480ad616e 100644
--- 
a/dev/breeze/doc/images/output_release-management_prepare-mypy-distributions.txt
+++ 
b/dev/breeze/doc/images/output_release-management_prepare-mypy-distributions.txt
@@ -1 +1 @@
-648c4d643abdb60f82e1afced6cfd6d5
+6a78a6708d57916b90df21bd8a035e8d
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.txt
 
b/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.txt
index 6c7d65448ee..416151822b1 100644
--- 
a/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.txt
+++ 
b/dev/breeze/doc/images/output_release-management_prepare-provider-distributions.txt
@@ -1 +1 @@
-2939956d3bf1154f772da9d8a1bf1647
+8e9317e44788c0b820f3a461da6df58a
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-provider-documentation.txt
 
b/dev/breeze/doc/images/output_release-management_prepare-provider-documentation.txt
index 32b1109fb35..25496ff5fe2 100644
--- 
a/dev/breeze/doc/images/output_release-management_prepare-provider-documentation.txt
+++ 
b/dev/breeze/doc/images/output_release-management_prepare-provider-documentation.txt
@@ -1 +1 @@
-926fc875638e2cb79e4f9df1acbd846b
+75517e0fd3d48cbc5cf85c50812753df
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-python-client.txt 
b/dev/breeze/doc/images/output_release-management_prepare-python-client.txt
index 57dd5f1ed3a..77e308e2a38 100644
--- a/dev/breeze/doc/images/output_release-management_prepare-python-client.txt
+++ b/dev/breeze/doc/images/output_release-management_prepare-python-client.txt
@@ -1 +1 @@
-2501eff9b78bd0c1e8154150d37fbe30
+404fc48b3968c34a8ad53443dfce8980
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-tarball.txt 
b/dev/breeze/doc/images/output_release-management_prepare-tarball.txt
index 36e25bbd08c..7cc646fca25 100644
--- a/dev/breeze/doc/images/output_release-management_prepare-tarball.txt
+++ b/dev/breeze/doc/images/output_release-management_prepare-tarball.txt
@@ -1 +1 @@
-529d01caf3eb57088d7df671f80b4bdb
+921cee73b360da76bab70bd424293e20
diff --git 
a/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.txt
 
b/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.txt
index f41ed008535..f1b9ee42e45 100644
--- 
a/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.txt
+++ 
b/dev/breeze/doc/images/output_release-management_prepare-task-sdk-distributions.txt
@@ -1 +1 @@
-40d4bc2a1d656d4e0f7373a90b549e94
+e7dd67a233f4c0b5ea0ae75e95c859fa
diff --git 
a/dev/breeze/doc/images/output_release-management_publish-docs-to-s3.txt 
b/dev/breeze/doc/images/output_release-management_publish-docs-to-s3.txt
index 822ce77242d..bfad2d6f5eb 100644
--- a/dev/breeze/doc/images/output_release-management_publish-docs-to-s3.txt
+++ b/dev/breeze/doc/images/output_release-management_publish-docs-to-s3.txt
@@ -1 +1 @@
-41787acc1ee74ac0d86bf981678956e8
+b11847cc9e7091d948597ac5823c98d3
diff --git a/dev/breeze/doc/images/output_release-management_publish-docs.txt 
b/dev/breeze/doc/images/output_release-management_publish-docs.txt
index 396fda7d611..12e06cfa472 100644
--- a/dev/breeze/doc/images/output_release-management_publish-docs.txt
+++ b/dev/breeze/doc/images/output_release-management_publish-docs.txt
@@ -1 +1 @@
-82288cd2badfc7241e8e6e46620c0280
+7967a912265c05eb878af2ba3ddf2057
diff --git 
a/dev/breeze/doc/images/output_release-management_release-prod-images.txt 
b/dev/breeze/doc/images/output_release-management_release-prod-images.txt
index 1ea13efce80..e7a2563b7e9 100644
--- a/dev/breeze/doc/images/output_release-management_release-prod-images.txt
+++ b/dev/breeze/doc/images/output_release-management_release-prod-images.txt
@@ -1 +1 @@
-c29e3146509fc796313a8b201d16d7ef
+66ee560be7b29389cb7f46d104eb92ec
diff --git 
a/dev/breeze/doc/images/output_release-management_start-rc-process.txt 
b/dev/breeze/doc/images/output_release-management_start-rc-process.txt
index 5489f0a06e9..7026b7fdecc 100644
--- a/dev/breeze/doc/images/output_release-management_start-rc-process.txt
+++ b/dev/breeze/doc/images/output_release-management_start-rc-process.txt
@@ -1 +1 @@
-549da0be0cb515c2300c8f099b0543ca
+59523e169ffeaf7e5f01b40986de7951
diff --git a/dev/breeze/doc/images/output_release-management_start-release.txt 
b/dev/breeze/doc/images/output_release-management_start-release.txt
index 590311afbc2..50d14440106 100644
--- a/dev/breeze/doc/images/output_release-management_start-release.txt
+++ b/dev/breeze/doc/images/output_release-management_start-release.txt
@@ -1 +1 @@
-cfab7b5f470357cdb11fcfea04641a1d
+353deb3db7e1ef5cfe5aa3b897211f4c
diff --git a/dev/breeze/doc/images/output_release-management_tag-providers.txt 
b/dev/breeze/doc/images/output_release-management_tag-providers.txt
index d98a7c6f08f..1520dccffc5 100644
--- a/dev/breeze/doc/images/output_release-management_tag-providers.txt
+++ b/dev/breeze/doc/images/output_release-management_tag-providers.txt
@@ -1 +1 @@
-8a985738a87fb8c51c90448b20f418c9
+95035a072198cd13edf4108c2d4dedae
diff --git 
a/dev/breeze/doc/images/output_release-management_update-constraints.txt 
b/dev/breeze/doc/images/output_release-management_update-constraints.txt
index c3d786b4891..f85cfa6d149 100644
--- a/dev/breeze/doc/images/output_release-management_update-constraints.txt
+++ b/dev/breeze/doc/images/output_release-management_update-constraints.txt
@@ -1 +1 @@
-2abc0886ad0977e0a91f579c3f0ac3ce
+1ef2866635f42330fe813b8dc2121f6f
diff --git 
a/dev/breeze/doc/images/output_release-management_update-providers-next-version.txt
 
b/dev/breeze/doc/images/output_release-management_update-providers-next-version.txt
index a916bab6a57..7eafa92405b 100644
--- 
a/dev/breeze/doc/images/output_release-management_update-providers-next-version.txt
+++ 
b/dev/breeze/doc/images/output_release-management_update-providers-next-version.txt
@@ -1 +1 @@
-49953c2a602e2fb6b9c8c9e12ce1de0a
+822bfe3d040b5b0e2052582cea5fa2f7
diff --git 
a/dev/breeze/doc/images/output_release-management_verify-provider-distributions.txt
 
b/dev/breeze/doc/images/output_release-management_verify-provider-distributions.txt
index ee06584a4fb..d8467d37602 100644
--- 
a/dev/breeze/doc/images/output_release-management_verify-provider-distributions.txt
+++ 
b/dev/breeze/doc/images/output_release-management_verify-provider-distributions.txt
@@ -1 +1 @@
-51d8f9f4993e6569a523ea6b049d3de8
+6f38f05b84f4aa4a5e41e2f7e7ee4318
diff --git 
a/dev/breeze/doc/images/output_release-management_verify-rc-by-pmc.txt 
b/dev/breeze/doc/images/output_release-management_verify-rc-by-pmc.txt
index 1cdcdfc8d6e..d1dcea6926c 100644
--- a/dev/breeze/doc/images/output_release-management_verify-rc-by-pmc.txt
+++ b/dev/breeze/doc/images/output_release-management_verify-rc-by-pmc.txt
@@ -1 +1 @@
-2c62c11595f22d4fdf7e9c9a7aefb998
+7026ac9fe494c008d46607532a603105
diff --git a/dev/breeze/doc/images/output_run.txt 
b/dev/breeze/doc/images/output_run.txt
index a6ec3736b4c..5d3b86b5069 100644
--- a/dev/breeze/doc/images/output_run.txt
+++ b/dev/breeze/doc/images/output_run.txt
@@ -1 +1 @@
-d2879ca7680ce6396b118b3e42bfd62d
+54d7d635ab887d0f556a9cebcab7f63f
diff --git a/dev/breeze/doc/images/output_sbom_build-all-airflow-images.txt 
b/dev/breeze/doc/images/output_sbom_build-all-airflow-images.txt
index a549f772080..97a73d6d300 100644
--- a/dev/breeze/doc/images/output_sbom_build-all-airflow-images.txt
+++ b/dev/breeze/doc/images/output_sbom_build-all-airflow-images.txt
@@ -1 +1 @@
-93c3e4001d46207d0b1026768f4cb4c0
+a1857855ca7836fb77e7d49d59452c98
diff --git 
a/dev/breeze/doc/images/output_sbom_export-dependency-information.txt 
b/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
index ae661bd3359..21c6d97139b 100644
--- a/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
+++ b/dev/breeze/doc/images/output_sbom_export-dependency-information.txt
@@ -1 +1 @@
-d1782d0498b05c41c04ebe4703af7843
+e374f5b74d0f817f6915a8417ba0cda4
diff --git 
a/dev/breeze/doc/images/output_sbom_generate-providers-requirements.txt 
b/dev/breeze/doc/images/output_sbom_generate-providers-requirements.txt
index af3b18bac68..0c39f82ba37 100644
--- a/dev/breeze/doc/images/output_sbom_generate-providers-requirements.txt
+++ b/dev/breeze/doc/images/output_sbom_generate-providers-requirements.txt
@@ -1 +1 @@
-32e515c6d22a49190410280d16eb3398
+cb4611abc6764a8d7c1aacad63da03e3
diff --git a/dev/breeze/doc/images/output_sbom_update-sbom-information.txt 
b/dev/breeze/doc/images/output_sbom_update-sbom-information.txt
index 6ab41cc9f19..cfdc44468b5 100644
--- a/dev/breeze/doc/images/output_sbom_update-sbom-information.txt
+++ b/dev/breeze/doc/images/output_sbom_update-sbom-information.txt
@@ -1 +1 @@
-fb99f661fec72e46d73d5de124f56fe7
+1c4a91a95b45910314f3596b0a84ac02
diff --git a/dev/breeze/doc/images/output_setup_autocomplete.txt 
b/dev/breeze/doc/images/output_setup_autocomplete.txt
index cfe326723ab..7886a97f754 100644
--- a/dev/breeze/doc/images/output_setup_autocomplete.txt
+++ b/dev/breeze/doc/images/output_setup_autocomplete.txt
@@ -1 +1 @@
-993887cc456374d1a10ffb62d5133154
+c34f64dff5e77995d13ccee0a29a5408
diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt 
b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
index e31c6cb3d11..47183c1981e 100644
--- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
+++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
@@ -1 +1 @@
-ea835758cd03dda882551c07b051daa8
+17c3b9d51cdd33b71a3ef495edc7297f
diff --git a/dev/breeze/doc/images/output_setup_config.txt 
b/dev/breeze/doc/images/output_setup_config.txt
index 5d1e4e5dfac..4bed9f321be 100644
--- a/dev/breeze/doc/images/output_setup_config.txt
+++ b/dev/breeze/doc/images/output_setup_config.txt
@@ -1 +1 @@
-c04c7d721a48bf54ff269e0c403853e1
+4fc5026be69f9e924d243365bdaa993d
diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt 
b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
index e8bd48f0167..f171b07e731 100644
--- a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
+++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
@@ -1 +1 @@
-2cc5a3c1f8cf474ed99999e62f59fd72
+d94f428c2c56dd453d3c5f02ae3442af
diff --git a/dev/breeze/doc/images/output_setup_synchronize-local-mounts.txt 
b/dev/breeze/doc/images/output_setup_synchronize-local-mounts.txt
index e7c8a46e3f8..8d20c67ea65 100644
--- a/dev/breeze/doc/images/output_setup_synchronize-local-mounts.txt
+++ b/dev/breeze/doc/images/output_setup_synchronize-local-mounts.txt
@@ -1 +1 @@
-20b6427e7e7faa4b9b5676fccd31bb5d
+f2fe62f152bdbe41956fa1d6a9bf719a
diff --git a/dev/breeze/doc/images/output_setup_version.txt 
b/dev/breeze/doc/images/output_setup_version.txt
index 2fe696e64d8..18a4093aec8 100644
--- a/dev/breeze/doc/images/output_setup_version.txt
+++ b/dev/breeze/doc/images/output_setup_version.txt
@@ -1 +1 @@
-6752d695b7db5fdea208095797fed2fa
+f9dfcf32db12ce914dd00b0542a40e2f
diff --git a/dev/breeze/doc/images/output_shell.svg 
b/dev/breeze/doc/images/output_shell.svg
index 1a74a0392f5..82892287298 100644
--- a/dev/breeze/doc/images/output_shell.svg
+++ b/dev/breeze/doc/images/output_shell.svg
@@ -616,7 +616,7 @@
 </text><text class="breeze-shell-r5" x="0" y="1435.2" textLength="1464" 
clip-path="url(#breeze-shell-line-58)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1435.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-58)">
 </text><text class="breeze-shell-r5" x="0" y="1459.6" textLength="24.4" 
clip-path="url(#breeze-shell-line-59)">╭─</text><text class="breeze-shell-r5" 
x="24.4" y="1459.6" textLength="207.4" 
clip-path="url(#breeze-shell-line-59)">&#160;Choose&#160;executor&#160;</text><text
 class="breeze-shell-r5" x="231.8" y="1459.6" textLength="1207.8" 
clip-path="url(#breeze-shell-line-59)">───────────────────────────────────────────────────────────────────────────────────────────────────</text><text
 cla [...]
 </text><text class="breeze-shell-r5" x="0" y="1484" textLength="12.2" 
clip-path="url(#breeze-shell-line-60)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1484" textLength="183" 
clip-path="url(#breeze-shell-line-60)">--executor&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-shell-r1" x="231.8" y="1484" textLength="585.6" 
clip-path="url(#breeze-shell-line-60)">Specify&#160;the&#160;executor&#160;to&#160;use&#160;with&#160;shell&#160;command.&#160;</text><text
 class="breeze-sh [...]
-</text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r7" 
x="231.8" y="1508.4" textLength="1061.4" 
clip-path="url(#breeze-shell-line-61)">(LocalExecutor|KubernetesExecutor|CeleryExecutor|CeleryKubernetesExecutor|EdgeExecutor)</text><text
 class="breeze-shell-r5" x="1451.8" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r1" 
x="1464" y="1508.4" te [...]
+</text><text class="breeze-shell-r5" x="0" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r7" 
x="231.8" y="1508.4" textLength="1061.4" 
clip-path="url(#breeze-shell-line-61)">(localexecutor|kubernetesexecutor|celeryexecutor|celerykubernetesexecutor|edgeexecutor)</text><text
 class="breeze-shell-r5" x="1451.8" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-shell-line-61)">│</text><text class="breeze-shell-r1" 
x="1464" y="1508.4" te [...]
 </text><text class="breeze-shell-r5" x="0" y="1532.8" textLength="12.2" 
clip-path="url(#breeze-shell-line-62)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1532.8" textLength="183" 
clip-path="url(#breeze-shell-line-62)">--celery-broker</text><text 
class="breeze-shell-r1" x="231.8" y="1532.8" textLength="414.8" 
clip-path="url(#breeze-shell-line-62)">Specify&#160;the&#160;celery&#160;message&#160;broker&#160;</text><text
 class="breeze-shell-r5" x="646.6" y="1532.8" textLength="195.2"  [...]
 </text><text class="breeze-shell-r5" x="0" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-shell-line-63)">│</text><text class="breeze-shell-r4" 
x="24.4" y="1557.2" textLength="183" 
clip-path="url(#breeze-shell-line-63)">--celery-flower</text><text 
class="breeze-shell-r1" x="231.8" y="1557.2" textLength="231.8" 
clip-path="url(#breeze-shell-line-63)">Start&#160;celery&#160;flower</text><text
 class="breeze-shell-r5" x="1451.8" y="1557.2" textLength="12.2" 
clip-path="url(#breeze-shell-l [...]
 </text><text class="breeze-shell-r5" x="0" y="1581.6" textLength="1464" 
clip-path="url(#breeze-shell-line-64)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-shell-r1" x="1464" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-shell-line-64)">
diff --git a/dev/breeze/doc/images/output_shell.txt 
b/dev/breeze/doc/images/output_shell.txt
index 6a7b5dee23c..3544feee31e 100644
--- a/dev/breeze/doc/images/output_shell.txt
+++ b/dev/breeze/doc/images/output_shell.txt
@@ -1 +1 @@
-2b113618326d9763c7e0bc1879f8ca37
+95bba676df9c9dccc5b0798fbc269f6e
diff --git a/dev/breeze/doc/images/output_start-airflow.svg 
b/dev/breeze/doc/images/output_start-airflow.svg
index f60a7ba6a94..f5779f508e0 100644
--- a/dev/breeze/doc/images/output_start-airflow.svg
+++ b/dev/breeze/doc/images/output_start-airflow.svg
@@ -548,7 +548,7 @@
 </text><text class="breeze-start-airflow-r5" x="0" y="1313.2" 
textLength="1464" 
clip-path="url(#breeze-start-airflow-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-start-airflow-r1" x="1464" y="1313.2" textLength="12.2" 
clip-path="url(#breeze-start-airflow-line-53)">
 </text><text class="breeze-start-airflow-r5" x="0" y="1337.6" 
textLength="24.4" clip-path="url(#breeze-start-airflow-line-54)">╭─</text><text 
class="breeze-start-airflow-r5" x="24.4" y="1337.6" textLength="231.8" 
clip-path="url(#breeze-start-airflow-line-54)">&#160;Choosing&#160;executor&#160;</text><text
 class="breeze-start-airflow-r5" x="256.2" y="1337.6" textLength="1183.4" 
clip-path="url(#breeze-start-airflow-line-54)">─────────────────────────────────────────────────────────────────
 [...]
 </text><text class="breeze-start-airflow-r5" x="0" y="1362" textLength="12.2" 
clip-path="url(#breeze-start-airflow-line-55)">│</text><text 
class="breeze-start-airflow-r4" x="24.4" y="1362" textLength="183" 
clip-path="url(#breeze-start-airflow-line-55)">--executor&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-start-airflow-r1" x="231.8" y="1362" textLength="1207.8" 
clip-path="url(#breeze-start-airflow-line-55)">Specify&#160;the&#160;executor&#160;to&#160;use&#160;with&#160;start
 [...]
-</text><text class="breeze-start-airflow-r5" x="0" y="1386.4" 
textLength="12.2" clip-path="url(#breeze-start-airflow-line-56)">│</text><text 
class="breeze-start-airflow-r1" x="231.8" y="1386.4" textLength="439.2" 
clip-path="url(#breeze-start-airflow-line-56)">depending&#160;on&#160;the&#160;integration&#160;used).&#160;</text><text
 class="breeze-start-airflow-r7" x="671" y="1386.4" textLength="524.6" 
clip-path="url(#breeze-start-airflow-line-56)">(LocalExecutor|CeleryExecutor|EdgeExecuto
 [...]
+</text><text class="breeze-start-airflow-r5" x="0" y="1386.4" 
textLength="12.2" clip-path="url(#breeze-start-airflow-line-56)">│</text><text 
class="breeze-start-airflow-r1" x="231.8" y="1386.4" textLength="439.2" 
clip-path="url(#breeze-start-airflow-line-56)">depending&#160;on&#160;the&#160;integration&#160;used).&#160;</text><text
 class="breeze-start-airflow-r7" x="671" y="1386.4" textLength="524.6" 
clip-path="url(#breeze-start-airflow-line-56)">(localexecutor|celeryexecutor|edgeexecuto
 [...]
 </text><text class="breeze-start-airflow-r5" x="0" y="1410.8" 
textLength="12.2" clip-path="url(#breeze-start-airflow-line-57)">│</text><text 
class="breeze-start-airflow-r4" x="24.4" y="1410.8" textLength="183" 
clip-path="url(#breeze-start-airflow-line-57)">--celery-broker</text><text 
class="breeze-start-airflow-r1" x="231.8" y="1410.8" textLength="414.8" 
clip-path="url(#breeze-start-airflow-line-57)">Specify&#160;the&#160;celery&#160;message&#160;broker&#160;</text><text
 class="breeze-st [...]
 </text><text class="breeze-start-airflow-r5" x="0" y="1435.2" 
textLength="12.2" clip-path="url(#breeze-start-airflow-line-58)">│</text><text 
class="breeze-start-airflow-r4" x="24.4" y="1435.2" textLength="183" 
clip-path="url(#breeze-start-airflow-line-58)">--celery-flower</text><text 
class="breeze-start-airflow-r1" x="231.8" y="1435.2" textLength="231.8" 
clip-path="url(#breeze-start-airflow-line-58)">Start&#160;celery&#160;flower</text><text
 class="breeze-start-airflow-r5" x="1451.8" y=" [...]
 </text><text class="breeze-start-airflow-r5" x="0" y="1459.6" 
textLength="1464" 
clip-path="url(#breeze-start-airflow-line-59)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-start-airflow-r1" x="1464" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-start-airflow-line-59)">
diff --git a/dev/breeze/doc/images/output_start-airflow.txt 
b/dev/breeze/doc/images/output_start-airflow.txt
index d2a1e628064..81c11faa429 100644
--- a/dev/breeze/doc/images/output_start-airflow.txt
+++ b/dev/breeze/doc/images/output_start-airflow.txt
@@ -1 +1 @@
-f0341f2a04d16d802889e257633b110c
+a76fae2707fcab0cc46a68f1186c6a08
diff --git 
a/dev/breeze/doc/images/output_testing_airflow-ctl-integration-tests.txt 
b/dev/breeze/doc/images/output_testing_airflow-ctl-integration-tests.txt
index dc01b623b26..36147a39ccc 100644
--- a/dev/breeze/doc/images/output_testing_airflow-ctl-integration-tests.txt
+++ b/dev/breeze/doc/images/output_testing_airflow-ctl-integration-tests.txt
@@ -1 +1 @@
-81a43bae5ec3c31ab2294a871e3d94b7
+e302335890458a12a28a52ed51b6337f
diff --git a/dev/breeze/doc/images/output_testing_airflow-ctl-tests.txt 
b/dev/breeze/doc/images/output_testing_airflow-ctl-tests.txt
index db7c6045fbc..98f03c94d23 100644
--- a/dev/breeze/doc/images/output_testing_airflow-ctl-tests.txt
+++ b/dev/breeze/doc/images/output_testing_airflow-ctl-tests.txt
@@ -1 +1 @@
-d67fcf2594fb5f78fedb1360ba07dab2
+caf04a20ceb4b3a426e095860f8a800f
diff --git a/dev/breeze/doc/images/output_testing_airflow-e2e-tests.txt 
b/dev/breeze/doc/images/output_testing_airflow-e2e-tests.txt
index 88da574d7ad..b344eaf9673 100644
--- a/dev/breeze/doc/images/output_testing_airflow-e2e-tests.txt
+++ b/dev/breeze/doc/images/output_testing_airflow-e2e-tests.txt
@@ -1 +1 @@
-3b6adba2bcaf91d241d9829ed46ab909
+11e115062a47a3ee70aeaa380af9cd84
diff --git a/dev/breeze/doc/images/output_testing_core-integration-tests.txt 
b/dev/breeze/doc/images/output_testing_core-integration-tests.txt
index 6abbd761032..aad3803373c 100644
--- a/dev/breeze/doc/images/output_testing_core-integration-tests.txt
+++ b/dev/breeze/doc/images/output_testing_core-integration-tests.txt
@@ -1 +1 @@
-363940bbe9113849e443464fbd0ba7ff
+56f677845a9c84dbdc1131c51b9af83a
diff --git a/dev/breeze/doc/images/output_testing_core-tests.txt 
b/dev/breeze/doc/images/output_testing_core-tests.txt
index f4f45d2efbb..214822e92c3 100644
--- a/dev/breeze/doc/images/output_testing_core-tests.txt
+++ b/dev/breeze/doc/images/output_testing_core-tests.txt
@@ -1 +1 @@
-8d0d4887e1705769f0622ff1be18b91c
+172b27f30c0867e08ca9f2ef11da2c94
diff --git a/dev/breeze/doc/images/output_testing_docker-compose-tests.txt 
b/dev/breeze/doc/images/output_testing_docker-compose-tests.txt
index ac16878f61e..2c906c51d5d 100644
--- a/dev/breeze/doc/images/output_testing_docker-compose-tests.txt
+++ b/dev/breeze/doc/images/output_testing_docker-compose-tests.txt
@@ -1 +1 @@
-5c018dae6739772e9b431f63d68b506b
+e7f68555c25e802df53097e5e7558088
diff --git a/dev/breeze/doc/images/output_testing_helm-tests.txt 
b/dev/breeze/doc/images/output_testing_helm-tests.txt
index 8eae6dd611a..c816fbb2bb8 100644
--- a/dev/breeze/doc/images/output_testing_helm-tests.txt
+++ b/dev/breeze/doc/images/output_testing_helm-tests.txt
@@ -1 +1 @@
-f11e9a72de90980c119a5f8011390347
+2a8a6d65107b81afe9bc7ffbec9dfb2e
diff --git 
a/dev/breeze/doc/images/output_testing_providers-integration-tests.txt 
b/dev/breeze/doc/images/output_testing_providers-integration-tests.txt
index 6e22ed69c64..da0296790d8 100644
--- a/dev/breeze/doc/images/output_testing_providers-integration-tests.txt
+++ b/dev/breeze/doc/images/output_testing_providers-integration-tests.txt
@@ -1 +1 @@
-5cec830510384eb802d662c41bcefdb5
+1ab3cf1b8c5a5deb4181110bb41fb811
diff --git a/dev/breeze/doc/images/output_testing_providers-tests.txt 
b/dev/breeze/doc/images/output_testing_providers-tests.txt
index b858d34068d..90b35cbdd7a 100644
--- a/dev/breeze/doc/images/output_testing_providers-tests.txt
+++ b/dev/breeze/doc/images/output_testing_providers-tests.txt
@@ -1 +1 @@
-697f5152883c345771c7f8de46bb94c9
+446f03c4e5fa14f9836f160d7f1557b7
diff --git a/dev/breeze/doc/images/output_testing_python-api-client-tests.txt 
b/dev/breeze/doc/images/output_testing_python-api-client-tests.txt
index 651c4a7e14e..ca9a2d70afa 100644
--- a/dev/breeze/doc/images/output_testing_python-api-client-tests.txt
+++ b/dev/breeze/doc/images/output_testing_python-api-client-tests.txt
@@ -1 +1 @@
-02b90ef8bb36554b8cc13f7e10031a7c
+0d407ea088f01326dfc1104f12a3017d
diff --git a/dev/breeze/doc/images/output_testing_system-tests.txt 
b/dev/breeze/doc/images/output_testing_system-tests.txt
index cd3db305028..f289c1cb3e9 100644
--- a/dev/breeze/doc/images/output_testing_system-tests.txt
+++ b/dev/breeze/doc/images/output_testing_system-tests.txt
@@ -1 +1 @@
-6c3be860444308c2fba7a59024dad481
+56ea5a7ea76ffad80f4f91cf8a5566d5
diff --git 
a/dev/breeze/doc/images/output_testing_task-sdk-integration-tests.txt 
b/dev/breeze/doc/images/output_testing_task-sdk-integration-tests.txt
index c8448618c94..6e754162d01 100644
--- a/dev/breeze/doc/images/output_testing_task-sdk-integration-tests.txt
+++ b/dev/breeze/doc/images/output_testing_task-sdk-integration-tests.txt
@@ -1 +1 @@
-fd52ebb44cb670b0a1f5d8c9952b0295
+76d2a06163a1c3f4dbc54f2e4aa13ade
diff --git a/dev/breeze/doc/images/output_testing_task-sdk-tests.txt 
b/dev/breeze/doc/images/output_testing_task-sdk-tests.txt
index f398aa839e9..475499ef8a8 100644
--- a/dev/breeze/doc/images/output_testing_task-sdk-tests.txt
+++ b/dev/breeze/doc/images/output_testing_task-sdk-tests.txt
@@ -1 +1 @@
-a40a1048d3c3f126e21cdd5b3967c2cb
+58ecc16666e1b4f5c5572533e7ccc0a7
diff --git a/dev/breeze/doc/images/output_testing_ui-e2e-tests.txt 
b/dev/breeze/doc/images/output_testing_ui-e2e-tests.txt
index 4f8ff450c99..69046ce01eb 100644
--- a/dev/breeze/doc/images/output_testing_ui-e2e-tests.txt
+++ b/dev/breeze/doc/images/output_testing_ui-e2e-tests.txt
@@ -1 +1 @@
-cf6fa256cb30252ee979da341309210a
+109d8450ccc1fa74ebc2547ae2db41d5
diff --git a/dev/breeze/doc/images/output_ui_check-translation-completeness.txt 
b/dev/breeze/doc/images/output_ui_check-translation-completeness.txt
index e04eab4c9f5..acab51d294f 100644
--- a/dev/breeze/doc/images/output_ui_check-translation-completeness.txt
+++ b/dev/breeze/doc/images/output_ui_check-translation-completeness.txt
@@ -1 +1 @@
-104b4b8e413c3b87fb5d9948efbf8c8b
+4d8c7e8b2fe193a4b8e8cf25a429ff7e
diff --git a/dev/breeze/doc/images/output_ui_compile-assets.txt 
b/dev/breeze/doc/images/output_ui_compile-assets.txt
index 43d44d3fe6e..e8873d1d2a8 100644
--- a/dev/breeze/doc/images/output_ui_compile-assets.txt
+++ b/dev/breeze/doc/images/output_ui_compile-assets.txt
@@ -1 +1 @@
-294871ec2706e2744c1e47969a9a02d9
+8df936b0f6068addf4d51460d5a27ccc
diff --git a/dev/breeze/doc/images/output_workflow-run_publish-docs.txt 
b/dev/breeze/doc/images/output_workflow-run_publish-docs.txt
index 48447dc38e2..3a57f0bb6d6 100644
--- a/dev/breeze/doc/images/output_workflow-run_publish-docs.txt
+++ b/dev/breeze/doc/images/output_workflow-run_publish-docs.txt
@@ -1 +1 @@
-814726db94d4b9bc9c226bd607a3e043
+7915334135094723635d68ce396033bf
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py 
b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index cda375fa7cc..3b1b1c730a4 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -1581,6 +1581,12 @@ class SelectiveChecks:
     def get_job_label(self, event_type: str, branch: str):
         import requests  # type: ignore[import-untyped]
 
+        # The main CI is now split into ci-arm.yml and ci-amd.yml; the old
+        # ci-amd-arm.yml file no longer exists. This lookup is dormant for the
+        # main pipeline (which hardcodes runner-type per wrapper) and only
+        # remains here for the `is_disabled_integration` code path that still
+        # reads `runner_type`. The API call against a missing workflow returns
+        # nothing and the caller falls back to PUBLIC_AMD_RUNNERS.
         job_name = "Basic tests"
         workflow_name = "ci-amd-arm.yml"
         headers = {"Accept": "application/vnd.github.v3+json"}
diff --git a/generated/PYPI_README.md b/generated/PYPI_README.md
index a723a97815c..2372610eeb4 100644
--- a/generated/PYPI_README.md
+++ b/generated/PYPI_README.md
@@ -32,8 +32,8 @@ PROJECT BY THE `generate-pypi-readme` PREK HOOK. YOUR CHANGES 
HERE WILL BE AUTOM
 
 | Version | Build Status                                                       
                                                                                
             |
 
|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| Main    | [![GitHub Build 
main](https://github.com/apache/airflow/actions/workflows/ci-amd-arm.yml/badge.svg)](https://github.com/apache/airflow/actions)
                 |
-| 3.x     | [![GitHub Build 
3.1](https://github.com/apache/airflow/actions/workflows/ci-amd-arm.yml/badge.svg?branch=v3-1-test)](https://github.com/apache/airflow/actions)
 |
+| Main    | [![GitHub Build 
main](https://github.com/apache/airflow/actions/workflows/ci-amd.yml/badge.svg)](https://github.com/apache/airflow/actions)
                 |
+| 3.x     | [![GitHub Build 
3.2](https://github.com/apache/airflow/actions/workflows/ci-amd.yml/badge.svg?branch=v3-2-test)](https://github.com/apache/airflow/actions)
 |
 | 2.x     | [![GitHub Build 
2.11](https://github.com/apache/airflow/actions/workflows/ci.yml/badge.svg?branch=v2-11-test)](https://github.com/apache/airflow/actions)
       |
 
 
@@ -55,14 +55,14 @@ Use Airflow to author workflows (Dags) that orchestrate 
tasks. The Airflow sched
 
 Apache Airflow is tested with:
 
-|            | Main version (dev)                 | Stable version (3.2.1)     
  | Stable version (2.11.2)      |
-|------------|-----------------------------------|------------------------------|------------------------------|
-| Python     | 3.10, 3.11, 3.12, 3.13, 3.14       | 3.10, 3.11, 3.12, 3.13, 
3.14 | 3.10, 3.11, 3.12             |
-| Platform   | AMD64/ARM64                       | AMD64/ARM64                 
 | AMD64/ARM64(\*)              |
-| Kubernetes | 1.30, 1.31, 1.32, 1.33, 1.34, 1.35 | 1.30, 1.31, 1.32, 1.33     
  | 1.26, 1.27, 1.28, 1.29, 1.30 |
-| PostgreSQL | 14, 15, 16, 17, 18                | 13, 14, 15, 16, 17          
 | 12, 13, 14, 15, 16           |
-| MySQL      | 8.0, 8.4, Innovation              | 8.0, 8.4, Innovation        
 | 8.0, Innovation              |
-| SQLite     | 3.15.0+                           | 3.15.0+                     
 | 3.15.0+                      |
+|            | Main version (dev)                 | Stable version (3.2.0)     
         | Stable version (2.11.2)      |
+|------------|------------------------------------|-------------------------------------|------------------------------|
+| Python     | 3.10, 3.11, 3.12, 3.13, 3.14       | 3.10, 3.11, 3.12, 3.13, 
3.14        | 3.10, 3.11, 3.12             |
+| Platform   | AMD64/ARM64                        | AMD64/ARM64                
         | AMD64/ARM64(\*)              |
+| Kubernetes | 1.30, 1.31, 1.32, 1.33, 1.34, 1.35 | 1.30, 1.31, 1.32, 1.33, 
1.34, 1.35  | 1.26, 1.27, 1.28, 1.29, 1.30 |
+| PostgreSQL | 14, 15, 16, 17, 18                 | 14, 15, 16, 17, 18         
         | 12, 13, 14, 15, 16           |
+| MySQL      | 8.0, 8.4, Innovation               | 8.0, 8.4, Innovation       
         | 8.0, Innovation              |
+| SQLite     | 3.15.0+                            | 3.15.0+                    
         | 3.15.0+                      |
 
 \* Experimental
 
@@ -124,15 +124,15 @@ them to the appropriate format and workflow that your 
tool requires.
 
 
 ```bash
-pip install 'apache-airflow==3.2.1' \
- --constraint 
"https://raw.githubusercontent.com/apache/airflow/constraints-3.2.1/constraints-3.10.txt";
+pip install 'apache-airflow==3.2.0' \
+ --constraint 
"https://raw.githubusercontent.com/apache/airflow/constraints-3.2.0/constraints-3.10.txt";
 ```
 
 2. Installing with extras (i.e., postgres, google)
 
 ```bash
-pip install 'apache-airflow[postgres,google]==3.2.1' \
- --constraint 
"https://raw.githubusercontent.com/apache/airflow/constraints-3.2.1/constraints-3.10.txt";
+pip install 'apache-airflow[postgres,google]==3.2.0' \
+ --constraint 
"https://raw.githubusercontent.com/apache/airflow/constraints-3.2.0/constraints-3.10.txt";
 ```
 
 For information on installing provider distributions, check
diff --git a/scripts/ci/analyze_e2e_flaky_tests.py 
b/scripts/ci/analyze_e2e_flaky_tests.py
index c56fb7e48eb..a8942d7e261 100755
--- a/scripts/ci/analyze_e2e_flaky_tests.py
+++ b/scripts/ci/analyze_e2e_flaky_tests.py
@@ -34,7 +34,7 @@ Environment variables (required):
 
 Environment variables (optional):
   MAX_RUNS           - Maximum number of workflow runs to analyze (default: 10)
-  WORKFLOW_NAME      - Workflow file name to query (default: ci-amd-arm.yml)
+  WORKFLOW_NAME      - Workflow file name to query (default: ci-amd.yml)
   BRANCH             - Branch to filter runs (default: main)
   OUTPUT_FILE        - Path for the Slack message output (default: 
slack-message.json)
   GITHUB_OUTPUT      - Path to GitHub Actions output file
@@ -525,7 +525,7 @@ def write_step_summary(
 def main() -> None:
     repo = os.environ.get("GITHUB_REPOSITORY", "apache/airflow")
     max_runs = int(os.environ.get("MAX_RUNS", "10"))
-    workflow = os.environ.get("WORKFLOW_NAME", "ci-amd-arm.yml")
+    workflow = os.environ.get("WORKFLOW_NAME", "ci-amd.yml")
     branch = os.environ.get("BRANCH", "main")
     output_file = Path(os.environ.get("OUTPUT_FILE", "slack-message.json"))
 
diff --git a/scripts/ci/prek/check_ci_workflows_in_sync.py 
b/scripts/ci/prek/check_ci_workflows_in_sync.py
new file mode 100755
index 00000000000..3a219edd232
--- /dev/null
+++ b/scripts/ci/prek/check_ci_workflows_in_sync.py
@@ -0,0 +1,375 @@
+#!/usr/bin/env python3
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+"""
+Verify ci-arm.yml and ci-amd.yml stay in sync.
+
+The two workflows are physical copies of each other (GitHub Actions has no
+cross-file YAML include) and may differ ONLY in the small set of intentional
+divergences listed below. This check normalizes both files against that
+allowlist, then asserts the rest matches byte-for-byte.
+
+Documented divergences:
+
+1. Header intro comment (different prose explaining what each file is for)
+2. Workflow ``name:`` — ``Tests (ARM)`` vs ``Tests (AMD)``
+3. Triggers — ARM = schedule + workflow_dispatch only; AMD = pull_request +
+   push (to release branches) + workflow_dispatch
+4. ``concurrency.group`` prefix — ``ci-arm-`` vs ``ci-amd-``
+5. ``build-info`` outputs ``platform`` and ``runner-type`` — hardcoded per
+   architecture (and the surrounding comment naming the "ARM/AMD copy")
+6. ``print-platform`` job — ``name:`` and the architecture echoed to
+   GITHUB_STEP_SUMMARY
+
+Anything else differing between the two files is a drift bug. To
+intentionally introduce a new divergence, update the rules in this script
+in the same PR.
+
+Run from the repo root:
+
+    uv run --project scripts python 
scripts/ci/prek/check_ci_workflows_in_sync.py
+
+Exits 0 if the workflows are in sync, 1 (with a diff) otherwise.
+
+Local UX
+--------
+
+When run interactively (TTY attached, ``CI`` env var unset) the script
+also tries to figure out which side changed since the branch diverged
+from ``main`` and prints concrete next steps — either mirror the change
+to the other file, or add it to the per-line / per-block allowlist below.
+"""
+
+from __future__ import annotations
+
+import difflib
+import os
+import re
+import subprocess
+import sys
+from pathlib import Path
+
+REPO_ROOT = Path(__file__).resolve().parents[3]
+ARM = REPO_ROOT / ".github" / "workflows" / "ci-arm.yml"
+AMD = REPO_ROOT / ".github" / "workflows" / "ci-amd.yml"
+THIS_SCRIPT = Path(__file__).relative_to(REPO_ROOT)
+
+# Per-line regex normalizations applied to BOTH files. Each rule replaces
+# the architecture-specific token with a placeholder so the two normalized
+# files become identical. If you add a per-line difference between ARM and
+# AMD, append a rule here.
+LINE_RULES: list[tuple[str, str]] = [
+    (r"^name: Tests \((?:ARM|AMD)\)$", "name: Tests (PLACEHOLDER)"),
+    (r"^  group: ci-(?:arm|amd)-", "  group: ci-PLACEHOLDER-"),
+    (r'^      platform: "linux/(?:arm64|amd64)"$', '      platform: 
"linux/PLACEHOLDER"'),
+    (r"^      runner-type: '\[\"ubuntu-22\.04(?:-arm)?\"\]'$", "      
runner-type: 'PLACEHOLDER'"),
+    (
+        r"^      # (?:ARM|AMD) copy\)\. The matching (?:AMD|ARM) copy lives in 
ci-(?:amd|arm)\.yml\.$",
+        "      # PLACEHOLDER copy). The matching PLACEHOLDER copy lives in 
ci-PLACEHOLDER.yml.",
+    ),
+    (r'^    name: "Platform: (?:ARM|AMD)"$', '    name: "Platform: 
PLACEHOLDER"'),
+    (
+        r"^        run: \"echo '## Architecture: (?:ARM|AMD)' >> 
\$GITHUB_STEP_SUMMARY\"$",
+        "        run: \"echo '## Architecture: PLACEHOLDER' >> 
$GITHUB_STEP_SUMMARY\"",
+    ),
+]
+
+# Whole sections that legitimately exist in only one file. Each entry is the
+# verbatim block (including trailing newline) that must appear in the named
+# file and must NOT appear in the other. The blocks are stripped before
+# diffing so they don't show up as drift.
+ARM_ONLY_BLOCK = """  schedule:
+    - cron: '28 1,3,7,9,13,15,19,21 * * *'
+"""
+
+AMD_ONLY_BLOCK = """  push:
+    branches:
+      - v[0-9]+-[0-9]+-test
+      - providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
+  pull_request:
+    branches:
+      - main
+      - v[0-9]+-[0-9]+-test
+      - v[0-9]+-[0-9]+-stable
+      - providers-[a-z]+-?[a-z]*/v[0-9]+-[0-9]+
+    types: [opened, reopened, synchronize, ready_for_review]
+"""
+
+# The header comment block (between the `---` document marker and the
+# `name:` line) is intentionally different between files — each describes
+# what its own file is for. Collapse to a placeholder before diffing.
+HEADER_PATTERN = re.compile(r"(?<=\n---\n)(.*?)(?=^name: )", re.MULTILINE | 
re.DOTALL)
+HEADER_PLACEHOLDER = "# PLACEHOLDER: per-file intro comment\n"
+
+
+# --- ANSI color helpers 
-------------------------------------------------------
+# Local UX: colorize the report when stdout is a TTY and we're not in CI.
+
+_INTERACTIVE = os.environ.get("FORCE_INTERACTIVE") == "1" or (
+    sys.stdout.isatty() and not os.environ.get("CI") and not 
os.environ.get("PREK_HEADLESS")
+)
+
+
+def _ansi(code: str, text: str) -> str:
+    if not _INTERACTIVE:
+        return text
+    return f"\033[{code}m{text}\033[0m"
+
+
+def red(t: str) -> str:
+    return _ansi("1;31", t)
+
+
+def green(t: str) -> str:
+    return _ansi("1;32", t)
+
+
+def yellow(t: str) -> str:
+    return _ansi("1;33", t)
+
+
+def cyan(t: str) -> str:
+    return _ansi("1;36", t)
+
+
+def bold(t: str) -> str:
+    return _ansi("1", t)
+
+
+# --- normalization 
------------------------------------------------------------
+
+
+def normalize(content: str, *, side: str) -> str:
+    """Strip side-specific blocks and apply line rules so both files compare 
equal."""
+    if side == "arm":
+        if ARM_ONLY_BLOCK not in content:
+            raise SystemExit(f"ci-arm.yml is missing its expected ARM-only 
trigger block:\n{ARM_ONLY_BLOCK}")
+        if AMD_ONLY_BLOCK in content:
+            raise SystemExit("ci-arm.yml contains the AMD-only trigger block — 
should not.")
+        content = content.replace(ARM_ONLY_BLOCK, "")
+    elif side == "amd":
+        if AMD_ONLY_BLOCK not in content:
+            raise SystemExit(f"ci-amd.yml is missing its expected AMD-only 
trigger block:\n{AMD_ONLY_BLOCK}")
+        if ARM_ONLY_BLOCK in content:
+            raise SystemExit("ci-amd.yml contains the ARM-only trigger block — 
should not.")
+        content = content.replace(AMD_ONLY_BLOCK, "")
+    else:
+        raise ValueError(f"Unknown side: {side}")
+
+    for pattern, replacement in LINE_RULES:
+        content = re.sub(pattern, replacement, content, flags=re.MULTILINE)
+    content = HEADER_PATTERN.sub(HEADER_PLACEHOLDER, content)
+    return content
+
+
+# --- main-branch comparison (local UX) 
----------------------------------------
+
+
+def _git(args: list[str]) -> str | None:
+    """Run git from the repo root; return stdout text on success, None on 
failure."""
+    try:
+        result = subprocess.run(
+            ["git", "-C", str(REPO_ROOT), *args],
+            capture_output=True,
+            text=True,
+            check=False,
+        )
+    except FileNotFoundError:
+        return None
+    if result.returncode != 0:
+        return None
+    return result.stdout
+
+
+def _resolve_baseline_ref() -> str | None:
+    """Pick a reasonable baseline ref to diff against — the closest of 
upstream/main, origin/main, or main."""
+    for candidate in ("upstream/main", "origin/main", "main"):
+        if _git(["rev-parse", "--verify", "--quiet", candidate]) is not None:
+            return candidate
+    return None
+
+
+def _diff_since_baseline(file_path: Path, baseline: str) -> str | None:
+    """Return the unified diff of ``file_path`` from baseline to the working 
tree.
+
+    Uses ``git diff <baseline> -- <file>`` (NOT the three-dot form) so the
+    comparison covers committed AND uncommitted edits. The check needs to
+    catch a developer who edits one file and forgets to mirror it before
+    even running ``git add``.
+    """
+    rel = file_path.relative_to(REPO_ROOT).as_posix()
+    output = _git(["diff", "--no-color", baseline, "--", rel])
+    if output is None:
+        return None
+    return output.strip() or None
+
+
+def _is_new_file_diff(diff: str | None) -> bool:
+    """True if the diff describes the file as added (no baseline content to 
compare)."""
+    return (
+        bool(diff) and "new file mode" in diff.splitlines()[1]
+        if diff and len(diff.splitlines()) > 1
+        else False
+    )
+
+
+def _trim_diff(diff: str, max_lines: int = 60) -> str:
+    """Cap diff to max_lines so the report stays readable; mention how many 
lines were dropped."""
+    lines = diff.splitlines()
+    if len(lines) <= max_lines:
+        return diff
+    dropped = len(lines) - max_lines
+    return "\n".join(
+        lines[:max_lines] + [f"... ({dropped} more lines suppressed; run `git 
diff` to see full)"]
+    )
+
+
+def _suggest_actions(arm_diff: str | None, amd_diff: str | None) -> None:
+    """Print concrete suggestions about which file to edit, based on which 
side changed."""
+    print()
+    print(bold("Suggested next steps:"))
+    print()
+    arm_new = _is_new_file_diff(arm_diff)
+    amd_new = _is_new_file_diff(amd_diff)
+    if arm_new and amd_new:
+        print(
+            f"  • Both {cyan('ci-arm.yml')} and {cyan('ci-amd.yml')} were 
added in this branch — "
+            f"there is no baseline to attribute the drift to. Compare the two 
files directly "
+            f"({cyan('diff .github/workflows/ci-arm.yml 
.github/workflows/ci-amd.yml')}) and "
+            f"either pick one as the source of truth or extend the allowlist 
in "
+            f"{cyan(str(THIS_SCRIPT))}."
+        )
+        return
+    if arm_diff and not amd_diff:
+        print(
+            f"  • Only {cyan('ci-arm.yml')} has changed since the baseline. To 
bring AMD in line, "
+            f"mirror the change into {cyan('ci-amd.yml')}:"
+        )
+        print()
+        print(_indent(_trim_diff(arm_diff)))
+        print()
+        print(
+            f"  • If the change is intentionally ARM-only, add the new lines 
to "
+            f"{cyan('LINE_RULES')} (or {cyan('ARM_ONLY_BLOCK')}) in 
{cyan(str(THIS_SCRIPT))}."
+        )
+    elif amd_diff and not arm_diff:
+        print(
+            f"  • Only {cyan('ci-amd.yml')} has changed since the baseline. To 
bring ARM in line, "
+            f"mirror the change into {cyan('ci-arm.yml')}:"
+        )
+        print()
+        print(_indent(_trim_diff(amd_diff)))
+        print()
+        print(
+            f"  • If the change is intentionally AMD-only, add the new lines 
to "
+            f"{cyan('LINE_RULES')} (or {cyan('AMD_ONLY_BLOCK')}) in 
{cyan(str(THIS_SCRIPT))}."
+        )
+    elif arm_diff and amd_diff:
+        print(
+            "  • Both files have changes since the baseline. Compare the two 
diffs below "
+            "and decide which side is the source of truth, then mirror 
manually."
+        )
+        print()
+        print(yellow("ci-arm.yml diff vs baseline:"))
+        print(_indent(_trim_diff(arm_diff)))
+        print()
+        print(yellow("ci-amd.yml diff vs baseline:"))
+        print(_indent(_trim_diff(amd_diff)))
+        print()
+        print(f"  • If the divergence is intentional, document it in 
{cyan(str(THIS_SCRIPT))}.")
+    else:
+        # Neither file changed against the baseline, but the normalized diff 
is non-empty.
+        # That means the drift was already present before the branch — likely 
a bug in this
+        # script's allowlist or a pre-existing inconsistency that nobody 
caught.
+        print(
+            f"  • Neither file changed since the baseline, yet the normalized 
diff is non-empty. "
+            f"This usually means {cyan(str(THIS_SCRIPT))}'s allowlist is 
missing a rule for a "
+            f"pre-existing divergence. Inspect the diff above and update 
LINE_RULES / "
+            f"ARM_ONLY_BLOCK / AMD_ONLY_BLOCK accordingly."
+        )
+
+
+def _indent(text: str, prefix: str = "      ") -> str:
+    return "\n".join(prefix + line for line in text.splitlines())
+
+
+# --- entry point 
--------------------------------------------------------------
+
+
+def main() -> int:
+    if not ARM.exists() or not AMD.exists():
+        print(red(f"ERROR: expected both {ARM.name} and {AMD.name} to exist 
under .github/workflows/."))
+        return 1
+
+    arm_normalized = normalize(ARM.read_text(), side="arm")
+    amd_normalized = normalize(AMD.read_text(), side="amd")
+
+    if arm_normalized == amd_normalized:
+        print(green(f"OK: {ARM.name} and {AMD.name} are in sync (apart from 
documented divergences)."))
+        return 0
+
+    print(red(f"ERROR: {ARM.name} and {AMD.name} have diverged outside the 
allowed set."))
+    print()
+    print(bold("Normalized diff:"))
+    print()
+    diff = difflib.unified_diff(
+        arm_normalized.splitlines(),
+        amd_normalized.splitlines(),
+        fromfile=f"{ARM.name} (normalized)",
+        tofile=f"{AMD.name} (normalized)",
+        lineterm="",
+    )
+    for line in diff:
+        if line.startswith("+") and not line.startswith("+++"):
+            print(green(line))
+        elif line.startswith("-") and not line.startswith("---"):
+            print(red(line))
+        elif line.startswith("@@"):
+            print(cyan(line))
+        else:
+            print(line)
+
+    if _INTERACTIVE:
+        baseline = _resolve_baseline_ref()
+        if baseline is None:
+            print()
+            print(
+                yellow(
+                    "Could not resolve a baseline ref (tried upstream/main, 
origin/main, main). "
+                    "Skipping the per-side change attribution; fix manually 
using the diff above."
+                )
+            )
+            return 1
+        arm_diff = _diff_since_baseline(ARM, baseline)
+        amd_diff = _diff_since_baseline(AMD, baseline)
+        print()
+        print(bold(f"Comparing each file against {cyan(baseline)} to identify 
the changed side…"))
+        _suggest_actions(arm_diff, amd_diff)
+    else:
+        print()
+        print(
+            yellow(
+                "Run this script locally outside CI to see which side changed 
and get a "
+                "concrete suggestion (mirror the change, or add it to the 
allowlist in this script)."
+            )
+        )
+
+    return 1
+
+
+if __name__ == "__main__":
+    sys.exit(main())

Reply via email to