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

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 1724107d560 Fix CI integration tests gated by the wrong platform 
(#70015)
1724107d560 is described below

commit 1724107d5608bf921af8120272001adb7b921ba5
Author: PoAn Yang <[email protected]>
AuthorDate: Sun Jul 19 06:54:11 2026 +0900

    Fix CI integration tests gated by the wrong platform (#70015)
    
    Signed-off-by: PoAn Yang <[email protected]>
---
 .github/workflows/ci-amd.yml                       |   1 +
 .github/workflows/ci-arm.yml                       |   1 +
 dev/breeze/doc/ci/04_selective_checks.md           |   9 +
 .../doc/images/output_ci_selective-check.svg       |  46 +--
 .../doc/images/output_ci_selective-check.txt       |   2 +-
 .../src/airflow_breeze/commands/ci_commands.py     |  14 +
 .../airflow_breeze/commands/ci_commands_config.py  |   1 +
 dev/breeze/src/airflow_breeze/global_constants.py  |  11 +-
 .../src/airflow_breeze/utils/selective_checks.py   |  89 +-----
 dev/breeze/tests/conftest.py                       |   8 -
 dev/breeze/tests/test_selective_checks.py          | 332 ++++-----------------
 scripts/ci/prek/check_ci_workflows_in_sync.py      |   7 +-
 12 files changed, 124 insertions(+), 397 deletions(-)

diff --git a/.github/workflows/ci-amd.yml b/.github/workflows/ci-amd.yml
index cd7d99fae89..9edb394a6cc 100644
--- a/.github/workflows/ci-amd.yml
+++ b/.github/workflows/ci-amd.yml
@@ -226,6 +226,7 @@ jobs:
           COMMIT_REF: "${{ github.sha }}"
           VERBOSE: "false"
           GITHUB_CONTEXT_INPUT: "${{ runner.temp }}/github_context.json"
+          PLATFORM: "linux/amd64"
         run: breeze ci selective-check 2>> ${GITHUB_OUTPUT}
       - name: env
         run: printenv
diff --git a/.github/workflows/ci-arm.yml b/.github/workflows/ci-arm.yml
index d1c79602039..8f5ce3ac079 100644
--- a/.github/workflows/ci-arm.yml
+++ b/.github/workflows/ci-arm.yml
@@ -215,6 +215,7 @@ jobs:
           COMMIT_REF: "${{ github.sha }}"
           VERBOSE: "false"
           GITHUB_CONTEXT_INPUT: "${{ runner.temp }}/github_context.json"
+          PLATFORM: "linux/arm64"
         run: breeze ci selective-check 2>> ${GITHUB_OUTPUT}
       - name: env
         run: printenv
diff --git a/dev/breeze/doc/ci/04_selective_checks.md 
b/dev/breeze/doc/ci/04_selective_checks.md
index ebc6e545863..59d55d11178 100644
--- a/dev/breeze/doc/ci/04_selective_checks.md
+++ b/dev/breeze/doc/ci/04_selective_checks.md
@@ -227,6 +227,15 @@ The same matched-file approach drives the **prek hook skip 
list** (`skip_prek_ho
 compile / lint hook is skipped when nothing in its area changed. See
 [Skipping prek hooks](#skipping-prek-hooks-static-checks).
 
+#### The run's platform (`--platform`)
+
+Some integrations and providers only work on one CPU architecture, so the 
selection above is filtered
+by the platform the run's tests will execute on:
+
+* **Integrations** in `DISABLE_TESTABLE_INTEGRATIONS_FROM_ARM` are dropped on 
ARM.
+* **Providers** that declare `excluded-platforms` in their `provider.yaml` 
(e.g. `ibm.mq` excludes
+  `linux/arm64`) are removed from the providers test-type matrix on that 
platform.
+
 ## Individually simple rules
 
 The list of rules is long, but each rule is a one-liner you can reason about 
in isolation. A few
diff --git a/dev/breeze/doc/images/output_ci_selective-check.svg 
b/dev/breeze/doc/images/output_ci_selective-check.svg
index 58bccf85cd0..6c5e3064794 100644
--- a/dev/breeze/doc/images/output_ci_selective-check.svg
+++ b/dev/breeze/doc/images/output_ci_selective-check.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 708.8" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 757.5999999999999" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-ci-selective-check-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="657.8" />
+      <rect x="0" y="0" width="1463.0" height="706.5999999999999" />
     </clipPath>
     <clipPath id="breeze-ci-selective-check-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -123,9 +123,15 @@
 <clipPath id="breeze-ci-selective-check-line-25">
     <rect x="0" y="611.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-ci-selective-check-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-ci-selective-check-line-27">
+    <rect x="0" y="660.3" 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="706.8" rx="8"/><text 
class="breeze-ci-selective-check-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;ci&#160;selective-check</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="755.6" rx="8"/><text 
class="breeze-ci-selective-check-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;ci&#160;selective-check</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -146,22 +152,24 @@
 </text><text class="breeze-ci-selective-check-r5" x="0" y="215.2" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-8)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="215.2" textLength="341.6" 
clip-path="url(#breeze-ci-selective-check-line-8)">--default-branch&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r1" x="390.4" y="215.2" textLength="512.4" 
clip-path="url(#breeze-ci-selective-chec [...]
 </text><text class="breeze-ci-selective-check-r5" x="0" y="239.6" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-9)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="239.6" textLength="341.6" 
clip-path="url(#breeze-ci-selective-check-line-9)">--default-constraints-branch</text><text
 class="breeze-ci-selective-check-r1" x="390.4" y="239.6" textLength="658.8" 
clip-path="url(#breeze-ci-selective-check-line-9)">Constraints&#160;Branch&#160;against&#160;which&#
 [...]
 </text><text class="breeze-ci-selective-check-r5" x="0" y="264" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-10)">│</text><text 
class="breeze-ci-selective-check-r6" x="390.4" y="264" textLength="73.2" 
clip-path="url(#breeze-ci-selective-check-line-10)">(TEXT)</text><text 
class="breeze-ci-selective-check-r5" x="1451.8" y="264" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-10)">│</text><text 
class="breeze-ci-selective-check-r1" x="1464" y="264" textLe [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="288.4" 
textLength="1464" 
clip-path="url(#breeze-ci-selective-check-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-selective-check-r1" x="1464" y="288.4" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-11)">
-</text><text class="breeze-ci-selective-check-r5" x="0" y="312.8" 
textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-12)">╭─</text><text 
class="breeze-ci-selective-check-r5" x="24.4" y="312.8" textLength="231.8" 
clip-path="url(#breeze-ci-selective-check-line-12)">&#160;GitHub&#160;parameters&#160;</text><text
 class="breeze-ci-selective-check-r5" x="256.2" y="312.8" textLength="1183.4" 
clip-path="url(#breeze-ci-selective-check-line-12)">──────────────────────────────────────
 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="337.2" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-13)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="337.2" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-13)">--github-event-name&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r1" x="366" y="337.2" textLength="610" 
clip-path="url(#breeze-ci-selective-check-line-13)">Name&#160;of&#160;the&#160;GitHub&#160;ev
 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="361.6" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-14)">│</text><text 
class="breeze-ci-selective-check-r6" x="366" y="361.6" textLength="1073.6" 
clip-path="url(#breeze-ci-selective-check-line-14)">|&#160;pull_request_review&#160;|&#160;pull_request_target&#160;|&#160;pull_request_workflow&#160;|&#160;push&#160;|&#160;schedule&#160;|&#160;</text><text
 class="breeze-ci-selective-check-r5" x="1451.8" y="361.6" t [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-15)">│</text><text 
class="breeze-ci-selective-check-r6" x="366" y="386" textLength="402.6" 
clip-path="url(#breeze-ci-selective-check-line-15)">workflow_dispatch&#160;|&#160;workflow_run)</text><text
 class="breeze-ci-selective-check-r5" x="1451.8" y="386" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-15)">│</text><text 
class="breeze-ci-selecti [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-16)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="410.4" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-16)">--github-repository&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r7" x="317.2" y="410.4" textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-16)">-g</text><text 
class="breeze-ci-select [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-17)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="434.8" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-17)">--github-actor&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r1" x="366" y="434.8" textLength="549" 
clip-path="url(#breeze-ci-selective-check-line-17)">Actor&#160;that& [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-18)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="459.2" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-18)">--github-context&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r1" x="366" y="459.2" textLength="695.4" 
clip-path="url(#breeze-ci-selective-check-line-18)">GitHub&#160;context&#160 
[...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-19)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="483.6" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-19)">--github-context-input</text><text
 class="breeze-ci-selective-check-r1" x="366" y="483.6" textLength="1073.6" 
clip-path="url(#breeze-ci-selective-check-line-19)">File&#160;input&#160;(might&#160;be&#160;`-`)&#160;wi
 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-20)">│</text><text 
class="breeze-ci-selective-check-r4" x="366" y="508" textLength="195.2" 
clip-path="url(#breeze-ci-selective-check-line-20)">--github-context</text><text
 class="breeze-ci-selective-check-r1" x="561.2" y="508" textLength="744.2" 
clip-path="url(#breeze-ci-selective-check-line-20)">&#160;for&#160;large&#160;contexts&#160;that&#160;would&#160;exce
 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="532.4" 
textLength="1464" 
clip-path="url(#breeze-ci-selective-check-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-selective-check-r1" x="1464" y="532.4" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-21)">
-</text><text class="breeze-ci-selective-check-r5" x="0" y="556.8" 
textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-22)">╭─</text><text 
class="breeze-ci-selective-check-r5" x="24.4" y="556.8" textLength="195.2" 
clip-path="url(#breeze-ci-selective-check-line-22)">&#160;Common&#160;options&#160;</text><text
 class="breeze-ci-selective-check-r5" x="219.6" y="556.8" textLength="1220" 
clip-path="url(#breeze-ci-selective-check-line-22)">───────────────────────────────────────────
 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-23)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="581.2" textLength="109.8" 
clip-path="url(#breeze-ci-selective-check-line-23)">--verbose</text><text 
class="breeze-ci-selective-check-r7" x="158.6" y="581.2" textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-23)">-v</text><text 
class="breeze-ci-selective-check-r1" x="207.4" y="5 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-24)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="605.6" textLength="109.8" 
clip-path="url(#breeze-ci-selective-check-line-24)">--dry-run</text><text 
class="breeze-ci-selective-check-r7" x="158.6" y="605.6" textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-24)">-D</text><text 
class="breeze-ci-selective-check-r1" x="207.4" y="6 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-25)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="630" textLength="109.8" 
clip-path="url(#breeze-ci-selective-check-line-25)">--help&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r7" x="158.6" y="630" textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-25)">-h</text><text 
class="breeze-ci-selective-check-r1" x="20 [...]
-</text><text class="breeze-ci-selective-check-r5" x="0" y="654.4" 
textLength="1464" 
clip-path="url(#breeze-ci-selective-check-line-26)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-selective-check-r1" x="1464" y="654.4" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-26)">
+</text><text class="breeze-ci-selective-check-r5" x="0" y="288.4" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-11)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="288.4" textLength="341.6" 
clip-path="url(#breeze-ci-selective-check-line-11)">--platform&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r1" x="390.4" y="288.4" textLength="1049.2" 
clip-pa [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="312.8" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-12)">│</text><text 
class="breeze-ci-selective-check-r1" x="390.4" y="312.8" textLength="170.8" 
clip-path="url(#breeze-ci-selective-check-line-12)">are&#160;testable.&#160;</text><text
 class="breeze-ci-selective-check-r5" x="561.2" y="312.8" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-12)">[default:&#160;linux/amd64]</text><text
 class="br [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="337.2" 
textLength="1464" 
clip-path="url(#breeze-ci-selective-check-line-13)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-selective-check-r1" x="1464" y="337.2" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-13)">
+</text><text class="breeze-ci-selective-check-r5" x="0" y="361.6" 
textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-14)">╭─</text><text 
class="breeze-ci-selective-check-r5" x="24.4" y="361.6" textLength="231.8" 
clip-path="url(#breeze-ci-selective-check-line-14)">&#160;GitHub&#160;parameters&#160;</text><text
 class="breeze-ci-selective-check-r5" x="256.2" y="361.6" textLength="1183.4" 
clip-path="url(#breeze-ci-selective-check-line-14)">──────────────────────────────────────
 [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="386" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-15)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="386" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-15)">--github-event-name&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r1" x="366" y="386" textLength="610" 
clip-path="url(#breeze-ci-selective-check-line-15)">Name&#160;of&#160;the&#160;GitHub&#160;event&#1
 [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="410.4" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-16)">│</text><text 
class="breeze-ci-selective-check-r6" x="366" y="410.4" textLength="1073.6" 
clip-path="url(#breeze-ci-selective-check-line-16)">|&#160;pull_request_review&#160;|&#160;pull_request_target&#160;|&#160;pull_request_workflow&#160;|&#160;push&#160;|&#160;schedule&#160;|&#160;</text><text
 class="breeze-ci-selective-check-r5" x="1451.8" y="410.4" t [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="434.8" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-17)">│</text><text 
class="breeze-ci-selective-check-r6" x="366" y="434.8" textLength="402.6" 
clip-path="url(#breeze-ci-selective-check-line-17)">workflow_dispatch&#160;|&#160;workflow_run)</text><text
 class="breeze-ci-selective-check-r5" x="1451.8" y="434.8" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-17)">│</text><text 
class="breeze-ci-s [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="459.2" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-18)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="459.2" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-18)">--github-repository&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r7" x="317.2" y="459.2" textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-18)">-g</text><text 
class="breeze-ci-select [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="483.6" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-19)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="483.6" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-19)">--github-actor&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r1" x="366" y="483.6" textLength="549" 
clip-path="url(#breeze-ci-selective-check-line-19)">Actor&#160;that& [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-20)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="508" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-20)">--github-context&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r1" x="366" y="508" textLength="695.4" 
clip-path="url(#breeze-ci-selective-check-line-20)">GitHub&#160;context&#160;(JSON
 [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-21)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="532.4" textLength="268.4" 
clip-path="url(#breeze-ci-selective-check-line-21)">--github-context-input</text><text
 class="breeze-ci-selective-check-r1" x="366" y="532.4" textLength="1073.6" 
clip-path="url(#breeze-ci-selective-check-line-21)">File&#160;input&#160;(might&#160;be&#160;`-`)&#160;wi
 [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-22)">│</text><text 
class="breeze-ci-selective-check-r4" x="366" y="556.8" textLength="195.2" 
clip-path="url(#breeze-ci-selective-check-line-22)">--github-context</text><text
 class="breeze-ci-selective-check-r1" x="561.2" y="556.8" textLength="744.2" 
clip-path="url(#breeze-ci-selective-check-line-22)">&#160;for&#160;large&#160;contexts&#160;that&#160;would&#16
 [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="581.2" 
textLength="1464" 
clip-path="url(#breeze-ci-selective-check-line-23)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-selective-check-r1" x="1464" y="581.2" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-23)">
+</text><text class="breeze-ci-selective-check-r5" x="0" y="605.6" 
textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-24)">╭─</text><text 
class="breeze-ci-selective-check-r5" x="24.4" y="605.6" textLength="195.2" 
clip-path="url(#breeze-ci-selective-check-line-24)">&#160;Common&#160;options&#160;</text><text
 class="breeze-ci-selective-check-r5" x="219.6" y="605.6" textLength="1220" 
clip-path="url(#breeze-ci-selective-check-line-24)">───────────────────────────────────────────
 [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-25)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="630" textLength="109.8" 
clip-path="url(#breeze-ci-selective-check-line-25)">--verbose</text><text 
class="breeze-ci-selective-check-r7" x="158.6" y="630" textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-25)">-v</text><text 
class="breeze-ci-selective-check-r1" x="207.4" y="630" te [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-26)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="654.4" textLength="109.8" 
clip-path="url(#breeze-ci-selective-check-line-26)">--dry-run</text><text 
class="breeze-ci-selective-check-r7" x="158.6" y="654.4" textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-26)">-D</text><text 
class="breeze-ci-selective-check-r1" x="207.4" y="6 [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-27)">│</text><text 
class="breeze-ci-selective-check-r4" x="24.4" y="678.8" textLength="109.8" 
clip-path="url(#breeze-ci-selective-check-line-27)">--help&#160;&#160;&#160;</text><text
 class="breeze-ci-selective-check-r7" x="158.6" y="678.8" textLength="24.4" 
clip-path="url(#breeze-ci-selective-check-line-27)">-h</text><text 
class="breeze-ci-selective-check-r1" [...]
+</text><text class="breeze-ci-selective-check-r5" x="0" y="703.2" 
textLength="1464" 
clip-path="url(#breeze-ci-selective-check-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-ci-selective-check-r1" x="1464" y="703.2" textLength="12.2" 
clip-path="url(#breeze-ci-selective-check-line-28)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_ci_selective-check.txt 
b/dev/breeze/doc/images/output_ci_selective-check.txt
index c4b2ee8c47c..625c3a3b750 100644
--- a/dev/breeze/doc/images/output_ci_selective-check.txt
+++ b/dev/breeze/doc/images/output_ci_selective-check.txt
@@ -1 +1 @@
-e1fc891c482e1d0ac98370259cdabebf
+bc06116a5cbad927acd981e56b6a5411
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands.py 
b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
index 02b9967f29f..f7d0b82b02b 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands.py
@@ -41,6 +41,8 @@ from airflow_breeze.commands.common_options import (
     option_verbose,
 )
 from airflow_breeze.global_constants import (
+    CI_AMD_PLATFORM,
+    CI_PLATFORMS,
     DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
     MILESTONE_BUG_LABELS,
     MILESTONE_SKIP_LABELS,
@@ -236,6 +238,16 @@ def get_changed_files(commit_ref: str | None) -> 
tuple[str, ...]:
     type=str,
     default="",
 )
[email protected](
+    "--platform",
+    "ci_platform",
+    type=BetterChoice(CI_PLATFORMS),
+    default=CI_AMD_PLATFORM,
+    help="Platform the tests of this run execute on. "
+    "It decides which integrations and providers are testable.",
+    envvar="PLATFORM",
+    show_default=True,
+)
 @click.option(
     "--github-context",
     help="GitHub context (JSON formatted) passed by GitHub Actions",
@@ -262,6 +274,7 @@ def selective_check(
     github_actor: str,
     github_context: str,
     github_context_input: StringIO | None,
+    ci_platform: str,
 ):
     try:
         from airflow_breeze.utils.selective_checks import SelectiveChecks
@@ -287,6 +300,7 @@ def selective_check(
             github_repository=github_repository,
             github_actor=github_actor,
             github_context_dict=github_context_dict,
+            platform=ci_platform,
         )
         print(str(sc), file=sys.stderr)
     except Exception:
diff --git a/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
index ae5bc64a5b7..61b62e6ed8f 100644
--- a/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/ci_commands_config.py
@@ -46,6 +46,7 @@ CI_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
                 "--pr-labels",
                 "--default-branch",
                 "--default-constraints-branch",
+                "--platform",
             ],
         },
         {
diff --git a/dev/breeze/src/airflow_breeze/global_constants.py 
b/dev/breeze/src/airflow_breeze/global_constants.py
index c24b92dd795..d7fca41779d 100644
--- a/dev/breeze/src/airflow_breeze/global_constants.py
+++ b/dev/breeze/src/airflow_breeze/global_constants.py
@@ -37,13 +37,10 @@ from airflow_breeze.utils.path_utils import (
 PUBLIC_AMD_RUNNERS = '["ubuntu-22.04"]'
 PUBLIC_ARM_RUNNERS = '["ubuntu-22.04-arm"]'
 
-# The runner type cross-mapping is intentional — if the previous scheduled 
build used AMD, the current scheduled build should run with ARM.
-RUNNERS_TYPE_CROSS_MAPPING = {
-    "ubuntu-22.04": '["ubuntu-22.04-arm"]',
-    "ubuntu-22.04-arm": '["ubuntu-22.04"]',
-    "windows-2022": '["windows-2022"]',
-    "windows-2025": '["windows-2025"]',
-}
+# Platform the tests of a CI run execute on.
+CI_AMD_PLATFORM = "linux/amd64"
+CI_ARM_PLATFORM = "linux/arm64"
+CI_PLATFORMS = [CI_AMD_PLATFORM, CI_ARM_PLATFORM]
 
 ANSWER = ""
 
diff --git a/dev/breeze/src/airflow_breeze/utils/selective_checks.py 
b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
index b912af64e3d..970c90e606f 100644
--- a/dev/breeze/src/airflow_breeze/utils/selective_checks.py
+++ b/dev/breeze/src/airflow_breeze/utils/selective_checks.py
@@ -32,6 +32,8 @@ from airflow_breeze.branch_defaults import AIRFLOW_BRANCH, 
DEFAULT_AIRFLOW_CONST
 from airflow_breeze.global_constants import (
     ALL_PYTHON_MAJOR_MINOR_VERSIONS,
     APACHE_AIRFLOW_GITHUB_REPOSITORY,
+    CI_AMD_PLATFORM,
+    CI_ARM_PLATFORM,
     COMMITTERS,
     CURRENT_KUBERNETES_VERSIONS,
     CURRENT_MYSQL_VERSIONS,
@@ -51,7 +53,6 @@ from airflow_breeze.global_constants import (
     PROVIDERS_COMPATIBILITY_TESTS_MATRIX,
     PUBLIC_AMD_RUNNERS,
     PUBLIC_ARM_RUNNERS,
-    RUNNERS_TYPE_CROSS_MAPPING,
     TESTABLE_CORE_INTEGRATIONS,
     TESTABLE_PROVIDERS_INTEGRATION_OWNERS,
     TESTABLE_PROVIDERS_INTEGRATIONS,
@@ -683,6 +684,7 @@ class SelectiveChecks:
         github_repository: str = APACHE_AIRFLOW_GITHUB_REPOSITORY,
         github_actor: str = "",
         github_context_dict: dict[str, Any] | None = None,
+        platform: str = CI_AMD_PLATFORM,
     ):
         self._files = files
         self._default_branch = default_branch
@@ -693,6 +695,7 @@ class SelectiveChecks:
         self._github_repository = github_repository
         self._github_actor = github_actor
         self._github_context_dict = github_context_dict or {}
+        self._platform = platform
         self._new_toml: dict[str, Any] = {}
         self._old_toml: dict[str, Any] = {}
 
@@ -1400,7 +1403,7 @@ class SelectiveChecks:
 
     @cached_property
     def _platform_excluded_providers(self) -> set[str]:
-        """Provider ids that opt out of the current ``self.platform`` via 
provider.yaml.
+        """Provider ids that opt out of the current platform via provider.yaml.
 
         Mirrors the ``excluded-python-versions`` mechanism but keyed by Docker 
platform
         string (e.g. ``linux/arm64``) so providers whose native dependencies 
are unavailable
@@ -1408,7 +1411,7 @@ class SelectiveChecks:
         """
         excluded: set[str] = set()
         for provider_id, provider_info in get_provider_dependencies().items():
-            if self.platform in provider_info.get("excluded-platforms", []):
+            if self._platform in provider_info.get("excluded-platforms", []):
                 excluded.add(provider_id)
         return excluded
 
@@ -1803,80 +1806,6 @@ class SelectiveChecks:
         suspended = set(get_suspended_provider_ids())
         return " ".join(sorted(p for p in affected_providers if p not in 
suspended))
 
-    def get_job_label(self, event_type: str, branch: str):
-        import requests  # type: ignore[import-untyped]
-
-        # The main CI is now split into ci-arm.yml and ci-amd.yml; the old
-        # ci-amd-arm.yml file no longer exists. This lookup is dormant for the
-        # main pipeline (which hardcodes runner-type per wrapper) and only
-        # remains here for the `is_disabled_integration` code path that still
-        # reads `runner_type`. The API call against a missing workflow returns
-        # nothing and the caller falls back to PUBLIC_AMD_RUNNERS.
-        job_name = "Basic tests"
-        workflow_name = "ci-amd-arm.yml"
-        headers = {"Accept": "application/vnd.github.v3+json"}
-        if os.environ.get("GITHUB_TOKEN"):
-            headers["Authorization"] = f"token 
{os.environ.get('GITHUB_TOKEN')}"
-
-        url = 
f"https://api.github.com/repos/{self._github_repository}/actions/workflows/{workflow_name}/runs";
-        payload = {"event": event_type, "status": "completed", "branch": 
branch}
-
-        response = requests.get(url, headers=headers, params=payload)
-        if response.status_code != 200:
-            try:
-                error_msg = response.json()
-            except ValueError:
-                error_msg = response.text[:200]  # Truncate long HTML responses
-            console_print(f"[red]Error while listing workflow runs error: 
{error_msg}.\n")
-            return None
-        runs = response.json().get("workflow_runs", [])
-        if not runs:
-            console_print(
-                f"[yellow]No runs information found for workflow 
{workflow_name}, params: {payload}.\n"
-            )
-            return None
-        jobs_url = runs[0].get("jobs_url")
-        jobs_response = requests.get(jobs_url, headers=headers)
-        if jobs_response.status_code != 200:
-            try:
-                error_msg = jobs_response.json()
-            except ValueError:
-                error_msg = jobs_response.text[:200]
-            console_print(f"[red]Error while listing jobs error: 
{error_msg}.\n")
-            return None
-        jobs = jobs_response.json().get("jobs", [])
-        if not jobs:
-            console_print("[yellow]No jobs information found for jobs %s.\n", 
jobs_url)
-            return None
-
-        for job in jobs:
-            if job_name in job.get("name", ""):
-                runner_labels = job.get("labels", [])
-                if "windows-2025" in runner_labels:
-                    continue
-                if not runner_labels:
-                    console_print("[yellow]No labels found for job 
{job_name}.\n", jobs_url)
-                    return None
-                return runner_labels[0]
-
-        return None
-
-    @cached_property
-    def runner_type(self):
-        if self._github_event in [GithubEvents.SCHEDULE, GithubEvents.PUSH]:
-            branch = self._github_context_dict.get("ref_name", "main")
-            label = 
self.get_job_label(event_type=str(self._github_event.value), branch=branch)
-
-            return RUNNERS_TYPE_CROSS_MAPPING.get(label, PUBLIC_AMD_RUNNERS) 
if label else PUBLIC_AMD_RUNNERS
-
-        return PUBLIC_AMD_RUNNERS
-
-    @cached_property
-    def platform(self):
-        if "arm" in self.runner_type:
-            return "linux/arm64"
-        return "linux/amd64"
-
     @cached_property
     def amd_runners(self) -> str:
         return PUBLIC_AMD_RUNNERS
@@ -1913,10 +1842,8 @@ class SelectiveChecks:
         return json.dumps(sorted_providers_to_exclude)
 
     def _is_disabled_integration(self, integration: str) -> bool:
-        return (
-            integration in DISABLE_TESTABLE_INTEGRATIONS_FROM_CI
-            or integration in DISABLE_TESTABLE_INTEGRATIONS_FROM_ARM
-            and self.runner_type in PUBLIC_ARM_RUNNERS
+        return integration in DISABLE_TESTABLE_INTEGRATIONS_FROM_CI or (
+            integration in DISABLE_TESTABLE_INTEGRATIONS_FROM_ARM and 
self._platform == CI_ARM_PLATFORM
         )
 
     @cached_property
diff --git a/dev/breeze/tests/conftest.py b/dev/breeze/tests/conftest.py
index 76d92bc0b0a..1d8779562e6 100644
--- a/dev/breeze/tests/conftest.py
+++ b/dev/breeze/tests/conftest.py
@@ -64,11 +64,3 @@ def pytest_unconfigure(config):
 @pytest.fixture(autouse=True)
 def clear_clearable_cache():
     clear_all_cached_functions()
-
-
[email protected]
-def json_decode_error():
-    """Provide a requests.exceptions.JSONDecodeError for mocking API 
failures."""
-    import requests
-
-    return requests.exceptions.JSONDecodeError("", "", 0)
diff --git a/dev/breeze/tests/test_selective_checks.py 
b/dev/breeze/tests/test_selective_checks.py
index ae8260db30f..3698d41d51b 100644
--- a/dev/breeze/tests/test_selective_checks.py
+++ b/dev/breeze/tests/test_selective_checks.py
@@ -27,13 +27,14 @@ from rich.console import Console
 from airflow_breeze.global_constants import (
     ALLOWED_KUBERNETES_VERSIONS,
     ALLOWED_PYTHON_MAJOR_MINOR_VERSIONS,
+    CI_AMD_PLATFORM,
+    CI_ARM_PLATFORM,
     DEFAULT_KUBERNETES_VERSION,
     DEFAULT_PYTHON_MAJOR_MINOR_VERSION,
     JAVA_SDK_VERSION,
     NUMBER_OF_CORE_SLICES,
     NUMBER_OF_LOW_DEP_SLICES,
     PROVIDERS_COMPATIBILITY_TESTS_MATRIX,
-    PUBLIC_AMD_RUNNERS,
     GithubEvents,
 )
 from airflow_breeze.utils.functools_cache import clearable_cache
@@ -2513,26 +2514,12 @@ def test_expected_output_pull_request_v2_7(
         ),
     ],
 )
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-@patch("requests.get")
 def test_expected_output_push(
-    mock_get,
     files: tuple[str, ...],
     pr_labels: tuple[str, ...],
     default_branch: str,
     expected_outputs: dict[str, str],
 ):
-    # Mock GitHub API calls for runner_type property (used in PUSH events)
-    workflow_response = Mock()
-    workflow_response.status_code = 200
-    workflow_response.json.return_value = {"workflow_runs": [{"jobs_url": 
"https://api.github.com/jobs/123"}]}
-    jobs_response = Mock()
-    jobs_response.status_code = 200
-    jobs_response.json.return_value = {
-        "jobs": [{"name": "Basic tests (ubuntu-22.04)", "labels": 
["ubuntu-22.04"]}]
-    }
-    mock_get.side_effect = [workflow_response, jobs_response]
-
     stderr = SelectiveChecks(
         files=files,
         commit_ref=NEUTRAL_COMMIT,
@@ -2768,20 +2755,7 @@ def test_expected_output_pull_request_target(
         GithubEvents.SCHEDULE,
     ],
 )
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-@patch("requests.get")
-def test_no_commit_provided_trigger_full_build_for_any_event_type(mock_get, 
github_event):
-    # Mock GitHub API calls for runner_type property (used in PUSH/SCHEDULE 
events)
-    workflow_response = Mock()
-    workflow_response.status_code = 200
-    workflow_response.json.return_value = {"workflow_runs": [{"jobs_url": 
"https://api.github.com/jobs/123"}]}
-    jobs_response = Mock()
-    jobs_response.status_code = 200
-    jobs_response.json.return_value = {
-        "jobs": [{"name": "Basic tests (ubuntu-22.04)", "labels": 
["ubuntu-22.04"]}]
-    }
-    mock_get.side_effect = [workflow_response, jobs_response]
-
+def 
test_no_commit_provided_trigger_full_build_for_any_event_type(github_event):
     stderr = SelectiveChecks(
         files=(),
         commit_ref="",
@@ -2814,20 +2788,7 @@ def 
test_no_commit_provided_trigger_full_build_for_any_event_type(mock_get, gith
         GithubEvents.SCHEDULE,
     ],
 )
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-@patch("requests.get")
-def test_files_provided_trigger_full_build_for_any_event_type(mock_get, 
github_event):
-    # Mock GitHub API calls for runner_type property (used in PUSH/SCHEDULE 
events)
-    workflow_response = Mock()
-    workflow_response.status_code = 200
-    workflow_response.json.return_value = {"workflow_runs": [{"jobs_url": 
"https://api.github.com/jobs/123"}]}
-    jobs_response = Mock()
-    jobs_response.status_code = 200
-    jobs_response.json.return_value = {
-        "jobs": [{"name": "Basic tests (ubuntu-22.04)", "labels": 
["ubuntu-22.04"]}]
-    }
-    mock_get.side_effect = [workflow_response, jobs_response]
-
+def test_files_provided_trigger_full_build_for_any_event_type(github_event):
     stderr = SelectiveChecks(
         files=(
             "airflow-core/src/airflow/ui/src/pages/Run/Details.tsx",
@@ -3229,270 +3190,116 @@ def test_mypy_matches(
     assert_outputs_are_printed(expected_outputs, str(stderr))
 
 
-@patch("requests.get")
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-def test_get_job_label(mock_get):
-    selective_checks = SelectiveChecks(
-        files=(),
-        github_event=GithubEvents.PULL_REQUEST,
-        github_repository="apache/airflow",
-        github_context_dict={},
-    )
-
-    workflow_response = Mock()
-    workflow_response.status_code = 200
-    workflow_response.json.return_value = {"workflow_runs": [{"jobs_url": 
"https://api.github.com/jobs/123"}]}
-
-    jobs_response = Mock()
-    jobs_response.status_code = 200
-    jobs_response.json.return_value = {
-        "jobs": [
-            {"name": "Basic tests (ubuntu-22.04)", "labels": ["ubuntu-22.04"]},
-            {"name": "Other job", "labels": ["ubuntu-22.04"]},
-        ]
-    }
-
-    mock_get.side_effect = [workflow_response, jobs_response]
-
-    result = selective_checks.get_job_label("push", "main")
-
-    assert result == "ubuntu-22.04"
-
-
-@patch("requests.get")
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-def test_get_job_label_not_found(mock_get):
-    selective_checks = SelectiveChecks(
-        files=(),
-        github_event=GithubEvents.PULL_REQUEST,
-        github_repository="apache/airflow",
-        github_context_dict={},
-    )
-
-    workflow_response = Mock()
-    workflow_response.status_code = 200
-    workflow_response.json.return_value = {"workflow_runs": [{"jobs_url": 
"https://api.github.com/jobs/123"}]}
-
-    jobs_response = Mock()
-    jobs_response.status_code = 200
-    jobs_response.json.return_value = {
-        "jobs": [
-            {"name": "Basic tests (ubuntu-22.04)", "labels": []},
-            {"name": "Other job", "labels": ["ubuntu-22.04"]},
-        ]
-    }
-
-    mock_get.side_effect = [workflow_response, jobs_response]
-
-    result = selective_checks.get_job_label("push", "main")
-
-    assert result is None
-
-
 @pytest.mark.parametrize(
-    ("workflow_status", "jobs_status", "expected_result"),
-    [
-        pytest.param(504, 200, None, id="workflow_api_504_error"),
-        pytest.param(200, 503, None, id="jobs_api_503_error"),
-        pytest.param(200, 200, "ubuntu-22.04", id="both_apis_200_success"),
-    ],
-)
-@patch("requests.get")
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-def test_get_job_label_api_status_codes(
-    mock_get, workflow_status, jobs_status, expected_result, json_decode_error
-):
-    """Test that get_job_label handles various HTTP status codes correctly."""
-    selective_checks = SelectiveChecks(
-        files=(),
-        github_event=GithubEvents.PULL_REQUEST,
-        github_repository="apache/airflow",
-        github_context_dict={},
-    )
-
-    workflow_response = Mock()
-    workflow_response.status_code = workflow_status
-    if workflow_status == 200:
-        workflow_response.json.return_value = {
-            "workflow_runs": [{"jobs_url": "https://api.github.com/jobs/123"}]
-        }
-    else:
-        workflow_response.json.side_effect = json_decode_error
-        workflow_response.text = "<html>Gateway Timeout</html>"
-
-    jobs_response = Mock()
-    jobs_response.status_code = jobs_status
-    if jobs_status == 200:
-        jobs_response.json.return_value = {
-            "jobs": [
-                {"name": "Basic tests (ubuntu-22.04)", "labels": 
["ubuntu-22.04"]},
-                {"name": "Other job", "labels": ["ubuntu-22.04"]},
-            ]
-        }
-    else:
-        jobs_response.json.side_effect = json_decode_error
-        jobs_response.text = "<html>Service Unavailable</html>"
-
-    mock_get.side_effect = [workflow_response, jobs_response]
-
-    result = selective_checks.get_job_label("push", "main")
-
-    assert result == expected_result
-
-
-def test_runner_type_pr():
-    selective_checks = SelectiveChecks(github_event=GithubEvents.PULL_REQUEST)
-
-    result = selective_checks.runner_type
-
-    assert result == PUBLIC_AMD_RUNNERS
-
-
-@patch("requests.get")
[email protected]("os.environ", {"GITHUB_TOKEN": "test_token"})
-def test_runner_type_schedule(mock_get):
-    selective_checks = SelectiveChecks(
-        files=(),
-        github_event=GithubEvents.SCHEDULE,
-        github_repository="apache/airflow",
-        github_context_dict={},
-    )
-
-    workflow_response = Mock()
-    workflow_response.status_code = 200
-    workflow_response.json.return_value = {"workflow_runs": [{"jobs_url": 
"https://api.github.com/jobs/123"}]}
-
-    jobs_response = Mock()
-    jobs_response.status_code = 200
-    jobs_response.json.return_value = {
-        "jobs": [
-            {"name": "Basic tests / Test git clone on Windows", "labels": 
["windows-2025"]},
-            {"name": "Basic tests (ubuntu-22.04)", "labels": ["ubuntu-22.04"]},
-            {"name": "Other job", "labels": ["ubuntu-22.04"]},
-        ]
-    }
-
-    mock_get.side_effect = [workflow_response, jobs_response]
-
-    result = selective_checks.runner_type
-
-    assert result == '["ubuntu-22.04-arm"]'
-
-
[email protected](
-    ("integration", "runner_type", "expected_result"),
+    ("integration", "platform", "expected_result"),
     [
         # Test integrations disabled for all CI environments
         pytest.param(
             "mssql",
-            PUBLIC_AMD_RUNNERS,
+            CI_AMD_PLATFORM,
             True,
             id="mssql_disabled_on_amd",
         ),
         pytest.param(
             "localstack",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             True,
             id="localstack_disabled_on_arm",
         ),
         # Test integrations disabled only for ARM runners
         pytest.param(
             "kerberos",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             True,
             id="kerberos_disabled_on_arm",
         ),
         pytest.param(
             "drill",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             True,
             id="drill_disabled_on_arm",
         ),
         pytest.param(
             "tinkerpop",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             True,
             id="tinkerpop_disabled_on_arm",
         ),
         pytest.param(
             "pinot",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             True,
             id="pinot_disabled_on_arm",
         ),
         pytest.param(
             "trino",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             True,
             id="trino_disabled_on_arm",
         ),
         pytest.param(
             "ydb",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             True,
             id="ydb_disabled_on_arm",
         ),
         # Test integrations that are NOT disabled on AMD runners
         pytest.param(
             "kerberos",
-            PUBLIC_AMD_RUNNERS,
+            CI_AMD_PLATFORM,
             False,
             id="kerberos_enabled_on_amd",
         ),
         pytest.param(
             "drill",
-            PUBLIC_AMD_RUNNERS,
+            CI_AMD_PLATFORM,
             False,
             id="drill_enabled_on_amd",
         ),
         pytest.param(
             "tinkerpop",
-            PUBLIC_AMD_RUNNERS,
+            CI_AMD_PLATFORM,
             False,
             id="tinkerpop_enabled_on_amd",
         ),
         # Test an integration that is not in any disabled list
         pytest.param(
             "postgres",
-            PUBLIC_AMD_RUNNERS,
+            CI_AMD_PLATFORM,
             False,
             id="postgres_enabled_on_amd",
         ),
         pytest.param(
             "postgres",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             False,
             id="postgres_enabled_on_arm",
         ),
         pytest.param(
             "redis",
-            PUBLIC_AMD_RUNNERS,
+            CI_AMD_PLATFORM,
             False,
             id="redis_enabled_on_amd",
         ),
         pytest.param(
             "redis",
-            '["ubuntu-22.04-arm"]',
+            CI_ARM_PLATFORM,
             False,
             id="redis_enabled_on_arm",
         ),
     ],
 )
-def test_is_disabled_integration(integration: str, runner_type: str, 
expected_result: bool):
+def test_is_disabled_integration(integration: str, platform: str, 
expected_result: bool):
     """Test that _is_disabled_integration correctly identifies disabled 
integrations."""
     selective_checks = SelectiveChecks(
         files=(),
         github_event=GithubEvents.PULL_REQUEST,
         github_repository="apache/airflow",
         github_context_dict={},
+        platform=platform,
     )
 
-    # Mock the runner_type property
-    with patch.object(
-        SelectiveChecks, "runner_type", new_callable=lambda: property(lambda 
self: runner_type)
-    ):
-        result = selective_checks._is_disabled_integration(integration)
-        assert result == expected_result
+    assert selective_checks._is_disabled_integration(integration) == 
expected_result
 
 
 def test_testable_core_integrations_excludes_disabled():
@@ -3506,14 +3313,10 @@ def test_testable_core_integrations_excludes_disabled():
             files=("airflow-core/tests/test_example.py",),
             commit_ref=NEUTRAL_COMMIT,
             github_event=GithubEvents.PULL_REQUEST,
+            platform=CI_AMD_PLATFORM,
         )
-        with (
-            patch.object(
-                SelectiveChecks, "runner_type", new_callable=lambda: 
property(lambda self: PUBLIC_AMD_RUNNERS)
-            ),
-            patch.object(
-                SelectiveChecks, "full_tests_needed", new_callable=lambda: 
property(lambda self: True)
-            ),
+        with patch.object(
+            SelectiveChecks, "full_tests_needed", new_callable=lambda: 
property(lambda self: True)
         ):
             result = selective_checks_amd.testable_core_integrations
             assert "postgres" in result
@@ -3530,16 +3333,10 @@ def 
test_testable_core_integrations_excludes_arm_disabled_on_arm():
             commit_ref=NEUTRAL_COMMIT,
             github_event=GithubEvents.SCHEDULE,
             github_context_dict={"ref_name": "main"},
+            platform=CI_ARM_PLATFORM,
         )
-        with (
-            patch.object(
-                SelectiveChecks,
-                "runner_type",
-                new_callable=lambda: property(lambda self: 
'["ubuntu-22.04-arm"]'),
-            ),
-            patch.object(
-                SelectiveChecks, "full_tests_needed", new_callable=lambda: 
property(lambda self: True)
-            ),
+        with patch.object(
+            SelectiveChecks, "full_tests_needed", new_callable=lambda: 
property(lambda self: True)
         ):
             result = selective_checks_arm.testable_core_integrations
             assert "postgres" in result
@@ -3558,14 +3355,10 @@ def 
test_testable_providers_integrations_excludes_disabled():
             files=("providers/amazon/tests/test_example.py",),
             commit_ref=NEUTRAL_COMMIT,
             github_event=GithubEvents.PULL_REQUEST,
+            platform=CI_AMD_PLATFORM,
         )
-        with (
-            patch.object(
-                SelectiveChecks, "runner_type", new_callable=lambda: 
property(lambda self: PUBLIC_AMD_RUNNERS)
-            ),
-            patch.object(
-                SelectiveChecks, "full_tests_needed", new_callable=lambda: 
property(lambda self: True)
-            ),
+        with patch.object(
+            SelectiveChecks, "full_tests_needed", new_callable=lambda: 
property(lambda self: True)
         ):
             result = selective_checks_amd.testable_providers_integrations
             assert "postgres" in result
@@ -3583,16 +3376,10 @@ def 
test_testable_providers_integrations_excludes_arm_disabled_on_arm():
             commit_ref=NEUTRAL_COMMIT,
             github_event=GithubEvents.SCHEDULE,
             github_context_dict={"ref_name": "main"},
+            platform=CI_ARM_PLATFORM,
         )
-        with (
-            patch.object(
-                SelectiveChecks,
-                "runner_type",
-                new_callable=lambda: property(lambda self: 
'["ubuntu-22.04-arm"]'),
-            ),
-            patch.object(
-                SelectiveChecks, "full_tests_needed", new_callable=lambda: 
property(lambda self: True)
-            ),
+        with patch.object(
+            SelectiveChecks, "full_tests_needed", new_callable=lambda: 
property(lambda self: True)
         ):
             result = selective_checks_arm.testable_providers_integrations
             assert "postgres" in result
@@ -3616,12 +3403,9 @@ def 
test_testable_core_integrations_gated_by_source(changed_file, expected_integ
         files=(changed_file,),
         commit_ref=NEUTRAL_COMMIT,
         github_event=GithubEvents.PULL_REQUEST,
+        platform=CI_AMD_PLATFORM,
     )
-    with patch.object(
-        SelectiveChecks, "runner_type", new_callable=lambda: property(lambda 
self: PUBLIC_AMD_RUNNERS)
-    ):
-        result = selective_checks.testable_core_integrations
-        assert result == [expected_integration]
+    assert selective_checks.testable_core_integrations == 
[expected_integration]
 
 
 def test_testable_core_integrations_empty_when_unrelated_source():
@@ -3630,11 +3414,9 @@ def 
test_testable_core_integrations_empty_when_unrelated_source():
         files=("airflow-core/src/airflow/models/taskinstance.py",),
         commit_ref=NEUTRAL_COMMIT,
         github_event=GithubEvents.PULL_REQUEST,
+        platform=CI_AMD_PLATFORM,
     )
-    with patch.object(
-        SelectiveChecks, "runner_type", new_callable=lambda: property(lambda 
self: PUBLIC_AMD_RUNNERS)
-    ):
-        assert selective_checks.testable_core_integrations == []
+    assert selective_checks.testable_core_integrations == []
 
 
 def test_testable_providers_integrations_gated_by_affected_provider():
@@ -3643,15 +3425,13 @@ def 
test_testable_providers_integrations_gated_by_affected_provider():
         
files=("providers/apache/cassandra/src/airflow/providers/apache/cassandra/hooks/cassandra.py",),
         commit_ref=NEUTRAL_COMMIT,
         github_event=GithubEvents.PULL_REQUEST,
+        platform=CI_AMD_PLATFORM,
     )
-    with patch.object(
-        SelectiveChecks, "runner_type", new_callable=lambda: property(lambda 
self: PUBLIC_AMD_RUNNERS)
-    ):
-        result = selective_checks.testable_providers_integrations
-        assert "cassandra" in result
-        # Unrelated integrations whose providers are not affected must be 
absent.
-        assert "mongo" not in result
-        assert "ydb" not in result
+    result = selective_checks.testable_providers_integrations
+    assert "cassandra" in result
+    # Unrelated integrations whose providers are not affected must be absent.
+    assert "mongo" not in result
+    assert "ydb" not in result
 
 
 def test_individual_providers_excludes_platform_excluded_on_arm():
@@ -3665,14 +3445,11 @@ def 
test_individual_providers_excludes_platform_excluded_on_arm():
         github_context_dict={"ref_name": "main"},
         default_branch="main",
         pr_labels=("full tests needed",),
+        platform=CI_ARM_PLATFORM,
     )
-    with patch.object(
-        SelectiveChecks, "runner_type", new_callable=lambda: property(lambda 
self: '["ubuntu-22.04-arm"]')
-    ):
-        assert arm_checks.platform == "linux/arm64"
-        arm_output = 
arm_checks.individual_providers_test_types_list_as_strings_in_json
-        assert arm_output is not None
-        assert "Providers[ibm.mq]" not in arm_output
+    arm_output = 
arm_checks.individual_providers_test_types_list_as_strings_in_json
+    assert arm_output is not None
+    assert "Providers[ibm.mq]" not in arm_output
 
     amd_checks = SelectiveChecks(
         files=("airflow-core/tests/test_example.py",),
@@ -3681,14 +3458,11 @@ def 
test_individual_providers_excludes_platform_excluded_on_arm():
         github_context_dict={"ref_name": "main"},
         default_branch="main",
         pr_labels=("full tests needed",),
+        platform=CI_AMD_PLATFORM,
     )
-    with patch.object(
-        SelectiveChecks, "runner_type", new_callable=lambda: property(lambda 
self: PUBLIC_AMD_RUNNERS)
-    ):
-        assert amd_checks.platform == "linux/amd64"
-        amd_output = 
amd_checks.individual_providers_test_types_list_as_strings_in_json
-        assert amd_output is not None
-        assert "Providers[ibm.mq]" in amd_output
+    amd_output = 
amd_checks.individual_providers_test_types_list_as_strings_in_json
+    assert amd_output is not None
+    assert "Providers[ibm.mq]" in amd_output
 
 
 def test_run_kubernetes_tests_forced_by_label():
diff --git a/scripts/ci/prek/check_ci_workflows_in_sync.py 
b/scripts/ci/prek/check_ci_workflows_in_sync.py
index 2e5584c2431..14d195f067b 100755
--- a/scripts/ci/prek/check_ci_workflows_in_sync.py
+++ b/scripts/ci/prek/check_ci_workflows_in_sync.py
@@ -36,9 +36,11 @@ Documented divergences:
 4. ``concurrency.group`` prefix — ``ci-arm-`` vs ``ci-amd-``
 5. ``build-info`` outputs ``platform`` and ``runner-type`` — hardcoded per
    architecture (and the surrounding comment naming the "ARM/AMD copy")
-6. ``print-platform`` job — ``name:`` and the architecture echoed to
+6. ``PLATFORM`` env on the ``selective-checks`` step — the platform this
+   workflow's tests run on.
+7. ``print-platform`` job — ``name:`` and the architecture echoed to
    GITHUB_STEP_SUMMARY
-7. ``notify-slack`` Slack-state artifact name — ``slack-state-tests-…-arm``
+8. ``notify-slack`` Slack-state artifact name — ``slack-state-tests-…-arm``
    vs ``slack-state-tests-…-amd``, so the de-dup tracker in
    ``slack_notification_state.py`` keeps independent state for each
    platform on the same branch
@@ -85,6 +87,7 @@ LINE_RULES: list[tuple[str, str]] = [
     (r"^  group: ci-(?:arm|amd)-", "  group: ci-PLACEHOLDER-"),
     (r'^      platform: "linux/(?:arm64|amd64)"$', '      platform: 
"linux/PLACEHOLDER"'),
     (r"^      runner-type: '\[\"ubuntu-22\.04(?:-arm)?\"\]'$", "      
runner-type: 'PLACEHOLDER'"),
+    (r'^          PLATFORM: "linux/(?:arm64|amd64)"$', '          PLATFORM: 
"linux/PLACEHOLDER"'),
     (
         r"^      # (?:ARM|AMD) copy\)\. The matching (?:AMD|ARM) copy lives in 
ci-(?:amd|arm)\.yml\.$",
         "      # PLACEHOLDER copy). The matching PLACEHOLDER copy lives in 
ci-PLACEHOLDER.yml.",

Reply via email to