From 73ac3cd889a74efd3ff6a43eb7fe822f2deca5c9 Mon Sep 17 00:00:00 2001
From: Dominik Heilbock <dheilbock@gmx.net>
Date: Mon, 14 Jul 2025 16:23:05 +0200
Subject: [PATCH 1/3] Added hook to check whether provider exclusions for a
 specific python versions are consistently set

---
 .pre-commit-config.yaml                       |   6 +
 contributing-docs/08_static_code_checks.rst   |   2 +
 .../doc/images/output_static-checks.svg       | 134 +++++----
 .../doc/images/output_static-checks.txt       |   2 +-
 .../src/airflow_breeze/pre_commit_ids.py      |   1 +
 ...ck_exclusion_of_provider_python_version.py | 280 ++++++++++++++++++
 6 files changed, 359 insertions(+), 66 deletions(-)
 create mode 100755 scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index fd869767d7555..861b05de138e6 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -239,6 +239,12 @@ repos:
         # libcst doesn't have source wheels for all PY except PY3.12, excluding it
         additional_dependencies: ['libcst>=1.8.1']
         files: ^(providers/.*/)?airflow/.*/(sensors|operators)/.*\.py$
+      - id: check-provider-exclusions-python-version
+        name: Check Provider Python Version Exclusions
+        entry: ./scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
+        language: python
+        files: ^(providers/.*/(pyproject.toml|provider.yaml)|dev/breeze/src/airflow_breeze/global_constants.py)$
+        additional_dependencies: ['pyyaml>=6.0.2', 'tomli>=2.0.1', "packaging>=25"]
   - repo: https://github.com/asottile/blacken-docs
     rev: 1.19.1
     hooks:
diff --git a/contributing-docs/08_static_code_checks.rst b/contributing-docs/08_static_code_checks.rst
index be119583cff43..793dcd8a13847 100644
--- a/contributing-docs/08_static_code_checks.rst
+++ b/contributing-docs/08_static_code_checks.rst
@@ -215,6 +215,8 @@ require Breeze Docker image to be built locally.
 +-----------------------------------------------------------+--------------------------------------------------------+---------+
 | check-provider-docs-valid                                 | Validate provider doc files                            |         |
 +-----------------------------------------------------------+--------------------------------------------------------+---------+
+| check-provider-exclusions-python-version                  | Check Provider Python Version Exclusions               |         |
++-----------------------------------------------------------+--------------------------------------------------------+---------+
 | check-provider-yaml-valid                                 | Validate provider.yaml files                           | *       |
 +-----------------------------------------------------------+--------------------------------------------------------+---------+
 | check-providers-subpackages-init-file-exist               | Provider subpackage init files are there               |         |
diff --git a/dev/breeze/doc/images/output_static-checks.svg b/dev/breeze/doc/images/output_static-checks.svg
index 0857d08d9d606..8391aa303ad74 100644
--- a/dev/breeze/doc/images/output_static-checks.svg
+++ b/dev/breeze/doc/images/output_static-checks.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2270.4" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2294.7999999999997" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-static-checks-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="2219.4" />
+      <rect x="0" y="0" width="1463.0" height="2243.7999999999997" />
     </clipPath>
     <clipPath id="breeze-static-checks-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -315,9 +315,12 @@
 <clipPath id="breeze-static-checks-line-89">
     <rect x="0" y="2173.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-static-checks-line-90">
+    <rect x="0" y="2197.5" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2268.4" rx="8"/><text class="breeze-static-checks-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;static-checks</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="2292.8" rx="8"/><text class="breeze-static-checks-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;static-checks</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -356,68 +359,69 @@
 </text><text class="breeze-static-checks-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-26)">│</text><text class="breeze-static-checks-r7" x="451.4" y="654.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-26)">check-only-new-session-with-provide-session&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-26)">│</text><text class="breeze-static-checks-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-26)">
 </text><text class="breeze-static-checks-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-27)">│</text><text class="breeze-static-checks-r7" x="451.4" y="678.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-27)">check-persist-credentials-disabled-in-github-workflows&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-27)">│</text><text class="breeze-static-checks-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-27)">
 </text><text class="breeze-static-checks-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-28)">│</text><text class="breeze-static-checks-r7" x="451.4" y="703.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-28)">check-pre-commit-information-consistent&#160;|&#160;check-provide-create-sessions-imports&#160;|</text><text class="breeze-static-checks-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-28)">│</text><text class="breeze-static-checks-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-28)">
