From edb597702b0eeebb4163c59660776989a58dcd27 Mon Sep 17 00:00:00 2001
From: LIU ZHE YOU <zhu424.dev@gmail.com>
Date: Thu, 18 Jun 2026 10:59:52 +0900
Subject: [PATCH 1/4] Add Go + Java + Python lang-SDK coordinator system test
 on KubernetesExecutor

Adds a kind-based system test that runs one Dag (lang_sdk_combined) whose
tasks span the Python task-runner and the Go/Java coordinators on the
KubernetesExecutor. The golang/java queues route to their coordinators,
each carrying a pod_template_file (the worktree-1 feature). Each worker
pod's init container stages the queue's artifact (Go binary / Java jar)
from a per-language localstack S3 bucket through the DagBundle interface
into a shared emptyDir that is the coordinator's executables_root/jars_root.
The Go queue runs on the prod image (self-contained static binary); the
Java queue runs on the CI image (bundles the JVM the JavaCoordinator needs).

New k8s-test-only bundles: go-sdk/example/k8s_combined and
java-sdk/k8s-example. Provisioning is a new breeze command,
`breeze k8s setup-lang-sdk-test`, which builds the artifacts, deploys
localstack, uploads artifacts and the Python stub Dag, renders the
pod-template image placeholders, and installs the Helm release.
---
 dev/breeze/doc/05_test_commands.rst           |  17 +
 dev/breeze/doc/images/output_k8s.svg          |  38 +-
 dev/breeze/doc/images/output_k8s.txt          |   2 +-
 .../images/output_k8s_setup-lang-sdk-test.svg | 152 +++++++
 .../images/output_k8s_setup-lang-sdk-test.txt |   1 +
 ...utput_setup_check-all-params-in-groups.svg |   4 +-
 ...utput_setup_check-all-params-in-groups.txt |   2 +-
 ...output_setup_regenerate-command-images.svg |   8 +-
 ...output_setup_regenerate-command-images.txt |   2 +-
 .../commands/kubernetes_commands.py           | 381 ++++++++++++++++++
 .../commands/kubernetes_commands_config.py    |  13 +-
 go-sdk/example/k8s_combined/main.go           |  89 ++++
 java-sdk/k8s-example/build.gradle             |  50 +++
 java-sdk/k8s-example/gradle.properties        |  19 +
 java-sdk/k8s-example/settings.gradle          |  33 ++
 .../airflow/k8sexample/CombinedExample.java   |  47 +++
 .../airflow/k8sexample/K8sBundleBuilder.java  |  39 ++
 kubernetes-tests/lang_sdk/Dockerfile.java     |  31 ++
 kubernetes-tests/lang_sdk/README.md           |  95 +++++
 kubernetes-tests/lang_sdk/config/values.yaml  |  60 +++
 .../lang_sdk/dags/lang_sdk_combined.py        |  80 ++++
 .../lang_sdk/manifests/localstack.yaml        |  77 ++++
 .../pod_templates/lang_sdk_golang.yaml        | 117 ++++++
 .../lang_sdk/pod_templates/lang_sdk_java.yaml | 115 ++++++
 kubernetes-tests/lang_sdk/stage_artifacts.py  |  92 +++++
 .../test_lang_sdk_coordinator_executor.py     |  81 ++++
 26 files changed, 1626 insertions(+), 19 deletions(-)
 create mode 100644 dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
 create mode 100644 dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
 create mode 100644 go-sdk/example/k8s_combined/main.go
 create mode 100644 java-sdk/k8s-example/build.gradle
 create mode 100644 java-sdk/k8s-example/gradle.properties
 create mode 100644 java-sdk/k8s-example/settings.gradle
 create mode 100644 java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/CombinedExample.java
 create mode 100644 java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
 create mode 100644 kubernetes-tests/lang_sdk/Dockerfile.java
 create mode 100644 kubernetes-tests/lang_sdk/README.md
 create mode 100644 kubernetes-tests/lang_sdk/config/values.yaml
 create mode 100644 kubernetes-tests/lang_sdk/dags/lang_sdk_combined.py
 create mode 100644 kubernetes-tests/lang_sdk/manifests/localstack.yaml
 create mode 100644 kubernetes-tests/lang_sdk/pod_templates/lang_sdk_golang.yaml
 create mode 100644 kubernetes-tests/lang_sdk/pod_templates/lang_sdk_java.yaml
 create mode 100644 kubernetes-tests/lang_sdk/stage_artifacts.py
 create mode 100644 kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py

diff --git a/dev/breeze/doc/05_test_commands.rst b/dev/breeze/doc/05_test_commands.rst
index 9422918e9bfdb..ae165365164eb 100644
--- a/dev/breeze/doc/05_test_commands.rst
+++ b/dev/breeze/doc/05_test_commands.rst
@@ -565,6 +565,23 @@ All parameters of the command are here:
   :width: 100%
   :alt: Breeze k8s deploy-airflow
 
+Setting up the lang-SDK coordinator system test
+...............................................
+
+``breeze k8s setup-lang-sdk-test`` provisions a cluster for the lang-SDK coordinator
+system test: it builds the Go and Java example bundles, deploys an in-cluster localstack
+S3, uploads the artifacts and the Python stub Dag to their buckets, renders the
+coordinator pod-template image placeholders, and installs the Helm release configured for
+the ``golang`` and ``java`` queues. After it completes, run the test with
+``breeze k8s tests``.
+
+All parameters of the command are here:
+
+.. image:: ./images/output_k8s_setup-lang-sdk-test.svg
+  :target: https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/images/output_k8s_setup-lang-sdk-test.svg
+  :width: 100%
+  :alt: Breeze k8s setup-lang-sdk-test
+
 Hot-reloading Dags and core sources
 ...................................
 
diff --git a/dev/breeze/doc/images/output_k8s.svg b/dev/breeze/doc/images/output_k8s.svg
index fd164ea3575ff..a76c947f06e72 100644
--- a/dev/breeze/doc/images/output_k8s.svg
+++ b/dev/breeze/doc/images/output_k8s.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 855.1999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 977.1999999999999" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-k8s-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="804.1999999999999" />
+      <rect x="0" y="0" width="1463.0" height="926.1999999999999" />
     </clipPath>
     <clipPath id="breeze-k8s-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -141,9 +141,24 @@
 <clipPath id="breeze-k8s-line-31">
     <rect x="0" y="757.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-k8s-line-32">
+    <rect x="0" y="782.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-line-33">
+    <rect x="0" y="806.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-line-34">
+    <rect x="0" y="831.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-line-35">
+    <rect x="0" y="855.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-line-36">
+    <rect x="0" y="879.9" 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="853.2" rx="8"/><text class="breeze-k8s-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="975.2" rx="8"/><text class="breeze-k8s-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -180,12 +195,17 @@
 </text><text class="breeze-k8s-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-line-24)">│</text><text class="breeze-k8s-r4" x="24.4" y="605.6" textLength="97.6" clip-path="url(#breeze-k8s-line-24)">logs&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="146.4" y="605.6" textLength="463.6" clip-path="url(#breeze-k8s-line-24)">Dump&#160;k8s&#160;logs&#160;to&#160;${TMP_DIR}/kind_logs_</text><text class="breeze-k8s-r7" x="610" y="605.6" textLength="170.8" clip-path="url(#breeze-k8s-line-24)">&lt;cluster_name&gt;</text><text class="breeze-k8s-r1" x="780.8" y="605.6" textLength="658.8" clip-path="url(#breeze-k8s-line-24)">&#160;directory&#160;(optionally&#160;all&#160;clusters).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-line-24)">│</text><text class="breeze-k8s-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-line-24)">
 </text><text class="breeze-k8s-r5" x="0" y="630" textLength="1464" clip-path="url(#breeze-k8s-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-k8s-line-25)">
 </text><text class="breeze-k8s-r5" x="0" y="654.4" textLength="24.4" clip-path="url(#breeze-k8s-line-26)">╭─</text><text class="breeze-k8s-r5" x="24.4" y="654.4" textLength="268.4" clip-path="url(#breeze-k8s-line-26)">&#160;K8S&#160;testing&#160;commands&#160;</text><text class="breeze-k8s-r5" x="292.8" y="654.4" textLength="1146.8" clip-path="url(#breeze-k8s-line-26)">──────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-r5" x="1439.6" y="654.4" textLength="24.4" clip-path="url(#breeze-k8s-line-26)">─╮</text><text class="breeze-k8s-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-line-26)">
-</text><text class="breeze-k8s-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-line-27)">│</text><text class="breeze-k8s-r4" x="24.4" y="678.8" textLength="219.6" clip-path="url(#breeze-k8s-line-27)">tests&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="678.8" textLength="1171.2" clip-path="url(#breeze-k8s-line-27)">Run&#160;tests&#160;against&#160;the&#160;current&#160;KinD&#160;cluster&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-line-27)">│</text><text class="breeze-k8s-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-line-27)">
-</text><text class="breeze-k8s-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-line-28)">│</text><text class="breeze-k8s-r4" x="24.4" y="703.2" textLength="219.6" clip-path="url(#breeze-k8s-line-28)">run-complete-tests</text><text class="breeze-k8s-r1" x="268.4" y="703.2" textLength="1171.2" clip-path="url(#breeze-k8s-line-28)">Run&#160;complete&#160;k8s&#160;tests&#160;consisting&#160;of:&#160;creating&#160;cluster,&#160;building&#160;and&#160;uploading&#160;image,&#160;deploying&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-line-28)">│</text><text class="breeze-k8s-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-line-28)">
-</text><text class="breeze-k8s-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-line-29)">│</text><text class="breeze-k8s-r1" x="268.4" y="727.6" textLength="1171.2" clip-path="url(#breeze-k8s-line-29)">airflow,&#160;running&#160;tests&#160;and&#160;deleting&#160;clusters&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-line-29)">│</text><text class="breeze-k8s-r1" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-line-29)">
-</text><text class="breeze-k8s-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r4" x="24.4" y="752" textLength="219.6" clip-path="url(#breeze-k8s-line-30)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="752" textLength="1171.2" clip-path="url(#breeze-k8s-line-30)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#160;cluster.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">
-</text><text class="breeze-k8s-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">│</text><text class="breeze-k8s-r4" x="24.4" y="776.4" textLength="219.6" clip-path="url(#breeze-k8s-line-31)">k9s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="268.4" y="776.4" textLength="1171.2" clip-path="url(#breeze-k8s-line-31)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;k9s&#160;args&#160;as&#160;extra&#160;args.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">│</text><text class="breeze-k8s-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">
-</text><text class="breeze-k8s-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-k8s-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-line-32)">
+</text><text class="breeze-k8s-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-line-27)">│</text><text class="breeze-k8s-r4" x="24.4" y="678.8" textLength="231.8" clip-path="url(#breeze-k8s-line-27)">tests&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="280.6" y="678.8" textLength="1159" clip-path="url(#breeze-k8s-line-27)">Run&#160;tests&#160;against&#160;the&#160;current&#160;KinD&#160;cluster&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-line-27)">│</text><text class="breeze-k8s-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-line-27)">
+</text><text class="breeze-k8s-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-line-28)">│</text><text class="breeze-k8s-r4" x="24.4" y="703.2" textLength="231.8" clip-path="url(#breeze-k8s-line-28)">run-complete-tests&#160;</text><text class="breeze-k8s-r1" x="280.6" y="703.2" textLength="1159" clip-path="url(#breeze-k8s-line-28)">Run&#160;complete&#160;k8s&#160;tests&#160;consisting&#160;of:&#160;creating&#160;cluster,&#160;building&#160;and&#160;uploading&#160;image,&#160;deploying</text><text class="breeze-k8s-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-line-28)">│</text><text class="breeze-k8s-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-line-28)">
+</text><text class="breeze-k8s-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-line-29)">│</text><text class="breeze-k8s-r1" x="280.6" y="727.6" textLength="1159" clip-path="url(#breeze-k8s-line-29)">airflow,&#160;running&#160;tests&#160;and&#160;deleting&#160;clusters&#160;(optionally&#160;for&#160;all&#160;clusters&#160;in&#160;parallel).&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-line-29)">│</text><text class="breeze-k8s-r1" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-line-29)">
+</text><text class="breeze-k8s-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r4" x="24.4" y="752" textLength="231.8" clip-path="url(#breeze-k8s-line-30)">setup-lang-sdk-test</text><text class="breeze-k8s-r1" x="280.6" y="752" textLength="1159" clip-path="url(#breeze-k8s-line-30)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java)&#160;coordinator&#160;system&#160;test&#160;on&#160;an&#160;already-deployed&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">
+</text><text class="breeze-k8s-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">│</text><text class="breeze-k8s-r1" x="280.6" y="776.4" textLength="1159" clip-path="url(#breeze-k8s-line-31)">KubernetesExecutor&#160;cluster:&#160;build&#160;artifacts,&#160;build&#160;+&#160;load&#160;the&#160;Java&#160;worker&#160;image,&#160;deploy&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">│</text><text class="breeze-k8s-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">
+</text><text class="breeze-k8s-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-line-32)">│</text><text class="breeze-k8s-r1" x="280.6" y="800.8" textLength="1159" clip-path="url(#breeze-k8s-line-32)">localstack&#160;S3,&#160;upload&#160;artifacts&#160;+&#160;stub&#160;Dag,&#160;create&#160;config,&#160;and&#160;upgrade&#160;the&#160;Helm&#160;release.&#160;Run&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-line-32)">│</text><text class="breeze-k8s-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-line-32)">
+</text><text class="breeze-k8s-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">│</text><text class="breeze-k8s-r1" x="280.6" y="825.2" textLength="524.6" clip-path="url(#breeze-k8s-line-33)">the&#160;test&#160;afterwards&#160;with&#160;`breeze&#160;k8s&#160;tests&#160;</text><text class="breeze-k8s-r4" x="805.2" y="825.2" textLength="122" clip-path="url(#breeze-k8s-line-33)">--executor</text><text class="breeze-k8s-r1" x="927.2" y="825.2" textLength="280.6" clip-path="url(#breeze-k8s-line-33)">&#160;KubernetesExecutor&#160;--&#160;</text><text class="breeze-k8s-r6" x="1207.8" y="825.2" textLength="24.4" clip-path="url(#breeze-k8s-line-33)">-k</text><text class="breeze-k8s-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">│</text><text class="breeze-k8s-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">
+</text><text class="breeze-k8s-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">│</text><text class="breeze-k8s-r1" x="280.6" y="849.6" textLength="1159" clip-path="url(#breeze-k8s-line-34)">test_lang_sdk_combined_dag_succeeds`.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">│</text><text class="breeze-k8s-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">
+</text><text class="breeze-k8s-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-k8s-line-35)">│</text><text class="breeze-k8s-r4" x="24.4" y="874" textLength="231.8" clip-path="url(#breeze-k8s-line-35)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="280.6" y="874" textLength="1159" clip-path="url(#breeze-k8s-line-35)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#160;cluster.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-k8s-line-35)">│</text><text class="breeze-k8s-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-k8s-line-35)">
+</text><text class="breeze-k8s-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-line-36)">│</text><text class="breeze-k8s-r4" x="24.4" y="898.4" textLength="231.8" clip-path="url(#breeze-k8s-line-36)">k9s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="280.6" y="898.4" textLength="1159" clip-path="url(#breeze-k8s-line-36)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;k9s&#160;args&#160;as&#160;extra&#160;args.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-line-36)">│</text><text class="breeze-k8s-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-line-36)">
+</text><text class="breeze-k8s-r5" x="0" y="922.8" textLength="1464" clip-path="url(#breeze-k8s-line-37)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-line-37)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_k8s.txt b/dev/breeze/doc/images/output_k8s.txt
index 710fb9e9e5af2..b107ea5132ae5 100644
--- a/dev/breeze/doc/images/output_k8s.txt
+++ b/dev/breeze/doc/images/output_k8s.txt
@@ -1 +1 @@
-bbba8147c6480f8b333ae667f0ace4f5
+6cee97283c102523c503e3d27a76e177
diff --git a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
new file mode 100644
index 0000000000000..d1c4e4ce0966f
--- /dev/null
+++ b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
@@ -0,0 +1,152 @@
+<svg class="rich-terminal" viewBox="0 0 1482 611.1999999999999" xmlns="http://www.w3.org/2000/svg">
+    <!-- Generated with Rich https://www.textualize.io -->
+    <style>
+
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Regular"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
+        font-style: normal;
+        font-weight: 400;
+    }
+    @font-face {
+        font-family: "Fira Code";
+        src: local("FiraCode-Bold"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
+                url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
+        font-style: bold;
+        font-weight: 700;
+    }
+
+    .breeze-k8s-setup-lang-sdk-test-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .breeze-k8s-setup-lang-sdk-test-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .breeze-k8s-setup-lang-sdk-test-r1 { fill: #c5c8c6 }
+.breeze-k8s-setup-lang-sdk-test-r2 { fill: #d0b344 }
+.breeze-k8s-setup-lang-sdk-test-r3 { fill: #c5c8c6;font-weight: bold }
+.breeze-k8s-setup-lang-sdk-test-r4 { fill: #68a0b3;font-weight: bold }
+.breeze-k8s-setup-lang-sdk-test-r5 { fill: #98a84b;font-weight: bold }
+.breeze-k8s-setup-lang-sdk-test-r6 { fill: #868887 }
+.breeze-k8s-setup-lang-sdk-test-r7 { fill: #8d7b39 }
+    </style>
+
+    <defs>
+    <clipPath id="breeze-k8s-setup-lang-sdk-test-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="560.1999999999999" />
+    </clipPath>
+    <clipPath id="breeze-k8s-setup-lang-sdk-test-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-setup-lang-sdk-test-line-21">
+    <rect x="0" y="513.9" 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="609.2" rx="8"/><text class="breeze-k8s-setup-lang-sdk-test-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;setup-lang-sdk-test</text>
+            <g transform="translate(26,22)">
+            <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
+            <circle cx="22" cy="0" r="7" fill="#febc2e"/>
+            <circle cx="44" cy="0" r="7" fill="#28c840"/>
+            </g>
+        
+    <g transform="translate(9, 41)" clip-path="url(#breeze-k8s-setup-lang-sdk-test-clip-terminal)">
+    
+    <g class="breeze-k8s-setup-lang-sdk-test-matrix">
+    <text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="20" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-0)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r2" x="12.2" y="44.4" textLength="73.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">Usage:</text><text class="breeze-k8s-setup-lang-sdk-test-r3" x="97.6" y="44.4" textLength="366" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">breeze&#160;k8s&#160;setup-lang-sdk-test</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="475.8" y="44.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">[</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="488" y="44.4" textLength="85.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">OPTIONS</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="573.4" y="44.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">]</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="44.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-1)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-2)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="93.2" textLength="1415.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-3)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java)&#160;coordinator&#160;system&#160;test&#160;on&#160;an&#160;already-deployed&#160;KubernetesExecutor&#160;cluster:&#160;build&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-3)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="117.6" textLength="1427.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-4)">artifacts,&#160;build&#160;+&#160;load&#160;the&#160;Java&#160;worker&#160;image,&#160;deploy&#160;localstack&#160;S3,&#160;upload&#160;artifacts&#160;+&#160;stub&#160;Dag,&#160;create&#160;config,&#160;and&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-4)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="142" textLength="890.6" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">upgrade&#160;the&#160;Helm&#160;release.&#160;Run&#160;the&#160;test&#160;afterwards&#160;with&#160;`breeze&#160;k8s&#160;tests&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="902.8" y="142" textLength="122" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">--executor</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1024.8" y="142" textLength="280.6" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">&#160;KubernetesExecutor&#160;--&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r5" x="1305.4" y="142" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">-k</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="166.4" textLength="451.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">test_lang_sdk_combined_dag_succeeds`.</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-7)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">╭─</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="24.4" y="215.2" textLength="305" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">&#160;K8S&#160;lang-SDK&#160;test&#160;flags&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="329.4" y="215.2" textLength="1110.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">───────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1439.6" y="215.2" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">─╮</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="239.6" textLength="244" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">--python&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r5" x="292.8" y="239.6" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">-p</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="239.6" textLength="744.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">Python&#160;major/minor&#160;version&#160;used&#160;in&#160;Airflow&#160;image&#160;for&#160;images.&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1085.8" y="239.6" textLength="183" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">[default:&#160;3.10]</text><text class="breeze-k8s-setup-lang-sdk-test-r7" x="1281" y="239.6" textLength="122" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">(&gt;3.10&lt;&#160;|&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="264" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-10)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r7" x="341.6" y="264" textLength="317.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-10)">3.11&#160;|&#160;3.12&#160;|&#160;3.13&#160;|&#160;3.14)</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="264" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-10)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-10)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="288.4" textLength="244" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">--kubernetes-version</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="288.4" textLength="671" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">Kubernetes&#160;version&#160;used&#160;to&#160;create&#160;the&#160;KinD&#160;cluster&#160;of.&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1012.6" y="288.4" textLength="231.8" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">[default:&#160;v1.30.13]</text><text class="breeze-k8s-setup-lang-sdk-test-r7" x="1256.6" y="288.4" textLength="170.8" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">(&gt;v1.30.13&lt;&#160;|&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-11)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r7" x="341.6" y="312.8" textLength="597.8" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">v1.31.12&#160;|&#160;v1.32.8&#160;|&#160;v1.33.4&#160;|&#160;v1.34.0&#160;|&#160;v1.35.0)</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-12)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="337.2" textLength="244" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">--go-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="337.2" textLength="976" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">Image&#160;for&#160;the&#160;Go&#160;(ExecutableCoordinator)&#160;worker&#160;pod.&#160;Defaults&#160;to&#160;the&#160;k8s&#160;image.&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r7" x="1317.6" y="337.2" textLength="73.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">(TEXT)</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-13)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="361.6" textLength="244" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">--java-image&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="361.6" textLength="1098" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">Image&#160;for&#160;the&#160;Java&#160;(JavaCoordinator)&#160;worker&#160;pod.&#160;Must&#160;include&#160;a&#160;JRE.&#160;Defaults&#160;to&#160;building&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="361.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-14)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="386" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="386" textLength="1098" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">the&#160;prod&#160;image&#160;plus&#160;a&#160;headless&#160;JRE&#160;(Dockerfile.java)&#160;and&#160;loading&#160;it&#160;into&#160;the&#160;kind&#160;cluster.</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="386" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-15)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r7" x="341.6" y="410.4" textLength="73.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">(TEXT)</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-16)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="434.8" textLength="1464" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-17)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="459.2" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">╭─</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="24.4" y="459.2" textLength="195.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">&#160;Common&#160;options&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="219.6" y="459.2" textLength="1220" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1439.6" y="459.2" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">─╮</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-18)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="483.6" textLength="109.8" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">--verbose</text><text class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="483.6" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">-v</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="207.4" y="483.6" textLength="585.6" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-19)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="508" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="508" textLength="109.8" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">--dry-run</text><text class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="508" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">-D</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="207.4" y="508" textLength="719.8" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="508" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-20)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="532.4" textLength="109.8" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">--help&#160;&#160;&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r5" x="158.6" y="532.4" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">-h</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="207.4" y="532.4" textLength="329.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-21)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="556.8" textLength="1464" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-22)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-22)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
new file mode 100644
index 0000000000000..256db99213b70
--- /dev/null
+++ b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
@@ -0,0 +1 @@
+63ead07eb7d775794a28800487bc014d
diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
index 1daa6048546dc..b79913efe0137 100644
--- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
+++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.svg
@@ -210,8 +210,8 @@
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="239.6" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">|&#160;ci:resource-check&#160;|&#160;ci:selective-check&#160;|&#160;ci:set-milestone&#160;|&#160;ci:upgrade&#160;|&#160;cleanup&#160;|&#160;doctor&#160;|&#160;down&#160;|&#160;exec</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-9)">
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="264" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="264" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">|&#160;generate-migration-file&#160;|&#160;issues&#160;|&#160;issues:unassign&#160;|&#160;k8s&#160;|&#160;k8s:build-k8s-image&#160;|&#160;k8s:configure-cluster&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="264" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="264" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-10)">
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="288.4" textLength="1281" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">|&#160;k8s:create-cluster&#160;|&#160;k8s:delete-cluster&#160;|&#160;k8s:deploy-airflow&#160;|&#160;k8s:deploy-cluster&#160;|&#160;k8s:dev&#160;|&#160;k8s:k9s&#160;|</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-11)">
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="312.8" textLength="1085.8" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">k8s:logs&#160;|&#160;k8s:run-complete-tests&#160;|&#160;k8s:setup-env&#160;|&#160;k8s:shell&#160;|&#160;k8s:status&#160;|&#160;k8s:tests&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="337.2" textLength="1110.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">k8s:upload-k8s-image&#160;|&#160;prod-image&#160;|&#160;prod-image:build&#160;|&#160;prod-image:load&#160;|&#160;prod-image:pull&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="312.8" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">k8s:logs&#160;|&#160;k8s:run-complete-tests&#160;|&#160;k8s:setup-env&#160;|&#160;k8s:setup-lang-sdk-test&#160;|&#160;k8s:shell&#160;|&#160;k8s:status&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-12)">
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="337.2" textLength="1256.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">k8s:tests&#160;|&#160;k8s:upload-k8s-image&#160;|&#160;prod-image&#160;|&#160;prod-image:build&#160;|&#160;prod-image:load&#160;|&#160;prod-image:pull&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-13)">
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="361.6" textLength="1134.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">prod-image:save&#160;|&#160;prod-image:verify&#160;|&#160;registry&#160;|&#160;registry:backfill&#160;|&#160;registry:extract-data&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-14)">
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="386" textLength="1098" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">registry:publish-versions&#160;|&#160;release-management&#160;|&#160;release-management:add-back-references&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="386" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-15)">
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="410.4" textLength="1073.6" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:check-release-files&#160;|&#160;release-management:classify-provider-changes&#160;|&#160;</text><text class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">│</text><text class="breeze-setup-check-all-params-in-groups-r1" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">
diff --git a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
index 027ee1753bd67..6cf56c1a731df 100644
--- a/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
+++ b/dev/breeze/doc/images/output_setup_check-all-params-in-groups.txt
@@ -1 +1 @@
-561b619130079265ef547620b63f72cd
+5bc35640bc1faf04a3e60c8c31a5f571
diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
index 72911001bb623..d8e6b986f5d9d 100644
--- a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
+++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
@@ -230,10 +230,10 @@
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="288.4" textLength="1122.4" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">cleanup&#160;|&#160;doctor&#160;|&#160;down&#160;|&#160;exec&#160;|&#160;generate-migration-file&#160;|&#160;issues&#160;|&#160;issues:unassign&#160;|&#160;k8s&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="288.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-11)">
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="312.8" textLength="1073.6" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">k8s:build-k8s-image&#160;|&#160;k8s:configure-cluster&#160;|&#160;k8s:create-cluster&#160;|&#160;k8s:delete-cluster&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="312.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-12)">
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="337.2" textLength="1195.6" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">k8s:deploy-airflow&#160;|&#160;k8s:deploy-cluster&#160;|&#160;k8s:dev&#160;|&#160;k8s:k9s&#160;|&#160;k8s:logs&#160;|&#160;k8s:run-complete-tests&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="337.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-13)">
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="361.6" textLength="1085.8" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">k8s:setup-env&#160;|&#160;k8s:shell&#160;|&#160;k8s:status&#160;|&#160;k8s:tests&#160;|&#160;k8s:upload-k8s-image&#160;|&#160;prod-image&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="386" textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">prod-image:build&#160;|&#160;prod-image:load&#160;|&#160;prod-image:pull&#160;|&#160;prod-image:save&#160;|&#160;prod-image:verify&#160;|&#160;registry&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="410.4" textLength="1159" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">|&#160;registry:backfill&#160;|&#160;registry:extract-data&#160;|&#160;registry:publish-versions&#160;|&#160;release-management&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="434.8" textLength="1000.4" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management:add-back-references&#160;|&#160;release-management:check-release-files&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="361.6" textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">k8s:setup-env&#160;|&#160;k8s:setup-lang-sdk-test&#160;|&#160;k8s:shell&#160;|&#160;k8s:status&#160;|&#160;k8s:tests&#160;|&#160;k8s:upload-k8s-image&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="361.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-14)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="386" textLength="1049.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">prod-image&#160;|&#160;prod-image:build&#160;|&#160;prod-image:load&#160;|&#160;prod-image:pull&#160;|&#160;prod-image:save&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="386" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-15)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="410.4" textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">prod-image:verify&#160;|&#160;registry&#160;|&#160;registry:backfill&#160;|&#160;registry:extract-data&#160;|&#160;registry:publish-versions&#160;|</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="410.4" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-16)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="434.8" textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">release-management&#160;|&#160;release-management:add-back-references&#160;|&#160;release-management:check-release-files&#160;|</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="434.8" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-17)">
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="459.2" textLength="1183.4" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">release-management:classify-provider-changes&#160;|&#160;release-management:clean-old-provider-artifacts&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-18)">
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="483.6" textLength="1073.6" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">release-management:constraints-version-check&#160;|&#160;release-management:create-minor-branch&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-19)">
 </text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="508" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text class="breeze-setup-regenerate-command-images-r6" x="195.2" y="508" textLength="1134.6" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">release-management:generate-airflowctl-changelog&#160;|&#160;release-management:generate-constraints&#160;|&#160;</text><text class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="508" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">│</text><text class="breeze-setup-regenerate-command-images-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-setup-regenerate-command-images-line-20)">
