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

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


The following commit(s) were added to refs/heads/main by this push:
     new 88b89283722 Add 'classify-provider-changes' breeze command for 
deterministic change classification (#68215)
88b89283722 is described below

commit 88b89283722a2309df428789d75a5e7f5c4c229c
Author: Jarek Potiuk <[email protected]>
AuthorDate: Wed Jun 17 16:55:31 2026 -0400

    Add 'classify-provider-changes' breeze command for deterministic change 
classification (#68215)
---
 .../prepare-providers-documentation/SKILL.md       | 111 +++++++-----
 dev/breeze/doc/09_release_management_tasks.rst     |  19 ++
 .../doc/images/output_release-management.svg       |  96 +++++-----
 .../doc/images/output_release-management.txt       |   2 +-
 ...elease-management_classify-provider-changes.svg | 200 +++++++++++++++++++++
 ...elease-management_classify-provider-changes.txt |   1 +
 .../output_setup_check-all-params-in-groups.svg    |  10 +-
 .../output_setup_check-all-params-in-groups.txt    |   2 +-
 .../output_setup_regenerate-command-images.svg     |  80 +++++----
 .../output_setup_regenerate-command-images.txt     |   2 +-
 .../commands/release_management_commands.py        | 109 +++++++++++
 .../commands/release_management_commands_config.py |  19 ++
 .../prepare_providers/provider_documentation.py    |  44 +++++
 dev/breeze/tests/test_provider_documentation.py    |  42 +++++
 14 files changed, 609 insertions(+), 128 deletions(-)

diff --git a/.agents/skills/prepare-providers-documentation/SKILL.md 
b/.agents/skills/prepare-providers-documentation/SKILL.md
index 688160d3a2a..fb5602f894a 100644
--- a/.agents/skills/prepare-providers-documentation/SKILL.md
+++ b/.agents/skills/prepare-providers-documentation/SKILL.md
@@ -108,49 +108,73 @@ date — running breeze the first time below will recreate 
and fetch it.
 The skill runs in five phases. Mark tasks with `TaskCreate` for each phase
 and tick them off as you go — the release manager wants to see progress.
 
-### Phase 1 — Discover providers with pending changes
+### Phase 1 — Discover and pre-classify pending changes (deterministic)
 
-For each provider, the source of truth for "what changed since last release"
-is the same git query breeze uses internally: commits between the latest
-release tag for that provider (`providers-<id>/<version>`) and
-`apache-https-for-providers/<base-branch>`, restricted to the provider's own
-folders.
+The source of truth for "what changed since last release" is the same git
+query breeze uses internally: commits between the latest release tag for that
+provider (`providers-<id>/<version>`) and 
`apache-https-for-providers/<base-branch>`,
+restricted to the provider's own folders.
 
-Discover in batch by running:
+Run the **deterministic classifier** — it discovers every provider with pending
+changes **and** pre-classifies each commit with hard-coded, high-confidence
+rules, flagging only the genuinely ambiguous ones as `needs_llm`. No random
+answers, nothing to discard:
 
 ```bash
-breeze release-management prepare-provider-documentation \
-    --non-interactive \
-    --skip-changelog \
-    --skip-readme \
-    --release-date "$RELEASE_DATE"
+breeze release-management classify-provider-changes \
+    --base-branch main \
+    --output-file /tmp/provider-changes.json
+# scope to a subset by appending provider ids, e.g. ... amazon cncf.kubernetes
 ```
 
-> [!WARNING]
-> Do **not** commit the result of that command. `--non-interactive` answers
-> the classification prompts with random values — Claude will overwrite the
-> changelog and version bumps in Phase 4 with real classifications. The only
-> reason to run breeze first is to refresh the apache remote, regenerate
-> build files, and confirm which providers have pending changes (read the
-> "Summary of prepared documentation" block at the end).
+The JSON it writes:
+
+```json
+{
+  "base_branch": "main",
+  "providers": {
+    "amazon": {
+      "current_version": "9.29.0",
+      "commits": [
+        {"hash": "c2dbd7a75a", "pr": "67987", "subject": "Fix IDC domain S3 
path resolution",
+         "classification": "needs_llm", "reason": "no high-confidence 
deterministic rule matched"},
+        {"hash": "abc123", "pr": "68087", "subject": "Bump the 
edge-ui-package-updates group ...",
+         "classification": "misc", "reason": "dependency bump (subject starts 
with 'Bump')"}
+      ]
+    }
+  }
+}
+```
 
-Record from the summary:
+How to read it:
 
-- **Success** — providers that had real changes (these need classification).
-- **Docs only** — providers with only documentation changes (already handled
-  by breeze; skip in Phase 2).
-- **Skipped on no changes** — nothing to do.
+- Providers under `providers` have pending changes (these need attention).
+- `classification ∈ {documentation, skip, misc}` are **decided by rules — take
+  them as-is**, no sub-agent needed (doc-only → `documentation`, test/example
+  only → `skip`, `Bump …` dependency bump → `misc`).
+- `classification == needs_llm` → **Phase 3 decides** with a sub-agent. These 
are
+  the only commits that need LLM analysis.
+- A provider with a `note`/`error` (e.g. a brand-new provider with no prior
+  release tag) → treat as an **initial release** and classify by hand.
 
-Reset the per-provider files that breeze touched but you'll be rewriting
-yourself before continuing:
+> [!NOTE]
+> The classifier is deliberately conservative: `Fix …`/`Add …` subjects are
+> **not** auto-classified (an "Add …" can be a breaking change), so they come
+> back as `needs_llm`. The rules live in `classify_change_deterministically`
+> 
(`dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py`).
+
+Then regenerate the auto-generated build files (this does **no** 
classification,
+so nothing random is produced):
 
 ```bash
+breeze release-management prepare-provider-documentation \
+    --reapply-templates-only --release-date "$RELEASE_DATE"
 git checkout -- $(git diff --name-only -- '**/provider.yaml' 
'**/changelog.rst')
 ```
 
 This leaves the regenerated build files (`__init__.py`, `README.rst`,
-`pyproject.toml`, `conf.py`, `get_provider_info.py`, `index.rst`) in place
-and discards only the stuff Claude is about to rewrite.
+`pyproject.toml`, `conf.py`, `get_provider_info.py`, `index.rst`) in place and
+discards only the changelog/version files Claude is about to rewrite itself.
 
 ### Phase 2 — Per-provider commit list
 
@@ -205,32 +229,35 @@ For each commit, classify it into one of:
 | `s`  | Skip (test/CI/example only — no user impact)   | none           |
 | `v`  | Min Airflow version bump                       | minor (treated as 
misc + bump) |
 
-#### Auto-classify cheap cases first
+#### Take the deterministic classifications from Phase 1
 
-Before spawning a sub-agent, apply the same fast heuristics breeze uses
-(see `classify_provider_pr_files` in
-`dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py`):
+`classify-provider-changes` (Phase 1) already classified every commit it could
+with hard-coded rules. Read `/tmp/provider-changes.json` and:
 
-- All changed files match `providers/<id>/docs/**/*.rst` → **`d`** (docs).
-- All changed files match `providers/<id>/tests/**` or
-  `providers/<id>/src/airflow/providers/<id>/example_dags/**` → **`s`** (skip).
-- Subject contains `Bump minimum Airflow version` and only `__init__.py` /
-  `provider.yaml` changed → **`v`**.
+- Use any commit whose `classification` is `documentation`, `skip`, or `misc`
+  **as-is** — these map to `d`, `s`, `m` respectively; no sub-agent needed.
+- Only commits with `classification: needs_llm` go to a sub-agent (below).
 
-Note these classifications and move on — no sub-agent needed.
+The deterministic rules (doc-only → `d`, test/example-only → `s`, `Bump …`
+dependency bump → `m`) are exactly the cheap cases — now computed once by
+breeze (`classify_change_deterministically`) instead of re-derived here. If you
+ever need the min-Airflow-bump case (`v`), that one is still a `needs_llm`
+judgement: a sub-agent should flag it when a PR bumps the provider's minimum
+Airflow version.
 
-#### Classify the rest — batched per provider, not one agent per PR
+#### Classify the `needs_llm` commits — batched per provider, not one agent 
per PR
 
+Only the commits the classifier returned as `needs_llm` still need a sub-agent.
 Classification is the token-heavy part of this skill, so spend sub-agents
 sparingly. Do **not** spawn one sub-agent per PR — that is one agent per
 commit and balloons to hundreds of agents on a normal release wave. Pick the
 smallest fan-out that fits the volume:
 
-- **Few commits remain (≲ 15 across all providers) → classify inline.** Read
-  each PR and its provider-scoped diff yourself, in this context. Spawn no
+- **Few `needs_llm` commits remain (≲ 15 across all providers) → classify 
inline.**
+  Read each PR and its provider-scoped diff yourself, in this context. Spawn no
   sub-agents at all.
 - **More than that → one sub-agent per provider.** Each agent classifies that
-  provider's *entire* remaining commit list in a single pass. This is the
+  provider's *entire* remaining `needs_llm` list in a single pass. This is the
   natural unit: multi-provider PRs are classified independently per provider
   anyway (see Cross-Cutting Rules), and one provider-scoped agent amortizes
   the breaking-change checklist across all of that provider's commits instead
diff --git a/dev/breeze/doc/09_release_management_tasks.rst 
b/dev/breeze/doc/09_release_management_tasks.rst
index 6a4d1a86b21..63d69195087 100644
--- a/dev/breeze/doc/09_release_management_tasks.rst
+++ b/dev/breeze/doc/09_release_management_tasks.rst
@@ -447,6 +447,25 @@ You can also add ``--answer yes`` to perform 
non-interactive build.
   :width: 100%
   :alt: Breeze prepare-provider-documentation
 
+Classifying provider changes
+""""""""""""""""""""""""""""
+
+You can use Breeze to classify each provider's unreleased changes using 
hard-coded,
+high-confidence rules, flagging ambiguous commits as ``needs_llm`` for an 
agent or skill
+to assess. The result is emitted as JSON, providing a deterministic 
alternative to the
+``--non-interactive`` documentation run used purely for change discovery.
+
+The below example classifies the pending changes for all providers.
+
+.. code-block:: bash
+
+     breeze release-management classify-provider-changes
+
+.. image:: ./images/output_release-management_classify-provider-changes.svg
+  :target: 
https://raw.githubusercontent.com/apache/airflow/main/dev/breeze/doc/images/output_release-management_classify-provider-changes.svg
+  :width: 100%
+  :alt: Breeze classify-provider-changes
+
 Updating provider next version
 """"""""""""""""""""""""""""""
 
diff --git a/dev/breeze/doc/images/output_release-management.svg 
b/dev/breeze/doc/images/output_release-management.svg
index 2613a5159f5..309ebac51d6 100644
--- a/dev/breeze/doc/images/output_release-management.svg
+++ b/dev/breeze/doc/images/output_release-management.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1562.8" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1660.3999999999999" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -42,7 +42,7 @@
 
     <defs>
     <clipPath id="breeze-release-management-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1511.8" />
+      <rect x="0" y="0" width="1463.0" height="1609.3999999999999" />
     </clipPath>
     <clipPath id="breeze-release-management-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -227,9 +227,21 @@
 <clipPath id="breeze-release-management-line-60">
     <rect x="0" y="1465.5" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-release-management-line-61">
+    <rect x="0" y="1489.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-line-62">
+    <rect x="0" y="1514.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-line-63">
+    <rect x="0" y="1538.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-line-64">
+    <rect x="0" y="1563.1" 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="1560.8" rx="8"/><text 
class="breeze-release-management-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;release-management</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1658.4" rx="8"/><text 
class="breeze-release-management-title" fill="#c5c8c6" text-anchor="middle" 
x="740" y="27">Command:&#160;release-management</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -263,44 +275,48 @@
 </text><text class="breeze-release-management-r5" x="0" y="532.4" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-21)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="532.4" textLength="12.2" 
clip-path="url(#breeze-release-management-line-21)">
 </text><text class="breeze-release-management-r5" x="0" y="556.8" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-22)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="556.8" textLength="341.6" 
clip-path="url(#breeze-release-management-line-22)">&#160;Providers&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="366" y="556.8" textLength="1073.6" 
clip-path="url(#breeze-release-management-line-22)">────────────────────────── 
[...]
 </text><text class="breeze-release-management-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-23)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="581.2" textLength="390.4" 
clip-path="url(#breeze-release-management-line-23)">prepare-provider-documentation&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="581.2" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-23)">Prepare&#160;CHANGELOG,&#160;RE
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-24)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="605.6" textLength="390.4" 
clip-path="url(#breeze-release-management-line-24)">update-providers-next-version&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="605.6" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-24)">Update&#160;provider&#160; 
[...]
-</text><text class="breeze-release-management-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-25)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="630" textLength="390.4" 
clip-path="url(#breeze-release-management-line-25)">prepare-provider-distributions&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="630" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-25)">Prepare&#160;sdist/whl&#160;distribut
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-26)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="654.4" textLength="268.4" 
clip-path="url(#breeze-release-management-line-26)">wiped&#160;with&#160;`git&#160;clean&#160;</text><text
 class="breeze-release-management-r6" x="707.6" y="654.4" textLength="48.8" 
clip-path="url(#breeze-release-management-line-26)">-fdx</text><text 
class="breeze-r [...]
-</text><text class="breeze-release-management-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-27)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="678.8" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-27)">keep&#160;in-tree&#160;generated&#160;files&#160;out&#160;of&#160;the&#160;artifact.&#160;See&#160;dev/breeze&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-28)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="703.2" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-28)">release-management&#160;docs.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-29)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="727.6" textLength="390.4" 
clip-path="url(#breeze-release-management-line-29)">install-provider-distributions&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="727.6" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-29)">Installs&#160;provider&#160;dis
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-30)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="752" textLength="390.4" 
clip-path="url(#breeze-release-management-line-30)">verify-provider-distributions&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="752" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-30)">Verifies&#160;if&#160;all&#160;p
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-31)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="776.4" textLength="390.4" 
clip-path="url(#breeze-release-management-line-31)">generate-providers-metadata&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="776.4" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-31)">Generates&#160;m [...]
-</text><text class="breeze-release-management-r5" x="0" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-32)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="800.8" textLength="390.4" 
clip-path="url(#breeze-release-management-line-32)">generate-issue-content-providers</text><text
 class="breeze-release-management-r1" x="439.2" y="800.8" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-32)">Generates&#160;content&#160;for&#160;issu
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-33)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="825.2" textLength="390.4" 
clip-path="url(#breeze-release-management-line-33)">clean-old-provider-artifacts&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="825.2" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-33)">Cleans&#160;the&#160; [...]
-</text><text class="breeze-release-management-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-34)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="849.6" textLength="390.4" 
clip-path="url(#breeze-release-management-line-34)">tag-providers&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="849.6" textLength="1000.4 
[...]
-</text><text class="breeze-release-management-r5" x="0" y="874" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-35)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="874" textLength="12.2" 
clip-path="url(#breeze-release-management-line-35)">
-</text><text class="breeze-release-management-r5" x="0" y="898.4" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-36)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="898.4" textLength="427" 
clip-path="url(#breeze-release-management-line-36)">&#160;Airflow&#160;Task&#160;SDK&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="451.4" y="898.4" textLength="988.2" 
clip-path="url(#breeze-release-management-line-36)">────────── [...]
-</text><text class="breeze-release-management-r5" x="0" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-37)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="922.8" textLength="512.4" 
clip-path="url(#breeze-release-management-line-37)">prepare-task-sdk-distributions&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="561.2" y="922.8" textLength="878.4" 
clip-path="url(#breeze-r [...]
-</text><text class="breeze-release-management-r5" x="0" y="947.2" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-38)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="947.2" textLength="12.2" 
clip-path="url(#breeze-release-management-line-38)">
-</text><text class="breeze-release-management-r5" x="0" y="971.6" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-39)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="971.6" textLength="353.8" 
clip-path="url(#breeze-release-management-line-39)">&#160;airflowctl&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="378.2" y="971.6" textLength="1061.4" 
clip-path="url(#breeze-release-management-line-39)">─────────────────────── 
[...]
-</text><text class="breeze-release-management-r5" x="0" y="996" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-40)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="996" textLength="414.8" 
clip-path="url(#breeze-release-management-line-40)">prepare-airflow-ctl-distributions&#160;</text><text
 class="breeze-release-management-r1" x="463.6" y="996" textLength="976" 
clip-path="url(#breeze-release-management-line-40)">Prepare&#160;sdist/whl&#160;distributions&#
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="1020.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-41)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1020.4" textLength="414.8" 
clip-path="url(#breeze-release-management-line-41)">generate-issue-content-airflow-ctl</text><text
 class="breeze-release-management-r1" x="463.6" y="1020.4" textLength="976" 
clip-path="url(#breeze-release-management-line-41)">Generates&#160;content&#160;for&#160;is
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="1044.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-42)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1044.8" textLength="414.8" 
clip-path="url(#breeze-release-management-line-42)">generate-airflowctl-changelog&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="463.6" y="1044.8" textLength="976" 
clip-path="url(#breeze-release-management-line-42)">Generates&#160 [...]
-</text><text class="breeze-release-management-r5" x="0" y="1069.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-43)">│</text><text 
class="breeze-release-management-r1" x="463.6" y="1069.2" textLength="976" 
clip-path="url(#breeze-release-management-line-43)">RELEASE_NOTES.rst.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="1093.6" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-44)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="1093.6" textLength="12.2" 
clip-path="url(#breeze-release-management-line-44)">
-</text><text class="breeze-release-management-r5" x="0" y="1118" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-45)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="1118" textLength="463.6" 
clip-path="url(#breeze-release-management-line-45)">&#160;Apache&#160;Airflow&#160;Mypy&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="488" y="1118" textLength="951.6" 
clip-path="url(#breeze-release-management-line-45)">────────── [...]
-</text><text class="breeze-release-management-r5" x="0" y="1142.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-46)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1142.4" textLength="451.4" 
clip-path="url(#breeze-release-management-line-46)">prepare-mypy-distributions&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="500.2" y="1142.4" textLength="939.4" 
clip-path="url(#breeze-release- [...]
-</text><text class="breeze-release-management-r5" x="0" y="1166.8" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="1166.8" textLength="12.2" 
clip-path="url(#breeze-release-management-line-47)">
-</text><text class="breeze-release-management-r5" x="0" y="1191.2" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-48)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="1191.2" textLength="292.8" 
clip-path="url(#breeze-release-management-line-48)">&#160;Other&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="317.2" y="1191.2" textLength="1122.4" 
clip-path="url(#breeze-release-management-line-48)">───────────────────────── 
[...]
-</text><text class="breeze-release-management-r5" x="0" y="1215.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-49)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1215.6" textLength="292.8" 
clip-path="url(#breeze-release-management-line-49)">add-back-references&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1215.6" textLength="1098" 
clip-path="url(#breeze-release-management-line-49)">Command&#160;to&#160;ad 
[...]
-</text><text class="breeze-release-management-r5" x="0" y="1240" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-50)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1240" textLength="292.8" 
clip-path="url(#breeze-release-management-line-50)">prepare-python-client&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1240" textLength="1098" 
clip-path="url(#breeze-release-management-line-50)">Prepares&#160;python&#160;client&#160;p
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="1264.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-51)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1264.4" textLength="292.8" 
clip-path="url(#breeze-release-management-line-51)">publish-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1264.4" textLength="1098" 
clip-path="url(#breeze-release-managemen [...]
-</text><text class="breeze-release-management-r5" x="0" y="1288.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-52)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1288.8" textLength="292.8" 
clip-path="url(#breeze-release-management-line-52)">generate-constraints&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1288.8" textLength="1098" 
clip-path="url(#breeze-release-management-line-52)">Generates&#160;pinned&#160;c
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="1313.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-53)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1313.2" textLength="292.8" 
clip-path="url(#breeze-release-management-line-53)">update-constraints&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1313.2" textLength="1098" 
clip-path="url(#breeze-release-management-line-53)">Update&#160;releas [...]
-</text><text class="breeze-release-management-r5" x="0" y="1337.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-54)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1337.6" textLength="292.8" 
clip-path="url(#breeze-release-management-line-54)">publish-docs-to-s3&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1337.6" textLength="1098" 
clip-path="url(#breeze-release-management-line-54)">Publishes&#160;doc [...]
-</text><text class="breeze-release-management-r5" x="0" y="1362" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-55)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1362" textLength="292.8" 
clip-path="url(#breeze-release-management-line-55)">verify-rc-by-pmc&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1362" textLength="1098" 
clip-path="url(#breeze-release-management-line-55)">[EXPERIMENTAL] [...]
-</text><text class="breeze-release-management-r5" x="0" y="1386.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-56)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1386.4" textLength="292.8" 
clip-path="url(#breeze-release-management-line-56)">check-release-files&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1386.4" textLength="1098" 
clip-path="url(#breeze-release-management-line-56)">Verify&#160;that&#160;a 
[...]
-</text><text class="breeze-release-management-r5" x="0" y="1410.8" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-57)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="1410.8" textLength="12.2" 
clip-path="url(#breeze-release-management-line-57)">
-</text><text class="breeze-release-management-r5" x="0" y="1435.2" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-58)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="1435.2" textLength="122" 
clip-path="url(#breeze-release-management-line-58)">&#160;Commands&#160;</text><text
 class="breeze-release-management-r5" x="146.4" y="1435.2" textLength="1293.2" 
clip-path="url(#breeze-release-management-line-58)">───────────────────────────────────────────────────
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="1459.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-59)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1459.6" textLength="305" 
clip-path="url(#breeze-release-management-line-59)">constraints-version-check</text><text
 class="breeze-release-management-r1" x="353.8" y="1459.6" textLength="1085.8" 
clip-path="url(#breeze-release-management-line-59)">Check&#160;constraints&#160;against&#160;releas
 [...]
-</text><text class="breeze-release-management-r5" x="0" y="1484" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-60)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1484" textLength="305" 
clip-path="url(#breeze-release-management-line-60)">merge-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="353.8" y="1484" textLength="1085.8" 
clip-path="url(#breeze-release-management-line-60)">Merge&#160;pr [...]
+</text><text class="breeze-release-management-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-24)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="605.6" textLength="390.4" 
clip-path="url(#breeze-release-management-line-24)">classify-provider-changes&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="605.6" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-24)">Classi [...]
+</text><text class="breeze-release-management-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-25)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="630" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-25)">rules,&#160;flagging&#160;ambiguous&#160;commits&#160;as&#160;&#x27;needs_llm&#x27;&#160;for&#160;an&#160;agent/skill&#160;to&#160;assess.&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r5" x="14 [...]
+</text><text class="breeze-release-management-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-26)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="654.4" textLength="707.6" 
clip-path="url(#breeze-release-management-line-26)">Outputs&#160;JSON&#160;-&#160;a&#160;deterministic&#160;alternative&#160;to&#160;the&#160;random&#160;&#x27;</text><text
 class="breeze-release-management-r4" x="1146.8" y="654.4" textLength="207.4" 
clip-path="url(# [...]
+</text><text class="breeze-release-management-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-27)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="678.8" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-27)">used&#160;purely&#160;for&#160;discovery.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-28)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="703.2" textLength="390.4" 
clip-path="url(#breeze-release-management-line-28)">update-providers-next-version&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="703.2" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-28)">Update&#160;provider&#160; 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-29)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="727.6" textLength="390.4" 
clip-path="url(#breeze-release-management-line-29)">prepare-provider-distributions&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="727.6" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-29)">Prepare&#160;sdist/whl&#160;dis
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-30)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="752" textLength="268.4" 
clip-path="url(#breeze-release-management-line-30)">wiped&#160;with&#160;`git&#160;clean&#160;</text><text
 class="breeze-release-management-r6" x="707.6" y="752" textLength="48.8" 
clip-path="url(#breeze-release-management-line-30)">-fdx</text><text 
class="breeze-release [...]
+</text><text class="breeze-release-management-r5" x="0" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-31)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="776.4" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-31)">keep&#160;in-tree&#160;generated&#160;files&#160;out&#160;of&#160;the&#160;artifact.&#160;See&#160;dev/breeze&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-32)">│</text><text 
class="breeze-release-management-r1" x="439.2" y="800.8" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-32)">release-management&#160;docs.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-33)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="825.2" textLength="390.4" 
clip-path="url(#breeze-release-management-line-33)">install-provider-distributions&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="825.2" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-33)">Installs&#160;provider&#160;dis
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-34)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="849.6" textLength="390.4" 
clip-path="url(#breeze-release-management-line-34)">verify-provider-distributions&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="849.6" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-34)">Verifies&#160;if&#160;all& 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-35)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="874" textLength="390.4" 
clip-path="url(#breeze-release-management-line-35)">generate-providers-metadata&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="874" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-35)">Generates&#160;metadat [...]
+</text><text class="breeze-release-management-r5" x="0" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-36)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="898.4" textLength="390.4" 
clip-path="url(#breeze-release-management-line-36)">generate-issue-content-providers</text><text
 class="breeze-release-management-r1" x="439.2" y="898.4" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-36)">Generates&#160;content&#160;for&#160;issu
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-37)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="922.8" textLength="390.4" 
clip-path="url(#breeze-release-management-line-37)">clean-old-provider-artifacts&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="922.8" textLength="1000.4" 
clip-path="url(#breeze-release-management-line-37)">Cleans&#160;the&#160; [...]
+</text><text class="breeze-release-management-r5" x="0" y="947.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-38)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="947.2" textLength="390.4" 
clip-path="url(#breeze-release-management-line-38)">tag-providers&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="439.2" y="947.2" textLength="1000.4 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="971.6" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-39)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="971.6" textLength="12.2" 
clip-path="url(#breeze-release-management-line-39)">
+</text><text class="breeze-release-management-r5" x="0" y="996" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-40)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="996" textLength="427" 
clip-path="url(#breeze-release-management-line-40)">&#160;Airflow&#160;Task&#160;SDK&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="451.4" y="996" textLength="988.2" 
clip-path="url(#breeze-release-management-line-40)">──────────────── [...]
+</text><text class="breeze-release-management-r5" x="0" y="1020.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-41)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1020.4" textLength="512.4" 
clip-path="url(#breeze-release-management-line-41)">prepare-task-sdk-distributions&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="561.2" y="1020.4" textLength="878.4" 
clip-path="url(#breez [...]
+</text><text class="breeze-release-management-r5" x="0" y="1044.8" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-42)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="1044.8" textLength="12.2" 
clip-path="url(#breeze-release-management-line-42)">
+</text><text class="breeze-release-management-r5" x="0" y="1069.2" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-43)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="1069.2" textLength="353.8" 
clip-path="url(#breeze-release-management-line-43)">&#160;airflowctl&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="378.2" y="1069.2" textLength="1061.4" 
clip-path="url(#breeze-release-management-line-43)">──────────────────── [...]
+</text><text class="breeze-release-management-r5" x="0" y="1093.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-44)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1093.6" textLength="414.8" 
clip-path="url(#breeze-release-management-line-44)">prepare-airflow-ctl-distributions&#160;</text><text
 class="breeze-release-management-r1" x="463.6" y="1093.6" textLength="976" 
clip-path="url(#breeze-release-management-line-44)">Prepare&#160;sdist/whl&#160;distri
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="1118" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-45)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1118" textLength="414.8" 
clip-path="url(#breeze-release-management-line-45)">generate-issue-content-airflow-ctl</text><text
 class="breeze-release-management-r1" x="463.6" y="1118" textLength="976" 
clip-path="url(#breeze-release-management-line-45)">Generates&#160;content&#160;for&#160;issue&#1
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="1142.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-46)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1142.4" textLength="414.8" 
clip-path="url(#breeze-release-management-line-46)">generate-airflowctl-changelog&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="463.6" y="1142.4" textLength="976" 
clip-path="url(#breeze-release-management-line-46)">Generates&#160 [...]
+</text><text class="breeze-release-management-r5" x="0" y="1166.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-47)">│</text><text 
class="breeze-release-management-r1" x="463.6" y="1166.8" textLength="976" 
clip-path="url(#breeze-release-management-line-47)">RELEASE_NOTES.rst.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#16
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="1191.2" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="1191.2" textLength="12.2" 
clip-path="url(#breeze-release-management-line-48)">
+</text><text class="breeze-release-management-r5" x="0" y="1215.6" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-49)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="1215.6" textLength="463.6" 
clip-path="url(#breeze-release-management-line-49)">&#160;Apache&#160;Airflow&#160;Mypy&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="488" y="1215.6" textLength="951.6" 
clip-path="url(#breeze-release-management-line-49)">──── [...]
+</text><text class="breeze-release-management-r5" x="0" y="1240" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-50)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1240" textLength="451.4" 
clip-path="url(#breeze-release-management-line-50)">prepare-mypy-distributions&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="500.2" y="1240" textLength="939.4" 
clip-path="url(#breeze-release-manage [...]
+</text><text class="breeze-release-management-r5" x="0" y="1264.4" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-51)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="1264.4" textLength="12.2" 
clip-path="url(#breeze-release-management-line-51)">
+</text><text class="breeze-release-management-r5" x="0" y="1288.8" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-52)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="1288.8" textLength="292.8" 
clip-path="url(#breeze-release-management-line-52)">&#160;Other&#160;release&#160;commands&#160;</text><text
 class="breeze-release-management-r5" x="317.2" y="1288.8" textLength="1122.4" 
clip-path="url(#breeze-release-management-line-52)">───────────────────────── 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="1313.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-53)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1313.2" textLength="292.8" 
clip-path="url(#breeze-release-management-line-53)">add-back-references&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1313.2" textLength="1098" 
clip-path="url(#breeze-release-management-line-53)">Command&#160;to&#160;ad 
[...]
+</text><text class="breeze-release-management-r5" x="0" y="1337.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-54)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1337.6" textLength="292.8" 
clip-path="url(#breeze-release-management-line-54)">prepare-python-client&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1337.6" textLength="1098" 
clip-path="url(#breeze-release-management-line-54)">Prepares&#160;python&#160;client&
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="1362" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-55)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1362" textLength="292.8" 
clip-path="url(#breeze-release-management-line-55)">publish-docs&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1362" textLength="1098" 
clip-path="url(#breeze-release-management-line [...]
+</text><text class="breeze-release-management-r5" x="0" y="1386.4" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-56)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1386.4" textLength="292.8" 
clip-path="url(#breeze-release-management-line-56)">generate-constraints&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1386.4" textLength="1098" 
clip-path="url(#breeze-release-management-line-56)">Generates&#160;pinned&#160;c
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="1410.8" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-57)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1410.8" textLength="292.8" 
clip-path="url(#breeze-release-management-line-57)">update-constraints&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1410.8" textLength="1098" 
clip-path="url(#breeze-release-management-line-57)">Update&#160;releas [...]
+</text><text class="breeze-release-management-r5" x="0" y="1435.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-58)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1435.2" textLength="292.8" 
clip-path="url(#breeze-release-management-line-58)">publish-docs-to-s3&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1435.2" textLength="1098" 
clip-path="url(#breeze-release-management-line-58)">Publishes&#160;doc [...]
+</text><text class="breeze-release-management-r5" x="0" y="1459.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-59)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1459.6" textLength="292.8" 
clip-path="url(#breeze-release-management-line-59)">verify-rc-by-pmc&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1459.6" textLength="1098" 
clip-path="url(#breeze-release-management-line-59)">[EXPERIM [...]
+</text><text class="breeze-release-management-r5" x="0" y="1484" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-60)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1484" textLength="292.8" 
clip-path="url(#breeze-release-management-line-60)">check-release-files&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="341.6" y="1484" textLength="1098" 
clip-path="url(#breeze-release-management-line-60)">Verify&#160;that&#160;all&#16
 [...]
 </text><text class="breeze-release-management-r5" x="0" y="1508.4" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-61)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="1508.4" textLength="12.2" 
clip-path="url(#breeze-release-management-line-61)">
+</text><text class="breeze-release-management-r5" x="0" y="1532.8" 
textLength="24.4" 
clip-path="url(#breeze-release-management-line-62)">╭─</text><text 
class="breeze-release-management-r5" x="24.4" y="1532.8" textLength="122" 
clip-path="url(#breeze-release-management-line-62)">&#160;Commands&#160;</text><text
 class="breeze-release-management-r5" x="146.4" y="1532.8" textLength="1293.2" 
clip-path="url(#breeze-release-management-line-62)">───────────────────────────────────────────────────
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="1557.2" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-63)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1557.2" textLength="305" 
clip-path="url(#breeze-release-management-line-63)">constraints-version-check</text><text
 class="breeze-release-management-r1" x="353.8" y="1557.2" textLength="1085.8" 
clip-path="url(#breeze-release-management-line-63)">Check&#160;constraints&#160;against&#160;releas
 [...]
+</text><text class="breeze-release-management-r5" x="0" y="1581.6" 
textLength="12.2" 
clip-path="url(#breeze-release-management-line-64)">│</text><text 
class="breeze-release-management-r4" x="24.4" y="1581.6" textLength="305" 
clip-path="url(#breeze-release-management-line-64)">merge-prod-images&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-r1" x="353.8" y="1581.6" textLength="1085.8" 
clip-path="url(#breeze-release-management-line-64)">Merge&# [...]
+</text><text class="breeze-release-management-r5" x="0" y="1606" 
textLength="1464" 
clip-path="url(#breeze-release-management-line-65)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-r1" x="1464" y="1606" textLength="12.2" 
clip-path="url(#breeze-release-management-line-65)">
 </text>
     </g>
     </g>
diff --git a/dev/breeze/doc/images/output_release-management.txt 
b/dev/breeze/doc/images/output_release-management.txt
index 10f37158801..88669f75b59 100644
--- a/dev/breeze/doc/images/output_release-management.txt
+++ b/dev/breeze/doc/images/output_release-management.txt
@@ -1 +1 @@
-422cbfd07af57d8374a63d90b480edf2
+1588da1100c6c55691550abd5da329b0
diff --git 
a/dev/breeze/doc/images/output_release-management_classify-provider-changes.svg 
b/dev/breeze/doc/images/output_release-management_classify-provider-changes.svg
new file mode 100644
index 00000000000..e7b78f7153e
--- /dev/null
+++ 
b/dev/breeze/doc/images/output_release-management_classify-provider-changes.svg
@@ -0,0 +1,200 @@
+<svg class="rich-terminal" viewBox="0 0 1482 904.0" 
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-release-management-classify-provider-changes-matrix {
+        font-family: Fira Code, monospace;
+        font-size: 20px;
+        line-height: 24.4px;
+        font-variant-east-asian: full-width;
+    }
+
+    .breeze-release-management-classify-provider-changes-title {
+        font-size: 18px;
+        font-weight: bold;
+        font-family: arial;
+    }
+
+    .breeze-release-management-classify-provider-changes-r1 { fill: #c5c8c6 }
+.breeze-release-management-classify-provider-changes-r2 { fill: #d0b344 }
+.breeze-release-management-classify-provider-changes-r3 { fill: 
#c5c8c6;font-weight: bold }
+.breeze-release-management-classify-provider-changes-r4 { fill: 
#68a0b3;font-weight: bold }
+.breeze-release-management-classify-provider-changes-r5 { fill: #868887 }
+.breeze-release-management-classify-provider-changes-r6 { fill: #8d7b39 }
+.breeze-release-management-classify-provider-changes-r7 { fill: 
#98a84b;font-weight: bold }
+    </style>
+
+    <defs>
+    <clipPath 
id="breeze-release-management-classify-provider-changes-clip-terminal">
+      <rect x="0" y="0" width="1463.0" height="853.0" />
+    </clipPath>
+    <clipPath id="breeze-release-management-classify-provider-changes-line-0">
+    <rect x="0" y="1.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-1">
+    <rect x="0" y="25.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-2">
+    <rect x="0" y="50.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-3">
+    <rect x="0" y="74.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-4">
+    <rect x="0" y="99.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-5">
+    <rect x="0" y="123.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-6">
+    <rect x="0" y="147.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-7">
+    <rect x="0" y="172.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-8">
+    <rect x="0" y="196.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-9">
+    <rect x="0" y="221.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-10">
+    <rect x="0" y="245.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-11">
+    <rect x="0" y="269.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-12">
+    <rect x="0" y="294.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-13">
+    <rect x="0" y="318.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-14">
+    <rect x="0" y="343.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-15">
+    <rect x="0" y="367.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-16">
+    <rect x="0" y="391.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-17">
+    <rect x="0" y="416.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-18">
+    <rect x="0" y="440.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-19">
+    <rect x="0" y="465.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-20">
+    <rect x="0" y="489.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-21">
+    <rect x="0" y="513.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-22">
+    <rect x="0" y="538.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-23">
+    <rect x="0" y="562.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-24">
+    <rect x="0" y="587.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-25">
+    <rect x="0" y="611.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-26">
+    <rect x="0" y="635.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-27">
+    <rect x="0" y="660.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-28">
+    <rect x="0" y="684.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-29">
+    <rect x="0" y="709.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-30">
+    <rect x="0" y="733.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-31">
+    <rect x="0" y="757.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-32">
+    <rect x="0" y="782.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-release-management-classify-provider-changes-line-33">
+    <rect x="0" y="806.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="902" rx="8"/><text 
class="breeze-release-management-classify-provider-changes-title" 
fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;release-management&#160;classify-provider-changes</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-release-management-classify-provider-changes-clip-terminal)">
+    
+    <g class="breeze-release-management-classify-provider-changes-matrix">
+    <text class="breeze-release-management-classify-provider-changes-r1" 
x="1464" y="20" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-0)">
+</text><text class="breeze-release-management-classify-provider-changes-r2" 
x="12.2" y="44.4" textLength="1439.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-1)">Usage:&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-release-management-classify-provider-changes-r3" 
x="12.2" y="68.8" textLength="1439.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-2)">breeze&#160;release-management&#160;classify-provider-changes&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#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-release-management-classify-provider-changes-r1" 
x="12.2" y="93.2" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-3)">[</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="93.2" textLength="85.4" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-3)">OPTIONS</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="109.8" 
y="93.2" textLength= [...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="117.6" textLength="73.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-4)">apache</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="85.4" 
y="117.6" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-4)">.</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="97.6" 
y="117.6" textLength [...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="142" textLength="73.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-5)">apache</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="85.4" 
y="142" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-5)">.</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="97.6" 
y="142" textLength="61"  [...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="166.4" textLength="97.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-6)">cloudant</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="109.8" 
y="166.4" textLength="36.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-6)">&#160;|&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="146.4" y="1 
[...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="190.8" textLength="122" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-7)">databricks</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="134.2" 
y="190.8" textLength="36.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-7)">&#160;|&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="170.8" y=" 
[...]
+</text><text class="breeze-release-management-classify-provider-changes-r1" 
x="12.2" y="215.2" textLength="24.4" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-8)">|&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="36.6" 
y="215.2" textLength="36.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-8)">git</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="73.2" 
y="215.2" textLen [...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="239.6" textLength="109.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-9)">microsoft</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="122" 
y="239.6" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-9)">.</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="134.2" 
y="239.6" textLe [...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="264" textLength="97.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-10)">openfaas</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="109.8" 
y="264" textLength="36.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-10)">&#160;|&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="146.4" 
y="264 [...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="288.4" textLength="73.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-11)">presto</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="85.4" 
y="288.4" textLength="36.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-11)">&#160;|&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="122" y="288. 
[...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="312.8" textLength="73.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-12)">sqlite</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="85.4" 
y="312.8" textLength="36.6" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-12)">&#160;|&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="122" y="312. 
[...]
+</text><text class="breeze-release-management-classify-provider-changes-r4" 
x="12.2" y="337.2" textLength="85.4" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-13)">zendesk</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="97.6" 
y="337.2" textLength="1354.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-13)">]...&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-classify-provider-changes-r1" 
x="1464" y="361.6" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-14)">
+</text><text class="breeze-release-management-classify-provider-changes-r1" 
x="12.2" y="386" textLength="1390.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-15)">Classify&#160;each&#160;provider&#x27;s&#160;unreleased&#160;changes&#160;with&#160;hard-coded,&#160;high-confidence&#160;rules,&#160;flagging&#160;ambiguous&#160;commits&#160;as&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="1464" 
y="386" textLength="12.2" clip-p [...]
+</text><text class="breeze-release-management-classify-provider-changes-r1" 
x="12.2" y="410.4" textLength="1220" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-16)">&#x27;needs_llm&#x27;&#160;for&#160;an&#160;agent/skill&#160;to&#160;assess.&#160;Outputs&#160;JSON&#160;-&#160;a&#160;deterministic&#160;alternative&#160;to&#160;the&#160;random&#160;&#x27;</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="1232.2" 
y="410.4" textLength="20 [...]
+</text><text class="breeze-release-management-classify-provider-changes-r1" 
x="12.2" y="434.8" textLength="366" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-17)">run&#160;used&#160;purely&#160;for&#160;discovery.</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="1464" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-17)">
+</text><text class="breeze-release-management-classify-provider-changes-r1" 
x="1464" y="459.2" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-18)">
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="483.6" textLength="24.4" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-19)">╭─</text><text
 class="breeze-release-management-classify-provider-changes-r5" x="24.4" 
y="483.6" textLength="292.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-19)">&#160;Classification&#160;options&#160;</text><text
 class="breeze-release-management-classify-provider-changes [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="508" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-20)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="508" textLength="231.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-20)">--base-branch&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-classify-provider-ch [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="532.4" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-21)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="532.4" textLength="231.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-21)">--skip-git-fetch&#160;&#160;&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r1" x [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="556.8" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-22)">│</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="329.4" 
y="556.8" textLength="1110.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-22)">as-is.&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&
 [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="581.2" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-23)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="581.2" textLength="231.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-23)">--github-repository</text><text
 class="breeze-release-management-classify-provider-changes-r7" x="280.6" 
y="581 [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="605.6" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-24)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="605.6" textLength="231.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-24)">--output-file&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-release-management-classify-provide [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="630" textLength="1464" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-25)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="1464" 
y="630" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-25)">
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="654.4" textLength="24.4" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-26)">╭─</text><text
 class="breeze-release-management-classify-provider-changes-r5" x="24.4" 
y="654.4" textLength="366" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-26)">&#160;Select&#160;non-regular&#160;providers&#160;</text><text
 class="breeze-release-management-classify-provide [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="678.8" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-27)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="678.8" textLength="353.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-27)">--include-not-ready-providers</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="402 [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="703.2" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-28)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="703.2" textLength="353.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-28)">--include-removed-providers&#160;&#160;</text><text
 class="breeze-release-management-classify-provider-changes- [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="727.6" textLength="1464" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-29)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="1464" 
y="727.6" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-29)">
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="752" textLength="24.4" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-30)">╭─</text><text
 class="breeze-release-management-classify-provider-changes-r5" x="24.4" 
y="752" textLength="195.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-30)">&#160;Common&#160;options&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r5" x="219. [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="776.4" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-31)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="776.4" textLength="109.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-31)">--verbose</text><text
 class="breeze-release-management-classify-provider-changes-r7" x="158.6" 
y="776.4" textLe [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="800.8" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-32)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="800.8" textLength="109.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-32)">--dry-run</text><text
 class="breeze-release-management-classify-provider-changes-r7" x="158.6" 
y="800.8" textLe [...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="825.2" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-33)">│</text><text
 class="breeze-release-management-classify-provider-changes-r4" x="24.4" 
y="825.2" textLength="109.8" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-33)">--help&#160;&#160;&#160;</text><text
 class="breeze-release-management-classify-provider-changes-r7" x="158.6" y 
[...]
+</text><text class="breeze-release-management-classify-provider-changes-r5" 
x="0" y="849.6" textLength="1464" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-34)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-release-management-classify-provider-changes-r1" x="1464" 
y="849.6" textLength="12.2" 
clip-path="url(#breeze-release-management-classify-provider-changes-line-34)">
+</text>
+    </g>
+    </g>
+</svg>
diff --git 
a/dev/breeze/doc/images/output_release-management_classify-provider-changes.txt 
b/dev/breeze/doc/images/output_release-management_classify-provider-changes.txt
new file mode 100644
index 00000000000..226f5e3c0fe
--- /dev/null
+++ 
b/dev/breeze/doc/images/output_release-management_classify-provider-changes.txt
@@ -0,0 +1 @@
+57466e5cb9470b0d4398724fda2a1825
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 e60ddb39e38..a94f436f33f 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
@@ -214,11 +214,11 @@
 </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
 cla [...]
 </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
 c [...]
 </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- [...]
-</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="1110.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-16)">release-management:check-release-files&#160;|&#160;release-management:clean-old-provider-artifacts&#160;|&#160;</text><text
 class="breeze-setup-check-all-par [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="434.8" 
textLength="1073.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:constraints-version-check&#160;|&#160;release-management:create-minor-branch&#160;|&#160;</text><text
 class="breeze-setup-check-all-params [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="459.2" 
textLength="1134.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:generate-airflowctl-changelog&#160;|&#160;release-management:generate-constraints&#160;|&#160;</text><text
 class="breeze-setup-check-all-p [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="483.6" 
textLength="1281" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:generate-issue-content-airflow-ctl&#160;|&#160;release-management:generate-issue-content-core&#160;|&#160;</text><text
 class="breeze-setup-c [...]
-</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="508" 
textLength="671" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:generate-issue-content-helm-chart&#160;|&#160;</text><text
 class="breeze-setup-check-all-params-in-groups-r5" x="1451.8" y="508" 
textLength="12.2 [...]
+</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 [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="434.8" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="434.8" 
textLength="1183.4" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-17)">release-management:clean-old-provider-artifacts&#160;|&#160;release-management:constraints-version-check&#160;|&#160;</text><text
 class="breeze-setup-check-a [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="459.2" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="459.2" 
textLength="1122.4" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-18)">release-management:create-minor-branch&#160;|&#160;release-management:generate-airflowctl-changelog&#160;|&#160;</text><text
 class="breeze-setup-check-all-pa [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="483.6" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="483.6" 
textLength="1195.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-19)">release-management:generate-constraints&#160;|&#160;release-management:generate-issue-content-airflow-ctl&#160;|&#160;</text><text
 class="breeze-setup-check- [...]
+</text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" y="508" 
textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="508" 
textLength="1268.8" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-20)">release-management:generate-issue-content-core&#160;|&#160;release-management:generate-issue-content-helm-chart&#160;|&#160;</text><text
 class="breeze-setup-chec [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="532.4" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="532.4" 
textLength="1256.6" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-21)">release-management:generate-issue-content-providers&#160;|&#160;release-management:generate-providers-metadata&#160;|&#160;</text><text
 class="breeze-setup-c [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="556.8" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="556.8" 
textLength="1110.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-22)">release-management:install-provider-distributions&#160;|&#160;release-management:merge-prod-images&#160;|&#160;</text><text
 class="breeze-setup-check-all-par [...]
 </text><text class="breeze-setup-check-all-params-in-groups-r5" x="0" 
y="581.2" textLength="12.2" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">│</text><text 
class="breeze-setup-check-all-params-in-groups-r6" x="158.6" y="581.2" 
textLength="1281" 
clip-path="url(#breeze-setup-check-all-params-in-groups-line-23)">release-management:prepare-airflow-ctl-distributions&#160;|&#160;release-management:prepare-airflow-distributions&#160;|</text><text
 class="breeze-setup-check- [...]
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 827782657be..f6155ca71eb 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 @@
-e9e98d932ec6cb9cfb86af58105b007f
+ab7f4fb815bf503631f336876c24e2b1
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 df79de9080e..0e07ebb3f1e 100644
--- a/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
+++ b/dev/breeze/doc/images/output_setup_regenerate-command-images.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 1343.1999999999998" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 1367.6" 
xmlns="http://www.w3.org/2000/svg";>
     <!-- Generated with Rich https://www.textualize.io -->
     <style>
 
@@ -43,7 +43,7 @@
 
     <defs>
     <clipPath id="breeze-setup-regenerate-command-images-clip-terminal">
-      <rect x="0" y="0" width="1463.0" height="1292.1999999999998" />
+      <rect x="0" y="0" width="1463.0" height="1316.6" />
     </clipPath>
     <clipPath id="breeze-setup-regenerate-command-images-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -201,9 +201,12 @@
 <clipPath id="breeze-setup-regenerate-command-images-line-51">
     <rect x="0" y="1245.9" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-setup-regenerate-command-images-line-52">
+    <rect x="0" y="1270.3" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1341.2" rx="8"/><text 
class="breeze-setup-regenerate-command-images-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;setup&#160;regenerate-command-images</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1365.6" rx="8"/><text 
class="breeze-setup-regenerate-command-images-title" fill="#c5c8c6" 
text-anchor="middle" x="740" 
y="27">Command:&#160;setup&#160;regenerate-command-images</text>
             <g transform="translate(26,22)">
             <circle cx="0" cy="0" r="7" fill="#ff5f57"/>
             <circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -231,41 +234,42 @@
 </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><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="bre [...]
 </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- [...]
-</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:clean-old-provider-artifacts&#160;|&#160;release-management:constraints-version-check&#160;|&#160;</text><text
 class="breeze-setup-regenerate- [...]
-</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="1122.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-19)">release-management:create-minor-branch&#160;|&#160;release-management:generate-airflowctl-changelog&#160;|&#160;</text><text
 class="breeze-setup-regenerate-comma [...]
-</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="1195.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-20)">release-management:generate-constraints&#160;|&#160;release-management:generate-issue-content-airflow-ctl&#160;|&#160;</text><text
 class="breeze-setup-regenerate-com [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="532.4" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">release-management:generate-issue-content-core&#160;|&#160;release-management:generate-issue-content-helm-chart&#160;</text><text
 class="breeze-setup-regenerate- [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="556.8" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">|&#160;release-management:generate-issue-content-providers&#160;|&#160;release-management:generate-providers-metadata</text><text
 class="breeze-setup-regenerate- [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="581.2" 
textLength="1134.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">|&#160;release-management:install-provider-distributions&#160;|&#160;release-management:merge-prod-images&#160;|&#160;</text><text
 class="breeze-setup-regenerate [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="605.6" 
textLength="671" 
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">release-management:prepare-airflow-ctl-distributions&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="605.6" 
textLength="12. [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="630" 
textLength="1207.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">release-management:prepare-airflow-distributions&#160;|&#160;release-management:prepare-helm-chart-package&#160;|&#160;</text><text
 class="breeze-setup-regenerate-co [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="654.4" 
textLength="1171.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">release-management:prepare-helm-chart-tarball&#160;|&#160;release-management:prepare-mypy-distributions&#160;|&#160;</text><text
 class="breeze-setup-regenerate-c [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="678.8" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">release-management:prepare-provider-distributions&#160;|&#160;release-management:prepare-provider-documentation&#160;</text><text
 class="breeze-setup-regenerate- [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="703.2" 
textLength="1000.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">|&#160;release-management:prepare-python-client&#160;|&#160;release-management:prepare-tarball&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-im [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="727.6" 
textLength="1049.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">release-management:prepare-task-sdk-distributions&#160;|&#160;release-management:publish-docs&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-ima [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="752" 
textLength="988.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">release-management:publish-docs-to-s3&#160;|&#160;release-management:release-prod-images&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x= [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="776.4" 
textLength="890.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">release-management:start-rc-process&#160;|&#160;release-management:start-release&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="145 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="800.8" 
textLength="915" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">release-management:tag-providers&#160;|&#160;release-management:update-constraints&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="145 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="825.2" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">release-management:update-providers-next-version&#160;|&#160;release-management:verify-provider-distributions&#160;|&#160;</text><text
 class="breeze-setup-regene [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="849.6" 
textLength="1012.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">release-management:verify-rc-by-pmc&#160;|&#160;run&#160;|&#160;sbom&#160;|&#160;sbom:build-all-airflow-images&#160;|&#160;</text><text
 class="breeze-setup-regen [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="874" 
textLength="927.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">sbom:export-dependency-information&#160;|&#160;sbom:generate-providers-requirements&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="1451 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-36)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="898.4" 
textLength="1159" 
clip-path="url(#breeze-setup-regenerate-command-images-line-36)">sbom:update-sbom-information&#160;|&#160;setup&#160;|&#160;setup:autocomplete&#160;|&#160;setup:check-all-params-in-groups&#160;|&#160;</text><text
 class="breeze-s [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-37)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="922.8" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-37)">setup:config&#160;|&#160;setup:regenerate-command-images&#160;|&#160;setup:self-upgrade&#160;|&#160;setup:synchronize-local-mounts&#160;|</text><text
 class="bree [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="947.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-38)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="947.2" 
textLength="1098" 
clip-path="url(#breeze-setup-regenerate-command-images-line-38)">setup:version&#160;|&#160;shell&#160;|&#160;start-airflow&#160;|&#160;testing&#160;|&#160;testing:airflow-ctl-integration-tests&#160;|&#160;</text><text
 class="bre [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="971.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-39)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="971.6" 
textLength="1085.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-39)">testing:airflow-ctl-tests&#160;|&#160;testing:airflow-e2e-tests&#160;|&#160;testing:core-integration-tests&#160;|&#160;</text><text
 class="breeze-setup-regenerat [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="996" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-40)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="996" 
textLength="890.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-40)">testing:core-tests&#160;|&#160;testing:docker-compose-tests&#160;|&#160;testing:helm-tests&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5"  [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1020.4" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-41)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1020.4" 
textLength="1195.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-41)">testing:providers-integration-tests&#160;|&#160;testing:providers-tests&#160;|&#160;testing:python-api-client-tests&#160;|&#160;</text><text
 class="breeze-setu [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1044.8" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-42)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1044.8" 
textLength="1037" 
clip-path="url(#breeze-setup-regenerate-command-images-line-42)">testing:system-tests&#160;|&#160;testing:task-sdk-integration-tests&#160;|&#160;testing:task-sdk-tests&#160;|&#160;</text><text
 class="breeze-setup-regenerate-co [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1069.2" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-43)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1069.2" 
textLength="1207.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-43)">testing:ui-e2e-tests&#160;|&#160;ui&#160;|&#160;ui:check-translation-completeness&#160;|&#160;ui:compile-assets&#160;|&#160;workflow-run&#160;|&#160;</text><te
 [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1093.6" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-44)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1093.6" 
textLength="317.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-44)">workflow-run:publish-docs)</text><text
 class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="1093.6" 
textLength="12.2" clip-path="url(#breeze-setup-re [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="1118" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-45)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="1118" 
textLength="146.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-45)">--check-only</text><text
 class="breeze-setup-regenerate-command-images-r1" x="195.2" y="1118" 
textLength="1244.4" clip-path="url(#breeze-setup-regenerate-command-ima [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1142.4" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-46)">│</text><text 
class="breeze-setup-regenerate-command-images-r1" x="195.2" y="1142.4" 
textLength="170.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-46)">together&#160;with&#160;</text><text
 class="breeze-setup-regenerate-command-images-r4" x="366" y="1142.4" 
textLength="109.8" clip-path="url(#breeze-setup-regene [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1166.8" textLength="1464" 
clip-path="url(#breeze-setup-regenerate-command-images-line-47)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-regenerate-command-images-r1" x="1464" y="1166.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-47)">
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1191.2" textLength="24.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-48)">╭─</text><text 
class="breeze-setup-regenerate-command-images-r5" x="24.4" y="1191.2" 
textLength="195.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-48)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="219.6" y="1191.2" 
textLength="1220" clip-path="url(#breeze-setu [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1215.6" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-49)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="1215.6" 
textLength="109.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-49)">--verbose</text><text
 class="breeze-setup-regenerate-command-images-r7" x="158.6" y="1215.6" 
textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-im [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="1240" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-50)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="1240" 
textLength="109.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-50)">--dry-run</text><text
 class="breeze-setup-regenerate-command-images-r7" x="158.6" y="1240" 
textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-l [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1264.4" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-51)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="1264.4" 
textLength="109.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-51)">--help&#160;&#160;&#160;</text><text
 class="breeze-setup-regenerate-command-images-r7" x="158.6" y="1264.4" 
textLength="24.4" clip-path="url(#breeze-setup-regene [...]
-</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1288.8" textLength="1464" 
clip-path="url(#breeze-setup-regenerate-command-images-line-52)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-regenerate-command-images-r1" x="1464" y="1288.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-52)">
+</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- [...]
+</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-i [...]
+</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- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="532.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="532.4" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-21)">release-management:generate-issue-content-airflow-ctl&#160;|&#160;release-management:generate-issue-content-core</text><text
 class="breeze-setup-regenerate-comma [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="556.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="556.8" 
textLength="695.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-22)">|&#160;release-management:generate-issue-content-helm-chart&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="556.8" textLe 
[...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="581.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="581.2" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-23)">release-management:generate-issue-content-providers&#160;|&#160;release-management:generate-providers-metadata&#160;|</text><text
 class="breeze-setup-regenerate- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="605.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="605.6" 
textLength="1110.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-24)">release-management:install-provider-distributions&#160;|&#160;release-management:merge-prod-images&#160;|&#160;</text><text
 class="breeze-setup-regenerate-comman [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="630" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="630" 
textLength="671" 
clip-path="url(#breeze-setup-regenerate-command-images-line-25)">release-management:prepare-airflow-ctl-distributions&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="630" 
textLength="12.2" cli [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="654.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="654.4" 
textLength="1207.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-26)">release-management:prepare-airflow-distributions&#160;|&#160;release-management:prepare-helm-chart-package&#160;|&#160;</text><text
 class="breeze-setup-regenerat [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="678.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="678.8" 
textLength="1171.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-27)">release-management:prepare-helm-chart-tarball&#160;|&#160;release-management:prepare-mypy-distributions&#160;|&#160;</text><text
 class="breeze-setup-regenerate-c [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="703.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="703.2" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-28)">release-management:prepare-provider-distributions&#160;|&#160;release-management:prepare-provider-documentation&#160;</text><text
 class="breeze-setup-regenerate- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="727.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="727.6" 
textLength="1000.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-29)">|&#160;release-management:prepare-python-client&#160;|&#160;release-management:prepare-tarball&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-im [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="752" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="752" 
textLength="1049.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-30)">release-management:prepare-task-sdk-distributions&#160;|&#160;release-management:publish-docs&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images- [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="776.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="776.4" 
textLength="988.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-31)">release-management:publish-docs-to-s3&#160;|&#160;release-management:release-prod-images&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="800.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="800.8" 
textLength="890.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-32)">release-management:start-rc-process&#160;|&#160;release-management:start-release&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="145 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="825.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="825.2" 
textLength="915" 
clip-path="url(#breeze-setup-regenerate-command-images-line-33)">release-management:tag-providers&#160;|&#160;release-management:update-constraints&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="145 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="849.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="849.6" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-34)">release-management:update-providers-next-version&#160;|&#160;release-management:verify-provider-distributions&#160;|&#160;</text><text
 class="breeze-setup-regene [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="874" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="874" 
textLength="1012.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-35)">release-management:verify-rc-by-pmc&#160;|&#160;run&#160;|&#160;sbom&#160;|&#160;sbom:build-all-airflow-images&#160;|&#160;</text><text
 class="breeze-setup-regenerat [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="898.4" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-36)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="898.4" 
textLength="927.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-36)">sbom:export-dependency-information&#160;|&#160;sbom:generate-providers-requirements&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x=" [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="922.8" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-37)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="922.8" 
textLength="1159" 
clip-path="url(#breeze-setup-regenerate-command-images-line-37)">sbom:update-sbom-information&#160;|&#160;setup&#160;|&#160;setup:autocomplete&#160;|&#160;setup:check-all-params-in-groups&#160;|&#160;</text><text
 class="breeze-s [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="947.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-38)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="947.2" 
textLength="1244.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-38)">setup:config&#160;|&#160;setup:regenerate-command-images&#160;|&#160;setup:self-upgrade&#160;|&#160;setup:synchronize-local-mounts&#160;|</text><text
 class="bree [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="971.6" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-39)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="971.6" 
textLength="1098" 
clip-path="url(#breeze-setup-regenerate-command-images-line-39)">setup:version&#160;|&#160;shell&#160;|&#160;start-airflow&#160;|&#160;testing&#160;|&#160;testing:airflow-ctl-integration-tests&#160;|&#160;</text><text
 class="bre [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="996" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-40)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="996" 
textLength="1085.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-40)">testing:airflow-ctl-tests&#160;|&#160;testing:airflow-e2e-tests&#160;|&#160;testing:core-integration-tests&#160;|&#160;</text><text
 class="breeze-setup-regenerate-co [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1020.4" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-41)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1020.4" 
textLength="890.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-41)">testing:core-tests&#160;|&#160;testing:docker-compose-tests&#160;|&#160;testing:helm-tests&#160;|&#160;</text><text
 class="breeze-setup-regenerate-command-image [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1044.8" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-42)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1044.8" 
textLength="1195.6" 
clip-path="url(#breeze-setup-regenerate-command-images-line-42)">testing:providers-integration-tests&#160;|&#160;testing:providers-tests&#160;|&#160;testing:python-api-client-tests&#160;|&#160;</text><text
 class="breeze-setu [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1069.2" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-43)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1069.2" 
textLength="1037" 
clip-path="url(#breeze-setup-regenerate-command-images-line-43)">testing:system-tests&#160;|&#160;testing:task-sdk-integration-tests&#160;|&#160;testing:task-sdk-tests&#160;|&#160;</text><text
 class="breeze-setup-regenerate-co [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1093.6" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-44)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1093.6" 
textLength="1207.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-44)">testing:ui-e2e-tests&#160;|&#160;ui&#160;|&#160;ui:check-translation-completeness&#160;|&#160;ui:compile-assets&#160;|&#160;workflow-run&#160;|&#160;</text><te
 [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="1118" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-45)">│</text><text 
class="breeze-setup-regenerate-command-images-r6" x="195.2" y="1118" 
textLength="317.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-45)">workflow-run:publish-docs)</text><text
 class="breeze-setup-regenerate-command-images-r5" x="1451.8" y="1118" 
textLength="12.2" clip-path="url(#breeze-setup-regenera [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1142.4" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-46)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="1142.4" 
textLength="146.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-46)">--check-only</text><text
 class="breeze-setup-regenerate-command-images-r1" x="195.2" y="1142.4" 
textLength="1244.4" clip-path="url(#breeze-setup-regenerate-comma [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1166.8" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-47)">│</text><text 
class="breeze-setup-regenerate-command-images-r1" x="195.2" y="1166.8" 
textLength="170.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-47)">together&#160;with&#160;</text><text
 class="breeze-setup-regenerate-command-images-r4" x="366" y="1166.8" 
textLength="109.8" clip-path="url(#breeze-setup-regene [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1191.2" textLength="1464" 
clip-path="url(#breeze-setup-regenerate-command-images-line-48)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-regenerate-command-images-r1" x="1464" y="1191.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-48)">
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1215.6" textLength="24.4" 
clip-path="url(#breeze-setup-regenerate-command-images-line-49)">╭─</text><text 
class="breeze-setup-regenerate-command-images-r5" x="24.4" y="1215.6" 
textLength="195.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-49)">&#160;Common&#160;options&#160;</text><text
 class="breeze-setup-regenerate-command-images-r5" x="219.6" y="1215.6" 
textLength="1220" clip-path="url(#breeze-setu [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" y="1240" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-50)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="1240" 
textLength="109.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-50)">--verbose</text><text
 class="breeze-setup-regenerate-command-images-r7" x="158.6" y="1240" 
textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-images-l [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1264.4" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-51)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="1264.4" 
textLength="109.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-51)">--dry-run</text><text
 class="breeze-setup-regenerate-command-images-r7" x="158.6" y="1264.4" 
textLength="24.4" clip-path="url(#breeze-setup-regenerate-command-im [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1288.8" textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-52)">│</text><text 
class="breeze-setup-regenerate-command-images-r4" x="24.4" y="1288.8" 
textLength="109.8" 
clip-path="url(#breeze-setup-regenerate-command-images-line-52)">--help&#160;&#160;&#160;</text><text
 class="breeze-setup-regenerate-command-images-r7" x="158.6" y="1288.8" 
textLength="24.4" clip-path="url(#breeze-setup-regene [...]
+</text><text class="breeze-setup-regenerate-command-images-r5" x="0" 
y="1313.2" textLength="1464" 
clip-path="url(#breeze-setup-regenerate-command-images-line-53)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-setup-regenerate-command-images-r1" x="1464" y="1313.2" 
textLength="12.2" 
clip-path="url(#breeze-setup-regenerate-command-images-line-53)">
 </text>
     </g>
     </g>
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 37b9c5d0a5f..328bd526239 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 @@
-a48314c7b578d0c781e27c660641c459
+3a1ef6b761c61aa0fa09fe849e948a0e
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
index c7e6378239b..a117e9f11f6 100644
--- a/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/release_management_commands.py
@@ -811,6 +811,115 @@ def provider_action_summary(description: str, 
message_type: MessageType, package
         console_print()
 
 
+@release_management_group.command(
+    name="classify-provider-changes",
+    help="Classify each provider's unreleased changes with hard-coded, 
high-confidence rules, "
+    "flagging ambiguous commits as 'needs_llm' for an agent/skill to assess. 
Outputs JSON - a "
+    "deterministic alternative to the random '--non-interactive' run used 
purely for discovery.",
+)
[email protected](
+    "--base-branch",
+    type=str,
+    default="main",
+    help="Base branch to diff the provider changes against.",
+)
[email protected](
+    "--skip-git-fetch",
+    is_flag=True,
+    help="Skip recreating/fetching the 'apache-https-for-providers' remote; 
use the local state as-is.",
+)
[email protected](
+    "--output-file",
+    type=click.Path(dir_okay=False, writable=True, path_type=Path),
+    help="Write the JSON result here instead of stdout (keeps stdout free of 
progress output).",
+)
+@option_github_repository
+@option_include_not_ready_providers
+@option_include_removed_providers
+@argument_provider_distributions
+@option_verbose
+@option_dry_run
+def classify_provider_changes(
+    base_branch: str,
+    skip_git_fetch: bool,
+    output_file: Path | None,
+    github_repository: str,
+    include_not_ready_providers: bool,
+    include_removed_providers: bool,
+    provider_distributions: tuple[str, ...],
+):
+    import json
+
+    from airflow_breeze.prepare_providers.provider_documentation import (
+        NEEDS_LLM_CLASSIFICATION,
+        _get_all_changes_for_package,
+        classify_change_deterministically,
+    )
+
+    perform_environment_checks()
+    cleanup_python_generated_files()
+    if not provider_distributions:
+        provider_distributions = get_available_distributions(
+            include_removed=include_removed_providers, 
include_not_ready=include_not_ready_providers
+        )
+    if not skip_git_fetch:
+        run_command(["git", "remote", "rm", "apache-https-for-providers"], 
check=False, stderr=DEVNULL)
+        
make_sure_remote_apache_exists_and_fetch(github_repository=github_repository)
+
+    result: dict[str, Any] = {"base_branch": base_branch, "providers": {}}
+    needs_llm_total = 0
+    for provider_id in provider_distributions:
+        try:
+            basic_provider_checks(provider_id)
+            _, list_of_list_of_changes, _ = _get_all_changes_for_package(
+                provider_id,
+                base_branch,
+                reapply_templates_only=False,
+                only_min_version_update=False,
+            )
+        except Exception as e:
+            # Typically a brand-new provider with no prior release tag, or a 
suspended provider.
+            result["providers"][provider_id] = {
+                "pending": True,
+                "needs_llm": True,
+                "note": f"could not compute diff (new provider or missing 
release tag): {e}",
+            }
+            continue
+        changes = list_of_list_of_changes[0] if list_of_list_of_changes else []
+        if not changes:
+            continue
+        commits = []
+        for change in changes:
+            classification, reason = 
classify_change_deterministically(provider_id, change)
+            if classification == NEEDS_LLM_CLASSIFICATION:
+                needs_llm_total += 1
+            commits.append(
+                {
+                    "hash": change.short_hash,
+                    "pr": change.pr,
+                    "subject": change.message_without_backticks,
+                    "classification": classification,
+                    "reason": reason,
+                }
+            )
+        result["providers"][provider_id] = {
+            "current_version": get_provider_details(provider_id).versions[0],
+            "commits": commits,
+        }
+
+    payload = json.dumps(result, indent=2)
+    if output_file:
+        output_file.write_text(payload + "\n")
+        console_print(
+            f"[success]Wrote classification for {len(result['providers'])} 
provider(s) "
+            f"to {output_file}[/]\n"
+            f"[info]{needs_llm_total} commit(s) flagged 'needs_llm' for LLM 
assessment.[/]"
+        )
+    else:
+        # Plain stdout (not via the rich console) so the JSON is 
machine-parsable.
+        print(payload)
+
+
 @release_management_group.command(
     name="prepare-provider-documentation",
     help="Prepare CHANGELOG, README and COMMITS information for providers.",
diff --git 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
index 52c51e0c531..2b4c8073b88 100644
--- 
a/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
+++ 
b/dev/breeze/src/airflow_breeze/commands/release_management_commands_config.py
@@ -42,6 +42,7 @@ RELEASE_PROVIDERS_COMMANDS: dict[str, str | list[str]] = {
     "name": "Providers release commands",
     "commands": [
         "prepare-provider-documentation",
+        "classify-provider-changes",
         "update-providers-next-version",
         "prepare-provider-distributions",
         "install-provider-distributions",
@@ -266,6 +267,24 @@ RELEASE_MANAGEMENT_PARAMETERS: dict[str, list[dict[str, 
str | list[str]]]] = {
             ],
         },
     ],
+    "breeze release-management classify-provider-changes": [
+        {
+            "name": "Classification options",
+            "options": [
+                "--base-branch",
+                "--skip-git-fetch",
+                "--github-repository",
+                "--output-file",
+            ],
+        },
+        {
+            "name": "Select non-regular providers",
+            "options": [
+                "--include-not-ready-providers",
+                "--include-removed-providers",
+            ],
+        },
+    ],
     "breeze release-management prepare-provider-documentation": [
         {
             "name": "Documentation generation mode",
diff --git 
a/dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py 
b/dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py
index 3b42befe3fa..0a3053f1184 100644
--- a/dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py
+++ b/dev/breeze/src/airflow_breeze/prepare_providers/provider_documentation.py
@@ -251,6 +251,50 @@ def classify_provider_pr_files(provider_id: str, 
commit_hash: str) -> str:
     return classification_result(provider_id, changed_files)
 
 
+# Classification value emitted when no high-confidence hard-coded rule matches 
and
+# an LLM/agent must assess the type of change. The deterministic rules only 
ever
+# decide ``documentation``/``skip``/``misc`` (the cases that can be decided 
with
+# near-certainty from changed files or the commit subject); everything else is
+# deliberately left to an LLM, because ``Fix``/``Add`` subjects are too often 
wrong
+# (e.g. an "Add ..." that is actually a breaking change).
+NEEDS_LLM_CLASSIFICATION = "needs_llm"
+
+# Maps the deterministic file/subject verdicts to the human-readable 
classification
+# names used by the prepare-providers-documentation skill and changelog 
sections.
+_DETERMINISTIC_CLASSIFICATION_NAMES = {
+    TypeOfChange.DOCUMENTATION: "documentation",
+    TypeOfChange.SKIP: "skip",
+    TypeOfChange.MISC: "misc",
+}
+
+_BUMP_SUBJECT_RE = re.compile(r"^\s*bump\b", re.IGNORECASE)
+
+
+def classify_change_deterministically(provider_id: str, change: Change) -> 
tuple[str, str]:
+    """Classify a single provider change using only hard-coded, 
high-confidence rules.
+
+    Returns a ``(classification, reason)`` tuple where ``classification`` is 
one of
+    ``documentation``, ``skip``, ``misc`` (decided here) or ``needs_llm`` (no
+    high-confidence rule matched - an LLM/agent must assess the type of 
change).
+
+    Intentionally conservative: only changed-files heuristics and a ``Bump``
+    dependency-bump subject are trusted. ``Fix``/``Add`` subjects are NOT
+    auto-classified as bugfix/feature, since they are wrong too often to be 
safe.
+    """
+    files_class = classify_provider_pr_files(provider_id, change.full_hash)
+    if files_class == "documentation":
+        return 
_DETERMINISTIC_CLASSIFICATION_NAMES[TypeOfChange.DOCUMENTATION], (
+            "only provider documentation (*.rst) files changed"
+        )
+    if files_class == "test_or_example_only":
+        return _DETERMINISTIC_CLASSIFICATION_NAMES[TypeOfChange.SKIP], ("only 
tests / example DAGs changed")
+    if _BUMP_SUBJECT_RE.match(change.message):
+        return _DETERMINISTIC_CLASSIFICATION_NAMES[TypeOfChange.MISC], (
+            "dependency bump (subject starts with 'Bump')"
+        )
+    return NEEDS_LLM_CLASSIFICATION, "no high-confidence deterministic rule 
matched"
+
+
 def _get_git_log_command(
     folder_paths: list[Path] | None = None, from_commit: str | None = None, 
to_commit: str | None = None
 ) -> list[str]:
diff --git a/dev/breeze/tests/test_provider_documentation.py 
b/dev/breeze/tests/test_provider_documentation.py
index 9d4340c48ae..b1048452071 100644
--- a/dev/breeze/tests/test_provider_documentation.py
+++ b/dev/breeze/tests/test_provider_documentation.py
@@ -23,6 +23,7 @@ from pathlib import Path
 import pytest
 
 from airflow_breeze.prepare_providers.provider_documentation import (
+    NEEDS_LLM_CLASSIFICATION,
     VERSION_MAJOR_INDEX,
     VERSION_MINOR_INDEX,
     VERSION_PATCHLEVEL_INDEX,
@@ -34,6 +35,7 @@ from airflow_breeze.prepare_providers.provider_documentation 
import (
     _get_changes_classified,
     _get_git_log_command,
     classification_result,
+    classify_change_deterministically,
     get_most_impactful_change,
     get_version_tag,
 )
@@ -490,3 +492,43 @@ def test_get_most_impactful_change(changes, expected):
 def test_classify_provider_pr_files_logic(provider_id, changed_files, 
expected):
     result = classification_result(provider_id, changed_files)
     assert result == expected
+
+
+def _make_change(subject: str) -> Change:
+    return Change(
+        full_hash="deadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
+        short_hash="deadbee",
+        date="2026-06-08",
+        version="1.0.0",
+        message=subject,
+        message_without_backticks=subject.replace("`", "'"),
+        pr="123",
+    )
+
+
[email protected](
+    ("files_class", "subject", "expected"),
+    [
+        # changed-files verdict wins, regardless of the subject
+        pytest.param("documentation", "Fix typo in docs", "documentation", 
id="doc_only"),
+        pytest.param("documentation", "Bump aiohttp", "documentation", 
id="doc_only_beats_bump"),
+        pytest.param("test_or_example_only", "Add a flaky test", "skip", 
id="test_only"),
+        # subject-based deterministic rule: dependency bumps
+        pytest.param("other", "Bump aiohttp regarding dependabot warning", 
"misc", id="bump_misc"),
+        pytest.param("other", "bump the deps group across 1 directory", 
"misc", id="lowercase_bump_misc"),
+        # everything else is intentionally left to the LLM (conservative)
+        pytest.param("other", "Fix the ftp tls", NEEDS_LLM_CLASSIFICATION, 
id="fix_needs_llm"),
+        pytest.param("other", "Add DmsModifyTaskOperator", 
NEEDS_LLM_CLASSIFICATION, id="add_needs_llm"),
+        pytest.param("other", "Rename resumablemixin file", 
NEEDS_LLM_CLASSIFICATION, id="rename_needs_llm"),
+    ],
+)
+def test_classify_change_deterministically(files_class, subject, expected):
+    from unittest import mock
+
+    with mock.patch(
+        
"airflow_breeze.prepare_providers.provider_documentation.classify_provider_pr_files",
+        return_value=files_class,
+    ):
+        classification, reason = classify_change_deterministically("amazon", 
_make_change(subject))
+    assert classification == expected
+    assert reason, "a non-empty reason must always be returned"


Reply via email to