-</text><text class="breeze-static-checks-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">│</text><text class="breeze-static-checks-r7" x="451.4" y="727.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-29)">check-provider-docs-valid&#160;|&#160;check-provider-yaml-valid&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">│</text><text class="breeze-static-checks-r1" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">
-</text><text class="breeze-static-checks-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30)">│</text><text class="breeze-static-checks-r7" x="451.4" y="752" textLength="988.2" clip-path="url(#breeze-static-checks-line-30)">check-providers-subpackages-init-file-exist&#160;|&#160;check-pydevd-left-in-code&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30)">│</text><text class="breeze-static-checks-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30)">
-</text><text class="breeze-static-checks-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-31)">│</text><text class="breeze-static-checks-r7" x="451.4" y="776.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-31)">check-pytest-mark-db-test-in-providers&#160;|&#160;check-revision-heads-map&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-31)">│</text><text class="breeze-static-checks-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-31)">
-</text><text class="breeze-static-checks-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-32)">│</text><text class="breeze-static-checks-r7" x="451.4" y="800.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-32)">check-safe-filter-usage-in-html&#160;|&#160;check-significant-newsfragments-are-valid&#160;|&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-32)">│</text><text class="breeze-static-checks-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-32)">
-</text><text class="breeze-static-checks-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-33)">│</text><text class="breeze-static-checks-r7" x="451.4" y="825.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-33)">check-sql-dependency-common-data-structure&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-33)">│</text><text class="breeze-static-checks-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-33)">
-</text><text class="breeze-static-checks-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-34)">│</text><text class="breeze-static-checks-r7" x="451.4" y="849.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-34)">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tests-present&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-34)">│</text><text class="breeze-static-checks-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-34)">
-</text><text class="breeze-static-checks-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35)">│</text><text class="breeze-static-checks-r7" x="451.4" y="874" textLength="988.2" clip-path="url(#breeze-static-checks-line-35)">check-system-tests-tocs&#160;|&#160;check-taskinstance-tis-attrs&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35)">│</text><text class="breeze-static-checks-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35)">
-</text><text class="breeze-static-checks-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-36)">│</text><text class="breeze-static-checks-r7" x="451.4" y="898.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-36)">check-template-context-variable-in-sync&#160;|&#160;check-template-fields-valid&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-36)">│</text><text class="breeze-static-checks-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-36)">
-</text><text class="breeze-static-checks-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-37)">│</text><text class="breeze-static-checks-r7" x="451.4" y="922.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-37)">check-tests-in-the-right-folders&#160;|&#160;check-tests-unittest-testcase&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-37)">│</text><text class="breeze-static-checks-r1" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-37)">
-</text><text class="breeze-static-checks-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-38)">│</text><text class="breeze-static-checks-r7" x="451.4" y="947.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-38)">check-urlparse-usage-in-code&#160;|&#160;check-xml&#160;|&#160;check-zip-file-is-not-committed&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-38)">│</text><text class="breeze-static-checks-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-38)">
-</text><text class="breeze-static-checks-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-39)">│</text><text class="breeze-static-checks-r7" x="451.4" y="971.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-39)">codespell&#160;|&#160;compile-fab-assets&#160;|&#160;compile-ui-assets&#160;|&#160;compile-ui-assets-dev&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="971.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-39)">│</text><text class="breeze-static-checks-r1" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-39)">
-</text><text class="breeze-static-checks-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-static-checks-line-40)">│</text><text class="breeze-static-checks-r7" x="451.4" y="996" textLength="988.2" clip-path="url(#breeze-static-checks-line-40)">create-missing-init-py-files-tests&#160;|&#160;debug-statements&#160;|&#160;detect-private-key&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="996" textLength="12.2" clip-path="url(#breeze-static-checks-line-40)">│</text><text class="breeze-static-checks-r1" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-static-checks-line-40)">
-</text><text class="breeze-static-checks-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1020.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-41)">doctoc&#160;|&#160;end-of-file-fixer&#160;|&#160;fix-encoding-pragma&#160;|&#160;flynt&#160;|&#160;gci&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1020.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">│</text><text class="breeze-static-checks-r1" x="1464" y="1020.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">
-</text><text class="breeze-static-checks-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1044.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-42)">generate-airflow-diagrams&#160;|&#160;generate-airflowctl-datamodels&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1044.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">│</text><text class="breeze-static-checks-r1" x="1464" y="1044.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">
-</text><text class="breeze-static-checks-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1069.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-43)">generate-airflowctl-help-images&#160;|&#160;generate-openapi-spec&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">│</text><text class="breeze-static-checks-r1" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">
-</text><text class="breeze-static-checks-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1093.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-44)">generate-openapi-spec-fab&#160;|&#160;generate-pypi-readme&#160;|&#160;generate-tasksdk-datamodels&#160;|&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">│</text><text class="breeze-static-checks-r1" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">
-</text><text class="breeze-static-checks-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1118" textLength="988.2" clip-path="url(#breeze-static-checks-line-45)">generate-volumes-for-sources&#160;|&#160;go-mockery&#160;|&#160;go-mod-tidy&#160;|&#160;gofmt&#160;|&#160;identity&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">│</text><text class="breeze-static-checks-r1" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">
-</text><text class="breeze-static-checks-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1142.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-46)">insert-license&#160;|&#160;kubeconform&#160;|&#160;lint-chart-schema&#160;|&#160;lint-dockerfile&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text class="breeze-static-checks-r1" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">
-</text><text class="breeze-static-checks-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1166.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-47)">lint-helm-chart&#160;|&#160;lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;mixed-line-ending&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">│</text><text class="breeze-static-checks-r1" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">
-</text><text class="breeze-static-checks-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1191.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-48)">mypy-airflow-core&#160;|&#160;mypy-airflow-ctl&#160;|&#160;mypy-dev&#160;|&#160;mypy-devel-common&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">│</text><text class="breeze-static-checks-r1" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">
-</text><text class="breeze-static-checks-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1215.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-49)">mypy-providers&#160;|&#160;mypy-task-sdk&#160;|&#160;pretty-format-json&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">│</text><text class="breeze-static-checks-r1" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">
-</text><text class="breeze-static-checks-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-static-checks-line-50)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1240" textLength="988.2" clip-path="url(#breeze-static-checks-line-50)">prevent-deprecated-sqlalchemy-usage&#160;|&#160;provider-version-compat&#160;|&#160;pylint&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-static-checks-line-50)">│</text><text class="breeze-static-checks-r1" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-static-checks-line-50)">
-</text><text class="breeze-static-checks-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-51)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1264.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-51)">python-no-log-warn&#160;|&#160;replace-bad-characters&#160;|&#160;rst-backticks&#160;|&#160;ruff&#160;|&#160;ruff-format&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-51)">│</text><text class="breeze-static-checks-r1" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-51)">
-</text><text class="breeze-static-checks-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-52)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1288.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-52)">|&#160;shellcheck&#160;|&#160;trailing-whitespace&#160;|&#160;ts-compile-lint-simple-auth-manager-ui&#160;|&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-52)">│</text><text class="breeze-static-checks-r1" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-52)">
-</text><text class="breeze-static-checks-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1313.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-53)">ts-compile-lint-ui&#160;|&#160;update-black-version&#160;|&#160;update-breeze-cmd-output&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">│</text><text class="breeze-static-checks-r1" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">
-</text><text class="breeze-static-checks-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1337.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-54)">update-breeze-readme-config-hash&#160;|&#160;update-chart-dependencies&#160;|&#160;update-er-diagram&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">│</text><text class="breeze-static-checks-r1" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">
-</text><text class="breeze-static-checks-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1362" textLength="988.2" clip-path="url(#breeze-static-checks-line-55)">|&#160;update-in-the-wild-to-be-sorted&#160;|&#160;update-inlined-dockerfile-scripts&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">│</text><text class="breeze-static-checks-r1" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">
-</text><text class="breeze-static-checks-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1386.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-56)">update-installed-providers-to-be-sorted&#160;|&#160;update-installers-and-pre-commit&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">│</text><text class="breeze-static-checks-r1" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">
-</text><text class="breeze-static-checks-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-57)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1410.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-57)">update-local-yml-file&#160;|&#160;update-migration-references&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1410.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-57)">│</text><text class="breeze-static-checks-r1" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-57)">
-</text><text class="breeze-static-checks-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-58)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1435.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-58)">update-providers-build-files&#160;|&#160;update-providers-dependencies&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1435.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-58)">│</text><text class="breeze-static-checks-r1" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-58)">
-</text><text class="breeze-static-checks-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-59)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1459.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-59)">update-pyproject-toml&#160;|&#160;update-reproducible-source-date-epoch&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1459.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-59)">│</text><text class="breeze-static-checks-r1" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-59)">
-</text><text class="breeze-static-checks-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-static-checks-line-60)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1484" textLength="988.2" clip-path="url(#breeze-static-checks-line-60)">update-spelling-wordlist-to-be-sorted&#160;|&#160;update-supported-versions&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1484" textLength="12.2" clip-path="url(#breeze-static-checks-line-60)">│</text><text class="breeze-static-checks-r1" x="1464" y="1484" textLength="12.2" clip-path="url(#breeze-static-checks-line-60)">
-</text><text class="breeze-static-checks-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1508.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-61)">update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|&#160;validate-chart-annotations&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">│</text><text class="breeze-static-checks-r1" x="1464" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">
-</text><text class="breeze-static-checks-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1532.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-62)">|&#160;validate-operators-init&#160;|&#160;yamllint&#160;|&#160;zizmor)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">│</text><text class="breeze-static-checks-r1" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">
-</text><text class="breeze-static-checks-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1557.2" textLength="268.4" clip-path="url(#breeze-static-checks-line-63)">--show-diff-on-failure</text><text class="breeze-static-checks-r6" x="402.6" y="1557.2" textLength="24.4" clip-path="url(#breeze-static-checks-line-63)">-s</text><text class="breeze-static-checks-r1" x="451.4" y="1557.2" textLength="524.6" clip-path="url(#breeze-static-checks-line-63)">Show&#160;diff&#160;for&#160;files&#160;modified&#160;by&#160;the&#160;checks.</text><text class="breeze-static-checks-r5" x="1451.8" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">│</text><text class="breeze-static-checks-r1" x="1464" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">
-</text><text class="breeze-static-checks-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1581.6" textLength="292.8" clip-path="url(#breeze-static-checks-line-64)">--initialize-environment</text><text class="breeze-static-checks-r1" x="451.4" y="1581.6" textLength="549" clip-path="url(#breeze-static-checks-line-64)">Initialize&#160;environment&#160;before&#160;running&#160;checks.</text><text class="breeze-static-checks-r5" x="1451.8" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">│</text><text class="breeze-static-checks-r1" x="1464" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">
-</text><text class="breeze-static-checks-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1606" textLength="353.8" clip-path="url(#breeze-static-checks-line-65)">--max-initialization-attempts</text><text class="breeze-static-checks-r1" x="451.4" y="1606" textLength="854" clip-path="url(#breeze-static-checks-line-65)">Maximum&#160;number&#160;of&#160;attempts&#160;to&#160;initialize&#160;environment&#160;before&#160;giving&#160;up.</text><text class="breeze-static-checks-r5" x="1451.8" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">│</text><text class="breeze-static-checks-r1" x="1464" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">
-</text><text class="breeze-static-checks-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1630.4" textLength="854" clip-path="url(#breeze-static-checks-line-66)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">│</text><text class="breeze-static-checks-r1" x="1464" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">
-</text><text class="breeze-static-checks-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">│</text><text class="breeze-static-checks-r5" x="451.4" y="1654.8" textLength="854" clip-path="url(#breeze-static-checks-line-67)">[default:&#160;3;&#160;1&lt;=x&lt;=10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">│</text><text class="breeze-static-checks-r1" x="1464" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">
-</text><text class="breeze-static-checks-r5" x="0" y="1679.2" textLength="1464" clip-path="url(#breeze-static-checks-line-68)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1679.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-68)">
-</text><text class="breeze-static-checks-r5" x="0" y="1703.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-69)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1703.6" textLength="463.6" clip-path="url(#breeze-static-checks-line-69)">&#160;Selecting&#160;files&#160;to&#160;run&#160;the&#160;checks&#160;on&#160;</text><text class="breeze-static-checks-r5" x="488" y="1703.6" textLength="951.6" clip-path="url(#breeze-static-checks-line-69)">──────────────────────────────────────────────────────────────────────────────</text><text class="breeze-static-checks-r5" x="1439.6" y="1703.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-69)">─╮</text><text class="breeze-static-checks-r1" x="1464" y="1703.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-69)">
-</text><text class="breeze-static-checks-r5" x="0" y="1728" textLength="12.2" clip-path="url(#breeze-static-checks-line-70)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1728" textLength="73.2" clip-path="url(#breeze-static-checks-line-70)">--file</text><text class="breeze-static-checks-r6" x="256.2" y="1728" textLength="24.4" clip-path="url(#breeze-static-checks-line-70)">-f</text><text class="breeze-static-checks-r1" x="305" y="1728" textLength="427" clip-path="url(#breeze-static-checks-line-70)">List&#160;of&#160;files&#160;to&#160;run&#160;the&#160;checks&#160;on.</text><text class="breeze-static-checks-r7" x="744.2" y="1728" textLength="73.2" clip-path="url(#breeze-static-checks-line-70)">(PATH)</text><text class="breeze-static-checks-r5" x="1451.8" y="1728" textLength="12.2" clip-path="url(#breeze-static-checks-line-70)">│</text><text class="breeze-static-checks-r1" x="1464" y="1728" textLength="12.2" clip-path="url(#breeze-static-checks-line-70)">
-</text><text class="breeze-static-checks-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1752.4" textLength="134.2" clip-path="url(#breeze-static-checks-line-71)">--all-files</text><text class="breeze-static-checks-r6" x="256.2" y="1752.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-71)">-a</text><text class="breeze-static-checks-r1" x="305" y="1752.4" textLength="292.8" clip-path="url(#breeze-static-checks-line-71)">Run&#160;checks&#160;on&#160;all&#160;files.</text><text class="breeze-static-checks-r5" x="1451.8" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">│</text><text class="breeze-static-checks-r1" x="1464" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">
-</text><text class="breeze-static-checks-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1776.8" textLength="146.4" clip-path="url(#breeze-static-checks-line-72)">--commit-ref</text><text class="breeze-static-checks-r6" x="256.2" y="1776.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-72)">-r</text><text class="breeze-static-checks-r1" x="305" y="1776.8" textLength="1134.6" clip-path="url(#breeze-static-checks-line-72)">Run&#160;checks&#160;for&#160;this&#160;commit&#160;reference&#160;only&#160;(can&#160;be&#160;any&#160;git&#160;commit-ish&#160;reference).&#160;Mutually&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">│</text><text class="breeze-static-checks-r1" x="1464" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">
-</text><text class="breeze-static-checks-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">│</text><text class="breeze-static-checks-r1" x="305" y="1801.2" textLength="183" clip-path="url(#breeze-static-checks-line-73)">exclusive&#160;with&#160;</text><text class="breeze-static-checks-r4" x="488" y="1801.2" textLength="158.6" clip-path="url(#breeze-static-checks-line-73)">--last-commit</text><text class="breeze-static-checks-r1" x="646.6" y="1801.2" textLength="793" clip-path="url(#breeze-static-checks-line-73)">.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">│</text><text class="breeze-static-checks-r1" x="1464" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">
-</text><text class="breeze-static-checks-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-74)">│</text><text class="breeze-static-checks-r7" x="305" y="1825.6" textLength="1134.6" clip-path="url(#breeze-static-checks-line-74)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1825.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-74)">│</text><text class="breeze-static-checks-r1" x="1464" y="1825.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-74)">
-</text><text class="breeze-static-checks-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1850" textLength="158.6" clip-path="url(#breeze-static-checks-line-75)">--last-commit</text><text class="breeze-static-checks-r6" x="256.2" y="1850" textLength="24.4" clip-path="url(#breeze-static-checks-line-75)">-c</text><text class="breeze-static-checks-r1" x="305" y="1850" textLength="793" clip-path="url(#breeze-static-checks-line-75)">Run&#160;checks&#160;for&#160;all&#160;files&#160;in&#160;last&#160;commit.&#160;Mutually&#160;exclusive&#160;with&#160;</text><text class="breeze-static-checks-r4" x="1098" y="1850" textLength="146.4" clip-path="url(#breeze-static-checks-line-75)">--commit-ref</text><text class="breeze-static-checks-r1" x="1244.4" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">.</text><text class="breeze-static-checks-r5" x="1451.8" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">│</text><text class="breeze-static-checks-r1" x="1464" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">
-</text><text class="breeze-static-checks-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1874.4" textLength="207.4" clip-path="url(#breeze-static-checks-line-76)">--only-my-changes</text><text class="breeze-static-checks-r6" x="256.2" y="1874.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-76)">-m</text><text class="breeze-static-checks-r1" x="305" y="1874.4" textLength="1134.6" clip-path="url(#breeze-static-checks-line-76)">Run&#160;checks&#160;for&#160;commits&#160;belonging&#160;to&#160;my&#160;PR&#160;only:&#160;for&#160;all&#160;commits&#160;between&#160;merge&#160;base&#160;to&#160;`main`&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">│</text><text class="breeze-static-checks-r1" x="1464" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">
-</text><text class="breeze-static-checks-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">│</text><text class="breeze-static-checks-r1" x="305" y="1898.8" textLength="1134.6" clip-path="url(#breeze-static-checks-line-77)">branch&#160;and&#160;HEAD&#160;of&#160;your&#160;branch.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">│</text><text class="breeze-static-checks-r1" x="1464" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">
-</text><text class="breeze-static-checks-r5" x="0" y="1923.2" textLength="1464" clip-path="url(#breeze-static-checks-line-78)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1923.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-78)">
-</text><text class="breeze-static-checks-r5" x="0" y="1947.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-79)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1947.6" textLength="463.6" clip-path="url(#breeze-static-checks-line-79)">&#160;Building&#160;image&#160;before&#160;running&#160;checks&#160;</text><text class="breeze-static-checks-r5" x="488" y="1947.6" textLength="951.6" clip-path="url(#breeze-static-checks-line-79)">──────────────────────────────────────────────────────────────────────────────</text><text class="breeze-static-checks-r5" x="1439.6" y="1947.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-79)">─╮</text><text class="breeze-static-checks-r1" x="1464" y="1947.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-79)">
-</text><text class="breeze-static-checks-r5" x="0" y="1972" textLength="12.2" clip-path="url(#breeze-static-checks-line-80)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1972" textLength="317.2" clip-path="url(#breeze-static-checks-line-80)">--skip-image-upgrade-check</text><text class="breeze-static-checks-r1" x="414.8" y="1972" textLength="536.8" clip-path="url(#breeze-static-checks-line-80)">Skip&#160;checking&#160;if&#160;the&#160;CI&#160;image&#160;is&#160;up&#160;to&#160;date.</text><text class="breeze-static-checks-r5" x="1451.8" y="1972" textLength="12.2" clip-path="url(#breeze-static-checks-line-80)">│</text><text class="breeze-static-checks-r1" x="1464" y="1972" textLength="12.2" clip-path="url(#breeze-static-checks-line-80)">
-</text><text class="breeze-static-checks-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1996.4" textLength="158.6" clip-path="url(#breeze-static-checks-line-81)">--force-build</text><text class="breeze-static-checks-r1" x="414.8" y="1996.4" textLength="707.6" clip-path="url(#breeze-static-checks-line-81)">Force&#160;image&#160;build&#160;no&#160;matter&#160;if&#160;it&#160;is&#160;determined&#160;as&#160;needed.</text><text class="breeze-static-checks-r5" x="1451.8" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">│</text><text class="breeze-static-checks-r1" x="1464" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">
-</text><text class="breeze-static-checks-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2020.8" textLength="231.8" clip-path="url(#breeze-static-checks-line-82)">--github-repository</text><text class="breeze-static-checks-r6" x="366" y="2020.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-82)">-g</text><text class="breeze-static-checks-r1" x="414.8" y="2020.8" textLength="585.6" clip-path="url(#breeze-static-checks-line-82)">GitHub&#160;repository&#160;used&#160;to&#160;pull,&#160;push&#160;run&#160;images.</text><text class="breeze-static-checks-r7" x="1012.6" y="2020.8" textLength="73.2" clip-path="url(#breeze-static-checks-line-82)">(TEXT)</text><text class="breeze-static-checks-r5" x="1098" y="2020.8" textLength="305" clip-path="url(#breeze-static-checks-line-82)">[default:&#160;apache/airflow]</text><text class="breeze-static-checks-r5" x="1451.8" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">│</text><text class="breeze-static-checks-r1" x="1464" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">
-</text><text class="breeze-static-checks-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2045.2" textLength="109.8" clip-path="url(#breeze-static-checks-line-83)">--builder</text><text class="breeze-static-checks-r1" x="414.8" y="2045.2" textLength="756.4" clip-path="url(#breeze-static-checks-line-83)">Buildx&#160;builder&#160;used&#160;to&#160;perform&#160;`docker&#160;buildx&#160;build`&#160;commands.</text><text class="breeze-static-checks-r7" x="1183.4" y="2045.2" textLength="73.2" clip-path="url(#breeze-static-checks-line-83)">(TEXT)</text><text class="breeze-static-checks-r5" x="1451.8" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">│</text><text class="breeze-static-checks-r1" x="1464" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">
-</text><text class="breeze-static-checks-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)">│</text><text class="breeze-static-checks-r5" x="414.8" y="2069.6" textLength="756.4" clip-path="url(#breeze-static-checks-line-84)">[default:&#160;autodetect]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)">│</text><text class="breeze-static-checks-r1" x="1464" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)">
-</text><text class="breeze-static-checks-r5" x="0" y="2094" textLength="1464" clip-path="url(#breeze-static-checks-line-85)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2094" textLength="12.2" clip-path="url(#breeze-static-checks-line-85)">
-</text><text class="breeze-static-checks-r5" x="0" y="2118.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-86)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="2118.4" textLength="195.2" clip-path="url(#breeze-static-checks-line-86)">&#160;Common&#160;options&#160;</text><text class="breeze-static-checks-r5" x="219.6" y="2118.4" textLength="1220" clip-path="url(#breeze-static-checks-line-86)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-static-checks-r5" x="1439.6" y="2118.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-86)">─╮</text><text class="breeze-static-checks-r1" x="1464" y="2118.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-86)">
-</text><text class="breeze-static-checks-r5" x="0" y="2142.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-87)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2142.8" textLength="109.8" clip-path="url(#breeze-static-checks-line-87)">--dry-run</text><text class="breeze-static-checks-r6" x="158.6" y="2142.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-87)">-D</text><text class="breeze-static-checks-r1" x="207.4" y="2142.8" textLength="719.8" clip-path="url(#breeze-static-checks-line-87)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-static-checks-r5" x="1451.8" y="2142.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-87)">│</text><text class="breeze-static-checks-r1" x="1464" y="2142.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-87)">
-</text><text class="breeze-static-checks-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-88)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2167.2" textLength="109.8" clip-path="url(#breeze-static-checks-line-88)">--verbose</text><text class="breeze-static-checks-r6" x="158.6" y="2167.2" textLength="24.4" clip-path="url(#breeze-static-checks-line-88)">-v</text><text class="breeze-static-checks-r1" x="207.4" y="2167.2" textLength="585.6" clip-path="url(#breeze-static-checks-line-88)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-static-checks-r5" x="1451.8" y="2167.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-88)">│</text><text class="breeze-static-checks-r1" x="1464" y="2167.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-88)">
-</text><text class="breeze-static-checks-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-89)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2191.6" textLength="73.2" clip-path="url(#breeze-static-checks-line-89)">--help</text><text class="breeze-static-checks-r6" x="158.6" y="2191.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-89)">-h</text><text class="breeze-static-checks-r1" x="207.4" y="2191.6" textLength="329.4" clip-path="url(#breeze-static-checks-line-89)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-static-checks-r5" x="1451.8" y="2191.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-89)">│</text><text class="breeze-static-checks-r1" x="1464" y="2191.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-89)">
-</text><text class="breeze-static-checks-r5" x="0" y="2216" textLength="1464" clip-path="url(#breeze-static-checks-line-90)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2216" textLength="12.2" clip-path="url(#breeze-static-checks-line-90)">
+</text><text class="breeze-static-checks-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">│</text><text class="breeze-static-checks-r7" x="451.4" y="727.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-29)">check-provider-docs-valid&#160;|&#160;check-provider-exclusions-python-version&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">│</text><text class="breeze-static-checks-r1" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-29)">
+</text><text class="breeze-static-checks-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30)">│</text><text class="breeze-static-checks-r7" x="451.4" y="752" textLength="988.2" clip-path="url(#breeze-static-checks-line-30)">check-provider-yaml-valid&#160;|&#160;check-providers-subpackages-init-file-exist&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30)">│</text><text class="breeze-static-checks-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-static-checks-line-30)">
+</text><text class="breeze-static-checks-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-31)">│</text><text class="breeze-static-checks-r7" x="451.4" y="776.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-31)">check-pydevd-left-in-code&#160;|&#160;check-pytest-mark-db-test-in-providers&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-31)">│</text><text class="breeze-static-checks-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-31)">
+</text><text class="breeze-static-checks-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-32)">│</text><text class="breeze-static-checks-r7" x="451.4" y="800.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-32)">check-revision-heads-map&#160;|&#160;check-safe-filter-usage-in-html&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-32)">│</text><text class="breeze-static-checks-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-32)">
+</text><text class="breeze-static-checks-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-33)">│</text><text class="breeze-static-checks-r7" x="451.4" y="825.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-33)">check-significant-newsfragments-are-valid&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-33)">│</text><text class="breeze-static-checks-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-33)">
+</text><text class="breeze-static-checks-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-34)">│</text><text class="breeze-static-checks-r7" x="451.4" y="849.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-34)">check-sql-dependency-common-data-structure&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-34)">│</text><text class="breeze-static-checks-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-34)">
+</text><text class="breeze-static-checks-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35)">│</text><text class="breeze-static-checks-r7" x="451.4" y="874" textLength="988.2" clip-path="url(#breeze-static-checks-line-35)">check-start-date-not-used-in-defaults&#160;|&#160;check-system-tests-present&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35)">│</text><text class="breeze-static-checks-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-static-checks-line-35)">
+</text><text class="breeze-static-checks-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-36)">│</text><text class="breeze-static-checks-r7" x="451.4" y="898.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-36)">check-system-tests-tocs&#160;|&#160;check-taskinstance-tis-attrs&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-36)">│</text><text class="breeze-static-checks-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-36)">
+</text><text class="breeze-static-checks-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-37)">│</text><text class="breeze-static-checks-r7" x="451.4" y="922.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-37)">check-template-context-variable-in-sync&#160;|&#160;check-template-fields-valid&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-37)">│</text><text class="breeze-static-checks-r1" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-37)">
+</text><text class="breeze-static-checks-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-38)">│</text><text class="breeze-static-checks-r7" x="451.4" y="947.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-38)">check-tests-in-the-right-folders&#160;|&#160;check-tests-unittest-testcase&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-38)">│</text><text class="breeze-static-checks-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-38)">
+</text><text class="breeze-static-checks-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-39)">│</text><text class="breeze-static-checks-r7" x="451.4" y="971.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-39)">check-urlparse-usage-in-code&#160;|&#160;check-xml&#160;|&#160;check-zip-file-is-not-committed&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="971.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-39)">│</text><text class="breeze-static-checks-r1" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-39)">
+</text><text class="breeze-static-checks-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-static-checks-line-40)">│</text><text class="breeze-static-checks-r7" x="451.4" y="996" textLength="988.2" clip-path="url(#breeze-static-checks-line-40)">codespell&#160;|&#160;compile-fab-assets&#160;|&#160;compile-ui-assets&#160;|&#160;compile-ui-assets-dev&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="996" textLength="12.2" clip-path="url(#breeze-static-checks-line-40)">│</text><text class="breeze-static-checks-r1" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-static-checks-line-40)">
+</text><text class="breeze-static-checks-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1020.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-41)">create-missing-init-py-files-tests&#160;|&#160;debug-statements&#160;|&#160;detect-private-key&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1020.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">│</text><text class="breeze-static-checks-r1" x="1464" y="1020.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-41)">
+</text><text class="breeze-static-checks-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1044.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-42)">doctoc&#160;|&#160;end-of-file-fixer&#160;|&#160;fix-encoding-pragma&#160;|&#160;flynt&#160;|&#160;gci&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1044.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">│</text><text class="breeze-static-checks-r1" x="1464" y="1044.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-42)">
+</text><text class="breeze-static-checks-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1069.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-43)">generate-airflow-diagrams&#160;|&#160;generate-airflowctl-datamodels&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">│</text><text class="breeze-static-checks-r1" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-43)">
+</text><text class="breeze-static-checks-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1093.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-44)">generate-airflowctl-help-images&#160;|&#160;generate-openapi-spec&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">│</text><text class="breeze-static-checks-r1" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-44)">
+</text><text class="breeze-static-checks-r5" x="0" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1118" textLength="988.2" clip-path="url(#breeze-static-checks-line-45)">generate-openapi-spec-fab&#160;|&#160;generate-pypi-readme&#160;|&#160;generate-tasksdk-datamodels&#160;|&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">│</text><text class="breeze-static-checks-r1" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-static-checks-line-45)">
+</text><text class="breeze-static-checks-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1142.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-46)">generate-volumes-for-sources&#160;|&#160;go-mockery&#160;|&#160;go-mod-tidy&#160;|&#160;gofmt&#160;|&#160;identity&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">│</text><text class="breeze-static-checks-r1" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-46)">
+</text><text class="breeze-static-checks-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1166.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-47)">insert-license&#160;|&#160;kubeconform&#160;|&#160;lint-chart-schema&#160;|&#160;lint-dockerfile&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">│</text><text class="breeze-static-checks-r1" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-47)">
+</text><text class="breeze-static-checks-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1191.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-48)">lint-helm-chart&#160;|&#160;lint-json-schema&#160;|&#160;lint-markdown&#160;|&#160;mixed-line-ending&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">│</text><text class="breeze-static-checks-r1" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-48)">
+</text><text class="breeze-static-checks-r5" x="0" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1215.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-49)">mypy-airflow-core&#160;|&#160;mypy-airflow-ctl&#160;|&#160;mypy-dev&#160;|&#160;mypy-devel-common&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">│</text><text class="breeze-static-checks-r1" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-49)">
+</text><text class="breeze-static-checks-r5" x="0" y="1240" textLength="12.2" clip-path="url(#breeze-static-checks-line-50)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1240" textLength="988.2" clip-path="url(#breeze-static-checks-line-50)">mypy-providers&#160;|&#160;mypy-task-sdk&#160;|&#160;pretty-format-json&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1240" textLength="12.2" clip-path="url(#breeze-static-checks-line-50)">│</text><text class="breeze-static-checks-r1" x="1464" y="1240" textLength="12.2" clip-path="url(#breeze-static-checks-line-50)">
+</text><text class="breeze-static-checks-r5" x="0" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-51)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1264.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-51)">prevent-deprecated-sqlalchemy-usage&#160;|&#160;provider-version-compat&#160;|&#160;pylint&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-51)">│</text><text class="breeze-static-checks-r1" x="1464" y="1264.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-51)">
+</text><text class="breeze-static-checks-r5" x="0" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-52)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1288.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-52)">python-no-log-warn&#160;|&#160;replace-bad-characters&#160;|&#160;rst-backticks&#160;|&#160;ruff&#160;|&#160;ruff-format&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-52)">│</text><text class="breeze-static-checks-r1" x="1464" y="1288.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-52)">
+</text><text class="breeze-static-checks-r5" x="0" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1313.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-53)">|&#160;shellcheck&#160;|&#160;trailing-whitespace&#160;|&#160;ts-compile-lint-simple-auth-manager-ui&#160;|&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">│</text><text class="breeze-static-checks-r1" x="1464" y="1313.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-53)">
+</text><text class="breeze-static-checks-r5" x="0" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1337.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-54)">ts-compile-lint-ui&#160;|&#160;update-black-version&#160;|&#160;update-breeze-cmd-output&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">│</text><text class="breeze-static-checks-r1" x="1464" y="1337.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-54)">
+</text><text class="breeze-static-checks-r5" x="0" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1362" textLength="988.2" clip-path="url(#breeze-static-checks-line-55)">update-breeze-readme-config-hash&#160;|&#160;update-chart-dependencies&#160;|&#160;update-er-diagram&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">│</text><text class="breeze-static-checks-r1" x="1464" y="1362" textLength="12.2" clip-path="url(#breeze-static-checks-line-55)">
+</text><text class="breeze-static-checks-r5" x="0" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1386.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-56)">|&#160;update-in-the-wild-to-be-sorted&#160;|&#160;update-inlined-dockerfile-scripts&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">│</text><text class="breeze-static-checks-r1" x="1464" y="1386.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-56)">
+</text><text class="breeze-static-checks-r5" x="0" y="1410.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-57)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1410.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-57)">update-installed-providers-to-be-sorted&#160;|&#160;update-installers-and-pre-commit&#160;|&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1410.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-57)">│</text><text class="breeze-static-checks-r1" x="1464" y="1410.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-57)">
+</text><text class="breeze-static-checks-r5" x="0" y="1435.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-58)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1435.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-58)">update-local-yml-file&#160;|&#160;update-migration-references&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1435.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-58)">│</text><text class="breeze-static-checks-r1" x="1464" y="1435.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-58)">
+</text><text class="breeze-static-checks-r5" x="0" y="1459.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-59)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1459.6" textLength="988.2" clip-path="url(#breeze-static-checks-line-59)">update-providers-build-files&#160;|&#160;update-providers-dependencies&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1459.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-59)">│</text><text class="breeze-static-checks-r1" x="1464" y="1459.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-59)">
+</text><text class="breeze-static-checks-r5" x="0" y="1484" textLength="12.2" clip-path="url(#breeze-static-checks-line-60)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1484" textLength="988.2" clip-path="url(#breeze-static-checks-line-60)">update-pyproject-toml&#160;|&#160;update-reproducible-source-date-epoch&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1484" textLength="12.2" clip-path="url(#breeze-static-checks-line-60)">│</text><text class="breeze-static-checks-r1" x="1464" y="1484" textLength="12.2" clip-path="url(#breeze-static-checks-line-60)">
+</text><text class="breeze-static-checks-r5" x="0" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1508.4" textLength="988.2" clip-path="url(#breeze-static-checks-line-61)">update-spelling-wordlist-to-be-sorted&#160;|&#160;update-supported-versions&#160;|&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">│</text><text class="breeze-static-checks-r1" x="1464" y="1508.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-61)">
+</text><text class="breeze-static-checks-r5" x="0" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1532.8" textLength="988.2" clip-path="url(#breeze-static-checks-line-62)">update-vendored-in-k8s-json-schema&#160;|&#160;update-version&#160;|&#160;validate-chart-annotations&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">│</text><text class="breeze-static-checks-r1" x="1464" y="1532.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-62)">
+</text><text class="breeze-static-checks-r5" x="0" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1557.2" textLength="988.2" clip-path="url(#breeze-static-checks-line-63)">|&#160;validate-operators-init&#160;|&#160;yamllint&#160;|&#160;zizmor)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">│</text><text class="breeze-static-checks-r1" x="1464" y="1557.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-63)">
+</text><text class="breeze-static-checks-r5" x="0" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1581.6" textLength="268.4" clip-path="url(#breeze-static-checks-line-64)">--show-diff-on-failure</text><text class="breeze-static-checks-r6" x="402.6" y="1581.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-64)">-s</text><text class="breeze-static-checks-r1" x="451.4" y="1581.6" textLength="524.6" clip-path="url(#breeze-static-checks-line-64)">Show&#160;diff&#160;for&#160;files&#160;modified&#160;by&#160;the&#160;checks.</text><text class="breeze-static-checks-r5" x="1451.8" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">│</text><text class="breeze-static-checks-r1" x="1464" y="1581.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-64)">
+</text><text class="breeze-static-checks-r5" x="0" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1606" textLength="292.8" clip-path="url(#breeze-static-checks-line-65)">--initialize-environment</text><text class="breeze-static-checks-r1" x="451.4" y="1606" textLength="549" clip-path="url(#breeze-static-checks-line-65)">Initialize&#160;environment&#160;before&#160;running&#160;checks.</text><text class="breeze-static-checks-r5" x="1451.8" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">│</text><text class="breeze-static-checks-r1" x="1464" y="1606" textLength="12.2" clip-path="url(#breeze-static-checks-line-65)">
+</text><text class="breeze-static-checks-r5" x="0" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1630.4" textLength="353.8" clip-path="url(#breeze-static-checks-line-66)">--max-initialization-attempts</text><text class="breeze-static-checks-r1" x="451.4" y="1630.4" textLength="854" clip-path="url(#breeze-static-checks-line-66)">Maximum&#160;number&#160;of&#160;attempts&#160;to&#160;initialize&#160;environment&#160;before&#160;giving&#160;up.</text><text class="breeze-static-checks-r5" x="1451.8" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">│</text><text class="breeze-static-checks-r1" x="1464" y="1630.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-66)">
+</text><text class="breeze-static-checks-r5" x="0" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">│</text><text class="breeze-static-checks-r7" x="451.4" y="1654.8" textLength="854" clip-path="url(#breeze-static-checks-line-67)">(INTEGER&#160;RANGE)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">│</text><text class="breeze-static-checks-r1" x="1464" y="1654.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-67)">
+</text><text class="breeze-static-checks-r5" x="0" y="1679.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-68)">│</text><text class="breeze-static-checks-r5" x="451.4" y="1679.2" textLength="854" clip-path="url(#breeze-static-checks-line-68)">[default:&#160;3;&#160;1&lt;=x&lt;=10]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1679.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-68)">│</text><text class="breeze-static-checks-r1" x="1464" y="1679.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-68)">
+</text><text class="breeze-static-checks-r5" x="0" y="1703.6" textLength="1464" clip-path="url(#breeze-static-checks-line-69)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1703.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-69)">
+</text><text class="breeze-static-checks-r5" x="0" y="1728" textLength="24.4" clip-path="url(#breeze-static-checks-line-70)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1728" textLength="463.6" clip-path="url(#breeze-static-checks-line-70)">&#160;Selecting&#160;files&#160;to&#160;run&#160;the&#160;checks&#160;on&#160;</text><text class="breeze-static-checks-r5" x="488" y="1728" textLength="951.6" clip-path="url(#breeze-static-checks-line-70)">──────────────────────────────────────────────────────────────────────────────</text><text class="breeze-static-checks-r5" x="1439.6" y="1728" textLength="24.4" clip-path="url(#breeze-static-checks-line-70)">─╮</text><text class="breeze-static-checks-r1" x="1464" y="1728" textLength="12.2" clip-path="url(#breeze-static-checks-line-70)">
+</text><text class="breeze-static-checks-r5" x="0" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1752.4" textLength="73.2" clip-path="url(#breeze-static-checks-line-71)">--file</text><text class="breeze-static-checks-r6" x="256.2" y="1752.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-71)">-f</text><text class="breeze-static-checks-r1" x="305" y="1752.4" textLength="427" clip-path="url(#breeze-static-checks-line-71)">List&#160;of&#160;files&#160;to&#160;run&#160;the&#160;checks&#160;on.</text><text class="breeze-static-checks-r7" x="744.2" y="1752.4" textLength="73.2" clip-path="url(#breeze-static-checks-line-71)">(PATH)</text><text class="breeze-static-checks-r5" x="1451.8" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">│</text><text class="breeze-static-checks-r1" x="1464" y="1752.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-71)">
+</text><text class="breeze-static-checks-r5" x="0" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1776.8" textLength="134.2" clip-path="url(#breeze-static-checks-line-72)">--all-files</text><text class="breeze-static-checks-r6" x="256.2" y="1776.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-72)">-a</text><text class="breeze-static-checks-r1" x="305" y="1776.8" textLength="292.8" clip-path="url(#breeze-static-checks-line-72)">Run&#160;checks&#160;on&#160;all&#160;files.</text><text class="breeze-static-checks-r5" x="1451.8" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">│</text><text class="breeze-static-checks-r1" x="1464" y="1776.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-72)">
+</text><text class="breeze-static-checks-r5" x="0" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1801.2" textLength="146.4" clip-path="url(#breeze-static-checks-line-73)">--commit-ref</text><text class="breeze-static-checks-r6" x="256.2" y="1801.2" textLength="24.4" clip-path="url(#breeze-static-checks-line-73)">-r</text><text class="breeze-static-checks-r1" x="305" y="1801.2" textLength="1134.6" clip-path="url(#breeze-static-checks-line-73)">Run&#160;checks&#160;for&#160;this&#160;commit&#160;reference&#160;only&#160;(can&#160;be&#160;any&#160;git&#160;commit-ish&#160;reference).&#160;Mutually&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">│</text><text class="breeze-static-checks-r1" x="1464" y="1801.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-73)">
+</text><text class="breeze-static-checks-r5" x="0" y="1825.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-74)">│</text><text class="breeze-static-checks-r1" x="305" y="1825.6" textLength="183" clip-path="url(#breeze-static-checks-line-74)">exclusive&#160;with&#160;</text><text class="breeze-static-checks-r4" x="488" y="1825.6" textLength="158.6" clip-path="url(#breeze-static-checks-line-74)">--last-commit</text><text class="breeze-static-checks-r1" x="646.6" y="1825.6" textLength="793" clip-path="url(#breeze-static-checks-line-74)">.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1825.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-74)">│</text><text class="breeze-static-checks-r1" x="1464" y="1825.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-74)">
+</text><text class="breeze-static-checks-r5" x="0" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">│</text><text class="breeze-static-checks-r7" x="305" y="1850" textLength="1134.6" clip-path="url(#breeze-static-checks-line-75)">(TEXT)&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">│</text><text class="breeze-static-checks-r1" x="1464" y="1850" textLength="12.2" clip-path="url(#breeze-static-checks-line-75)">
+</text><text class="breeze-static-checks-r5" x="0" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1874.4" textLength="158.6" clip-path="url(#breeze-static-checks-line-76)">--last-commit</text><text class="breeze-static-checks-r6" x="256.2" y="1874.4" textLength="24.4" clip-path="url(#breeze-static-checks-line-76)">-c</text><text class="breeze-static-checks-r1" x="305" y="1874.4" textLength="793" clip-path="url(#breeze-static-checks-line-76)">Run&#160;checks&#160;for&#160;all&#160;files&#160;in&#160;last&#160;commit.&#160;Mutually&#160;exclusive&#160;with&#160;</text><text class="breeze-static-checks-r4" x="1098" y="1874.4" textLength="146.4" clip-path="url(#breeze-static-checks-line-76)">--commit-ref</text><text class="breeze-static-checks-r1" x="1244.4" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">.</text><text class="breeze-static-checks-r5" x="1451.8" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">│</text><text class="breeze-static-checks-r1" x="1464" y="1874.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-76)">
+</text><text class="breeze-static-checks-r5" x="0" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1898.8" textLength="207.4" clip-path="url(#breeze-static-checks-line-77)">--only-my-changes</text><text class="breeze-static-checks-r6" x="256.2" y="1898.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-77)">-m</text><text class="breeze-static-checks-r1" x="305" y="1898.8" textLength="1134.6" clip-path="url(#breeze-static-checks-line-77)">Run&#160;checks&#160;for&#160;commits&#160;belonging&#160;to&#160;my&#160;PR&#160;only:&#160;for&#160;all&#160;commits&#160;between&#160;merge&#160;base&#160;to&#160;`main`&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">│</text><text class="breeze-static-checks-r1" x="1464" y="1898.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-77)">
+</text><text class="breeze-static-checks-r5" x="0" y="1923.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-78)">│</text><text class="breeze-static-checks-r1" x="305" y="1923.2" textLength="1134.6" clip-path="url(#breeze-static-checks-line-78)">branch&#160;and&#160;HEAD&#160;of&#160;your&#160;branch.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="1923.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-78)">│</text><text class="breeze-static-checks-r1" x="1464" y="1923.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-78)">
+</text><text class="breeze-static-checks-r5" x="0" y="1947.6" textLength="1464" clip-path="url(#breeze-static-checks-line-79)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="1947.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-79)">
+</text><text class="breeze-static-checks-r5" x="0" y="1972" textLength="24.4" clip-path="url(#breeze-static-checks-line-80)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="1972" textLength="463.6" clip-path="url(#breeze-static-checks-line-80)">&#160;Building&#160;image&#160;before&#160;running&#160;checks&#160;</text><text class="breeze-static-checks-r5" x="488" y="1972" textLength="951.6" clip-path="url(#breeze-static-checks-line-80)">──────────────────────────────────────────────────────────────────────────────</text><text class="breeze-static-checks-r5" x="1439.6" y="1972" textLength="24.4" clip-path="url(#breeze-static-checks-line-80)">─╮</text><text class="breeze-static-checks-r1" x="1464" y="1972" textLength="12.2" clip-path="url(#breeze-static-checks-line-80)">
+</text><text class="breeze-static-checks-r5" x="0" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">│</text><text class="breeze-static-checks-r4" x="24.4" y="1996.4" textLength="317.2" clip-path="url(#breeze-static-checks-line-81)">--skip-image-upgrade-check</text><text class="breeze-static-checks-r1" x="414.8" y="1996.4" textLength="536.8" clip-path="url(#breeze-static-checks-line-81)">Skip&#160;checking&#160;if&#160;the&#160;CI&#160;image&#160;is&#160;up&#160;to&#160;date.</text><text class="breeze-static-checks-r5" x="1451.8" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">│</text><text class="breeze-static-checks-r1" x="1464" y="1996.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-81)">
+</text><text class="breeze-static-checks-r5" x="0" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2020.8" textLength="158.6" clip-path="url(#breeze-static-checks-line-82)">--force-build</text><text class="breeze-static-checks-r1" x="414.8" y="2020.8" textLength="707.6" clip-path="url(#breeze-static-checks-line-82)">Force&#160;image&#160;build&#160;no&#160;matter&#160;if&#160;it&#160;is&#160;determined&#160;as&#160;needed.</text><text class="breeze-static-checks-r5" x="1451.8" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">│</text><text class="breeze-static-checks-r1" x="1464" y="2020.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-82)">
+</text><text class="breeze-static-checks-r5" x="0" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2045.2" textLength="231.8" clip-path="url(#breeze-static-checks-line-83)">--github-repository</text><text class="breeze-static-checks-r6" x="366" y="2045.2" textLength="24.4" clip-path="url(#breeze-static-checks-line-83)">-g</text><text class="breeze-static-checks-r1" x="414.8" y="2045.2" textLength="585.6" clip-path="url(#breeze-static-checks-line-83)">GitHub&#160;repository&#160;used&#160;to&#160;pull,&#160;push&#160;run&#160;images.</text><text class="breeze-static-checks-r7" x="1012.6" y="2045.2" textLength="73.2" clip-path="url(#breeze-static-checks-line-83)">(TEXT)</text><text class="breeze-static-checks-r5" x="1098" y="2045.2" textLength="305" clip-path="url(#breeze-static-checks-line-83)">[default:&#160;apache/airflow]</text><text class="breeze-static-checks-r5" x="1451.8" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">│</text><text class="breeze-static-checks-r1" x="1464" y="2045.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-83)">
+</text><text class="breeze-static-checks-r5" x="0" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2069.6" textLength="109.8" clip-path="url(#breeze-static-checks-line-84)">--builder</text><text class="breeze-static-checks-r1" x="414.8" y="2069.6" textLength="756.4" clip-path="url(#breeze-static-checks-line-84)">Buildx&#160;builder&#160;used&#160;to&#160;perform&#160;`docker&#160;buildx&#160;build`&#160;commands.</text><text class="breeze-static-checks-r7" x="1183.4" y="2069.6" textLength="73.2" clip-path="url(#breeze-static-checks-line-84)">(TEXT)</text><text class="breeze-static-checks-r5" x="1451.8" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)">│</text><text class="breeze-static-checks-r1" x="1464" y="2069.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-84)">
+</text><text class="breeze-static-checks-r5" x="0" y="2094" textLength="12.2" clip-path="url(#breeze-static-checks-line-85)">│</text><text class="breeze-static-checks-r5" x="414.8" y="2094" textLength="756.4" clip-path="url(#breeze-static-checks-line-85)">[default:&#160;autodetect]&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-static-checks-r5" x="1451.8" y="2094" textLength="12.2" clip-path="url(#breeze-static-checks-line-85)">│</text><text class="breeze-static-checks-r1" x="1464" y="2094" textLength="12.2" clip-path="url(#breeze-static-checks-line-85)">
+</text><text class="breeze-static-checks-r5" x="0" y="2118.4" textLength="1464" clip-path="url(#breeze-static-checks-line-86)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2118.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-86)">
+</text><text class="breeze-static-checks-r5" x="0" y="2142.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-87)">╭─</text><text class="breeze-static-checks-r5" x="24.4" y="2142.8" textLength="195.2" clip-path="url(#breeze-static-checks-line-87)">&#160;Common&#160;options&#160;</text><text class="breeze-static-checks-r5" x="219.6" y="2142.8" textLength="1220" clip-path="url(#breeze-static-checks-line-87)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-static-checks-r5" x="1439.6" y="2142.8" textLength="24.4" clip-path="url(#breeze-static-checks-line-87)">─╮</text><text class="breeze-static-checks-r1" x="1464" y="2142.8" textLength="12.2" clip-path="url(#breeze-static-checks-line-87)">
+</text><text class="breeze-static-checks-r5" x="0" y="2167.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-88)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2167.2" textLength="109.8" clip-path="url(#breeze-static-checks-line-88)">--dry-run</text><text class="breeze-static-checks-r6" x="158.6" y="2167.2" textLength="24.4" clip-path="url(#breeze-static-checks-line-88)">-D</text><text class="breeze-static-checks-r1" x="207.4" y="2167.2" textLength="719.8" clip-path="url(#breeze-static-checks-line-88)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-static-checks-r5" x="1451.8" y="2167.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-88)">│</text><text class="breeze-static-checks-r1" x="1464" y="2167.2" textLength="12.2" clip-path="url(#breeze-static-checks-line-88)">
+</text><text class="breeze-static-checks-r5" x="0" y="2191.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-89)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2191.6" textLength="109.8" clip-path="url(#breeze-static-checks-line-89)">--verbose</text><text class="breeze-static-checks-r6" x="158.6" y="2191.6" textLength="24.4" clip-path="url(#breeze-static-checks-line-89)">-v</text><text class="breeze-static-checks-r1" x="207.4" y="2191.6" textLength="585.6" clip-path="url(#breeze-static-checks-line-89)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-static-checks-r5" x="1451.8" y="2191.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-89)">│</text><text class="breeze-static-checks-r1" x="1464" y="2191.6" textLength="12.2" clip-path="url(#breeze-static-checks-line-89)">
+</text><text class="breeze-static-checks-r5" x="0" y="2216" textLength="12.2" clip-path="url(#breeze-static-checks-line-90)">│</text><text class="breeze-static-checks-r4" x="24.4" y="2216" textLength="73.2" clip-path="url(#breeze-static-checks-line-90)">--help</text><text class="breeze-static-checks-r6" x="158.6" y="2216" textLength="24.4" clip-path="url(#breeze-static-checks-line-90)">-h</text><text class="breeze-static-checks-r1" x="207.4" y="2216" textLength="329.4" clip-path="url(#breeze-static-checks-line-90)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-static-checks-r5" x="1451.8" y="2216" textLength="12.2" clip-path="url(#breeze-static-checks-line-90)">│</text><text class="breeze-static-checks-r1" x="1464" y="2216" textLength="12.2" clip-path="url(#breeze-static-checks-line-90)">
+</text><text class="breeze-static-checks-r5" x="0" y="2240.4" textLength="1464" clip-path="url(#breeze-static-checks-line-91)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-static-checks-r1" x="1464" y="2240.4" textLength="12.2" clip-path="url(#breeze-static-checks-line-91)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_static-checks.txt b/dev/breeze/doc/images/output_static-checks.txt
index c4ea9001bac34..fa1199fddeefe 100644
--- a/dev/breeze/doc/images/output_static-checks.txt
+++ b/dev/breeze/doc/images/output_static-checks.txt
@@ -1 +1 @@
-c3e2295a3b4cfc4073a1c8bea4ee4f3b
+d740360b9bb4f4d0122c16af4763a5a5
diff --git a/dev/breeze/src/airflow_breeze/pre_commit_ids.py b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
index a9d1b62c0b8ac..7bba12197e34b 100644
--- a/dev/breeze/src/airflow_breeze/pre_commit_ids.py
+++ b/dev/breeze/src/airflow_breeze/pre_commit_ids.py
@@ -71,6 +71,7 @@
     "check-pre-commit-information-consistent",
     "check-provide-create-sessions-imports",
     "check-provider-docs-valid",
+    "check-provider-exclusions-python-version",
     "check-provider-yaml-valid",
     "check-providers-subpackages-init-file-exist",
     "check-pydevd-left-in-code",
diff --git a/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py b/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
new file mode 100755
index 0000000000000..72df8a7378522
--- /dev/null
+++ b/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
@@ -0,0 +1,280 @@
+#!/usr/bin/env python
+# 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.
+from __future__ import annotations
+
+import ast
+import re
+import sys
+from pathlib import Path
+from typing import cast
+
+import yaml
+from packaging.specifiers import SpecifierSet
+from packaging.version import Version
+
+try:
+    import tomllib
+except ImportError:
+    import tomli as tomllib
+
+# The purpose of this script, is to check whether the exclusion of certain providers for
+# specific python versions is constant across all 3 files in which it needs to be set.
+# This is the providers pyproject.toml and provider.yaml and the PROVIDERS_COMPATIBILITY_TESTS_MATRIX
+# in dev/breeze/src/airflow_breeze/global_constants.py
+
+MIN_SUPPORTED_VERSION = "3.10"
+
+
+def find_provider_root(path: Path) -> Path | None:
+    current = path.parent
+    while current != current.parent:
+        if (current / "pyproject.toml").exists() and (current / "provider.yaml").exists():
+            return current
+        current = current.parent
+    return None
+
+
+def get_simple_provider_name(provider_root: Path) -> str:
+    parts = provider_root.parts
+    try:
+        idx = parts.index("providers")
+    except ValueError:
+        return provider_root.name
+    relevant_parts = parts[idx + 1 :]
+    return ".".join(relevant_parts)
+
+
+def parse_min_py_version(requires_python: str) -> str | None:
+    match = re.search(r">=\s*([0-9]+(?:\.[0-9]+)*)", requires_python)
+    if match:
+        return match.group(1)
+    return None
+
+
+def filter_pyproject_exclusions(exclusions: set[str]) -> set[str]:
+    filtered = set()
+    for v in exclusions:
+        ver = Version(v)
+        if ver >= Version(MIN_SUPPORTED_VERSION):
+            filtered.add(v)
+    return filtered
+
+
+def parse_pyproject_exclusions_filtered(pyproject_path: Path) -> set[str]:
+    try:
+        with pyproject_path.open("rb") as f:
+            data = tomllib.load(f)
+        requires_python = data.get("project", {}).get("requires-python", "")
+        exclusions = set(re.findall(r"!=([0-9.]+)", requires_python))
+        min_version_match = re.search(r">=\s*([0-9]+(?:\.[0-9]+)*)", requires_python)
+        if min_version_match:
+            min_version = min_version_match.group(1)
+            all_py_versions = [f"3.{i}" for i in range(10, 13)]  # Airflows current min Python version is 3.10
+            for v in all_py_versions:
+                if Version(v) < Version(min_version):
+                    exclusions.add(v)
+        return filter_pyproject_exclusions(exclusions)
+    except Exception as e:
+        print(f"Failed to parse {pyproject_path}: {e}")
+        return set()
+
+
+def check_classifiers_vs_pyproject_exclusions(
+    pyproject_path: Path, pyproject_exclusions: set[str]
+) -> list[str]:
+    try:
+        with pyproject_path.open("rb") as f:
+            data = tomllib.load(f)
+        classifiers = data.get("project", {}).get("classifiers", [])
+        classifier_versions = {
+            entry.strip().split("::")[2].strip()
+            for entry in classifiers
+            if entry.strip().startswith("Programming Language :: Python ::")
+            and entry.strip().count("::") == 2
+        }
+        return sorted(pyproject_exclusions & classifier_versions)
+    except Exception as e:
+        print(f"Failed to check classifiers in {pyproject_path}: {e}")
+        return []
+
+
+def parse_pyproject_exclusions(pyproject_path: Path) -> set[str]:
+    try:
+        with pyproject_path.open("rb") as f:
+            data = tomllib.load(f)
+        requires_python = data.get("project", {}).get("requires-python", "")
+        spec = SpecifierSet(requires_python)
+
+        all_py_versions = [f"3.{i}" for i in range(10, 13)]  # Airflows current min Python version is 3.10
+        excluded = {v for v in all_py_versions if Version(v) not in spec}
+        return excluded
+    except Exception as e:
+        print(f"Failed to parse {pyproject_path}: {e}")
+        return set()
+
+
+def parse_provider_yaml_exclusions(provider_yaml_path: Path) -> set[str]:
+    try:
+        with open(provider_yaml_path) as f:
+            data = yaml.safe_load(f)
+        raw_versions = data.get("excluded-python-versions", [])
+        versions = set()
+        for v in raw_versions:
+            if isinstance(v, float):
+                print(
+                    f"warning: Float value {v} found in {provider_yaml_path}. Did you mean '{v:.2f}' as a string?"
+                )
+                versions.add(f"{v:.2f}")
+            else:
+                versions.add(str(v))
+        return versions
+    except Exception as e:
+        print(f"Failed to parse {provider_yaml_path}: {e}")
+        return set()
+
+
+def parse_provider_name(pyproject_path: Path) -> str | None:
+    try:
+        with pyproject_path.open("rb") as f:
+            data = tomllib.load(f)
+        return data.get("project", {}).get("name")
+    except Exception as e:
+        print(f"Failed to parse provider name in {pyproject_path}: {e}")
+        return None
+
+
+def parse_global_exclusions(global_constants_path: Path) -> dict[str, set[str]]:
+    try:
+        with open(global_constants_path) as f:
+            tree = ast.parse(f.read())
+    except Exception as e:
+        print(f"Failed to parse {global_constants_path}: {e}")
+        return {}
+    for node in tree.body:
+        if isinstance(node, ast.Assign):
+            targets = node.targets
+            if node.value is None:
+                continue
+            value = node.value
+        elif isinstance(node, ast.AnnAssign):
+            if node.value is None:
+                continue
+            targets = cast("list[ast.expr]", [node.target])
+            value = node.value
+        else:
+            continue
+
+        for target in targets:
+            if getattr(target, "id", None) == "PROVIDERS_COMPATIBILITY_TESTS_MATRIX":
+                try:
+                    matrix = ast.literal_eval(value)
+                    version_map: dict[str, set[str]] = {}
+                    for entry in matrix:
+                        py_ver = entry.get("python-version")
+                        removed = entry.get("remove-providers", "")
+                        removed_set = set(p.strip() for p in removed.split())
+                        version_map.setdefault(py_ver, set()).update(removed_set)
+                    return version_map
+                except Exception as e:
+                    print("Failed to evaluate PROVIDERS_COMPATIBILITY_TESTS_MATRIX:", e)
+                    return {}
+    return {}
+
+
+def check_consistency(provider_root: Path, global_exclusions: dict[str, set[str]]) -> bool:
+    pyproject_path = provider_root / "pyproject.toml"
+    provider_yaml_path = provider_root / "provider.yaml"
+    provider_name = parse_provider_name(pyproject_path)
+    simple_name = get_simple_provider_name(provider_root)
+
+    if not provider_name:
+        print(f"Could not parse provider name in {pyproject_path}")
+        return False
+
+    pyproject_exclusions = parse_pyproject_exclusions_filtered(pyproject_path)
+    provider_yaml_exclusions = parse_provider_yaml_exclusions(provider_yaml_path)
+    classifier_conflicts = check_classifiers_vs_pyproject_exclusions(pyproject_path, pyproject_exclusions)
+
+    failure_messages = []
+
+    if pyproject_exclusions != provider_yaml_exclusions:
+        failure_messages.append(
+            f"\nMismatch in excluded Python versions between pyproject.toml and provider.yaml:"
+            f"\n  pyproject.toml exclusions: {sorted(pyproject_exclusions) if pyproject_exclusions else 'no versions excluded'}"
+            f"\n  provider.yaml exclusions: {sorted(provider_yaml_exclusions) if provider_yaml_exclusions else 'no versions excluded'}"
+        )
+
+    all_exclusions = pyproject_exclusions | provider_yaml_exclusions
+    for py_ver in all_exclusions:
+        if provider_name not in global_exclusions.get(py_ver, set()):
+            failure_messages.append(
+                f"\nProvider missing from exclusion matrix for Python {py_ver} in dev/breeze/src/airflow_breeze/global_constants.py"
+            )
+
+    if classifier_conflicts:
+        failure_messages.append(
+            "\nThe 'classifiers' key in pyproject.toml contains Python versions that are excluded in 'requires-python'"
+        )
+
+    if failure_messages:
+        print(f"\nInconsistencies found in provider '{simple_name}':")
+        for msg in failure_messages:
+            print(msg)
+        return False
+
+    return True
+
+
+def main():
+    changed_files = [Path(f) for f in sys.argv[1:]]
+    provider_roots = set()
+    for f in changed_files:
+        root = find_provider_root(f)
+        if root:
+            provider_roots.add(root)
+
+    if not provider_roots:
+        print("No relevant changes detected, skipping check.")
+        sys.exit(0)
+
+    global_constants_path = Path("dev/breeze/src/airflow_breeze/global_constants.py")
+    if not global_constants_path.exists():
+        print(f"Global constants file not found at {global_constants_path}")
+        sys.exit(1)
+
+    global_exclusions = parse_global_exclusions(global_constants_path)
+    if not global_exclusions:
+        print("Failed to parse global exclusions or global exclusions are empty.")
+        sys.exit(1)
+
+    failed = False
+    for provider_root in provider_roots:
+        if not check_consistency(provider_root, global_exclusions):
+            failed = True
+
+    if failed:
+        sys.exit(1)
+    else:
+        print(
+            "Python version exclusions are consistent across pyproject.toml, provider.yaml and global constants."
+        )
+        sys.exit(0)
+
+
+if __name__ == "__main__":
+    main()

From a4e953ca04136a3aab10c901ecc2b5201ab22b0f Mon Sep 17 00:00:00 2001
From: Dominik Heilbock <dheilbock@gmx.net>
Date: Mon, 14 Jul 2025 21:58:54 +0200
Subject: [PATCH 2/3] refined logic of hook

---
 .pre-commit-config.yaml                       |  2 ++
 ...ck_exclusion_of_provider_python_version.py | 33 +++++++------------
 2 files changed, 14 insertions(+), 21 deletions(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 861b05de138e6..60091624ea398 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -243,6 +243,8 @@ repos:
         name: Check Provider Python Version Exclusions
         entry: ./scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
         language: python
+        pass_filenames: true
+        require_serial: true
         files: ^(providers/.*/(pyproject.toml|provider.yaml)|dev/breeze/src/airflow_breeze/global_constants.py)$
         additional_dependencies: ['pyyaml>=6.0.2', 'tomli>=2.0.1', "packaging>=25"]
   - repo: https://github.com/asottile/blacken-docs
diff --git a/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py b/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
index 72df8a7378522..ce43b3925a4aa 100755
--- a/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
+++ b/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
@@ -38,6 +38,7 @@
 # in dev/breeze/src/airflow_breeze/global_constants.py
 
 MIN_SUPPORTED_VERSION = "3.10"
+SUPPORTED_PYTHON_VERSIONS = [f"3.{i}" for i in range(10, 13)]
 
 
 def find_provider_root(path: Path) -> Path | None:
@@ -59,18 +60,13 @@ def get_simple_provider_name(provider_root: Path) -> str:
     return ".".join(relevant_parts)
 
 
-def parse_min_py_version(requires_python: str) -> str | None:
-    match = re.search(r">=\s*([0-9]+(?:\.[0-9]+)*)", requires_python)
-    if match:
-        return match.group(1)
-    return None
-
-
 def filter_pyproject_exclusions(exclusions: set[str]) -> set[str]:
     filtered = set()
     for v in exclusions:
         ver = Version(v)
-        if ver >= Version(MIN_SUPPORTED_VERSION):
+        if ver >= Version(
+            MIN_SUPPORTED_VERSION
+        ):  # If the excluded version is less than the current minimum supported one
             filtered.add(v)
     return filtered
 
@@ -84,7 +80,7 @@ def parse_pyproject_exclusions_filtered(pyproject_path: Path) -> set[str]:
         min_version_match = re.search(r">=\s*([0-9]+(?:\.[0-9]+)*)", requires_python)
         if min_version_match:
             min_version = min_version_match.group(1)
-            all_py_versions = [f"3.{i}" for i in range(10, 13)]  # Airflows current min Python version is 3.10
+            all_py_versions = SUPPORTED_PYTHON_VERSIONS
             for v in all_py_versions:
                 if Version(v) < Version(min_version):
                     exclusions.add(v)
@@ -120,7 +116,7 @@ def parse_pyproject_exclusions(pyproject_path: Path) -> set[str]:
         requires_python = data.get("project", {}).get("requires-python", "")
         spec = SpecifierSet(requires_python)
 
-        all_py_versions = [f"3.{i}" for i in range(10, 13)]  # Airflows current min Python version is 3.10
+        all_py_versions = SUPPORTED_PYTHON_VERSIONS
         excluded = {v for v in all_py_versions if Version(v) not in spec}
         return excluded
     except Exception as e:
@@ -135,13 +131,13 @@ def parse_provider_yaml_exclusions(provider_yaml_path: Path) -> set[str]:
         raw_versions = data.get("excluded-python-versions", [])
         versions = set()
         for v in raw_versions:
-            if isinstance(v, float):
+            version_str = f"{v:.2f}" if isinstance(v, float) else str(v)
+            if version_str in SUPPORTED_PYTHON_VERSIONS:
+                versions.add(version_str)
+            elif Version(version_str) < Version(MIN_SUPPORTED_VERSION):
                 print(
-                    f"warning: Float value {v} found in {provider_yaml_path}. Did you mean '{v:.2f}' as a string?"
+                    f"Warning: {provider_yaml_path} excludes {version_str} which is below minimum supported version {MIN_SUPPORTED_VERSION}"
                 )
-                versions.add(f"{v:.2f}")
-            else:
-                versions.add(str(v))
         return versions
     except Exception as e:
         print(f"Failed to parse {provider_yaml_path}: {e}")
@@ -199,13 +195,8 @@ def parse_global_exclusions(global_constants_path: Path) -> dict[str, set[str]]:
 def check_consistency(provider_root: Path, global_exclusions: dict[str, set[str]]) -> bool:
     pyproject_path = provider_root / "pyproject.toml"
     provider_yaml_path = provider_root / "provider.yaml"
-    provider_name = parse_provider_name(pyproject_path)
     simple_name = get_simple_provider_name(provider_root)
 
-    if not provider_name:
-        print(f"Could not parse provider name in {pyproject_path}")
-        return False
-
     pyproject_exclusions = parse_pyproject_exclusions_filtered(pyproject_path)
     provider_yaml_exclusions = parse_provider_yaml_exclusions(provider_yaml_path)
     classifier_conflicts = check_classifiers_vs_pyproject_exclusions(pyproject_path, pyproject_exclusions)
@@ -221,7 +212,7 @@ def check_consistency(provider_root: Path, global_exclusions: dict[str, set[str]
 
     all_exclusions = pyproject_exclusions | provider_yaml_exclusions
     for py_ver in all_exclusions:
-        if provider_name not in global_exclusions.get(py_ver, set()):
+        if simple_name not in global_exclusions.get(py_ver, set()):
             failure_messages.append(
                 f"\nProvider missing from exclusion matrix for Python {py_ver} in dev/breeze/src/airflow_breeze/global_constants.py"
             )

From e5faa2a72524e7f2058f40f0af923f33957d171d Mon Sep 17 00:00:00 2001
From: Dominik Heilbock <dheilbock@gmx.net>
Date: Tue, 15 Jul 2025 09:48:14 +0200
Subject: [PATCH 3/3] Refined hook logic and removed unused method

---
 ...ck_exclusion_of_provider_python_version.py | 157 +++++++-----------
 1 file changed, 60 insertions(+), 97 deletions(-)

diff --git a/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py b/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
index ce43b3925a4aa..9ab5ddeff13e6 100755
--- a/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
+++ b/scripts/ci/pre_commit/check_exclusion_of_provider_python_version.py
@@ -32,12 +32,14 @@
 except ImportError:
     import tomli as tomllib
 
-# The purpose of this script, is to check whether the exclusion of certain providers for
-# specific python versions is constant across all 3 files in which it needs to be set.
-# This is the providers pyproject.toml and provider.yaml and the PROVIDERS_COMPATIBILITY_TESTS_MATRIX
-# in dev/breeze/src/airflow_breeze/global_constants.py
-
-MIN_SUPPORTED_VERSION = "3.10"
+"""
+The purpose of this script, is to check whether the exclusion of certain providers for
+specific python versions is constant across all 3 files in which it needs to be set.
+This is the providers pyproject.toml and provider.yaml and the PROVIDERS_COMPATIBILITY_TESTS_MATRIX
+in dev/breeze/src/airflow_breeze/global_constants.py.
+"""
+
+MIN_SUPPORTED_PYTHON_VERSION = "3.10"
 SUPPORTED_PYTHON_VERSIONS = [f"3.{i}" for i in range(10, 13)]
 
 
@@ -65,102 +67,71 @@ def filter_pyproject_exclusions(exclusions: set[str]) -> set[str]:
     for v in exclusions:
         ver = Version(v)
         if ver >= Version(
-            MIN_SUPPORTED_VERSION
+            MIN_SUPPORTED_PYTHON_VERSION
         ):  # If the excluded version is less than the current minimum supported one
             filtered.add(v)
     return filtered
 
 
 def parse_pyproject_exclusions_filtered(pyproject_path: Path) -> set[str]:
-    try:
-        with pyproject_path.open("rb") as f:
-            data = tomllib.load(f)
-        requires_python = data.get("project", {}).get("requires-python", "")
-        exclusions = set(re.findall(r"!=([0-9.]+)", requires_python))
-        min_version_match = re.search(r">=\s*([0-9]+(?:\.[0-9]+)*)", requires_python)
-        if min_version_match:
-            min_version = min_version_match.group(1)
-            all_py_versions = SUPPORTED_PYTHON_VERSIONS
-            for v in all_py_versions:
-                if Version(v) < Version(min_version):
-                    exclusions.add(v)
-        return filter_pyproject_exclusions(exclusions)
-    except Exception as e:
-        print(f"Failed to parse {pyproject_path}: {e}")
-        return set()
+    with pyproject_path.open("rb") as f:
+        data = tomllib.load(f)
+    requires_python = data.get("project", {}).get("requires-python", "")
+    exclusions = set(re.findall(r"!=([0-9.]+)", requires_python))
+    min_version_match = re.search(r">=\s*([0-9]+(?:\.[0-9]+)*)", requires_python)
+    if min_version_match:
+        min_version = min_version_match.group(1)
+        all_py_versions = SUPPORTED_PYTHON_VERSIONS
+        for v in all_py_versions:
+            if Version(v) < Version(min_version):
+                exclusions.add(v)
+    return filter_pyproject_exclusions(exclusions)
 
 
 def check_classifiers_vs_pyproject_exclusions(
     pyproject_path: Path, pyproject_exclusions: set[str]
 ) -> list[str]:
-    try:
-        with pyproject_path.open("rb") as f:
-            data = tomllib.load(f)
-        classifiers = data.get("project", {}).get("classifiers", [])
-        classifier_versions = {
-            entry.strip().split("::")[2].strip()
-            for entry in classifiers
-            if entry.strip().startswith("Programming Language :: Python ::")
-            and entry.strip().count("::") == 2
-        }
-        return sorted(pyproject_exclusions & classifier_versions)
-    except Exception as e:
-        print(f"Failed to check classifiers in {pyproject_path}: {e}")
-        return []
+    with pyproject_path.open("rb") as f:
+        data = tomllib.load(f)
+    classifiers = data.get("project", {}).get("classifiers", [])
+    classifier_versions = {
+        entry.strip().split("::")[2].strip()
+        for entry in classifiers
+        if entry.strip().startswith("Programming Language :: Python ::") and entry.strip().count("::") == 2
+    }
+    return sorted(pyproject_exclusions & classifier_versions)
 
 
 def parse_pyproject_exclusions(pyproject_path: Path) -> set[str]:
-    try:
-        with pyproject_path.open("rb") as f:
-            data = tomllib.load(f)
-        requires_python = data.get("project", {}).get("requires-python", "")
-        spec = SpecifierSet(requires_python)
+    with pyproject_path.open("rb") as f:
+        data = tomllib.load(f)
+    requires_python = data.get("project", {}).get("requires-python", "")
+    spec = SpecifierSet(requires_python)
 
-        all_py_versions = SUPPORTED_PYTHON_VERSIONS
-        excluded = {v for v in all_py_versions if Version(v) not in spec}
-        return excluded
-    except Exception as e:
-        print(f"Failed to parse {pyproject_path}: {e}")
-        return set()
+    all_py_versions = SUPPORTED_PYTHON_VERSIONS
+    excluded = {v for v in all_py_versions if Version(v) not in spec}
+    return excluded
 
 
 def parse_provider_yaml_exclusions(provider_yaml_path: Path) -> set[str]:
-    try:
-        with open(provider_yaml_path) as f:
-            data = yaml.safe_load(f)
-        raw_versions = data.get("excluded-python-versions", [])
-        versions = set()
-        for v in raw_versions:
-            version_str = f"{v:.2f}" if isinstance(v, float) else str(v)
-            if version_str in SUPPORTED_PYTHON_VERSIONS:
-                versions.add(version_str)
-            elif Version(version_str) < Version(MIN_SUPPORTED_VERSION):
-                print(
-                    f"Warning: {provider_yaml_path} excludes {version_str} which is below minimum supported version {MIN_SUPPORTED_VERSION}"
-                )
-        return versions
-    except Exception as e:
-        print(f"Failed to parse {provider_yaml_path}: {e}")
-        return set()
-
-
-def parse_provider_name(pyproject_path: Path) -> str | None:
-    try:
-        with pyproject_path.open("rb") as f:
-            data = tomllib.load(f)
-        return data.get("project", {}).get("name")
-    except Exception as e:
-        print(f"Failed to parse provider name in {pyproject_path}: {e}")
-        return None
+    with open(provider_yaml_path) as f:
+        data = yaml.safe_load(f)
+    raw_versions = data.get("excluded-python-versions", [])
+    versions = set()
+    for v in raw_versions:
+        version_str = f"{v:.2f}" if isinstance(v, float) else str(v)
+        if version_str in SUPPORTED_PYTHON_VERSIONS:
+            versions.add(version_str)
+        elif Version(version_str) < Version(MIN_SUPPORTED_PYTHON_VERSION):
+            print(
+                f"\nWarning: {provider_yaml_path} excludes {version_str} which is below minimum supported version {MIN_SUPPORTED_PYTHON_VERSION}"
+            )
+    return versions
 
 
 def parse_global_exclusions(global_constants_path: Path) -> dict[str, set[str]]:
-    try:
-        with open(global_constants_path) as f:
-            tree = ast.parse(f.read())
-    except Exception as e:
-        print(f"Failed to parse {global_constants_path}: {e}")
-        return {}
+    with open(global_constants_path) as f:
+        tree = ast.parse(f.read())
     for node in tree.body:
         if isinstance(node, ast.Assign):
             targets = node.targets
@@ -177,18 +148,14 @@ def parse_global_exclusions(global_constants_path: Path) -> dict[str, set[str]]:
 
         for target in targets:
             if getattr(target, "id", None) == "PROVIDERS_COMPATIBILITY_TESTS_MATRIX":
-                try:
-                    matrix = ast.literal_eval(value)
-                    version_map: dict[str, set[str]] = {}
-                    for entry in matrix:
-                        py_ver = entry.get("python-version")
-                        removed = entry.get("remove-providers", "")
-                        removed_set = set(p.strip() for p in removed.split())
-                        version_map.setdefault(py_ver, set()).update(removed_set)
-                    return version_map
-                except Exception as e:
-                    print("Failed to evaluate PROVIDERS_COMPATIBILITY_TESTS_MATRIX:", e)
-                    return {}
+                matrix = ast.literal_eval(value)
+                version_map: dict[str, set[str]] = {}
+                for entry in matrix:
+                    py_ver = entry.get("python-version")
+                    removed = entry.get("remove-providers", "")
+                    removed_set = set(p.strip() for p in removed.split())
+                    version_map.setdefault(py_ver, set()).update(removed_set)
+                return version_map
     return {}
 
 
@@ -196,7 +163,6 @@ def check_consistency(provider_root: Path, global_exclusions: dict[str, set[str]
     pyproject_path = provider_root / "pyproject.toml"
     provider_yaml_path = provider_root / "provider.yaml"
     simple_name = get_simple_provider_name(provider_root)
-
     pyproject_exclusions = parse_pyproject_exclusions_filtered(pyproject_path)
     provider_yaml_exclusions = parse_provider_yaml_exclusions(provider_yaml_path)
     classifier_conflicts = check_classifiers_vs_pyproject_exclusions(pyproject_path, pyproject_exclusions)
@@ -261,9 +227,6 @@ def main():
     if failed:
         sys.exit(1)
     else:
-        print(
-            "Python version exclusions are consistent across pyproject.toml, provider.yaml and global constants."
-        )
         sys.exit(0)
 
 