diff --git a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
index 860ef216136f4..2ff7337a18a5f 100644
--- a/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
+++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.txt
@@ -1 +1 @@
-bce2b4cc3d1512b690164cbfaa4bd2f6
+3103c7328eb949575455ff8fae01c49c
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index a0172515e0334..a657811c744ad 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -2450,3 +2450,384 @@ def deploy_cluster(
     )
     if return_code != 0:
         sys.exit(return_code)
+
+
+# ---------------------------------------------------------------------------
+# lang-SDK (Go + Java) coordinator system test on KubernetesExecutor.
+# Assets live under kubernetes-tests/lang_sdk/. See that directory's README.md.
+# ---------------------------------------------------------------------------
+LANG_SDK_PATH = AIRFLOW_ROOT_PATH / "kubernetes-tests" / "lang_sdk"
+LANG_SDK_GO_BUNDLE_PKG = "./example/k8s_combined"
+LANG_SDK_GO_BUNDLE_NAME = "lang_sdk_combined"
+LANG_SDK_JAVA_EXAMPLE_PATH = AIRFLOW_ROOT_PATH / "java-sdk" / "k8s-example"
+LANG_SDK_GO_SDK_PATH = AIRFLOW_ROOT_PATH / "go-sdk"
+# Build the artifacts inside ephemeral toolchain containers so the host needs
+# neither Go nor a JDK installed (mirrors the airflow-e2e-tests conftest).
+LANG_SDK_GO_BUILDER_IMAGE = os.environ.get("GO_BUILDER_IMAGE", "golang:1.24-alpine")
+LANG_SDK_JAVA_BUILDER_IMAGE = "eclipse-temurin:17-jdk"
+LANG_SDK_MAVEN_CACHE_PATH = AIRFLOW_ROOT_PATH / "files" / "m2"
+# The Java queue needs a JRE the JavaCoordinator can exec; the Go queue runs on
+# the plain prod image. Building the Java worker image as a separate tag (prod +
+# JRE, see Dockerfile.java) lets each coordinator route its queue to a distinct
+# pod_template_file base image.
+LANG_SDK_JAVA_WORKER_IMAGE = "lang-sdk-java-worker:latest"
+LANG_SDK_JAVA_DOCKERFILE = LANG_SDK_PATH / "Dockerfile.java"
+LANG_SDK_AWS_CONN_URI = (
+    "aws://test:test@/?region_name=us-east-1&"
+    "endpoint_url=http%3A%2F%2Flocalstack.airflow.svc.cluster.local%3A4566"
+)
+
+
+def _lang_sdk_build_artifacts(staging: Path, output: Output | None) -> None:
+    """Build the Go bundle and Java jar into ``staging/{go,java}-artifacts``.
+
+    Both toolchains run inside ephemeral Docker containers so the host does not
+    need Go or a JDK; each builds into a gitignored dir under the repo and the
+    result is copied into the staging dir.
+    """
+    go_dir = staging / "go-artifacts"
+    java_dir = staging / "java-artifacts"
+    go_dir.mkdir(parents=True, exist_ok=True)
+    java_dir.mkdir(parents=True, exist_ok=True)
+
+    uid_gid = f"{os.getuid()}:{os.getgid()}"
+
+    # CGO_ENABLED=0 yields a fully static binary that runs on the stock worker.
+    # USER/HOME must be set because the SDK calls user.Current() at init; with
+    # cgo disabled Go's pure-Go resolver reads those env vars and panics if
+    # either is empty. HOME points at a writable, gitignored dir under go-sdk/bin
+    # so the Go build and module caches persist between runs.
+    get_console(output=output).print(f"[info]Building Go bundle in {LANG_SDK_GO_BUILDER_IMAGE}")
+    run_command(
+        [
+            "docker",
+            "run",
+            "--rm",
+            "--user",
+            uid_gid,
+            "-e",
+            "HOME=/repo/go-sdk/bin/.home",
+            "-e",
+            "USER=airflow",
+            "-e",
+            "CGO_ENABLED=0",
+            "-v",
+            f"{AIRFLOW_ROOT_PATH}:/repo",
+            "-w",
+            "/repo/go-sdk",
+            LANG_SDK_GO_BUILDER_IMAGE,
+            "go",
+            "tool",
+            "airflow-go-pack",
+            "--output",
+            f"/repo/go-sdk/bin/{LANG_SDK_GO_BUNDLE_NAME}",
+            LANG_SDK_GO_BUNDLE_PKG,
+        ],
+        output=output,
+        check=True,
+    )
+    shutil.copy(LANG_SDK_GO_SDK_PATH / "bin" / LANG_SDK_GO_BUNDLE_NAME, go_dir / LANG_SDK_GO_BUNDLE_NAME)
+
+    # The k8s-example resolves the SDK plugin and libraries from mavenLocal(),
+    # so publish them first, then build the bundle. --user keeps build outputs
+    # owned by the host user; HOME is set explicitly because that UID has no
+    # /etc/passwd entry; GRADLE_USER_HOME and the mounted ~/.m2 persist the
+    # Gradle distribution and dependency caches between runs.
+    LANG_SDK_MAVEN_CACHE_PATH.mkdir(parents=True, exist_ok=True)
+    java_docker_prefix = [
+        "docker",
+        "run",
+        "--rm",
+        "--user",
+        uid_gid,
+        "-e",
+        "GRADLE_USER_HOME=/repo/java-sdk/.gradle",
+        "-e",
+        "HOME=/workspace-home",
+        "-v",
+        f"{LANG_SDK_MAVEN_CACHE_PATH}:/workspace-home/.m2",
+        "-v",
+        f"{AIRFLOW_ROOT_PATH}:/repo",
+    ]
+    get_console(output=output).print("[info]Publishing Java SDK artifacts to local Maven repository")
+    run_command(
+        [
+            *java_docker_prefix,
+            "-w",
+            "/repo/java-sdk",
+            LANG_SDK_JAVA_BUILDER_IMAGE,
+            "./gradlew",
+            "publishToMavenLocal",
+            "-PskipSigning=true",
+            "--no-daemon",
+            "--console=plain",
+        ],
+        output=output,
+        check=True,
+    )
+    get_console(output=output).print(f"[info]Building Java jar in {LANG_SDK_JAVA_BUILDER_IMAGE}")
+    run_command(
+        [
+            *java_docker_prefix,
+            "-w",
+            "/repo/java-sdk/k8s-example",
+            LANG_SDK_JAVA_BUILDER_IMAGE,
+            "../gradlew",
+            "bundle",
+            "--no-daemon",
+            "--console=plain",
+        ],
+        output=output,
+        check=True,
+    )
+    jars = list((LANG_SDK_JAVA_EXAMPLE_PATH / "build" / "bundle").glob("*.jar"))
+    if not jars:
+        get_console(output=output).print("[error]No jar produced by the Java bundle build")
+        sys.exit(1)
+    shutil.copy(jars[0], java_dir / jars[0].name)
+
+
+def _lang_sdk_kubectl(
+    args: list[str], python: str, kubernetes_version: str, output: Output | None, check=True
+):
+    return run_command_with_k8s_env(
+        ["kubectl", *args],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        check=check,
+    )
+
+
+def _lang_sdk_deploy_localstack(python: str, kubernetes_version: str, output: Output | None) -> None:
+    get_console(output=output).print("[info]Deploying localstack (S3) into the airflow namespace")
+    _lang_sdk_kubectl(
+        ["apply", "-f", str(LANG_SDK_PATH / "manifests" / "localstack.yaml")],
+        python,
+        kubernetes_version,
+        output,
+    )
+    _lang_sdk_kubectl(
+        ["rollout", "status", "deployment/localstack", "-n", HELM_AIRFLOW_NAMESPACE, "--timeout=180s"],
+        python,
+        kubernetes_version,
+        output,
+    )
+
+
+def _lang_sdk_upload_artifacts(
+    staging: Path, python: str, kubernetes_version: str, output: Output | None
+) -> None:
+    """Copy artifacts + stub Dag into the localstack pod and create/fill S3 buckets via awslocal."""
+    pod = run_command_with_k8s_env(
+        [
+            "kubectl",
+            "get",
+            "pod",
+            "-n",
+            HELM_AIRFLOW_NAMESPACE,
+            "-l",
+            "app=localstack",
+            "-o",
+            "jsonpath={.items[0].metadata.name}",
+        ],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        capture_output=True,
+        text=True,
+        check=True,
+    ).stdout.strip()
+
+    go_bundle = staging / "go-artifacts" / "lang_sdk_combined"
+    java_jar = next((staging / "java-artifacts").glob("*.jar"))
+    stub_dag = LANG_SDK_PATH / "dags" / "lang_sdk_combined.py"
+
+    for src, dest in (
+        (go_bundle, "/tmp/go_bundle"),
+        (java_jar, "/tmp/app.jar"),
+        (stub_dag, "/tmp/lang_sdk_combined.py"),
+    ):
+        _lang_sdk_kubectl(
+            ["cp", str(src), f"{HELM_AIRFLOW_NAMESPACE}/{pod}:{dest}"], python, kubernetes_version, output
+        )
+
+    for bucket in ("go-artifacts", "java-artifacts", "dags"):
+        _lang_sdk_kubectl(
+            ["exec", "-n", HELM_AIRFLOW_NAMESPACE, pod, "--", "awslocal", "s3", "mb", f"s3://{bucket}"],
+            python,
+            kubernetes_version,
+            output,
+            check=False,
+        )
+    uploads = (
+        ("/tmp/go_bundle", "s3://go-artifacts/lang_sdk_combined"),
+        ("/tmp/app.jar", "s3://java-artifacts/app.jar"),
+        ("/tmp/lang_sdk_combined.py", "s3://dags/lang_sdk_combined.py"),
+    )
+    for src, dest in uploads:
+        _lang_sdk_kubectl(
+            ["exec", "-n", HELM_AIRFLOW_NAMESPACE, pod, "--", "awslocal", "s3", "cp", src, dest],
+            python,
+            kubernetes_version,
+            output,
+        )
+
+
+def _lang_sdk_apply_configmaps_and_secret(
+    python: str, kubernetes_version: str, go_image: str, java_image: str, output: Output | None
+) -> None:
+    with tempfile.TemporaryDirectory(prefix="lang_sdk_pt_") as tmp:
+        rendered = Path(tmp)
+        for name in ("lang_sdk_golang.yaml", "lang_sdk_java.yaml"):
+            text = (LANG_SDK_PATH / "pod_templates" / name).read_text()
+            text = text.replace("__LANG_SDK_GO_IMAGE__", go_image).replace(
+                "__LANG_SDK_JAVA_IMAGE__", java_image
+            )
+            (rendered / name).write_text(text)
+        # Idempotent configmap/secret application via `--dry-run | apply`.
+        for cm_args in (
+            ["create", "configmap", "lang-sdk-pod-templates", f"--from-file={rendered}"],
+            [
+                "create",
+                "configmap",
+                "lang-sdk-scripts",
+                f"--from-file={LANG_SDK_PATH / 'stage_artifacts.py'}",
+            ],
+            [
+                "create",
+                "secret",
+                "generic",
+                "lang-sdk-aws-conn",
+                f"--from-literal=uri={LANG_SDK_AWS_CONN_URI}",
+            ],
+        ):
+            manifest = run_command_with_k8s_env(
+                ["kubectl", *cm_args, "-n", HELM_AIRFLOW_NAMESPACE, "--dry-run=client", "-o", "yaml"],
+                python=python,
+                kubernetes_version=kubernetes_version,
+                output=output,
+                capture_output=True,
+                check=True,
+            ).stdout
+            run_command_with_k8s_env(
+                ["kubectl", "apply", "-n", HELM_AIRFLOW_NAMESPACE, "-f", "-"],
+                python=python,
+                kubernetes_version=kubernetes_version,
+                output=output,
+                input=manifest,
+                check=True,
+            )
+
+
+def _lang_sdk_build_java_worker_image(
+    base_image: str, python: str, kubernetes_version: str, output: Output | None
+) -> str:
+    """Build the prod+JRE Java worker image and load it into the kind cluster.
+
+    Returns the local image tag the Java pod template should reference.
+    """
+    get_console(output=output).print(
+        f"[info]Building Java worker image {LANG_SDK_JAVA_WORKER_IMAGE} (JRE on top of {base_image})"
+    )
+    run_command(
+        [
+            "docker",
+            "build",
+            "--build-arg",
+            f"BASE_IMAGE={base_image}",
+            "-t",
+            LANG_SDK_JAVA_WORKER_IMAGE,
+            "-f",
+            str(LANG_SDK_JAVA_DOCKERFILE),
+            str(LANG_SDK_PATH),
+        ],
+        output=output,
+        check=True,
+    )
+    cluster_name = get_kind_cluster_name(python=python, kubernetes_version=kubernetes_version)
+    get_console(output=output).print(f"[info]Loading {LANG_SDK_JAVA_WORKER_IMAGE} into {cluster_name}")
+    run_command_with_k8s_env(
+        ["kind", "load", "docker-image", "--name", cluster_name, LANG_SDK_JAVA_WORKER_IMAGE],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        check=True,
+    )
+    return LANG_SDK_JAVA_WORKER_IMAGE
+
+
+def _lang_sdk_deploy_airflow(python: str, kubernetes_version: str, output: Output | None) -> None:
+    params = BuildProdParams(python=python)
+    image = params.airflow_image_kubernetes
+    get_console(output=output).print("[info]Upgrading airflow Helm release with lang-SDK values")
+    run_command_with_k8s_env(
+        [
+            "helm",
+            "upgrade",
+            "--install",
+            "airflow",
+            os.fspath(CHART_PATH),
+            "--kube-context",
+            get_kubectl_cluster_name(python=python, kubernetes_version=kubernetes_version),
+            "--namespace",
+            HELM_AIRFLOW_NAMESPACE,
+            "--set",
+            f"defaultAirflowRepository={image}",
+            "--set",
+            "defaultAirflowTag=latest",
+            "-f",
+            str(LANG_SDK_PATH / "config" / "values.yaml"),
+            "--timeout",
+            "20m0s",
+            "--wait",
+        ],
+        python=python,
+        kubernetes_version=kubernetes_version,
+        output=output,
+        check=True,
+    )
+
+
+@kubernetes_group.command(
+    name="setup-lang-sdk-test",
+    help="Provision the lang-SDK (Go + Java) coordinator system test on an already-deployed "
+    "KubernetesExecutor cluster: build artifacts, build + load the Java worker image, deploy "
+    "localstack S3, upload artifacts + stub Dag, create config, and upgrade the Helm release. "
+    "Run the test afterwards with `breeze k8s tests --executor KubernetesExecutor "
+    "-- -k test_lang_sdk_combined_dag_succeeds`.",
+)
+@option_python
+@option_kubernetes_version
+@click.option(
+    "--go-image",
+    help="Image for the Go (ExecutableCoordinator) worker pod. Defaults to the k8s image.",
+)
+@click.option(
+    "--java-image",
+    help="Image for the Java (JavaCoordinator) worker pod. Must include a JRE. Defaults to building "
+    "the prod image plus a headless JRE (Dockerfile.java) and loading it into the kind cluster.",
+)
+@option_verbose
+@option_dry_run
+def setup_lang_sdk_test(python: str, kubernetes_version: str, go_image: str | None, java_image: str | None):
+    result = sync_virtualenv(force_venv_setup=False)
+    if result.returncode != 0:
+        sys.exit(result.returncode)
+    make_sure_kubernetes_tools_are_installed()
+    default_image = f"{BuildProdParams(python=python).airflow_image_kubernetes}:latest"
+    go_image = go_image or default_image
+    if not java_image:
+        java_image = _lang_sdk_build_java_worker_image(go_image, python, kubernetes_version, output=None)
+    with tempfile.TemporaryDirectory(prefix="lang_sdk_artifacts_") as tmp:
+        _lang_sdk_build_artifacts(Path(tmp), output=None)
+        _lang_sdk_deploy_localstack(python, kubernetes_version, output=None)
+        _lang_sdk_upload_artifacts(Path(tmp), python, kubernetes_version, output=None)
+    _lang_sdk_apply_configmaps_and_secret(python, kubernetes_version, go_image, java_image, output=None)
+    _lang_sdk_deploy_airflow(python, kubernetes_version, output=None)
+    console_print(
+        "\n[success]lang-SDK test environment is ready.[/]\n"
+        "[info]Run the test with:\n"
+        "  breeze k8s tests --executor KubernetesExecutor "
+        "-- -k test_lang_sdk_combined_dag_succeeds\n"
+    )
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
index 274439111ea06..0c9a202dbda4e 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
@@ -37,9 +37,20 @@
 
 KUBERNETES_TESTING_COMMANDS: dict[str, str | list[str]] = {
     "name": "K8S testing commands",
-    "commands": ["tests", "run-complete-tests", "shell", "k9s", "logs"],
+    "commands": ["tests", "run-complete-tests", "setup-lang-sdk-test", "shell", "k9s", "logs"],
 }
 KUBERNETES_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] = {
+    "breeze k8s setup-lang-sdk-test": [
+        {
+            "name": "K8S lang-SDK test flags",
+            "options": [
+                "--python",
+                "--kubernetes-version",
+                "--go-image",
+                "--java-image",
+            ],
+        }
+    ],
     "breeze k8s setup-env": [
         {
             "name": "K8S setup flags",
diff --git a/go-sdk/example/k8s_combined/main.go b/go-sdk/example/k8s_combined/main.go
new file mode 100644
index 0000000000000..1f2768301e9b1
--- /dev/null
+++ b/go-sdk/example/k8s_combined/main.go
@@ -0,0 +1,89 @@
+// 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.
+
+// Command k8s_combined is the Go half of the KubernetesExecutor lang-SDK system
+// test bundle. It registers the Go tasks of the shared lang_sdk_combined Dag
+// (the Java half lives in java-sdk/k8s-example, the Python stub Dag in
+// kubernetes-tests/lang_sdk/dags). The coordinator locates this binary by
+// dag_id, so only the Go tasks are registered here; the Java tasks of the same
+// dag_id live in the Java jar.
+package main
+
+import (
+	"log"
+	"log/slog"
+	"runtime"
+	"time"
+
+	v1 "github.com/apache/airflow/go-sdk/bundle/bundlev1"
+	"github.com/apache/airflow/go-sdk/bundle/bundlev1/bundlev1server"
+	"github.com/apache/airflow/go-sdk/sdk"
+)
+
+// Must match the dag_id of the Python stub Dag and the Java bundle.
+const combinedDagID = "lang_sdk_combined"
+
+// Set by `-ldflags` at build time; the coordinator finds the bundle by dag_id,
+// so the name is only cosmetic.
+var (
+	bundleName    = "lang_sdk_combined_go"
+	bundleVersion = "0.0"
+)
+
+type combinedBundle struct{}
+
+var _ v1.BundleProvider = (*combinedBundle)(nil)
+
+func (m *combinedBundle) GetBundleVersion() v1.BundleInfo {
+	return v1.BundleInfo{Name: bundleName, Version: &bundleVersion}
+}
+
+func (m *combinedBundle) RegisterDags(dagbag v1.Registry) error {
+	dag := dagbag.AddDag(combinedDagID)
+	// Explicit task ids so the Go tasks are namespaced apart from the Java
+	// tasks that share this dag_id in the Python stub.
+	dag.AddTaskWithName("go_extract", goExtract)
+	dag.AddTaskWithName("go_transform", goTransform)
+	return nil
+}
+
+func main() {
+	if err := bundlev1server.Serve(&combinedBundle{}); err != nil {
+		log.Fatal(err)
+	}
+}
+
+// goExtract returns a map pushed as the task's XCom, mirroring the reference
+// example's extract task so the Python downstream can read it.
+func goExtract(ctx sdk.TIRunContext, log *slog.Logger) (any, error) {
+	log.InfoContext(ctx, "go_extract running")
+	return map[string]any{
+		"go_version": runtime.Version(),
+		"timestamp":  time.Now().UnixNano(),
+	}, nil
+}
+
+// goTransform reads the my_variable Airflow variable through the coordinator,
+// exercising a GetVariable round-trip over the Execution API.
+func goTransform(ctx sdk.TIRunContext, client sdk.VariableClient, log *slog.Logger) error {
+	val, err := client.GetVariable(ctx, "my_variable")
+	if err != nil {
+		return err
+	}
+	log.InfoContext(ctx, "go_transform obtained variable", "my_variable", val)
+	return nil
+}
diff --git a/java-sdk/k8s-example/build.gradle b/java-sdk/k8s-example/build.gradle
new file mode 100644
index 0000000000000..f27f0f94e8d6b
--- /dev/null
+++ b/java-sdk/k8s-example/build.gradle
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+plugins {
+    id("org.apache.airflow.sdk") version "${projectVersion}"
+}
+
+repositories {
+    mavenLocal()  // Not needed for your own project.
+    mavenCentral()
+}
+
+dependencies {
+    annotationProcessor("org.apache.airflow:airflow-sdk-processor:${projectVersion}")
+    implementation("org.apache.airflow:airflow-sdk:${projectVersion}")
+    implementation("org.slf4j:slf4j-simple:2.0.17")
+}
+
+java {
+    toolchain {
+        languageVersion.set(JavaLanguageVersion.of(11))
+    }
+    sourceCompatibility = JavaVersion.VERSION_11
+}
+
+sourceSets {
+    main {
+        java.srcDir("src/java")
+    }
+}
+
+airflowBundle {
+    mainClass = "org.apache.airflow.k8sexample.K8sBundleBuilder"
+}
diff --git a/java-sdk/k8s-example/gradle.properties b/java-sdk/k8s-example/gradle.properties
new file mode 100644
index 0000000000000..d823c0c35d9e1
--- /dev/null
+++ b/java-sdk/k8s-example/gradle.properties
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+projectVersion=1.0.0-SNAPSHOT
diff --git a/java-sdk/k8s-example/settings.gradle b/java-sdk/k8s-example/settings.gradle
new file mode 100644
index 0000000000000..e50235a34d568
--- /dev/null
+++ b/java-sdk/k8s-example/settings.gradle
@@ -0,0 +1,33 @@
+/*
+ * 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.
+ */
+
+// This is only needed since we want to route the plugin to the local build.
+// You don't need it in your own project.
+pluginManagement {
+    repositories {
+        mavenLocal()
+        gradlePluginPortal()
+    }
+}
+
+plugins {
+    id("org.gradle.toolchains.foojay-resolver-convention") version "0.10.0"
+}
+
+rootProject.name = "airflow-java-sdk-k8s-example"
diff --git a/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/CombinedExample.java b/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/CombinedExample.java
new file mode 100644
index 0000000000000..25fc1ef0b8840
--- /dev/null
+++ b/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/CombinedExample.java
@@ -0,0 +1,47 @@
+/*
+ * 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.
+ */
+
+package org.apache.airflow.k8sexample;
+
+import java.util.Date;
+import org.apache.airflow.sdk.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+// Java half of the KubernetesExecutor lang-SDK system test bundle. Registers the
+// Java tasks of the shared "lang_sdk_combined" Dag; the Go tasks of the same
+// dag_id live in go-sdk/example/k8s_combined and the Python stub Dag in
+// kubernetes-tests/lang_sdk/dags. The coordinator locates this jar by dag_id, so
+// only the Java tasks are registered here.
+@Builder.Dag(id = "lang_sdk_combined")
+public class CombinedExample {
+  private static final Logger logger = LoggerFactory.getLogger(CombinedExample.class);
+
+  @Builder.Task(id = "java_extract")
+  public long extract(Client client) {
+    logger.info("java_extract running");
+    return new Date().getTime();
+  }
+
+  @Builder.Task(id = "java_transform")
+  public void transform(Client client) {
+    var variable = client.getVariable("my_variable");
+    logger.info("java_transform obtained variable {}", variable);
+  }
+}
diff --git a/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java b/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
new file mode 100644
index 0000000000000..8333567da83ed
--- /dev/null
+++ b/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ */
+
+package org.apache.airflow.k8sexample;
+
+import java.util.List;
+import org.apache.airflow.sdk.*;
+import org.jetbrains.annotations.NotNull;
+
+// CombinedExampleBuilder is generated by the annotation processor from the
+// @Builder.Dag class CombinedExample.
+public class K8sBundleBuilder implements BundleBuilder {
+  @NotNull
+  @Override
+  public Iterable<Dag> getDags() {
+    return List.of(CombinedExampleBuilder.build());
+  }
+
+  public static void main(String[] args) {
+    var bundle = new K8sBundleBuilder().build();
+    Server.create(args).serve(bundle);
+  }
+}
diff --git a/kubernetes-tests/lang_sdk/Dockerfile.java b/kubernetes-tests/lang_sdk/Dockerfile.java
new file mode 100644
index 0000000000000..59a91f8699f9f
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/Dockerfile.java
@@ -0,0 +1,31 @@
+# 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.
+#
+# Java worker image for the "java" queue: the stock prod image plus a headless
+# JRE so the JavaCoordinator can exec `java`. The Go queue runs on the plain
+# prod image (a Go bundle is a self-contained static binary), so keeping this a
+# separate image demonstrates routing each coordinator's queue to its own
+# pod_template_file with a queue-specific base image.
+ARG BASE_IMAGE
+FROM ${BASE_IMAGE}
+
+USER root
+RUN apt-get update \
+    && apt-get install --no-install-recommends -y default-jre-headless \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+USER airflow
diff --git a/kubernetes-tests/lang_sdk/README.md b/kubernetes-tests/lang_sdk/README.md
new file mode 100644
index 0000000000000..87afc9a811d44
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/README.md
@@ -0,0 +1,95 @@
+<!--
+ 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.
+-->
+
+# lang-SDK coordinator system test (KubernetesExecutor)
+
+End-to-end test that one Dag mixing **Python + Go + Java** tasks runs to success on
+`KubernetesExecutor`, using the per-queue `extra.pod_template_file` routing added to the
+`[sdk] coordinators` config. The test lives at
+`kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py`.
+
+## How it fits together
+
+```
+                    localstack (S3)                     scheduler (KubernetesExecutor)
+   go-artifacts ─┐   ┌ dags bucket ── S3DagBundle ──► dag-processor parses lang_sdk_combined.py
+   java-artifacts┘   │                                         │ task on queue golang/java
+                     │                                         ▼
+   stub Dag ─────────┘                       reads [sdk] coordinators[key].extra.pod_template_file
+                                                              │
+                          worker pod (from that pod template):
+                          initContainer  stage_artifacts.py  ── S3DagBundle.initialize() ──►
+                              pulls go-artifacts / java-artifacts bucket into the shared
+                              emptyDir = executables_root / jars_root
+                          base container  supervisor → coordinator forks the Go binary / Java jar
+```
+
+Key point: in coordinator mode the worker pod does **not** run the Python task-runner,
+so the artifact is not downloaded by the normal Dag-bundle path. The init container runs
+`stage_artifacts.py`, which reuses the **DagBundle interface**
+(`DagBundlesManager().get_bundle(name).initialize()` — the download half of
+`task_runner.parse`) to pull the artifact from its S3 bucket into the path the
+coordinator scans.
+
+## Components
+
+| Path | Role |
+| --- | --- |
+| `dags/lang_sdk_combined.py` | Python stub Dag (`dag_id=lang_sdk_combined`); uploaded to the `dags` bucket. |
+| `../../../go-sdk/example/k8s_combined` | Go bundle: `go_extract` / `go_transform` under `lang_sdk_combined`. |
+| `../../../java-sdk/k8s-example` | Java bundle: `java_extract` / `java_transform` under `lang_sdk_combined`. |
+| `stage_artifacts.py` | Init-container entrypoint; stages an artifact bucket via DagBundle. |
+| `pod_templates/lang_sdk_golang.yaml` | `golang` queue worker pod: prod image + go-artifacts init container. |
+| `pod_templates/lang_sdk_java.yaml` | `java` queue worker pod: JVM image + java-artifacts init container. |
+| `manifests/localstack.yaml` | In-cluster S3 (localstack). |
+| `config/values.yaml` | Helm overrides: KubernetesExecutor, coordinators (+extra.pod_template_file), queue routing, stub-Dag S3 bundle, AWS conn, scheduler pod-template mount. |
+
+The Go binary, Java jar, and stub Dag share one object store (localstack) but live in
+**separate buckets** (`go-artifacts`, `java-artifacts`, `dags`).
+
+## Running it
+
+The artifacts, localstack, config, and Helm release are provisioned by a single breeze
+command on top of an already-deployed KubernetesExecutor cluster:
+
+```bash
+# 1. Stand up a KubernetesExecutor cluster.
+#    * configure-cluster creates the `airflow` namespace and test resources.
+#    * --rebuild-base-image bakes the local (unreleased) cncf.kubernetes executor
+#      and task-SDK coordinator code into the image -- without it the released
+#      providers ship instead and the coordinator routing is ignored.
+#    * ui compile-assets must run first so the rebuilt prod image ships the UI
+#      assets the api-server health endpoint serves (the shared test harness
+#      polls it before running).
+breeze k8s create-cluster
+breeze k8s configure-cluster
+breeze ui compile-assets
+breeze k8s build-k8s-image --rebuild-base-image
+breeze k8s upload-k8s-image
+breeze k8s deploy-airflow --executor KubernetesExecutor
+
+# 2. Provision the lang-SDK test: build the Go bundle + Java jar (in Docker),
+#    build + load the Java worker image (prod + JRE for the JavaCoordinator),
+#    deploy localstack, upload artifacts + stub Dag, render config, helm upgrade.
+breeze k8s setup-lang-sdk-test
+
+# 3. Run the test by name (the shared harness triggers a fresh Dag run).
+breeze k8s tests --executor KubernetesExecutor \
+    -- -k test_lang_sdk_combined_dag_succeeds
+```
diff --git a/kubernetes-tests/lang_sdk/config/values.yaml b/kubernetes-tests/lang_sdk/config/values.yaml
new file mode 100644
index 0000000000000..32e903d5aa1a8
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/config/values.yaml
@@ -0,0 +1,60 @@
+# 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.
+#
+# Helm overrides for the lang-SDK KubernetesExecutor system test. Applied with
+# `helm ... -f` by `breeze k8s setup-lang-sdk-test` (which also renders the
+# pod-template image placeholders and creates the lang-sdk-aws-conn secret).
+---
+executor: KubernetesExecutor
+
+# A global AWS connection pointing at the in-cluster localstack S3, used by the
+# dag-processor (to pull the Python stub Dag bundle) and by the artifact
+# init-containers. Sourced from the secret the breeze command creates.
+extraEnv: |
+  - name: AIRFLOW_CONN_AWS_LOCALSTACK
+    valueFrom:
+      secretKeyRef:
+        name: lang-sdk-aws-conn
+        key: uri
+
+# The KubernetesExecutor lives in the scheduler and reads each coordinator's
+# pod_template_file from disk, so mount the rendered templates (configmap created
+# by the breeze command) into the scheduler at the path referenced below.
+scheduler:
+  extraVolumes:
+    - name: lang-sdk-pod-templates
+      configMap:
+        name: lang-sdk-pod-templates
+  extraVolumeMounts:
+    - name: lang-sdk-pod-templates
+      readOnly: true
+      mountPath: /opt/airflow/lang_sdk/pod_templates
+
+config:
+  # Route the golang/java queues to their coordinators, each carrying an
+  # extra.pod_template_file (the worktree-1 feature) so the worker pod is
+  # launched from a coordinator-specific template that stages the artifact and,
+  # for Java, runs on the JVM-bearing image.
+  sdk:
+    # Single-line JSON: airflow.cfg is an ini file, so a value with embedded
+    # newlines would break the rendered configmap.
+    coordinators: '{"go-sdk": {"classpath": "airflow.sdk.coordinators.executable.ExecutableCoordinator", "kwargs": {"executables_root": ["/opt/airflow/artifacts/go-artifacts"]}, "extra": {"pod_template_file": "/opt/airflow/lang_sdk/pod_templates/lang_sdk_golang.yaml"}}, "java-sdk": {"classpath": "airflow.sdk.coordinators.java.JavaCoordinator", "kwargs": {"jars_root": ["/opt/airflow/artifacts/java-artifacts"]}, "extra": {"pod_template_file": "/opt/airflow/lang_sdk/pod_templates/lang_sdk_java.yaml", "worker_container_repository": "lang-sdk-java-worker", "worker_container_tag": "latest"}}}'
+    queue_to_coordinator: '{"golang": "go-sdk", "java": "java-sdk"}'
+  # The Python stub Dag (lang_sdk_combined.py) is pulled from the localstack
+  # "dags" bucket by the dag-processor.
+  dag_processor:
+    dag_bundle_config_list: '[{"name": "lang-sdk-dags", "classpath": "airflow.providers.amazon.aws.bundles.s3.S3DagBundle", "kwargs": {"bucket_name": "dags", "aws_conn_id": "aws_localstack"}}]'
diff --git a/kubernetes-tests/lang_sdk/dags/lang_sdk_combined.py b/kubernetes-tests/lang_sdk/dags/lang_sdk_combined.py
new file mode 100644
index 0000000000000..c7e6fa8604a2b
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/dags/lang_sdk_combined.py
@@ -0,0 +1,80 @@
+# 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.
+"""
+Combined Python + Go + Java stub Dag for the KubernetesExecutor lang-SDK system test.
+
+A single ``lang_sdk_combined`` Dag chains native Python tasks, Go stub tasks, and
+Java stub tasks so one run exercises all three runtimes on KubernetesExecutor::
+
+    python_task_1 >> go_extract >> go_transform >> java_extract >> java_transform >> python_task_2
+
+* ``go_extract`` / ``go_transform`` are ``@task.stub(queue="golang")``; the
+  ``golang`` queue is routed to the ``ExecutableCoordinator``. Their Go
+  implementations live in ``go-sdk/example/k8s_combined`` under this same dag_id.
+* ``java_extract`` / ``java_transform`` are ``@task.stub(queue="java")``; the
+  ``java`` queue is routed to the ``JavaCoordinator``. Their Java
+  implementations live in ``java-sdk/k8s-example`` under this same dag_id.
+* The Python tasks run on the default Python path.
+
+The dag_id and the Go/Java task ids MUST match the identities the bundles expose
+so each coordinator can locate its artifact by dag_id and look up the task by id.
+"""
+
+from __future__ import annotations
+
+from airflow.sdk import dag, task
+
+
+@task()
+def python_task_1():
+    return "value_from_python_task_1"
+
+
+@task.stub(queue="golang")
+def go_extract(): ...
+
+
+@task.stub(queue="golang")
+def go_transform(): ...
+
+
+@task.stub(queue="java")
+def java_extract(): ...
+
+
+@task.stub(queue="java")
+def java_transform(): ...
+
+
+@task()
+def python_task_2():
+    print("python_task_2")
+
+
+@dag(dag_id="lang_sdk_combined")
+def lang_sdk_combined():
+    (
+        python_task_1()
+        >> go_extract()
+        >> go_transform()
+        >> java_extract()
+        >> java_transform()
+        >> python_task_2()
+    )
+
+
+lang_sdk_combined()
diff --git a/kubernetes-tests/lang_sdk/manifests/localstack.yaml b/kubernetes-tests/lang_sdk/manifests/localstack.yaml
new file mode 100644
index 0000000000000..730374c2f007c
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/manifests/localstack.yaml
@@ -0,0 +1,77 @@
+# 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.
+#
+# LocalStack (S3 only) used as the object store backing the lang-SDK system test:
+# the Go binary, Java jar, and Python stub Dag are uploaded to separate S3
+# buckets and pulled into pods via S3DagBundle. Deployed into the ``airflow``
+# namespace so the api-server / dag-processor / worker pods reach it at
+# ``http://localstack.airflow.svc.cluster.local:4566``.
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: localstack
+  namespace: airflow
+  labels:
+    app: localstack
+spec:
+  replicas: 1
+  selector:
+    matchLabels:
+      app: localstack
+  template:
+    metadata:
+      labels:
+        app: localstack
+    spec:
+      containers:
+        - name: localstack
+          image: localstack/localstack:4.7
+          ports:
+            - containerPort: 4566
+          env:
+            - name: SERVICES
+              value: s3
+            - name: AWS_DEFAULT_REGION
+              value: us-east-1
+          readinessProbe:
+            httpGet:
+              path: /_localstack/health
+              port: 4566
+            initialDelaySeconds: 5
+            periodSeconds: 5
+          livenessProbe:
+            httpGet:
+              path: /_localstack/health
+              port: 4566
+            initialDelaySeconds: 10
+            periodSeconds: 10
+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: localstack
+  namespace: airflow
+  labels:
+    app: localstack
+spec:
+  selector:
+    app: localstack
+  ports:
+    - name: edge
+      port: 4566
+      targetPort: 4566
diff --git a/kubernetes-tests/lang_sdk/pod_templates/lang_sdk_golang.yaml b/kubernetes-tests/lang_sdk/pod_templates/lang_sdk_golang.yaml
new file mode 100644
index 0000000000000..e3e700d700012
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/pod_templates/lang_sdk_golang.yaml
@@ -0,0 +1,117 @@
+# 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.
+#
+# Worker pod template for the "golang" queue (ExecutableCoordinator).
+#
+# An init container stages the packed Go bundle from the localstack ``go-artifacts``
+# bucket into a shared emptyDir at /opt/airflow/artifacts via the DagBundle
+# interface (stage_artifacts.py). That path is the coordinator's executables_root.
+# The base image is the plain prod image: a Go bundle is a self-contained static
+# binary, so no extra runtime is needed. Image placeholders are rendered by the
+# ``breeze k8s setup-lang-sdk-test`` command.
+---
+kind: Pod
+apiVersion: v1
+metadata:
+  name: placeholder-name-dont-delete
+  namespace: placeholder-name-dont-delete
+spec:
+  initContainers:
+    - name: stage-go-bundle
+      image: __LANG_SDK_GO_IMAGE__
+      imagePullPolicy: IfNotPresent
+      command: ["python", "/opt/airflow/lang_sdk/stage_artifacts.py"]
+      env:
+        - name: AIRFLOW_HOME
+          value: /opt/airflow
+        - name: ARTIFACT_BUNDLE_NAME
+          value: go-artifacts
+        - name: STAGE_CHMOD_EXEC
+          value: "true"
+        - name: AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_STORAGE_PATH
+          value: /opt/airflow/artifacts
+        - name: AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_CONFIG_LIST
+          value: >-
+            [{"name": "go-artifacts",
+              "classpath": "airflow.providers.amazon.aws.bundles.s3.S3DagBundle",
+              "kwargs": {"bucket_name": "go-artifacts", "aws_conn_id": "aws_localstack"}}]
+        - name: AIRFLOW_CONN_AWS_LOCALSTACK
+          valueFrom:
+            secretKeyRef:
+              name: lang-sdk-aws-conn
+              key: uri
+      volumeMounts:
+        - name: lang-sdk-artifacts
+          mountPath: /opt/airflow/artifacts
+        - name: lang-sdk-scripts
+          readOnly: true
+          mountPath: /opt/airflow/lang_sdk
+  containers:
+    - name: base
+      image: __LANG_SDK_GO_IMAGE__
+      env:
+        - name: AIRFLOW__CORE__EXECUTOR
+          value: LocalExecutor
+        - name: AIRFLOW_HOME
+          value: /opt/airflow
+        - name: AIRFLOW__CORE__DAGS_FOLDER
+          value: /opt/airflow/dags
+        - name: AIRFLOW__CORE__FERNET_KEY
+          valueFrom:
+            secretKeyRef:
+              name: airflow-fernet-key
+              key: fernet-key
+        - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
+          valueFrom:
+            secretKeyRef:
+              name: airflow-metadata
+              key: connection
+      volumeMounts:
+        - name: airflow-logs
+          mountPath: /opt/airflow/logs
+        - name: lang-sdk-artifacts
+          mountPath: /opt/airflow/artifacts
+        - name: airflow-config
+          readOnly: true
+          mountPath: /opt/airflow/airflow.cfg
+          subPath: airflow.cfg
+        - name: airflow-config
+          readOnly: true
+          mountPath: /opt/airflow/config/airflow_local_settings.py
+          subPath: airflow_local_settings.py
+      imagePullPolicy: IfNotPresent
+  volumes:
+    - name: airflow-logs
+      emptyDir: {}
+    - name: lang-sdk-artifacts
+      emptyDir: {}
+    - name: lang-sdk-scripts
+      configMap:
+        name: lang-sdk-scripts
+        defaultMode: 420
+    - name: airflow-config
+      configMap:
+        name: airflow-config
+        defaultMode: 420
+  restartPolicy: Never
+  terminationGracePeriodSeconds: 30
+  serviceAccountName: airflow-worker-kubernetes
+  serviceAccount: airflow-worker-kubernetes
+  securityContext:
+    runAsUser: 50000
+    fsGroup: 50000
+  schedulerName: default-scheduler
diff --git a/kubernetes-tests/lang_sdk/pod_templates/lang_sdk_java.yaml b/kubernetes-tests/lang_sdk/pod_templates/lang_sdk_java.yaml
new file mode 100644
index 0000000000000..eaccd63f4d2ad
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/pod_templates/lang_sdk_java.yaml
@@ -0,0 +1,115 @@
+# 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.
+#
+# Worker pod template for the "java" queue (JavaCoordinator).
+#
+# An init container stages the Java jar from the localstack ``java-artifacts``
+# bucket into a shared emptyDir at /opt/airflow/artifacts via the DagBundle
+# interface (stage_artifacts.py). That path is the coordinator's jars_root. The
+# base image is the prod image plus a headless JRE (built from Dockerfile.java)
+# so the JavaCoordinator can exec ``java`` -- distinct from the Go queue's plain
+# prod image. Image placeholders are rendered by ``breeze k8s setup-lang-sdk-test``.
+---
+kind: Pod
+apiVersion: v1
+metadata:
+  name: placeholder-name-dont-delete
+  namespace: placeholder-name-dont-delete
+spec:
+  initContainers:
+    - name: stage-java-jar
+      image: __LANG_SDK_JAVA_IMAGE__
+      imagePullPolicy: IfNotPresent
+      command: ["python", "/opt/airflow/lang_sdk/stage_artifacts.py"]
+      env:
+        - name: AIRFLOW_HOME
+          value: /opt/airflow
+        - name: ARTIFACT_BUNDLE_NAME
+          value: java-artifacts
+        - name: AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_STORAGE_PATH
+          value: /opt/airflow/artifacts
+        - name: AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_CONFIG_LIST
+          value: >-
+            [{"name": "java-artifacts",
+              "classpath": "airflow.providers.amazon.aws.bundles.s3.S3DagBundle",
+              "kwargs": {"bucket_name": "java-artifacts", "aws_conn_id": "aws_localstack"}}]
+        - name: AIRFLOW_CONN_AWS_LOCALSTACK
+          valueFrom:
+            secretKeyRef:
+              name: lang-sdk-aws-conn
+              key: uri
+      volumeMounts:
+        - name: lang-sdk-artifacts
+          mountPath: /opt/airflow/artifacts
+        - name: lang-sdk-scripts
+          readOnly: true
+          mountPath: /opt/airflow/lang_sdk
+  containers:
+    - name: base
+      image: __LANG_SDK_JAVA_IMAGE__
+      env:
+        - name: AIRFLOW__CORE__EXECUTOR
+          value: LocalExecutor
+        - name: AIRFLOW_HOME
+          value: /opt/airflow
+        - name: AIRFLOW__CORE__DAGS_FOLDER
+          value: /opt/airflow/dags
+        - name: AIRFLOW__CORE__FERNET_KEY
+          valueFrom:
+            secretKeyRef:
+              name: airflow-fernet-key
+              key: fernet-key
+        - name: AIRFLOW__DATABASE__SQL_ALCHEMY_CONN
+          valueFrom:
+            secretKeyRef:
+              name: airflow-metadata
+              key: connection
+      volumeMounts:
+        - name: airflow-logs
+          mountPath: /opt/airflow/logs
+        - name: lang-sdk-artifacts
+          mountPath: /opt/airflow/artifacts
+        - name: airflow-config
+          readOnly: true
+          mountPath: /opt/airflow/airflow.cfg
+          subPath: airflow.cfg
+        - name: airflow-config
+          readOnly: true
+          mountPath: /opt/airflow/config/airflow_local_settings.py
+          subPath: airflow_local_settings.py
+      imagePullPolicy: IfNotPresent
+  volumes:
+    - name: airflow-logs
+      emptyDir: {}
+    - name: lang-sdk-artifacts
+      emptyDir: {}
+    - name: lang-sdk-scripts
+      configMap:
+        name: lang-sdk-scripts
+        defaultMode: 420
+    - name: airflow-config
+      configMap:
+        name: airflow-config
+        defaultMode: 420
+  restartPolicy: Never
+  terminationGracePeriodSeconds: 30
+  serviceAccountName: airflow-worker-kubernetes
+  serviceAccount: airflow-worker-kubernetes
+  securityContext:
+    runAsUser: 50000
+    fsGroup: 50000
+  schedulerName: default-scheduler
diff --git a/kubernetes-tests/lang_sdk/stage_artifacts.py b/kubernetes-tests/lang_sdk/stage_artifacts.py
new file mode 100644
index 0000000000000..3da9ac6fb5a72
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/stage_artifacts.py
@@ -0,0 +1,92 @@
+# 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.
+"""
+Init-container entrypoint that stages a lang-SDK artifact bundle into a worker pod.
+
+This reuses the **DagBundle** machinery as the interface to the object store: it
+runs the same ``get_bundle(name).initialize()`` download step that
+:func:`airflow.sdk.execution_time.task_runner.parse` performs (minus the DAG
+parse), so the Go binary / Java jar stored in an S3 (localstack) bucket is pulled
+into ``bundle.path`` = ``{dag_bundle_storage_path}/{name}``.
+
+That path is the ``emptyDir`` shared with the worker container and is exactly the
+``executables_root`` / ``jars_root`` the coordinator scans. Coordinator mode never
+runs the Python task-runner in the worker pod, so without this step the artifact
+would never reach the pod.
+
+Configuration is read from the environment (set by the pod template):
+
+* ``ARTIFACT_BUNDLE_NAME`` -- the bundle key in ``[dag_processor]
+  dag_bundle_config_list`` to initialize.
+* ``AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_CONFIG_LIST`` -- registers that S3 bundle.
+* ``AIRFLOW__DAG_PROCESSOR__DAG_BUNDLE_STORAGE_PATH`` -- the shared ``emptyDir``.
+* ``STAGE_CHMOD_EXEC`` -- ``"true"`` for Go (the packed binary needs the execute
+  bit, which an S3 download does not preserve); unset/false for Java jars.
+"""
+
+from __future__ import annotations
+
+import os
+import stat
+import sys
+from pathlib import Path
+
+import structlog
+
+log = structlog.get_logger(logger_name=__name__)
+
+
+def stage_artifacts(bundle_name: str, *, make_executable: bool) -> Path:
+    """Initialize *bundle_name* via the DagBundle manager and return its local path."""
+    from airflow.dag_processing.bundles.manager import DagBundlesManager
+
+    bundle = DagBundlesManager().get_bundle(name=bundle_name)
+    bundle.initialize()
+    root = Path(bundle.path)
+
+    staged = sorted(p for p in root.rglob("*") if p.is_file())
+    if make_executable:
+        for p in staged:
+            p.chmod(p.stat().st_mode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH)
+
+    log.info(
+        "Staged artifact bundle",
+        bundle=bundle_name,
+        path=str(root),
+        files=[str(p.relative_to(root)) for p in staged],
+        made_executable=make_executable,
+    )
+    return root
+
+
+def main() -> None:
+    try:
+        bundle_name = os.environ["ARTIFACT_BUNDLE_NAME"]
+    except KeyError:
+        log.error("ARTIFACT_BUNDLE_NAME is required")
+        sys.exit(2)
+
+    make_executable = os.environ.get("STAGE_CHMOD_EXEC", "").lower() == "true"
+    root = stage_artifacts(bundle_name, make_executable=make_executable)
+
+    if not any(root.rglob("*")):
+        log.error("Artifact bundle is empty after staging", bundle=bundle_name, path=str(root))
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py b/kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py
new file mode 100644
index 0000000000000..cf418dbf173be
--- /dev/null
+++ b/kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py
@@ -0,0 +1,81 @@
+# 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.
+"""
+End-to-end test of the lang-SDK coordinators on KubernetesExecutor.
+
+Triggers the ``lang_sdk_combined`` Dag (Python + Go + Java tasks in one graph)
+and asserts every task instance and the Dag run reach ``success``. This exercises
+the full path the worktree-1 feature enables: the ``golang``/``java`` queues are
+routed to their coordinators, each coordinator's ``pod_template_file`` launches a
+worker pod whose init-container stages the artifact from localstack S3 via the
+DagBundle interface, and the coordinator then runs the Go binary / Java jar.
+
+Prerequisites are provisioned by ``breeze k8s setup-lang-sdk-test``.
+"""
+
+from __future__ import annotations
+
+import pytest
+
+from kubernetes_tests.test_base import EXECUTOR, BaseK8STest
+
+DAG_ID = "lang_sdk_combined"
+TASK_IDS = [
+    "python_task_1",
+    "go_extract",
+    "go_transform",
+    "java_extract",
+    "java_transform",
+    "python_task_2",
+]
+# Each task is a fresh pod (KubernetesExecutor) and the lang tasks also pull an
+# artifact + start a coordinator subprocess, so allow generous headroom.
+_TIMEOUT = 600
+
+
+@pytest.mark.skipif(EXECUTOR != "KubernetesExecutor", reason="Only runs on KubernetesExecutor")
+class TestLangSdkCoordinatorExecutor(BaseK8STest):
+    def _ensure_variable(self, key: str, value: str) -> None:
+        """Create the Airflow Variable the Go/Java transform tasks read (idempotent)."""
+        resp = self.session.post(f"http://{self.host}/variables", json={"key": key, "value": value})
+        # 409 == already exists from a previous run; both are acceptable.
+        assert resp.status_code in (200, 201, 409), f"Could not create variable {key}: {resp.text}"
+
+    @pytest.mark.execution_timeout(900)
+    def test_lang_sdk_combined_dag_succeeds(self):
+        self._ensure_variable("my_variable", "value_from_test")
+
+        dag_run_id, logical_date = self.start_job_in_kubernetes(DAG_ID, self.host)
+        print(f"Triggered {DAG_ID} run {dag_run_id} (logical_date={logical_date})")
+
+        for task_id in TASK_IDS:
+            self.monitor_task(
+                host=self.host,
+                dag_run_id=dag_run_id,
+                dag_id=DAG_ID,
+                task_id=task_id,
+                expected_final_state="success",
+                timeout=_TIMEOUT,
+            )
+
+        self.ensure_dag_expected_state(
+            host=self.host,
+            logical_date=logical_date,
+            dag_id=DAG_ID,
+            expected_final_state="success",
+            timeout=_TIMEOUT,
+        )

From ec67c698dda55b11c523c295f77178def69150f0 Mon Sep 17 00:00:00 2001
From: LIU ZHE YOU <zhu424.dev@gmail.com>
Date: Wed, 1 Jul 2026 12:28:20 +0900
Subject: [PATCH 2/4] Wire up lang-sdk test with breeze k8s command

---
 .github/workflows/k8s-tests.yml               |   3 +
 dev/breeze/doc/images/output_k8s.svg          |   4 +-
 dev/breeze/doc/images/output_k8s.txt          |   2 +-
 .../images/output_k8s_run-complete-tests.svg  |  72 +++++----
 .../images/output_k8s_run-complete-tests.txt  |   2 +-
 .../images/output_k8s_setup-lang-sdk-test.svg |   4 +-
 .../images/output_k8s_setup-lang-sdk-test.txt |   2 +-
 .../commands/kubernetes_commands.py           | 151 +++++++++++++++---
 .../commands/kubernetes_commands_config.py    |   8 +-
 kubernetes-tests/lang_sdk/README.md           |  12 +-
 kubernetes-tests/lang_sdk/config/values.yaml  |   2 +
 .../test_lang_sdk_coordinator_executor.py     |   9 +-
 12 files changed, 210 insertions(+), 61 deletions(-)

diff --git a/.github/workflows/k8s-tests.yml b/.github/workflows/k8s-tests.yml
index 34026d1393a75..029114b8540fa 100644
--- a/.github/workflows/k8s-tests.yml
+++ b/.github/workflows/k8s-tests.yml
@@ -103,6 +103,9 @@ jobs:
         env:
           EXECUTOR: ${{ matrix.executor }}
           USE_STANDARD_NAMING: ${{ matrix.use-standard-naming }}
+          # Provision + run the lang-SDK coordinator system test in a single variant only
+          # (KubernetesExecutor, standard-naming off) to keep it off the other five k8s jobs.
+          RUN_LANG_SDK_K8S_TESTS: ${{ (matrix.executor == 'KubernetesExecutor' && matrix.use-standard-naming == false) && 'true' || 'false' }}  # yamllint disable-line rule:line-length
           VERBOSE: "false"
       - name: "\
           Print logs ${{ matrix.executor }}-${{ matrix.kubernetes-combo }}-\
diff --git a/dev/breeze/doc/images/output_k8s.svg b/dev/breeze/doc/images/output_k8s.svg
index a76c947f06e72..33dfb7ca92762 100644
--- a/dev/breeze/doc/images/output_k8s.svg
+++ b/dev/breeze/doc/images/output_k8s.svg
@@ -201,8 +201,8 @@
 </text><text class="breeze-k8s-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r4" x="24.4" y="752" textLength="231.8" clip-path="url(#breeze-k8s-line-30)">setup-lang-sdk-test</text><text class="breeze-k8s-r1" x="280.6" y="752" textLength="1159" clip-path="url(#breeze-k8s-line-30)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java)&#160;coordinator&#160;system&#160;test&#160;on&#160;an&#160;already-deployed&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">│</text><text class="breeze-k8s-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-k8s-line-30)">
 </text><text class="breeze-k8s-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">│</text><text class="breeze-k8s-r1" x="280.6" y="776.4" textLength="1159" clip-path="url(#breeze-k8s-line-31)">KubernetesExecutor&#160;cluster:&#160;build&#160;artifacts,&#160;build&#160;+&#160;load&#160;the&#160;Java&#160;worker&#160;image,&#160;deploy&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">│</text><text class="breeze-k8s-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-line-31)">
 </text><text class="breeze-k8s-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-line-32)">│</text><text class="breeze-k8s-r1" x="280.6" y="800.8" textLength="1159" clip-path="url(#breeze-k8s-line-32)">localstack&#160;S3,&#160;upload&#160;artifacts&#160;+&#160;stub&#160;Dag,&#160;create&#160;config,&#160;and&#160;upgrade&#160;the&#160;Helm&#160;release.&#160;Run&#160;&#160;&#160;</text><text class="breeze-k8s-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-line-32)">│</text><text class="breeze-k8s-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-line-32)">
-</text><text class="breeze-k8s-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">│</text><text class="breeze-k8s-r1" x="280.6" y="825.2" textLength="524.6" clip-path="url(#breeze-k8s-line-33)">the&#160;test&#160;afterwards&#160;with&#160;`breeze&#160;k8s&#160;tests&#160;</text><text class="breeze-k8s-r4" x="805.2" y="825.2" textLength="122" clip-path="url(#breeze-k8s-line-33)">--executor</text><text class="breeze-k8s-r1" x="927.2" y="825.2" textLength="280.6" clip-path="url(#breeze-k8s-line-33)">&#160;KubernetesExecutor&#160;--&#160;</text><text class="breeze-k8s-r6" x="1207.8" y="825.2" textLength="24.4" clip-path="url(#breeze-k8s-line-33)">-k</text><text class="breeze-k8s-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">│</text><text class="breeze-k8s-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">
-</text><text class="breeze-k8s-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">│</text><text class="breeze-k8s-r1" x="280.6" y="849.6" textLength="1159" clip-path="url(#breeze-k8s-line-34)">test_lang_sdk_combined_dag_succeeds`.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">│</text><text class="breeze-k8s-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">
+</text><text class="breeze-k8s-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">│</text><text class="breeze-k8s-r1" x="280.6" y="825.2" textLength="866.2" clip-path="url(#breeze-k8s-line-33)">the&#160;test&#160;afterwards&#160;with&#160;`RUN_LANG_SDK_K8S_TESTS=true&#160;breeze&#160;k8s&#160;tests&#160;</text><text class="breeze-k8s-r4" x="1146.8" y="825.2" textLength="122" clip-path="url(#breeze-k8s-line-33)">--executor</text><text class="breeze-k8s-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">│</text><text class="breeze-k8s-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-line-33)">
+</text><text class="breeze-k8s-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">│</text><text class="breeze-k8s-r1" x="280.6" y="849.6" textLength="268.4" clip-path="url(#breeze-k8s-line-34)">KubernetesExecutor&#160;--&#160;</text><text class="breeze-k8s-r6" x="549" y="849.6" textLength="24.4" clip-path="url(#breeze-k8s-line-34)">-k</text><text class="breeze-k8s-r1" x="573.4" y="849.6" textLength="866.2" clip-path="url(#breeze-k8s-line-34)">&#160;test_lang_sdk_combined_dag_succeeds`.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">│</text><text class="breeze-k8s-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-line-34)">
 </text><text class="breeze-k8s-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-k8s-line-35)">│</text><text class="breeze-k8s-r4" x="24.4" y="874" textLength="231.8" clip-path="url(#breeze-k8s-line-35)">shell&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="280.6" y="874" textLength="1159" clip-path="url(#breeze-k8s-line-35)">Run&#160;shell&#160;environment&#160;for&#160;the&#160;current&#160;KinD&#160;cluster.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-k8s-line-35)">│</text><text class="breeze-k8s-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-k8s-line-35)">
 </text><text class="breeze-k8s-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-line-36)">│</text><text class="breeze-k8s-r4" x="24.4" y="898.4" textLength="231.8" clip-path="url(#breeze-k8s-line-36)">k9s&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-r1" x="280.6" y="898.4" textLength="1159" clip-path="url(#breeze-k8s-line-36)">Run&#160;k9s&#160;tool.&#160;You&#160;can&#160;pass&#160;any&#160;k9s&#160;args&#160;as&#160;extra&#160;args.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-k8s-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-line-36)">│</text><text class="breeze-k8s-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-line-36)">
 </text><text class="breeze-k8s-r5" x="0" y="922.8" textLength="1464" clip-path="url(#breeze-k8s-line-37)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-r1" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-line-37)">
diff --git a/dev/breeze/doc/images/output_k8s.txt b/dev/breeze/doc/images/output_k8s.txt
index b107ea5132ae5..9905cb9eb1454 100644
--- a/dev/breeze/doc/images/output_k8s.txt
+++ b/dev/breeze/doc/images/output_k8s.txt
@@ -1 +1 @@
-6cee97283c102523c503e3d27a76e177
+bbfb153dc7f511c65455bcf213bef665
diff --git a/dev/breeze/doc/images/output_k8s_run-complete-tests.svg b/dev/breeze/doc/images/output_k8s_run-complete-tests.svg
index 7af3fc6182b40..6f378e470770d 100644
--- a/dev/breeze/doc/images/output_k8s_run-complete-tests.svg
+++ b/dev/breeze/doc/images/output_k8s_run-complete-tests.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1172.3999999999999" xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 1270.0" xmlns="http://www.w3.org/2000/svg">
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-k8s-run-complete-tests-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1121.3999999999999" />
+      <rect x="0" y="0" width="1463.0" height="1219.0" />
     </clipPath>
     <clipPath id="breeze-k8s-run-complete-tests-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -180,9 +180,21 @@
 <clipPath id="breeze-k8s-run-complete-tests-line-44">
     <rect x="0" y="1075.1" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-k8s-run-complete-tests-line-45">
+    <rect x="0" y="1099.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-run-complete-tests-line-46">
+    <rect x="0" y="1123.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-run-complete-tests-line-47">
+    <rect x="0" y="1148.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-k8s-run-complete-tests-line-48">
+    <rect x="0" y="1172.7" 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="1170.4" rx="8"/><text class="breeze-k8s-run-complete-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;run-complete-tests</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="1480" height="1268" rx="8"/><text class="breeze-k8s-run-complete-tests-title" fill="#c5c8c6" text-anchor="middle" x="740" y="27">Command:&#160;k8s&#160;run-complete-tests</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -213,31 +225,35 @@
 </text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="585.6" y="459.2" textLength="85.4" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">use-uv]</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="459.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-18)">
 </text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="483.6" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-19)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="483.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-19)">
 </text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="508" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">╭─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="508" textLength="207.4" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">&#160;K8S&#160;tests&#160;flags&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="231.8" y="508" textLength="1207.8" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">───────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-run-complete-tests-r5" x="1439.6" y="508" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">─╮</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="508" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-20)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="532.4" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">--python&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r7" x="292.8" y="532.4" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">-p</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="532.4" textLength="744.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">Python&#160;major/minor&#160;version&#160;used&#160;in&#160;Airflow&#160;image&#160;for&#160;images.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1085.8" y="532.4" textLength="183" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">[default:&#160;3.10]</text><text class="breeze-k8s-run-complete-tests-r6" x="1281" y="532.4" textLength="122" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">(&gt;3.10&lt;&#160;|&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="556.8" textLength="317.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">3.11&#160;|&#160;3.12&#160;|&#160;3.13&#160;|&#160;3.14)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="581.2" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">--kubernetes-version</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="581.2" textLength="671" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">Kubernetes&#160;version&#160;used&#160;to&#160;create&#160;the&#160;KinD&#160;cluster&#160;of.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1012.6" y="581.2" textLength="231.8" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">[default:&#160;v1.30.13]</text><text class="breeze-k8s-run-complete-tests-r6" x="1256.6" y="581.2" textLength="170.8" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">(&gt;v1.30.13&lt;&#160;|&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="605.6" textLength="597.8" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">v1.31.12&#160;|&#160;v1.32.8&#160;|&#160;v1.33.4&#160;|&#160;v1.34.0&#160;|&#160;v1.35.0)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="630" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">--executor&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="630" textLength="512.4" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">Executor&#160;to&#160;use&#160;for&#160;a&#160;kubernetes&#160;cluster.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="854" y="630" textLength="292.8" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">[default:&#160;LocalExecutor]</text><text class="breeze-k8s-run-complete-tests-r6" x="1159" y="630" textLength="231.8" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">(&gt;LocalExecutor&lt;&#160;|&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="341.6" y="654.4" textLength="951.6" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">KubernetesExecutor&#160;|&#160;CeleryExecutor&#160;|&#160;CeleryKubernetesExecutor&#160;|&#160;EdgeExecutor)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="678.8" textLength="244" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">--force-venv-setup&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="341.6" y="678.8" textLength="427" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">Force&#160;recreation&#160;of&#160;the&#160;virtualenv.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="703.2" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="727.6" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">╭─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="727.6" textLength="219.6" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">&#160;Parallel&#160;options&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="244" y="727.6" textLength="1195.6" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-run-complete-tests-r5" x="1439.6" y="727.6" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">─╮</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="752" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">--run-in-parallel&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="752" textLength="854" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">Run&#160;the&#160;operation&#160;in&#160;parallel&#160;on&#160;all&#160;or&#160;selected&#160;subset&#160;of&#160;parameters.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="776.4" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">--parallelism&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="776.4" textLength="1085.8" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">Maximum&#160;number&#160;of&#160;processes&#160;to&#160;use&#160;while&#160;running&#160;the&#160;operation&#160;in&#160;parallel&#160;for&#160;cluster&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="800.8" textLength="146.4" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">operations.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="500.2" y="800.8" textLength="146.4" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">[default:&#160;2]</text><text class="breeze-k8s-run-complete-tests-r6" x="658.8" y="800.8" textLength="280.6" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">(INTEGER&#160;RANGE&#160;1&lt;=x&lt;=4)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="825.2" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">--python-versions&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="825.2" textLength="963.8" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">Space&#160;separated&#160;list&#160;of&#160;python&#160;versions&#160;used&#160;for&#160;build&#160;with&#160;multiple&#160;versions.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1317.6" y="825.2" textLength="122" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">[default:&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="353.8" y="849.6" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">3.10&#160;3.11&#160;3.12&#160;3.13&#160;3.14]</text><text class="breeze-k8s-run-complete-tests-r6" x="671" y="849.6" textLength="73.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">(TEXT)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="874" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">--kubernetes-versions&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="874" textLength="768.6" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">Kubernetes&#160;versions&#160;used&#160;to&#160;run&#160;in&#160;parallel&#160;(space&#160;separated).&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1122.4" y="874" textLength="231.8" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">[default:&#160;v1.30.13&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="353.8" y="898.4" textLength="500.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">v1.31.12&#160;v1.32.8&#160;v1.33.4&#160;v1.34.0&#160;v1.35.0]</text><text class="breeze-k8s-run-complete-tests-r6" x="866.2" y="898.4" textLength="73.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">(TEXT)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="922.8" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">--skip-cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="922.8" textLength="732" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">Skip&#160;cleanup&#160;of&#160;temporary&#160;files&#160;created&#160;during&#160;parallel&#160;run.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="947.2" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">--debug-resources&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="947.2" textLength="768.6" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">Whether&#160;to&#160;show&#160;resource&#160;information&#160;while&#160;running&#160;in&#160;parallel.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="971.6" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">--include-success-outputs</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="971.6" textLength="841.8" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">Whether&#160;to&#160;include&#160;outputs&#160;of&#160;successful&#160;runs&#160;(not&#160;shown&#160;by&#160;default).</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="971.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="996" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1020.4" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">╭─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="1020.4" textLength="195.2" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">&#160;Common&#160;options&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="219.6" y="1020.4" textLength="1220" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-run-complete-tests-r5" x="1439.6" y="1020.4" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">─╮</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1020.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1044.8" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">--dry-run</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1044.8" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">-D</text><text class="breeze-k8s-run-complete-tests-r1" x="207.4" y="1044.8" textLength="719.8" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1044.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1044.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1069.2" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">--verbose</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1069.2" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">-v</text><text class="breeze-k8s-run-complete-tests-r1" x="207.4" y="1069.2" textLength="585.6" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1069.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1093.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1093.6" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">--help&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1093.6" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">-h</text><text class="breeze-k8s-run-complete-tests-r1" x="207.4" y="1093.6" textLength="329.4" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1093.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">
-</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1118" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="532.4" textLength="414.8" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">--python&#160;&#160;&#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-k8s-run-complete-tests-r7" x="463.6" y="532.4" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">-p</text><text class="breeze-k8s-run-complete-tests-r1" x="512.4" y="532.4" textLength="744.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">Python&#160;major/minor&#160;version&#160;used&#160;in&#160;Airflow&#160;image&#160;for&#160;images.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1256.6" y="532.4" textLength="183" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">[default:&#160;3.10]</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="532.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-21)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="512.4" y="556.8" textLength="439.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">(&gt;3.10&lt;&#160;|&#160;3.11&#160;|&#160;3.12&#160;|&#160;3.13&#160;|&#160;3.14)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="556.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-22)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="581.2" textLength="414.8" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">--kubernetes-version&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="512.4" y="581.2" textLength="671" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">Kubernetes&#160;version&#160;used&#160;to&#160;create&#160;the&#160;KinD&#160;cluster&#160;of.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1183.4" y="581.2" textLength="231.8" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">[default:&#160;v1.30.13]</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="581.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-23)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="512.4" y="605.6" textLength="768.6" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">(&gt;v1.30.13&lt;&#160;|&#160;v1.31.12&#160;|&#160;v1.32.8&#160;|&#160;v1.33.4&#160;|&#160;v1.34.0&#160;|&#160;v1.35.0)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="605.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-24)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="630" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="630" textLength="414.8" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">--executor&#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-k8s-run-complete-tests-r1" x="512.4" y="630" textLength="512.4" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">Executor&#160;to&#160;use&#160;for&#160;a&#160;kubernetes&#160;cluster.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1024.8" y="630" textLength="292.8" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">[default:&#160;LocalExecutor]</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="630" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="630" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-25)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="512.4" y="654.4" textLength="695.4" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">(&gt;LocalExecutor&lt;&#160;|&#160;KubernetesExecutor&#160;|&#160;CeleryExecutor&#160;|&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="654.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-26)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">│</text><text class="breeze-k8s-run-complete-tests-r6" x="512.4" y="678.8" textLength="488" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">CeleryKubernetesExecutor&#160;|&#160;EdgeExecutor)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="678.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-27)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="703.2" textLength="183" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">--lang-sdk-test</text><text class="breeze-k8s-run-complete-tests-r1" x="207.4" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">/</text><text class="breeze-k8s-run-complete-tests-r4" x="219.6" y="703.2" textLength="219.6" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">--no-lang-sdk-test</text><text class="breeze-k8s-run-complete-tests-r1" x="512.4" y="703.2" textLength="927.2" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java)&#160;coordinator&#160;env&#160;and&#160;run&#160;its&#160;system&#160;test&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="703.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-28)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="512.4" y="727.6" textLength="927.2" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">as&#160;part&#160;of&#160;the&#160;run&#160;(KubernetesExecutor&#160;only).&#160;Off&#160;by&#160;default&#160;so&#160;the&#160;regular&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="727.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-29)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="752" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="512.4" y="752" textLength="317.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">k8s&#160;suites&#160;skip&#160;the&#160;test.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="829.6" y="752" textLength="329.4" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">[default:&#160;no-lang-sdk-test]</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="752" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="752" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-30)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="776.4" textLength="414.8" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">--force-venv-setup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="512.4" y="776.4" textLength="427" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">Force&#160;recreation&#160;of&#160;the&#160;virtualenv.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="776.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-31)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="800.8" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="800.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-32)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="825.2" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">╭─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="825.2" textLength="219.6" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">&#160;Parallel&#160;options&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="244" y="825.2" textLength="1195.6" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">──────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-run-complete-tests-r5" x="1439.6" y="825.2" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">─╮</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="825.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-33)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="849.6" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">--run-in-parallel&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="849.6" textLength="854" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">Run&#160;the&#160;operation&#160;in&#160;parallel&#160;on&#160;all&#160;or&#160;selected&#160;subset&#160;of&#160;parameters.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="849.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-34)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="874" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="874" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">--parallelism&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="874" textLength="1085.8" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">Maximum&#160;number&#160;of&#160;processes&#160;to&#160;use&#160;while&#160;running&#160;the&#160;operation&#160;in&#160;parallel&#160;for&#160;cluster&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="874" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="874" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-35)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="898.4" textLength="146.4" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">operations.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="500.2" y="898.4" textLength="146.4" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">[default:&#160;2]</text><text class="breeze-k8s-run-complete-tests-r6" x="658.8" y="898.4" textLength="280.6" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">(INTEGER&#160;RANGE&#160;1&lt;=x&lt;=4)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="898.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-36)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="922.8" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">--python-versions&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="922.8" textLength="963.8" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">Space&#160;separated&#160;list&#160;of&#160;python&#160;versions&#160;used&#160;for&#160;build&#160;with&#160;multiple&#160;versions.&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1317.6" y="922.8" textLength="122" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">[default:&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="922.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-37)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="947.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="353.8" y="947.2" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">3.10&#160;3.11&#160;3.12&#160;3.13&#160;3.14]</text><text class="breeze-k8s-run-complete-tests-r6" x="671" y="947.2" textLength="73.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">(TEXT)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="947.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="947.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-38)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="971.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="971.6" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">--kubernetes-versions&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="971.6" textLength="768.6" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">Kubernetes&#160;versions&#160;used&#160;to&#160;run&#160;in&#160;parallel&#160;(space&#160;separated).&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1122.4" y="971.6" textLength="231.8" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">[default:&#160;v1.30.13&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="971.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="971.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-39)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="996" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">│</text><text class="breeze-k8s-run-complete-tests-r5" x="353.8" y="996" textLength="500.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">v1.31.12&#160;v1.32.8&#160;v1.33.4&#160;v1.34.0&#160;v1.35.0]</text><text class="breeze-k8s-run-complete-tests-r6" x="866.2" y="996" textLength="73.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">(TEXT)</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="996" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="996" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-40)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1020.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1020.4" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">--skip-cleanup&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="1020.4" textLength="732" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">Skip&#160;cleanup&#160;of&#160;temporary&#160;files&#160;created&#160;during&#160;parallel&#160;run.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1020.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1020.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-41)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1044.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1044.8" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">--debug-resources&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="1044.8" textLength="768.6" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">Whether&#160;to&#160;show&#160;resource&#160;information&#160;while&#160;running&#160;in&#160;parallel.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1044.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1044.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-42)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1069.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1069.2" textLength="305" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">--include-success-outputs</text><text class="breeze-k8s-run-complete-tests-r1" x="353.8" y="1069.2" textLength="841.8" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">Whether&#160;to&#160;include&#160;outputs&#160;of&#160;successful&#160;runs&#160;(not&#160;shown&#160;by&#160;default).</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1069.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1069.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-43)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1093.6" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1093.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-44)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1118" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">╭─</text><text class="breeze-k8s-run-complete-tests-r5" x="24.4" y="1118" textLength="195.2" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">&#160;Common&#160;options&#160;</text><text class="breeze-k8s-run-complete-tests-r5" x="219.6" y="1118" textLength="1220" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">────────────────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-run-complete-tests-r5" x="1439.6" y="1118" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">─╮</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1118" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-45)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1142.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1142.4" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">--dry-run</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1142.4" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">-D</text><text class="breeze-k8s-run-complete-tests-r1" x="207.4" y="1142.4" textLength="719.8" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">If&#160;dry-run&#160;is&#160;set,&#160;commands&#160;are&#160;only&#160;printed,&#160;not&#160;executed.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1142.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1142.4" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-46)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1166.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1166.8" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">--verbose</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1166.8" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">-v</text><text class="breeze-k8s-run-complete-tests-r1" x="207.4" y="1166.8" textLength="585.6" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">Print&#160;verbose&#160;information&#160;about&#160;performed&#160;steps.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1166.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1166.8" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-47)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1191.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">│</text><text class="breeze-k8s-run-complete-tests-r4" x="24.4" y="1191.2" textLength="109.8" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">--help&#160;&#160;&#160;</text><text class="breeze-k8s-run-complete-tests-r7" x="158.6" y="1191.2" textLength="24.4" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">-h</text><text class="breeze-k8s-run-complete-tests-r1" x="207.4" y="1191.2" textLength="329.4" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">Show&#160;this&#160;message&#160;and&#160;exit.</text><text class="breeze-k8s-run-complete-tests-r5" x="1451.8" y="1191.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">│</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1191.2" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-48)">
+</text><text class="breeze-k8s-run-complete-tests-r5" x="0" y="1215.6" textLength="1464" clip-path="url(#breeze-k8s-run-complete-tests-line-49)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text class="breeze-k8s-run-complete-tests-r1" x="1464" y="1215.6" textLength="12.2" clip-path="url(#breeze-k8s-run-complete-tests-line-49)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_k8s_run-complete-tests.txt b/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
index 68b2b5a33198a..932dbefc44e0c 100644
--- a/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
+++ b/dev/breeze/doc/images/output_k8s_run-complete-tests.txt
@@ -1 +1 @@
-7cc20839aa0a13776ae3b70c48b5a522
+bbff103f342a54b5f22b0a3577d3a632
diff --git a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
index d1c4e4ce0966f..55b1d78afae62 100644
--- a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
+++ b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.svg
@@ -128,8 +128,8 @@
 </text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="68.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-2)">
 </text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="93.2" textLength="1415.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-3)">Provision&#160;the&#160;lang-SDK&#160;(Go&#160;+&#160;Java)&#160;coordinator&#160;system&#160;test&#160;on&#160;an&#160;already-deployed&#160;KubernetesExecutor&#160;cluster:&#160;build&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="93.2" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-3)">
 </text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="117.6" textLength="1427.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-4)">artifacts,&#160;build&#160;+&#160;load&#160;the&#160;Java&#160;worker&#160;image,&#160;deploy&#160;localstack&#160;S3,&#160;upload&#160;artifacts&#160;+&#160;stub&#160;Dag,&#160;create&#160;config,&#160;and&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="117.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-4)">
-</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="142" textLength="890.6" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">upgrade&#160;the&#160;Helm&#160;release.&#160;Run&#160;the&#160;test&#160;afterwards&#160;with&#160;`breeze&#160;k8s&#160;tests&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="902.8" y="142" textLength="122" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">--executor</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1024.8" y="142" textLength="280.6" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">&#160;KubernetesExecutor&#160;--&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r5" x="1305.4" y="142" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">-k</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">
-</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="166.4" textLength="451.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">test_lang_sdk_combined_dag_succeeds`.</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="142" textLength="1232.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">upgrade&#160;the&#160;Helm&#160;release.&#160;Run&#160;the&#160;test&#160;afterwards&#160;with&#160;`RUN_LANG_SDK_K8S_TESTS=true&#160;breeze&#160;k8s&#160;tests&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="1244.4" y="142" textLength="122" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">--executor</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="142" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-5)">
+</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="12.2" y="166.4" textLength="268.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">KubernetesExecutor&#160;--&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r5" x="280.6" y="166.4" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">-k</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="305" y="166.4" textLength="463.6" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">&#160;test_lang_sdk_combined_dag_succeeds`.</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="166.4" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-6)">
 </text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="190.8" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-7)">
 </text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="215.2" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">╭─</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="24.4" y="215.2" textLength="305" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">&#160;K8S&#160;lang-SDK&#160;test&#160;flags&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="329.4" y="215.2" textLength="1110.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">───────────────────────────────────────────────────────────────────────────────────────────</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1439.6" y="215.2" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">─╮</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="215.2" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-8)">
 </text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="0" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r4" x="24.4" y="239.6" textLength="244" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">--python&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r5" x="292.8" y="239.6" textLength="24.4" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">-p</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="341.6" y="239.6" textLength="744.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">Python&#160;major/minor&#160;version&#160;used&#160;in&#160;Airflow&#160;image&#160;for&#160;images.&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1085.8" y="239.6" textLength="183" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">[default:&#160;3.10]</text><text class="breeze-k8s-setup-lang-sdk-test-r7" x="1281" y="239.6" textLength="122" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">(&gt;3.10&lt;&#160;|&#160;</text><text class="breeze-k8s-setup-lang-sdk-test-r6" x="1451.8" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">│</text><text class="breeze-k8s-setup-lang-sdk-test-r1" x="1464" y="239.6" textLength="12.2" clip-path="url(#breeze-k8s-setup-lang-sdk-test-line-9)">
diff --git a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
index 256db99213b70..732dfe9012047 100644
--- a/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
+++ b/dev/breeze/doc/images/output_k8s_setup-lang-sdk-test.txt
@@ -1 +1 @@
-63ead07eb7d775794a28800487bc014d
+e79130d4518f85b8b1783b9a730f78fa
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index a657811c744ad..7800882978717 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -22,6 +22,7 @@
 import shutil
 import sys
 import tempfile
+from collections.abc import Callable
 from copy import deepcopy
 from itertools import chain
 from pathlib import Path
@@ -60,7 +61,7 @@
 from airflow_breeze.utils.ci_group import ci_group
 from airflow_breeze.utils.click_utils import BreezeGroup
 from airflow_breeze.utils.confirm import confirm_action
-from airflow_breeze.utils.console import Output, console_print, get_console
+from airflow_breeze.utils.console import MessageType, Output, console_print, get_console
 from airflow_breeze.utils.custom_param_types import CacheableChoice, CacheableDefault
 from airflow_breeze.utils.docker_command_utils import perform_environment_checks
 from airflow_breeze.utils.kubernetes_utils import (
@@ -88,6 +89,7 @@
     DockerBuildxProgressMatcher,
     GenericRegexpProgressMatcher,
     check_async_run_results,
+    get_output_files,
     run_with_pool,
 )
 from airflow_breeze.utils.path_utils import AIRFLOW_ROOT_PATH
@@ -269,6 +271,14 @@ def kubernetes_group():
     envvar="SKIP_IMAGE_BUILD",
 )
 option_all = click.option("--all", help="Apply it to all created clusters", is_flag=True, envvar="ALL")
+option_lang_sdk_test = click.option(
+    "--lang-sdk-test/--no-lang-sdk-test",
+    help="Provision the lang-SDK (Go + Java) coordinator env and run its system test as part of the "
+    "run (KubernetesExecutor only). Off by default so the regular k8s suites skip the test.",
+    default=False,
+    show_default=True,
+    envvar="RUN_LANG_SDK_K8S_TESTS",
+)
 
 K8S_CLUSTER_CREATE_PROGRESS_REGEXP = r".*airflow-python-[0-9.]+-v[0-9.].*|.*Connecting to localhost.*"
 K8S_UPLOAD_PROGRESS_REGEXP = r".*airflow-python-[0-9.]+-v[0-9.].*"
@@ -2103,6 +2113,7 @@ def _run_complete_tests(
     wait_time_in_seconds: int,
     force_recreate_cluster: bool,
     use_standard_naming: bool,
+    lang_sdk_test: bool,
     num_tries: int,
     extra_options: tuple[str, ...] | None,
     test_args: list[str],
@@ -2180,6 +2191,12 @@ def _run_complete_tests(
         if returncode != 0:
             _logs(python=python, kubernetes_version=kubernetes_version)
             return returncode, message
+        if lang_sdk_test and executor == KUBERNETES_EXECUTOR:
+            get_console(output=output).print(
+                f"\n[info]Provisioning lang-SDK test env for Python {python}, "
+                f"Kubernetes {kubernetes_version}\n"
+            )
+            _setup_lang_sdk_test(python=python, kubernetes_version=kubernetes_version, output=output)
         get_console(output=output).print(
             f"\n[info]Running tests Python {python}, Kubernetes {kubernetes_version}\n"
         )
@@ -2250,6 +2267,7 @@ def _run_complete_tests(
 @option_include_success_outputs
 @option_kubernetes_version
 @option_kubernetes_versions
+@option_lang_sdk_test
 @option_parallelism_cluster
 @option_python
 @option_python_versions
@@ -2271,6 +2289,7 @@ def run_complete_tests(
     include_success_outputs: bool,
     kubernetes_version: str,
     kubernetes_versions: str,
+    lang_sdk_test: bool,
     parallelism: int,
     python: str,
     python_versions: str,
@@ -2329,6 +2348,7 @@ def run_complete_tests(
                             "wait_time_in_seconds": wait_time_in_seconds,
                             "force_recreate_cluster": force_recreate_cluster,
                             "use_standard_naming": use_standard_naming,
+                            "lang_sdk_test": lang_sdk_test,
                             "num_tries": 3,  # when creating cluster in parallel, sometimes we need to retry
                             "extra_options": None,
                             "test_args": pytest_args,
@@ -2359,6 +2379,7 @@ def run_complete_tests(
             wait_time_in_seconds=wait_time_in_seconds,
             force_recreate_cluster=force_recreate_cluster,
             use_standard_naming=use_standard_naming,
+            lang_sdk_test=lang_sdk_test,
             num_tries=1,
             extra_options=None,
             test_args=pytest_args,
@@ -2478,17 +2499,14 @@ def deploy_cluster(
 )
 
 
-def _lang_sdk_build_artifacts(staging: Path, output: Output | None) -> None:
-    """Build the Go bundle and Java jar into ``staging/{go,java}-artifacts``.
+def _lang_sdk_build_go_bundle(staging: Path, output: Output | None) -> None:
+    """Build the Go bundle into ``staging/go-artifacts`` in an ephemeral Go toolchain container.
 
-    Both toolchains run inside ephemeral Docker containers so the host does not
-    need Go or a JDK; each builds into a gitignored dir under the repo and the
-    result is copied into the staging dir.
+    The container means the host needs no Go install; the build writes into a gitignored dir under
+    the repo (with persistent caches) and the result is copied into the staging dir.
     """
     go_dir = staging / "go-artifacts"
-    java_dir = staging / "java-artifacts"
     go_dir.mkdir(parents=True, exist_ok=True)
-    java_dir.mkdir(parents=True, exist_ok=True)
 
     uid_gid = f"{os.getuid()}:{os.getgid()}"
 
@@ -2528,6 +2546,18 @@ def _lang_sdk_build_artifacts(staging: Path, output: Output | None) -> None:
     )
     shutil.copy(LANG_SDK_GO_SDK_PATH / "bin" / LANG_SDK_GO_BUNDLE_NAME, go_dir / LANG_SDK_GO_BUNDLE_NAME)
 
+
+def _lang_sdk_build_java_jar(staging: Path, output: Output | None) -> None:
+    """Publish the Java SDK to mavenLocal then build the k8s-example jar into ``staging/java-artifacts``.
+
+    Runs in an ephemeral JDK container so the host needs no JDK; the Gradle distribution, dependency
+    and Maven caches persist between runs via the mounted dirs.
+    """
+    java_dir = staging / "java-artifacts"
+    java_dir.mkdir(parents=True, exist_ok=True)
+
+    uid_gid = f"{os.getuid()}:{os.getgid()}"
+
     # The k8s-example resolves the SDK plugin and libraries from mavenLocal(),
     # so publish them first, then build the bundle. --user keeps build outputs
     # owned by the host user; HOME is set explicitly because that UID has no
@@ -2789,13 +2819,93 @@ def _lang_sdk_deploy_airflow(python: str, kubernetes_version: str, output: Outpu
     )
 
 
+def _run_lang_sdk_parallel(
+    steps: list[tuple[str, Callable[[Output | None], Any]]],
+    output: Output | None,
+) -> dict[str, Any]:
+    """Run mutually-independent lang-SDK build/deploy steps concurrently.
+
+    The Go build, Java jar build, Java worker image build and localstack deploy share no inputs, so
+    running them together turns provisioning time into roughly the slowest single step. Each step
+    captures its own output; the captured logs are streamed in a stable order once all steps finish
+    (so parallel docker/kubectl output does not interleave), and the first failure is re-raised.
+    Returns each step's return value keyed by its title.
+    """
+    from concurrent.futures import ThreadPoolExecutor
+
+    titles = [title for title, _ in steps]
+    step_outputs = get_output_files(titles)
+    get_console(output=output).print(
+        f"[info]Running lang-SDK provisioning steps in parallel: {', '.join(titles)}"
+    )
+    results: dict[str, Any] = {}
+    errors: list[tuple[str, BaseException]] = []
+    with ThreadPoolExecutor(max_workers=len(steps)) as pool:
+        futures = [pool.submit(fn, step_output) for (_, fn), step_output in zip(steps, step_outputs)]
+        for (title, _), future in zip(steps, futures):
+            try:
+                results[title] = future.result()
+            except BaseException as error:
+                errors.append((title, error))
+    failed_titles = {title for title, _ in errors}
+    for (title, _), step_output in zip(steps, step_outputs):
+        message_type = MessageType.ERROR if title in failed_titles else MessageType.SUCCESS
+        with ci_group(step_output.escaped_title, message_type):
+            os.write(1, Path(step_output.file_name).read_bytes())
+    if errors:
+        get_console(output=output).print(
+            f"[error]lang-SDK provisioning failed in: {', '.join(sorted(failed_titles))}"
+        )
+        raise errors[0][1]
+    return results
+
+
+def _setup_lang_sdk_test(
+    python: str,
+    kubernetes_version: str,
+    go_image: str | None = None,
+    java_image: str | None = None,
+    output: Output | None = None,
+) -> None:
+    """Provision the lang-SDK coordinator env on an already-deployed KubernetesExecutor cluster.
+
+    Builds the Go/Java artifacts, the Java worker image and deploys localstack in parallel, then
+    serially uploads the artifacts, applies the config + secret, and helm-upgrades Airflow with the
+    lang-SDK values.
+    """
+    go_image = go_image or f"{BuildProdParams(python=python).airflow_image_kubernetes}:latest"
+    build_java_image = java_image is None
+    if java_image is None:
+        # The worker-image build below produces this fixed tag; resolve it up-front so the config
+        # rendering (which needs the tag, not the build result) does not depend on the parallel run.
+        java_image = LANG_SDK_JAVA_WORKER_IMAGE
+    with tempfile.TemporaryDirectory(prefix="lang_sdk_artifacts_") as tmp:
+        staging = Path(tmp)
+        steps: list[tuple[str, Callable[[Output | None], Any]]] = [
+            ("Build Go bundle", lambda o: _lang_sdk_build_go_bundle(staging, o)),
+            ("Build Java jar", lambda o: _lang_sdk_build_java_jar(staging, o)),
+            ("Deploy localstack", lambda o: _lang_sdk_deploy_localstack(python, kubernetes_version, o)),
+        ]
+        if build_java_image:
+            steps.append(
+                (
+                    "Build Java worker image",
+                    lambda o: _lang_sdk_build_java_worker_image(go_image, python, kubernetes_version, o),
+                )
+            )
+        _run_lang_sdk_parallel(steps, output=output)
+        _lang_sdk_upload_artifacts(staging, python, kubernetes_version, output)
+    _lang_sdk_apply_configmaps_and_secret(python, kubernetes_version, go_image, java_image, output)
+    _lang_sdk_deploy_airflow(python, kubernetes_version, output)
+
+
 @kubernetes_group.command(
     name="setup-lang-sdk-test",
     help="Provision the lang-SDK (Go + Java) coordinator system test on an already-deployed "
     "KubernetesExecutor cluster: build artifacts, build + load the Java worker image, deploy "
     "localstack S3, upload artifacts + stub Dag, create config, and upgrade the Helm release. "
-    "Run the test afterwards with `breeze k8s tests --executor KubernetesExecutor "
-    "-- -k test_lang_sdk_combined_dag_succeeds`.",
+    "Run the test afterwards with `RUN_LANG_SDK_K8S_TESTS=true breeze k8s tests "
+    "--executor KubernetesExecutor -- -k test_lang_sdk_combined_dag_succeeds`.",
 )
 @option_python
 @option_kubernetes_version
@@ -2815,19 +2925,16 @@ def setup_lang_sdk_test(python: str, kubernetes_version: str, go_image: str | No
     if result.returncode != 0:
         sys.exit(result.returncode)
     make_sure_kubernetes_tools_are_installed()
-    default_image = f"{BuildProdParams(python=python).airflow_image_kubernetes}:latest"
-    go_image = go_image or default_image
-    if not java_image:
-        java_image = _lang_sdk_build_java_worker_image(go_image, python, kubernetes_version, output=None)
-    with tempfile.TemporaryDirectory(prefix="lang_sdk_artifacts_") as tmp:
-        _lang_sdk_build_artifacts(Path(tmp), output=None)
-        _lang_sdk_deploy_localstack(python, kubernetes_version, output=None)
-        _lang_sdk_upload_artifacts(Path(tmp), python, kubernetes_version, output=None)
-    _lang_sdk_apply_configmaps_and_secret(python, kubernetes_version, go_image, java_image, output=None)
-    _lang_sdk_deploy_airflow(python, kubernetes_version, output=None)
+    _setup_lang_sdk_test(
+        python=python,
+        kubernetes_version=kubernetes_version,
+        go_image=go_image,
+        java_image=java_image,
+        output=None,
+    )
     console_print(
         "\n[success]lang-SDK test environment is ready.[/]\n"
-        "[info]Run the test with:\n"
-        "  breeze k8s tests --executor KubernetesExecutor "
+        "[info]Run the test with (the test is gated on RUN_LANG_SDK_K8S_TESTS):\n"
+        "  RUN_LANG_SDK_K8S_TESTS=true breeze k8s tests --executor KubernetesExecutor "
         "-- -k test_lang_sdk_combined_dag_succeeds\n"
     )
diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
index 0c9a202dbda4e..3fe7fdf81e965 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands_config.py
@@ -246,7 +246,13 @@
         },
         {
             "name": "K8S tests flags",
-            "options": ["--python", "--kubernetes-version", "--executor", "--force-venv-setup"],
+            "options": [
+                "--python",
+                "--kubernetes-version",
+                "--executor",
+                "--lang-sdk-test",
+                "--force-venv-setup",
+            ],
         },
         {
             "name": "Parallel options",
diff --git a/kubernetes-tests/lang_sdk/README.md b/kubernetes-tests/lang_sdk/README.md
index 87afc9a811d44..35b873888c852 100644
--- a/kubernetes-tests/lang_sdk/README.md
+++ b/kubernetes-tests/lang_sdk/README.md
@@ -89,7 +89,15 @@ breeze k8s deploy-airflow --executor KubernetesExecutor
 #    deploy localstack, upload artifacts + stub Dag, render config, helm upgrade.
 breeze k8s setup-lang-sdk-test
 
-# 3. Run the test by name (the shared harness triggers a fresh Dag run).
-breeze k8s tests --executor KubernetesExecutor \
+# 3. Run the test by name (the shared harness triggers a fresh Dag run). The test is gated on
+#    RUN_LANG_SDK_K8S_TESTS so it stays out of the regular k8s suites; set it to run the test here.
+RUN_LANG_SDK_K8S_TESTS=true breeze k8s tests --executor KubernetesExecutor \
     -- -k test_lang_sdk_combined_dag_succeeds
 ```
+
+In CI (and for a one-shot local run) steps 2-3 are folded into the standard k8s job via
+`breeze k8s run-complete-tests --lang-sdk-test`: it provisions the lang-SDK env after the base
+deploy, then runs the test. The `k8s-tests.yml` workflow enables it (`RUN_LANG_SDK_K8S_TESTS=true`,
+which `--lang-sdk-test` reads) for a single variant only -- KubernetesExecutor with standard-naming
+off -- so the other five k8s jobs skip the test. The provisioning builds (Go bundle, Java jar, Java
+worker image) and the localstack deploy run in parallel.
diff --git a/kubernetes-tests/lang_sdk/config/values.yaml b/kubernetes-tests/lang_sdk/config/values.yaml
index 32e903d5aa1a8..67f140a8eeb94 100644
--- a/kubernetes-tests/lang_sdk/config/values.yaml
+++ b/kubernetes-tests/lang_sdk/config/values.yaml
@@ -52,9 +52,11 @@ config:
   sdk:
     # Single-line JSON: airflow.cfg is an ini file, so a value with embedded
     # newlines would break the rendered configmap.
+    # yamllint disable-line rule:line-length
     coordinators: '{"go-sdk": {"classpath": "airflow.sdk.coordinators.executable.ExecutableCoordinator", "kwargs": {"executables_root": ["/opt/airflow/artifacts/go-artifacts"]}, "extra": {"pod_template_file": "/opt/airflow/lang_sdk/pod_templates/lang_sdk_golang.yaml"}}, "java-sdk": {"classpath": "airflow.sdk.coordinators.java.JavaCoordinator", "kwargs": {"jars_root": ["/opt/airflow/artifacts/java-artifacts"]}, "extra": {"pod_template_file": "/opt/airflow/lang_sdk/pod_templates/lang_sdk_java.yaml", "worker_container_repository": "lang-sdk-java-worker", "worker_container_tag": "latest"}}}'
     queue_to_coordinator: '{"golang": "go-sdk", "java": "java-sdk"}'
   # The Python stub Dag (lang_sdk_combined.py) is pulled from the localstack
   # "dags" bucket by the dag-processor.
   dag_processor:
+    # yamllint disable-line rule:line-length
     dag_bundle_config_list: '[{"name": "lang-sdk-dags", "classpath": "airflow.providers.amazon.aws.bundles.s3.S3DagBundle", "kwargs": {"bucket_name": "dags", "aws_conn_id": "aws_localstack"}}]'
diff --git a/kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py b/kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py
index cf418dbf173be..813329d4b8ad4 100644
--- a/kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py
+++ b/kubernetes-tests/tests/kubernetes_tests/test_lang_sdk_coordinator_executor.py
@@ -29,10 +29,14 @@
 
 from __future__ import annotations
 
+import os
+
 import pytest
 
 from kubernetes_tests.test_base import EXECUTOR, BaseK8STest
 
+_RUN_LANG_SDK = os.environ.get("RUN_LANG_SDK_K8S_TESTS", "").lower() in ("true", "1")
+
 DAG_ID = "lang_sdk_combined"
 TASK_IDS = [
     "python_task_1",
@@ -47,7 +51,10 @@
 _TIMEOUT = 600
 
 
-@pytest.mark.skipif(EXECUTOR != "KubernetesExecutor", reason="Only runs on KubernetesExecutor")
+@pytest.mark.skipif(
+    EXECUTOR != "KubernetesExecutor" or not _RUN_LANG_SDK,
+    reason="Runs only on KubernetesExecutor with the lang-SDK env provisioned (RUN_LANG_SDK_K8S_TESTS)",
+)
 class TestLangSdkCoordinatorExecutor(BaseK8STest):
     def _ensure_variable(self, key: str, value: str) -> None:
         """Create the Airflow Variable the Go/Java transform tasks read (idempotent)."""

From 6e9e40d395e3568bb452b32f5b8209bcef6720a6 Mon Sep 17 00:00:00 2001
From: LIU ZHE YOU <zhu424.dev@gmail.com>
Date: Wed, 1 Jul 2026 15:04:40 +0900
Subject: [PATCH 3/4] Keep the dags-folder bundle when provisioning the
 lang-SDK k8s test

The lang-SDK Helm values set config.dag_processor.dag_bundle_config_list to only
the localstack S3 bundle, which replaced the default dags-folder bundle. The
standard KubernetesExecutor example-Dag tests share the same test run, so
dropping dags-folder marked their Dags stale and their dagRun triggers returned
404. Configure the bundles additively via dagProcessor.dagBundleConfigList (the
chart-recommended input) so both the example Dags and the lang-SDK stub Dag are
served.
---
 kubernetes-tests/lang_sdk/config/values.yaml | 22 +++++++++++++++-----
 1 file changed, 17 insertions(+), 5 deletions(-)

diff --git a/kubernetes-tests/lang_sdk/config/values.yaml b/kubernetes-tests/lang_sdk/config/values.yaml
index 67f140a8eeb94..a4b5b4004b403 100644
--- a/kubernetes-tests/lang_sdk/config/values.yaml
+++ b/kubernetes-tests/lang_sdk/config/values.yaml
@@ -44,6 +44,23 @@ scheduler:
       readOnly: true
       mountPath: /opt/airflow/lang_sdk/pod_templates
 
+# Serve BOTH the baked-in example Dags (dags-folder) and the lang-SDK stub Dag pulled from the
+# localstack "dags" bucket. This must be additive: the standard KubernetesExecutor tests share this
+# run and trigger example Dags, so dropping dags-folder marks them stale and their runs 404.
+# Configure it here (dagProcessor.dagBundleConfigList) rather than overriding
+# config.dag_processor.dag_bundle_config_list directly -- the chart renders the config from this and
+# it is the recommended, drift-safe path.
+dagProcessor:
+  dagBundleConfigList:
+    - name: dags-folder
+      classpath: "airflow.dag_processing.bundles.local.LocalDagBundle"
+      kwargs: {}
+    - name: lang-sdk-dags
+      classpath: "airflow.providers.amazon.aws.bundles.s3.S3DagBundle"
+      kwargs:
+        bucket_name: "dags"
+        aws_conn_id: "aws_localstack"
+
 config:
   # Route the golang/java queues to their coordinators, each carrying an
   # extra.pod_template_file (the worktree-1 feature) so the worker pod is
@@ -55,8 +72,3 @@ config:
     # yamllint disable-line rule:line-length
     coordinators: '{"go-sdk": {"classpath": "airflow.sdk.coordinators.executable.ExecutableCoordinator", "kwargs": {"executables_root": ["/opt/airflow/artifacts/go-artifacts"]}, "extra": {"pod_template_file": "/opt/airflow/lang_sdk/pod_templates/lang_sdk_golang.yaml"}}, "java-sdk": {"classpath": "airflow.sdk.coordinators.java.JavaCoordinator", "kwargs": {"jars_root": ["/opt/airflow/artifacts/java-artifacts"]}, "extra": {"pod_template_file": "/opt/airflow/lang_sdk/pod_templates/lang_sdk_java.yaml", "worker_container_repository": "lang-sdk-java-worker", "worker_container_tag": "latest"}}}'
     queue_to_coordinator: '{"golang": "go-sdk", "java": "java-sdk"}'
-  # The Python stub Dag (lang_sdk_combined.py) is pulled from the localstack
-  # "dags" bucket by the dag-processor.
-  dag_processor:
-    # yamllint disable-line rule:line-length
-    dag_bundle_config_list: '[{"name": "lang-sdk-dags", "classpath": "airflow.providers.amazon.aws.bundles.s3.S3DagBundle", "kwargs": {"bucket_name": "dags", "aws_conn_id": "aws_localstack"}}]'

From 0236461ed4ec74e58a51a963db1b8426fdd3258f Mon Sep 17 00:00:00 2001
From: LIU ZHE YOU <zhu424.dev@gmail.com>
Date: Wed, 1 Jul 2026 18:26:12 +0900
Subject: [PATCH 4/4] Move lang-SDK k8s example sources out of go-sdk/java-sdk
 into kubernetes-tests

The Go and Java coordinator example sources for the KubernetesExecutor lang-SDK
system test lived under go-sdk/example/k8s_combined and java-sdk/k8s-example,
cluttering the SDK source trees. Move them next to the rest of the test assets
under kubernetes-tests/lang_sdk/ (go_example, java_example).

go_example becomes its own Go module resolving the in-repo go-sdk via a replace
directive (it no longer sits inside the go-sdk module); java_example stays a
standalone Gradle build that resolves the SDK from mavenLocal, now built with
java-sdk's gradle wrapper pointed at the moved project. The breeze provisioning
command, README, and stub-Dag docs are updated to the new paths.
---
 .../commands/kubernetes_commands.py           |  46 +++---
 kubernetes-tests/lang_sdk/README.md           |   4 +-
 .../lang_sdk/dags/lang_sdk_combined.py        |   4 +-
 .../lang_sdk/go_example/.gitignore            |   3 +
 kubernetes-tests/lang_sdk/go_example/go.mod   |  55 +++++++
 kubernetes-tests/lang_sdk/go_example/go.sum   | 155 ++++++++++++++++++
 .../lang_sdk/go_example}/main.go              |   9 +-
 .../lang_sdk/java_example/.gitignore          |   3 +
 .../lang_sdk/java_example}/build.gradle       |   0
 .../lang_sdk/java_example}/gradle.properties  |   0
 .../lang_sdk/java_example}/settings.gradle    |   0
 .../airflow/k8sexample/CombinedExample.java   |   6 +-
 .../airflow/k8sexample/K8sBundleBuilder.java  |   0
 13 files changed, 254 insertions(+), 31 deletions(-)
 create mode 100644 kubernetes-tests/lang_sdk/go_example/.gitignore
 create mode 100644 kubernetes-tests/lang_sdk/go_example/go.mod
 create mode 100644 kubernetes-tests/lang_sdk/go_example/go.sum
 rename {go-sdk/example/k8s_combined => kubernetes-tests/lang_sdk/go_example}/main.go (89%)
 create mode 100644 kubernetes-tests/lang_sdk/java_example/.gitignore
 rename {java-sdk/k8s-example => kubernetes-tests/lang_sdk/java_example}/build.gradle (100%)
 rename {java-sdk/k8s-example => kubernetes-tests/lang_sdk/java_example}/gradle.properties (100%)
 rename {java-sdk/k8s-example => kubernetes-tests/lang_sdk/java_example}/settings.gradle (100%)
 rename {java-sdk/k8s-example => kubernetes-tests/lang_sdk/java_example}/src/java/org/apache/airflow/k8sexample/CombinedExample.java (89%)
 rename {java-sdk/k8s-example => kubernetes-tests/lang_sdk/java_example}/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java (100%)

diff --git a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
index 7800882978717..4b3c66799b0ce 100644
--- a/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/kubernetes_commands.py
@@ -2478,10 +2478,12 @@ def deploy_cluster(
 # Assets live under kubernetes-tests/lang_sdk/. See that directory's README.md.
 # ---------------------------------------------------------------------------
 LANG_SDK_PATH = AIRFLOW_ROOT_PATH / "kubernetes-tests" / "lang_sdk"
-LANG_SDK_GO_BUNDLE_PKG = "./example/k8s_combined"
+# The Go/Java example sources live under the test dir (not in go-sdk/java-sdk). go_example is its
+# own Go module (replace-directive onto the in-repo go-sdk); java_example is a standalone Gradle
+# build that resolves the SDK from mavenLocal.
+LANG_SDK_GO_EXAMPLE_PATH = LANG_SDK_PATH / "go_example"
 LANG_SDK_GO_BUNDLE_NAME = "lang_sdk_combined"
-LANG_SDK_JAVA_EXAMPLE_PATH = AIRFLOW_ROOT_PATH / "java-sdk" / "k8s-example"
-LANG_SDK_GO_SDK_PATH = AIRFLOW_ROOT_PATH / "go-sdk"
+LANG_SDK_JAVA_EXAMPLE_PATH = LANG_SDK_PATH / "java_example"
 # Build the artifacts inside ephemeral toolchain containers so the host needs
 # neither Go nor a JDK installed (mirrors the airflow-e2e-tests conftest).
 LANG_SDK_GO_BUILDER_IMAGE = os.environ.get("GO_BUILDER_IMAGE", "golang:1.24-alpine")
@@ -2509,12 +2511,14 @@ def _lang_sdk_build_go_bundle(staging: Path, output: Output | None) -> None:
     go_dir.mkdir(parents=True, exist_ok=True)
 
     uid_gid = f"{os.getuid()}:{os.getgid()}"
+    go_example_ctr = f"/repo/{LANG_SDK_GO_EXAMPLE_PATH.relative_to(AIRFLOW_ROOT_PATH).as_posix()}"
 
     # CGO_ENABLED=0 yields a fully static binary that runs on the stock worker.
     # USER/HOME must be set because the SDK calls user.Current() at init; with
     # cgo disabled Go's pure-Go resolver reads those env vars and panics if
-    # either is empty. HOME points at a writable, gitignored dir under go-sdk/bin
-    # so the Go build and module caches persist between runs.
+    # either is empty. HOME points at a writable, gitignored dir under go_example
+    # so the Go build and module caches persist between runs. The package built is
+    # the current dir (".") because go_example is its own module.
     get_console(output=output).print(f"[info]Building Go bundle in {LANG_SDK_GO_BUILDER_IMAGE}")
     run_command(
         [
@@ -2524,7 +2528,7 @@ def _lang_sdk_build_go_bundle(staging: Path, output: Output | None) -> None:
             "--user",
             uid_gid,
             "-e",
-            "HOME=/repo/go-sdk/bin/.home",
+            f"HOME={go_example_ctr}/.home",
             "-e",
             "USER=airflow",
             "-e",
@@ -2532,23 +2536,23 @@ def _lang_sdk_build_go_bundle(staging: Path, output: Output | None) -> None:
             "-v",
             f"{AIRFLOW_ROOT_PATH}:/repo",
             "-w",
-            "/repo/go-sdk",
+            go_example_ctr,
             LANG_SDK_GO_BUILDER_IMAGE,
             "go",
             "tool",
             "airflow-go-pack",
             "--output",
-            f"/repo/go-sdk/bin/{LANG_SDK_GO_BUNDLE_NAME}",
-            LANG_SDK_GO_BUNDLE_PKG,
+            f"{go_example_ctr}/bin/{LANG_SDK_GO_BUNDLE_NAME}",
+            ".",
         ],
         output=output,
         check=True,
     )
-    shutil.copy(LANG_SDK_GO_SDK_PATH / "bin" / LANG_SDK_GO_BUNDLE_NAME, go_dir / LANG_SDK_GO_BUNDLE_NAME)
+    shutil.copy(LANG_SDK_GO_EXAMPLE_PATH / "bin" / LANG_SDK_GO_BUNDLE_NAME, go_dir / LANG_SDK_GO_BUNDLE_NAME)
 
 
 def _lang_sdk_build_java_jar(staging: Path, output: Output | None) -> None:
-    """Publish the Java SDK to mavenLocal then build the k8s-example jar into ``staging/java-artifacts``.
+    """Publish the Java SDK to mavenLocal then build the java_example jar into ``staging/java-artifacts``.
 
     Runs in an ephemeral JDK container so the host needs no JDK; the Gradle distribution, dependency
     and Maven caches persist between runs via the mounted dirs.
@@ -2557,12 +2561,14 @@ def _lang_sdk_build_java_jar(staging: Path, output: Output | None) -> None:
     java_dir.mkdir(parents=True, exist_ok=True)
 
     uid_gid = f"{os.getuid()}:{os.getgid()}"
-
-    # The k8s-example resolves the SDK plugin and libraries from mavenLocal(),
-    # so publish them first, then build the bundle. --user keeps build outputs
-    # owned by the host user; HOME is set explicitly because that UID has no
-    # /etc/passwd entry; GRADLE_USER_HOME and the mounted ~/.m2 persist the
-    # Gradle distribution and dependency caches between runs.
+    java_example_ctr = f"/repo/{LANG_SDK_JAVA_EXAMPLE_PATH.relative_to(AIRFLOW_ROOT_PATH).as_posix()}"
+
+    # java_example resolves the SDK plugin and libraries from mavenLocal(), so
+    # publish them first, then build the bundle with java-sdk's gradle wrapper
+    # pointed at the moved project (-p). --user keeps build outputs owned by the
+    # host user; HOME is set explicitly because that UID has no /etc/passwd entry;
+    # GRADLE_USER_HOME and the mounted ~/.m2 persist the Gradle distribution and
+    # dependency caches between runs.
     LANG_SDK_MAVEN_CACHE_PATH.mkdir(parents=True, exist_ok=True)
     java_docker_prefix = [
         "docker",
@@ -2600,9 +2606,11 @@ def _lang_sdk_build_java_jar(staging: Path, output: Output | None) -> None:
         [
             *java_docker_prefix,
             "-w",
-            "/repo/java-sdk/k8s-example",
+            "/repo/java-sdk",
             LANG_SDK_JAVA_BUILDER_IMAGE,
-            "../gradlew",
+            "./gradlew",
+            "-p",
+            java_example_ctr,
             "bundle",
             "--no-daemon",
             "--console=plain",
diff --git a/kubernetes-tests/lang_sdk/README.md b/kubernetes-tests/lang_sdk/README.md
index 35b873888c852..9444512b52fd1 100644
--- a/kubernetes-tests/lang_sdk/README.md
+++ b/kubernetes-tests/lang_sdk/README.md
@@ -52,8 +52,8 @@ coordinator scans.
 | Path | Role |
 | --- | --- |
 | `dags/lang_sdk_combined.py` | Python stub Dag (`dag_id=lang_sdk_combined`); uploaded to the `dags` bucket. |
-| `../../../go-sdk/example/k8s_combined` | Go bundle: `go_extract` / `go_transform` under `lang_sdk_combined`. |
-| `../../../java-sdk/k8s-example` | Java bundle: `java_extract` / `java_transform` under `lang_sdk_combined`. |
+| `go_example/` | Go bundle sources (own module, `replace` onto `../../../go-sdk`): `go_extract` / `go_transform` under `lang_sdk_combined`. |
+| `java_example/` | Java bundle sources (standalone Gradle build, SDK from mavenLocal): `java_extract` / `java_transform` under `lang_sdk_combined`. |
 | `stage_artifacts.py` | Init-container entrypoint; stages an artifact bucket via DagBundle. |
 | `pod_templates/lang_sdk_golang.yaml` | `golang` queue worker pod: prod image + go-artifacts init container. |
 | `pod_templates/lang_sdk_java.yaml` | `java` queue worker pod: JVM image + java-artifacts init container. |
diff --git a/kubernetes-tests/lang_sdk/dags/lang_sdk_combined.py b/kubernetes-tests/lang_sdk/dags/lang_sdk_combined.py
index c7e6fa8604a2b..b27055bf209b8 100644
--- a/kubernetes-tests/lang_sdk/dags/lang_sdk_combined.py
+++ b/kubernetes-tests/lang_sdk/dags/lang_sdk_combined.py
@@ -24,10 +24,10 @@
 
 * ``go_extract`` / ``go_transform`` are ``@task.stub(queue="golang")``; the
   ``golang`` queue is routed to the ``ExecutableCoordinator``. Their Go
-  implementations live in ``go-sdk/example/k8s_combined`` under this same dag_id.
+  implementations live in ``../go_example`` under this same dag_id.
 * ``java_extract`` / ``java_transform`` are ``@task.stub(queue="java")``; the
   ``java`` queue is routed to the ``JavaCoordinator``. Their Java
-  implementations live in ``java-sdk/k8s-example`` under this same dag_id.
+  implementations live in ``../java_example`` under this same dag_id.
 * The Python tasks run on the default Python path.
 
 The dag_id and the Go/Java task ids MUST match the identities the bundles expose
diff --git a/kubernetes-tests/lang_sdk/go_example/.gitignore b/kubernetes-tests/lang_sdk/go_example/.gitignore
new file mode 100644
index 0000000000000..3ecb2f20c1ae8
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/go_example/.gitignore
@@ -0,0 +1,3 @@
+# Build output and the module/build cache used by the in-Docker bundle build.
+/bin/
+/.home/
diff --git a/kubernetes-tests/lang_sdk/go_example/go.mod b/kubernetes-tests/lang_sdk/go_example/go.mod
new file mode 100644
index 0000000000000..a20ac9e1f1183
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/go_example/go.mod
@@ -0,0 +1,55 @@
+module github.com/apache/airflow/kubernetes-tests/lang_sdk/go_example
+
+go 1.24.0
+
+toolchain go1.24.6
+
+require github.com/apache/airflow/go-sdk v0.0.0
+
+require (
+	github.com/MatusOllah/slogcolor v1.6.0 // indirect
+	github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
+	github.com/evanphx/go-hclog-slog v0.0.0-20240717231540-be48fc4c4df5 // indirect
+	github.com/fatih/color v1.18.0 // indirect
+	github.com/fsnotify/fsnotify v1.8.0 // indirect
+	github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
+	github.com/golang/protobuf v1.5.4 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/hashicorp/go-hclog v1.6.3 // indirect
+	github.com/hashicorp/go-plugin v1.7.0 // indirect
+	github.com/hashicorp/yamux v0.1.2 // indirect
+	github.com/inconshreveable/mousetrap v1.1.0 // indirect
+	github.com/ivanpirog/coloredcobra v1.0.2-0.20250501221745-46194c320708 // indirect
+	github.com/mattn/go-colorable v0.1.14 // indirect
+	github.com/mattn/go-isatty v0.0.20 // indirect
+	github.com/oapi-codegen/runtime v1.1.1 // indirect
+	github.com/oklog/run v1.1.0 // indirect
+	github.com/pelletier/go-toml/v2 v2.2.3 // indirect
+	github.com/sagikazarmark/locafero v0.7.0 // indirect
+	github.com/sourcegraph/conc v0.3.0 // indirect
+	github.com/spf13/afero v1.12.0 // indirect
+	github.com/spf13/cast v1.10.0 // indirect
+	github.com/spf13/cobra v1.10.1 // indirect
+	github.com/spf13/pflag v1.0.10 // indirect
+	github.com/spf13/viper v1.20.1 // indirect
+	github.com/subosito/gotenv v1.6.0 // indirect
+	github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
+	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
+	go.uber.org/multierr v1.10.0 // indirect
+	golang.org/x/net v0.48.0 // indirect
+	golang.org/x/sys v0.39.0 // indirect
+	golang.org/x/text v0.32.0 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect
+	google.golang.org/grpc v1.79.3 // indirect
+	google.golang.org/protobuf v1.36.10 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+	resty.dev/v3 v3.0.0-beta.2 // indirect
+)
+
+// The Go SDK is unreleased, so resolve it from the in-repo sources.
+replace github.com/apache/airflow/go-sdk => ../../../go-sdk
+
+// airflow-go-pack (the SDK's bundle packer) builds this package into a
+// self-contained Airflow bundle binary; expose it as a module tool so
+// `go tool airflow-go-pack` works from this directory.
+tool github.com/apache/airflow/go-sdk/cmd/airflow-go-pack
diff --git a/kubernetes-tests/lang_sdk/go_example/go.sum b/kubernetes-tests/lang_sdk/go_example/go.sum
new file mode 100644
index 0000000000000..3f090fb8e3eb1
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/go_example/go.sum
@@ -0,0 +1,155 @@
+github.com/MatusOllah/slogcolor v1.6.0 h1:JAKer0xj5l1jYTXyQvs5ggqmJqYDuLnxgR9jfMAd+sI=
+github.com/MatusOllah/slogcolor v1.6.0/go.mod h1:5y1H50XuQIBvuYTJlmokWi+4FuPiJN5L7Z0jM4K4bYA=
+github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
+github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
+github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
+github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w=
+github.com/bufbuild/protocompile v0.14.1 h1:iA73zAf/fyljNjQKwYzUHD6AD4R8KMasmwa/FBatYVw=
+github.com/bufbuild/protocompile v0.14.1/go.mod h1:ppVdAIhbr2H8asPk6k4pY7t9zB1OU5DoEw9xY/FUi1c=
+github.com/cappuccinotm/slogx v1.4.2 h1:QKhrgxWdG3Qh1Gt+pvj9ieJipyNhKJ5jX5WftEmq8wQ=
+github.com/cappuccinotm/slogx v1.4.2/go.mod h1:Q9lmOfumtErQpVTT5/3nKH++YRJMrYNvGe7Xkqnjr2Q=
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/evanphx/go-hclog-slog v0.0.0-20240717231540-be48fc4c4df5 h1:Im4NdCnqw9SyBuU8dmXmvTPNukNah3++CTE2X6geTdw=
+github.com/evanphx/go-hclog-slog v0.0.0-20240717231540-be48fc4c4df5/go.mod h1:30+1dTR5EdDQGmcjkgOj4i6iVD3wnI0XymSOTPMlUeA=
+github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M=
+github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
+github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
+github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
+github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
+github.com/hashicorp/go-plugin v1.7.0 h1:YghfQH/0QmPNc/AZMTFE3ac8fipZyZECHdDPshfk+mA=
+github.com/hashicorp/go-plugin v1.7.0/go.mod h1:BExt6KEaIYx804z8k4gRzRLEvxKVb+kn0NMcihqOqb8=
+github.com/hashicorp/yamux v0.1.2 h1:XtB8kyFOyHXYVFnwT5C3+Bdo8gArse7j2AQ0DA0Uey8=
+github.com/hashicorp/yamux v0.1.2/go.mod h1:C+zze2n6e/7wshOZep2A70/aQU6QBRWJO/G6FT1wIns=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/ivanpirog/coloredcobra v1.0.2-0.20250501221745-46194c320708 h1:VQ9x0ecFBNH7r9mfvWelzhqLgG/8/YPGbcCu3JImaCE=
+github.com/ivanpirog/coloredcobra v1.0.2-0.20250501221745-46194c320708/go.mod h1:csDZxFD5oWCy1x8hxXVD4txpYQgo12WOcLS7JON5SVE=
+github.com/jarcoal/httpmock v1.4.0 h1:BvhqnH0JAYbNudL2GMJKgOHe2CtKlzJ/5rWKyp+hc2k=
+github.com/jarcoal/httpmock v1.4.0/go.mod h1:ftW1xULwo+j0R0JJkJIIi7UKigZUXCLLanykgjwBXL0=
+github.com/jhump/protoreflect v1.17.0 h1:qOEr613fac2lOuTgWN4tPAtLL7fUSbuJL5X5XumQh94=
+github.com/jhump/protoreflect v1.17.0/go.mod h1:h9+vUUL38jiBzck8ck+6G/aeMX8Z4QUY/NiJPwPNi+8=
+github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro=
+github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg=
+github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
+github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
+github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
+github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
+github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo=
+github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k=
+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs=
+github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4=
+github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY=
+github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo=
+github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
+github.com/spf13/cobra v1.10.1 h1:lJeBwCfmrnXthfAupyUTzJ/J4Nc1RsHC/mSRU2dll/s=
+github.com/spf13/cobra v1.10.1/go.mod h1:7SmJGaTHFVBY0jW4NXGluQoLvhqFQM+6XSKD+P4XaB0=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
+github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.20.1 h1:ZMi+z/lvLyPSCoNtFCpqjy0S4kPbirhpTMwl8BkW9X4=
+github.com/spf13/viper v1.20.1/go.mod h1:P9Mdzt1zoHIG8m2eZQinpiBjo6kCmZSKBClNNqjJvu4=
+github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
+github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8=
+github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok=
+github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
+github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
+go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64=
+go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
+go.opentelemetry.io/otel v1.41.0 h1:YlEwVsGAlCvczDILpUXpIpPSL/VPugt7zHThEMLce1c=
+go.opentelemetry.io/otel v1.41.0/go.mod h1:Yt4UwgEKeT05QbLwbyHXEwhnjxNO6D8L5PQP51/46dE=
+go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0=
+go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs=
+go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18=
+go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE=
+go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8=
+go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew=
+go.opentelemetry.io/otel/trace v1.41.0 h1:Vbk2co6bhj8L59ZJ6/xFTskY+tGAbOnCtQGVVa9TIN0=
+go.opentelemetry.io/otel/trace v1.41.0/go.mod h1:U1NU4ULCoxeDKc09yCWdWe+3QoyweJcISEVa1RBzOis=
+go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ=
+go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
+golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
+golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU=
+golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
+google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE=
+google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ=
+google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
+google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+resty.dev/v3 v3.0.0-beta.2 h1:xu4mGAdbCLuc3kbk7eddWfWm4JfhwDtdapwss5nCjnQ=
+resty.dev/v3 v3.0.0-beta.2/go.mod h1:OgkqiPvTDtOuV4MGZuUDhwOpkY8enjOsjjMzeOHefy4=
diff --git a/go-sdk/example/k8s_combined/main.go b/kubernetes-tests/lang_sdk/go_example/main.go
similarity index 89%
rename from go-sdk/example/k8s_combined/main.go
rename to kubernetes-tests/lang_sdk/go_example/main.go
index 1f2768301e9b1..d9c4fc52e33e0 100644
--- a/go-sdk/example/k8s_combined/main.go
+++ b/kubernetes-tests/lang_sdk/go_example/main.go
@@ -15,12 +15,11 @@
 // specific language governing permissions and limitations
 // under the License.
 
-// Command k8s_combined is the Go half of the KubernetesExecutor lang-SDK system
+// Command go_example is the Go half of the KubernetesExecutor lang-SDK system
 // test bundle. It registers the Go tasks of the shared lang_sdk_combined Dag
-// (the Java half lives in java-sdk/k8s-example, the Python stub Dag in
-// kubernetes-tests/lang_sdk/dags). The coordinator locates this binary by
-// dag_id, so only the Go tasks are registered here; the Java tasks of the same
-// dag_id live in the Java jar.
+// (the Java half lives in ../java_example, the Python stub Dag in ../dags). The
+// coordinator locates this binary by dag_id, so only the Go tasks are registered
+// here; the Java tasks of the same dag_id live in the Java jar.
 package main
 
 import (
diff --git a/kubernetes-tests/lang_sdk/java_example/.gitignore b/kubernetes-tests/lang_sdk/java_example/.gitignore
new file mode 100644
index 0000000000000..6abe38c3d9c93
--- /dev/null
+++ b/kubernetes-tests/lang_sdk/java_example/.gitignore
@@ -0,0 +1,3 @@
+# Gradle build output and caches produced by the in-Docker bundle build.
+.gradle/
+build/
diff --git a/java-sdk/k8s-example/build.gradle b/kubernetes-tests/lang_sdk/java_example/build.gradle
similarity index 100%
rename from java-sdk/k8s-example/build.gradle
rename to kubernetes-tests/lang_sdk/java_example/build.gradle
diff --git a/java-sdk/k8s-example/gradle.properties b/kubernetes-tests/lang_sdk/java_example/gradle.properties
similarity index 100%
rename from java-sdk/k8s-example/gradle.properties
rename to kubernetes-tests/lang_sdk/java_example/gradle.properties
diff --git a/java-sdk/k8s-example/settings.gradle b/kubernetes-tests/lang_sdk/java_example/settings.gradle
similarity index 100%
rename from java-sdk/k8s-example/settings.gradle
rename to kubernetes-tests/lang_sdk/java_example/settings.gradle
diff --git a/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/CombinedExample.java b/kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/CombinedExample.java
similarity index 89%
rename from java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/CombinedExample.java
rename to kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/CombinedExample.java
index 25fc1ef0b8840..63aaa5b6f051d 100644
--- a/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/CombinedExample.java
+++ b/kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/CombinedExample.java
@@ -26,9 +26,9 @@
 
 // Java half of the KubernetesExecutor lang-SDK system test bundle. Registers the
 // Java tasks of the shared "lang_sdk_combined" Dag; the Go tasks of the same
-// dag_id live in go-sdk/example/k8s_combined and the Python stub Dag in
-// kubernetes-tests/lang_sdk/dags. The coordinator locates this jar by dag_id, so
-// only the Java tasks are registered here.
+// dag_id live in ../go_example and the Python stub Dag in ../dags. The
+// coordinator locates this jar by dag_id, so only the Java tasks are registered
+// here.
 @Builder.Dag(id = "lang_sdk_combined")
 public class CombinedExample {
   private static final Logger logger = LoggerFactory.getLogger(CombinedExample.class);
diff --git a/java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java b/kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
similarity index 100%
rename from java-sdk/k8s-example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
rename to kubernetes-tests/lang_sdk/java_example/src/java/org/apache/airflow/k8sexample/K8sBundleBuilder.java
