This is an automated email from the ASF dual-hosted git repository.
potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git
The following commit(s) were added to refs/heads/main by this push:
new 4b69954d3d3 Add people selection options group and reviewer filter to
auto-triage (#63422)
4b69954d3d3 is described below
commit 4b69954d3d341ff1ae8217e4963520e6ac78b4b6
Author: Jarek Potiuk <[email protected]>
AuthorDate: Thu Mar 12 14:39:48 2026 +0100
Add people selection options group and reviewer filter to auto-triage
(#63422)
Co-authored-by: Claude Opus 4.6 <[email protected]>
---
dev/breeze/doc/images/output_pr_auto-triage.svg | 174 +++++++-------
dev/breeze/doc/images/output_pr_auto-triage.txt | 2 +-
.../src/airflow_breeze/commands/pr_commands.py | 265 ++++++++++++++++++---
.../airflow_breeze/commands/pr_commands_config.py | 12 +-
.../src/airflow_breeze/utils/custom_param_types.py | 16 ++
5 files changed, 355 insertions(+), 114 deletions(-)
diff --git a/dev/breeze/doc/images/output_pr_auto-triage.svg
b/dev/breeze/doc/images/output_pr_auto-triage.svg
index 39f6145ac1c..4117bca262a 100644
--- a/dev/breeze/doc/images/output_pr_auto-triage.svg
+++ b/dev/breeze/doc/images/output_pr_auto-triage.svg
@@ -1,4 +1,4 @@
-<svg class="rich-terminal" viewBox="0 0 1482 2246.0"
xmlns="http://www.w3.org/2000/svg">
+<svg class="rich-terminal" viewBox="0 0 1482 2319.2"
xmlns="http://www.w3.org/2000/svg">
<!-- Generated with Rich https://www.textualize.io -->
<style>
@@ -43,7 +43,7 @@
<defs>
<clipPath id="breeze-pr-auto-triage-clip-terminal">
- <rect x="0" y="0" width="1463.0" height="2195.0" />
+ <rect x="0" y="0" width="1463.0" height="2268.2" />
</clipPath>
<clipPath id="breeze-pr-auto-triage-line-0">
<rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -312,9 +312,18 @@
<clipPath id="breeze-pr-auto-triage-line-88">
<rect x="0" y="2148.7" width="1464" height="24.65"/>
</clipPath>
+<clipPath id="breeze-pr-auto-triage-line-89">
+ <rect x="0" y="2173.1" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-90">
+ <rect x="0" y="2197.5" width="1464" height="24.65"/>
+ </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-91">
+ <rect x="0" y="2221.9" width="1464" height="24.65"/>
+ </clipPath>
</defs>
- <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="2244" rx="8"/><text
class="breeze-pr-auto-triage-title" fill="#c5c8c6" text-anchor="middle" x="740"
y="27">Command: pr auto-triage</text>
+ <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1"
x="1" y="1" width="1480" height="2317.2" rx="8"/><text
class="breeze-pr-auto-triage-title" fill="#c5c8c6" text-anchor="middle" x="740"
y="27">Command: pr auto-triage</text>
<g transform="translate(26,22)">
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
@@ -336,84 +345,87 @@
</text><text class="breeze-pr-auto-triage-r5" x="0" y="239.6"
textLength="24.4" clip-path="url(#breeze-pr-auto-triage-line-9)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="239.6" textLength="219.6"
clip-path="url(#breeze-pr-auto-triage-line-9)"> Target selection </text><text
class="breeze-pr-auto-triage-r5" x="244" y="239.6" textLength="1195.6"
clip-path="url(#breeze-pr-auto-triage-line-9)">────────────────────────────────────────────────────────────────────
[...]
</text><text class="breeze-pr-auto-triage-r5" x="0" y="264" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-10)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="264" textLength="48.8"
clip-path="url(#breeze-pr-auto-triage-line-10)">--pr</text><text
class="breeze-pr-auto-triage-r1" x="97.6" y="264" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-10)">Triage a specific PR by number instead of searching. </te
[...]
</text><text class="breeze-pr-auto-triage-r5" x="0" y="288.4"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-11)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="288.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-11)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="312.8"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-12)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="312.8" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-12)"> Filter options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="312.8" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-12)">───────────────────────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="337.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-13)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="337.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-13)">--label                </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="337.2" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="361.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-14)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="361.6" textLength="122"
clip-path="url(#breeze-pr-auto-triage-line-14)">repeated. </text><text
class="breeze-pr-auto-triage-r6" x="451.4" y="361.6" textLength="829.6"
clip-path="url(#breeze-pr-auto-triage-line-14)">(area:API | area:CLI | area:ConfigTemplates | area:DAG
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="386" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-15)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="386" textLength="1024.8"
clip-path="url(#breeze-pr-auto-triage-line-15)">area:Executors-core | area:Lineage | area:Logging | area:Plugins | area:Scheduler | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="386" textLength="12.2"
clip-path="url(# [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="410.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-16)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="410.4" textLength="1012.6"
clip-path="url(#breeze-pr-auto-triage-line-16)">area:Secrets | area:Triggerer | area:UI | area:airflow-ctl | area:core-operators | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="410.4" textLength="12.2"
clip-path=" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="434.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-17)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="434.8" textLength="988.2"
clip-path="url(#breeze-pr-auto-triage-line-17)">area:db-migrations | area:deadline-alerts | area:dev-tools | area:docker-tests | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="434.8" textLength="12.2"
clip-path="url(#breeze-p [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="459.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-18)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="459.2" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-18)">area:go-sdk | area:helm-chart | area:kubernetes-tests | area:production-image | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="459.2" textLength="12.2"
clip-path="url(#breeze-pr-a [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="483.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-19)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="483.6" textLength="1085.8"
clip-path="url(#breeze-pr-auto-triage-line-19)">area:providers | area:registry | area:system-tests | area:task-sdk | area:translations | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="483.6" textLength="12.2" clip-
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="508" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-20)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="508" textLength="1012.6"
clip-path="url(#breeze-pr-auto-triage-line-20)">backport-to-v3-1-test | kind:documentation | provider:airbyte | provider:alibaba | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="508" textLength="12.2"
clip-path="url(#breeze-pr-a [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="532.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-21)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="532.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-21)">provider:amazon | provider:apache-beam | provider:apache-cassandra | provider:apache-drill </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="532.4" textLength="12.2"
clip-path="url(#br [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="556.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-22)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="556.8" textLength="890.6"
clip-path="url(#breeze-pr-auto-triage-line-22)">| provider:apache-druid | provider:apache-flink | provider:apache-hdfs | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="556.8" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="581.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-23)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="581.2" textLength="902.8"
clip-path="url(#breeze-pr-auto-triage-line-23)">provider:apache-hive | provider:apache-iceberg | provider:apache-impala | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="581.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-lin [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="605.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-24)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="605.6" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-24)">provider:apache-kafka | provider:apache-kylin | provider:apache-livy | provider:apache-pig </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="605.6" textLength="12.2"
clip-path="url(#br [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="630" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-25)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="630" textLength="951.6"
clip-path="url(#breeze-pr-auto-triage-line-25)">| provider:apache-pinot | provider:apache-spark | provider:apache-tinkerpop | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="630" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage- [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="654.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-26)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="654.4" textLength="1000.4"
clip-path="url(#breeze-pr-auto-triage-line-26)">provider:apprise | provider:arangodb | provider:asana | provider:atlassian-jira | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="654.4" textLength="12.2"
clip-path="url(#breeze [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="678.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-27)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="678.8" textLength="1012.6"
clip-path="url(#breeze-pr-auto-triage-line-27)">provider:celery | provider:cloudant | provider:cncf-kubernetes | provider:cohere | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="678.8" textLength="12.2"
clip-path="url(#breez [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="703.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-28)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="703.2" textLength="817.4"
clip-path="url(#breeze-pr-auto-triage-line-28)">provider:common-ai | provider:common-compat | provider:common-io | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="703.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-28)"> [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="727.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-29)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="727.6" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-29)">provider:common-messaging | provider:common-sql | provider:databricks | provider:datadog | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="727.6" textLength="12.2"
clip-path="ur [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="752" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-30)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="752" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-30)">provider:dbt-cloud | provider:dingding | provider:discord | provider:docker | provider:edge</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="752" textLength="12.2"
clip-path="url(#bre [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="776.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-31)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="776.4" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-31)">| provider:elasticsearch | provider:exasol | provider:fab | provider:facebook | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="776.4" textLength="12.2"
clip-path="url(#breeze [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="800.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-32)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="800.8" textLength="1000.4"
clip-path="url(#breeze-pr-auto-triage-line-32)">provider:ftp | provider:git | provider:github | provider:google | provider:grpc | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="800.8" textLength="12.2"
clip-path="u [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="825.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-33)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="825.2" textLength="890.6"
clip-path="url(#breeze-pr-auto-triage-line-33)">provider:hashicorp | provider:http | provider:imap | provider:influxdb | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="825.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-t [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="849.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-34)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="849.6" textLength="951.6"
clip-path="url(#breeze-pr-auto-triage-line-34)">provider:informatica | provider:jdbc | provider:jenkins | provider:keycloak | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="849.6" textLength="12.2"
clip-path="url(#breeze-pr-a [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="874" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-35)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="874" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-35)">provider:microsoft-azure | provider:microsoft-mssql | provider:microsoft-psrp | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="874" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line- [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="898.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-36)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="898.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-36)">provider:microsoft-winrm | provider:mongo | provider:mysql | provider:neo4j | provider:odbc</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="898.4" textLength="12.2"
clip-path="ur [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="922.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-37)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="922.8" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-37)">| provider:openai | provider:openfaas | provider:openlineage | provider:opensearch | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="922.8" textLength="12.2"
clip-path="url(# [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="947.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-38)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="947.2" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-38)">provider:opsgenie | provider:oracle | provider:pagerduty | provider:papermill | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="947.2" textLength="12.2"
clip-path="url(#breeze-pr-a [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="971.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-39)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="971.6" textLength="951.6"
clip-path="url(#breeze-pr-auto-triage-line-39)">provider:pgvector | provider:pinecone | provider:postgres | provider:presto | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="971.6" textLength="12.2"
clip-path="url(#breeze-pr-a [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="996" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-40)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="996" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-40)">provider:qdrant | provider:redis | provider:salesforce | provider:samba | provider:segment </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="996" textLength="12.2"
clip-path="url [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1020.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-41)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1020.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-41)">| provider:sendgrid | provider:sftp | provider:singularity | provider:slack | provider:smtp</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1020.4" textLength="12.2" clip-
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1044.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-42)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1044.8" textLength="927.2"
clip-path="url(#breeze-pr-auto-triage-line-42)">| provider:snowflake | provider:sqlite | provider:ssh | provider:standard | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1044.8" textLength="12.2"
clip-path="url(#breez [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1069.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-43)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1069.2" textLength="927.2"
clip-path="url(#breeze-pr-auto-triage-line-43)">provider:tableau | provider:telegram | provider:teradata | provider:trino | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1069.2" textLength="12.2"
clip-path="url(#breeze-pr- [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1093.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-44)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1093.6" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-44)">provider:vertica | provider:weaviate | provider:yandex | provider:ydb | provider:zendesk | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1093.6" textLength="12.2" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1118" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-45)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1118" textLength="1098"
clip-path="url(#breeze-pr-auto-triage-line-45)">translation:ar | translation:ca | translation:de | translation:default | translation:el | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1118" textLength="12.2"
clip-path [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1142.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-46)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1142.4" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-46)">translation:es | translation:fr | translation:he | translation:hi | translation:hu | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1142.4" textLength="12.2"
clip-pat [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1166.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-47)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1166.8" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-47)">translation:it | translation:ja | translation:ko | translation:nl | translation:pl | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1166.8" textLength="12.2"
clip-pat [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1191.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-48)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1191.2" textLength="1085.8"
clip-path="url(#breeze-pr-auto-triage-line-48)">translation:pt | translation:th | translation:tr | translation:zh-CN | translation:zh-TW)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1191.2" textLength="12.2"
clip-path="u [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1215.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-49)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1215.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-49)">--exclude-label        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1215.6" textLength="805.2"
clip-path="url(#breeze-pr-auto-triage-line-49)">Exclude PRs with 
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1240" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-50)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1240" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-50)">--author               </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1240" textLength="402.6"
clip-path="url(#breeze-pr-auto-triage-line-50)">Fil [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1264.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-51)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1264.4" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-51)">--created-after        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1264.4" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-51)">Only PRs created 
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1288.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-52)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1288.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-52)">--created-before       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1288.8" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-52)">Only PRs created on
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1313.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-53)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1313.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-53)">--updated-after        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1313.2" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-53)">Only PRs updated 
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1337.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-54)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1337.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-54)">--updated-before       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1337.6" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-54)">Only PRs updated on
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1362" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-55)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1362" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-55)">--include-collaborators</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1362" textLength="793"
clip-path="url(#breeze-pr-auto-triage-line-55)">Include PRs from collaborators/members/owners (normally 
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1386.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-56)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1386.4" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-56)">--include-drafts       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1386.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-56)">Include draft PRs in&
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1410.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-57)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1410.8" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-57)">review.                                    
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1435.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-58)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1435.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-58)">--pending-approval-only</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1435.2" textLength="622.2"
clip-path="url(#breeze-pr-auto-triage-line-58)">Only show PRs with workflow runs awaiting&
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1459.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-59)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1459.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-59)">--checks-state         </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1459.6" textLength="524.6"
clip-path="url(#breeze-pr-auto-triage-line-59)">Only assess PRs&#
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1484" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-60)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1484" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-60)">--min-commits-behind   </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1484" textLength="878.4"
clip-path="url(#breeze-pr-auto-triage-line-60)">Only assess PRs that are at least
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1508.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-61)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1508.4" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-61)">(INTEGER)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1508.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-61)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1508.4" textLength="12.2" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1532.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-62)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1532.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-62)">--review-requested     </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1532.8" textLength="817.4"
clip-path="url(#breeze-pr-auto-triage-line-62)">Only show PRs where review&
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1557.2"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-63)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1557.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-63)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1581.6"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-64)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1581.6" textLength="292.8"
clip-path="url(#breeze-pr-auto-triage-line-64)"> Pagination and sorting </text><text
class="breeze-pr-auto-triage-r5" x="317.2" y="1581.6" textLength="1122.4"
clip-path="url(#breeze-pr-auto-triage-line-64)">─────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1606" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-65)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1606" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-65)">--batch-size</text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1606" textLength="500.2"
clip-path="url(#breeze-pr-auto-triage-line-65)">Number of PRs to fetch per GraphQL page. </text><
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1630.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-66)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1630.4" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-66)">--max-num   </text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1630.4" textLength="793"
clip-path="url(#breeze-pr-auto-triage-line-66)">Maximum number of non-collaborator PRs to
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1654.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-67)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1654.8" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-67)">--sort      </text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1654.8" textLength="414.8"
clip-path="url(#breeze-pr-auto-triage-line-67)">Sort order for PR search res
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1679.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-68)">│</text><text
class="breeze-pr-auto-triage-r6" x="195.2" y="1679.2" textLength="622.2"
clip-path="url(#breeze-pr-auto-triage-line-68)">(created-asc|created-desc|updated-asc|updated-desc)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1679.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-68)">│</text><text
class="breeze-pr-auto-triage- [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1703.6"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-69)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1703.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-69)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1728" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-70)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1728" textLength="244"
clip-path="url(#breeze-pr-auto-triage-line-70)"> Assessment options </text><text
class="breeze-pr-auto-triage-r5" x="268.4" y="1728" textLength="1171.2"
clip-path="url(#breeze-pr-auto-triage-line-70)">──────────────────────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1752.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-71)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1752.4" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-71)">--check-mode     </text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1752.4" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-71)">Which checks to run: 'both&#x
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1776.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-72)">│</text><text
class="breeze-pr-auto-triage-r5" x="256.2" y="1776.8" textLength="61"
clip-path="url(#breeze-pr-auto-triage-line-72)">both]</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1776.8" textLength="158.6"
clip-path="url(#breeze-pr-auto-triage-line-72)">(both|ci|llm)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1776.8" textLength= [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1801.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-73)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1801.2" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-73)">--llm-model      </text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1801.2" textLength="1183.4"
clip-path="url(#breeze-pr-auto-triage-line-73)">LLM model for assessment (f
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1825.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-74)">│</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1825.6" textLength="268.4"
clip-path="url(#breeze-pr-auto-triage-line-74)">for OpenAI Codex CLI. </text><text
class="breeze-pr-auto-triage-r5" x="524.6" y="1825.6" textLength="427"
clip-path="url(#breeze-pr-auto-triage-line-74)">[default: claude/claude-sonnet-4-6]</text><text
c [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1850" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-75)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1850" textLength="1159"
clip-path="url(#breeze-pr-auto-triage-line-75)">>claude/claude-sonnet-4-6< | claude/claude-opus-4-20250514 | claude/claude-sonnet-4-20250514 | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1850" textLength="12.2"
clip-path="url(#br [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1874.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-76)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1874.4" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-76)">claude/claude-haiku-4-5-20251001 | claude/sonnet | claude/opus | claude/haiku | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1874.4" textLength="12.2"
clip-path="url(#breeze-p [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1898.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-77)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1898.8" textLength="1146.8"
clip-path="url(#breeze-pr-auto-triage-line-77)">codex/gpt-5.3-codex | codex/gpt-5.3-codex-spark | codex/gpt-5.2-codex | codex/gpt-5.1-codex | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1898.8" textLength="12.2"
clip-pa [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1923.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-78)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1923.2" textLength="695.4"
clip-path="url(#breeze-pr-auto-triage-line-78)">codex/gpt-5-codex | codex/gpt-5-codex-mini | codex/gpt-5)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1923.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-78)">│</text><text cla [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1947.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-79)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1947.6" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-79)">--llm-concurrency</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1947.6" textLength="524.6"
clip-path="url(#breeze-pr-auto-triage-line-79)">Number of concurrent LLM assessment calls. </tex
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1972" textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-80)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1972" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-80)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1996.4"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-81)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1996.4" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-81)"> Action options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="1996.4" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-81)">────────────────────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2020.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-82)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2020.8" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-82)">--answer-triage</text><text
class="breeze-pr-auto-triage-r1" x="231.8" y="2020.8" textLength="1207.8"
clip-path="url(#breeze-pr-auto-triage-line-82)">Force answer to triage prompts: [d]raft, [c]lose,&#
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2045.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-83)">│</text><text
class="breeze-pr-auto-triage-r6" x="231.8" y="2045.2" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-83)">(d|c|r|s|q|y|n)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2045.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-83)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2045.2" textLength="12 [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2069.6"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-84)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2069.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-84)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2094" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-85)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="2094" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-85)"> Common options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="2094" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-85)">──────────────────────────────────────────────────────────────────────
[...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2118.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-86)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2118.4" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-86)">--dry-run</text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2118.4" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-86)">-D</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2118.4" textLength="719.8" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2142.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-87)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2142.8" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-87)">--verbose</text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2142.8" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-87)">-v</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2142.8" textLength="585.6" [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2167.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-88)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2167.2" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-88)">--help   </text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2167.2" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-88)">-h</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2167.2" tex [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="2191.6"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-89)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2191.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-89)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="312.8"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-12)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="312.8" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-12)"> Select people </text><text
class="breeze-pr-auto-triage-r5" x="207.4" y="312.8" textLength="1232.2"
clip-path="url(#breeze-pr-auto-triage-line-12)">────────────────────────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="337.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-13)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="337.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-13)">--author               </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="337.2" textLength="402.6"
clip-path="url(#breeze-pr-auto-triage-line-13)"> [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="361.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-14)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="361.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-14)">--include-collaborators</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="361.6" textLength="793"
clip-path="url(#breeze-pr-auto-triage-line-14)">Include PRs from collaborators/members/owners (normally&#
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="386" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-15)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="386" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-15)">--reviews-for-me       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="386" textLength="817.4"
clip-path="url(#breeze-pr-auto-triage-line-15)">Only show PRs where review
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="410.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-16)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="410.4" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-16)">--reviews-for          </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="410.4" textLength="878.4"
clip-path="url(#breeze-pr-auto-triage-line-16)">Only show PRs&# [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="434.8"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-17)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="434.8" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-17)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="459.2"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-18)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="459.2" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-18)"> Filter options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="459.2" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-18)">───────────────────────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="483.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-19)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="483.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-19)">--label                </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="483.6" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="508" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-20)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="508" textLength="122"
clip-path="url(#breeze-pr-auto-triage-line-20)">repeated. </text><text
class="breeze-pr-auto-triage-r6" x="451.4" y="508" textLength="829.6"
clip-path="url(#breeze-pr-auto-triage-line-20)">(area:API | area:CLI | area:ConfigTemplates | area:DAG-proce
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="532.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-21)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="532.4" textLength="1024.8"
clip-path="url(#breeze-pr-auto-triage-line-21)">area:Executors-core | area:Lineage | area:Logging | area:Plugins | area:Scheduler | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="532.4" textLength="12.2"
clip-path= [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="556.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-22)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="556.8" textLength="1012.6"
clip-path="url(#breeze-pr-auto-triage-line-22)">area:Secrets | area:Triggerer | area:UI | area:airflow-ctl | area:core-operators | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="556.8" textLength="12.2"
clip-path=" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="581.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-23)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="581.2" textLength="988.2"
clip-path="url(#breeze-pr-auto-triage-line-23)">area:db-migrations | area:deadline-alerts | area:dev-tools | area:docker-tests | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="581.2" textLength="12.2"
clip-path="url(#breeze-p [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="605.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-24)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="605.6" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-24)">area:go-sdk | area:helm-chart | area:kubernetes-tests | area:production-image | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="605.6" textLength="12.2"
clip-path="url(#breeze-pr-a [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="630" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-25)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="630" textLength="1085.8"
clip-path="url(#breeze-pr-auto-triage-line-25)">area:providers | area:registry | area:system-tests | area:task-sdk | area:translations | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="630" textLength="12.2"
clip-path=" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="654.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-26)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="654.4" textLength="1012.6"
clip-path="url(#breeze-pr-auto-triage-line-26)">backport-to-v3-1-test | kind:documentation | provider:airbyte | provider:alibaba | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="654.4" textLength="12.2"
clip-path="url(#breez [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="678.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-27)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="678.8" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-27)">provider:amazon | provider:apache-beam | provider:apache-cassandra | provider:apache-drill </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="678.8" textLength="12.2"
clip-path="url(#br [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="703.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-28)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="703.2" textLength="890.6"
clip-path="url(#breeze-pr-auto-triage-line-28)">| provider:apache-druid | provider:apache-flink | provider:apache-hdfs | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="703.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="727.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-29)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="727.6" textLength="902.8"
clip-path="url(#breeze-pr-auto-triage-line-29)">provider:apache-hive | provider:apache-iceberg | provider:apache-impala | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="727.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-lin [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="752" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-30)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="752" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-30)">provider:apache-kafka | provider:apache-kylin | provider:apache-livy | provider:apache-pig </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="752" textLength="12.2"
clip-path="url(#breeze-p [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="776.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-31)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="776.4" textLength="951.6"
clip-path="url(#breeze-pr-auto-triage-line-31)">| provider:apache-pinot | provider:apache-spark | provider:apache-tinkerpop | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="776.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-t [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="800.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-32)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="800.8" textLength="1000.4"
clip-path="url(#breeze-pr-auto-triage-line-32)">provider:apprise | provider:arangodb | provider:asana | provider:atlassian-jira | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="800.8" textLength="12.2"
clip-path="url(#breeze [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="825.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-33)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="825.2" textLength="1012.6"
clip-path="url(#breeze-pr-auto-triage-line-33)">provider:celery | provider:cloudant | provider:cncf-kubernetes | provider:cohere | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="825.2" textLength="12.2"
clip-path="url(#breez [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="849.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-34)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="849.6" textLength="817.4"
clip-path="url(#breeze-pr-auto-triage-line-34)">provider:common-ai | provider:common-compat | provider:common-io | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="849.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-34)"> [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="874" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-35)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="874" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-35)">provider:common-messaging | provider:common-sql | provider:databricks | provider:datadog | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="874" textLength="12.2"
clip-path="url(#bre [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="898.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-36)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="898.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-36)">provider:dbt-cloud | provider:dingding | provider:discord | provider:docker | provider:edge</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="898.4" textLength="12.2"
clip-path="ur [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="922.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-37)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="922.8" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-37)">| provider:elasticsearch | provider:exasol | provider:fab | provider:facebook | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="922.8" textLength="12.2"
clip-path="url(#breeze [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="947.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-38)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="947.2" textLength="1000.4"
clip-path="url(#breeze-pr-auto-triage-line-38)">provider:ftp | provider:git | provider:github | provider:google | provider:grpc | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="947.2" textLength="12.2"
clip-path="u [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="971.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-39)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="971.6" textLength="890.6"
clip-path="url(#breeze-pr-auto-triage-line-39)">provider:hashicorp | provider:http | provider:imap | provider:influxdb | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="971.6" textLength="12.2"
clip-path="url(#breeze-pr-auto-t [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="996" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-40)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="996" textLength="951.6"
clip-path="url(#breeze-pr-auto-triage-line-40)">provider:informatica | provider:jdbc | provider:jenkins | provider:keycloak | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="996" textLength="12.2"
clip-path="url(#breeze-pr-auto-tr [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1020.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-41)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1020.4" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-41)">provider:microsoft-azure | provider:microsoft-mssql | provider:microsoft-psrp | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1020.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-tri [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1044.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-42)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1044.8" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-42)">provider:microsoft-winrm | provider:mongo | provider:mysql | provider:neo4j | provider:odbc</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1044.8" textLength="12.2"
clip-path= [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1069.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-43)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1069.2" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-43)">| provider:openai | provider:openfaas | provider:openlineage | provider:opensearch | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1069.2" textLength="12.2"
clip-path="ur [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1093.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-44)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1093.6" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-44)">provider:opsgenie | provider:oracle | provider:pagerduty | provider:papermill | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1093.6" textLength="12.2"
clip-path="url(#breeze-p [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1118" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-45)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1118" textLength="951.6"
clip-path="url(#breeze-pr-auto-triage-line-45)">provider:pgvector | provider:pinecone | provider:postgres | provider:presto | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1118" textLength="12.2"
clip-path="url(#breeze-pr-auto [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1142.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-46)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1142.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-46)">provider:qdrant | provider:redis | provider:salesforce | provider:samba | provider:segment </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1142.4" textLength="12.2" clip-
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1166.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-47)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1166.8" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-47)">| provider:sendgrid | provider:sftp | provider:singularity | provider:slack | provider:smtp</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1166.8" textLength="12.2" clip-
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1191.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-48)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1191.2" textLength="927.2"
clip-path="url(#breeze-pr-auto-triage-line-48)">| provider:snowflake | provider:sqlite | provider:ssh | provider:standard | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1191.2" textLength="12.2"
clip-path="url(#breez [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1215.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-49)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1215.6" textLength="927.2"
clip-path="url(#breeze-pr-auto-triage-line-49)">provider:tableau | provider:telegram | provider:teradata | provider:trino | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1215.6" textLength="12.2"
clip-path="url(#breeze-pr- [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1240" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-50)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1240" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-50)">provider:vertica | provider:weaviate | provider:yandex | provider:ydb | provider:zendesk | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1240" textLength="12.2" clip-p
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1264.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-51)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1264.4" textLength="1098"
clip-path="url(#breeze-pr-auto-triage-line-51)">translation:ar | translation:ca | translation:de | translation:default | translation:el | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1264.4" textLength="12.2" cli
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1288.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-52)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1288.8" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-52)">translation:es | translation:fr | translation:he | translation:hi | translation:hu | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1288.8" textLength="12.2"
clip-pat [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1313.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-53)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1313.2" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-53)">translation:it | translation:ja | translation:ko | translation:nl | translation:pl | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1313.2" textLength="12.2"
clip-pat [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1337.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-54)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1337.6" textLength="1085.8"
clip-path="url(#breeze-pr-auto-triage-line-54)">translation:pt | translation:th | translation:tr | translation:zh-CN | translation:zh-TW)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1337.6" textLength="12.2"
clip-path="u [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1362" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-55)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1362" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-55)">--exclude-label        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1362" textLength="805.2"
clip-path="url(#breeze-pr-auto-triage-line-55)">Exclude PRs with this&#
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1386.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-56)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1386.4" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-56)">--created-after        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1386.4" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-56)">Only PRs created 
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1410.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-57)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1410.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-57)">--created-before       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1410.8" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-57)">Only PRs created on
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1435.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-58)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1435.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-58)">--updated-after        </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1435.2" textLength="646.6"
clip-path="url(#breeze-pr-auto-triage-line-58)">Only PRs updated 
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1459.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-59)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1459.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-59)">--updated-before       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1459.6" textLength="658.8"
clip-path="url(#breeze-pr-auto-triage-line-59)">Only PRs updated on
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1484" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-60)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1484" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-60)">--include-drafts       </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1484" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-60)">Include draft PRs in t
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1508.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-61)">│</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1508.4" textLength="1110.2"
clip-path="url(#breeze-pr-auto-triage-line-61)">review.                                    
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1532.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-62)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1532.8" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-62)">--pending-approval-only</text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1532.8" textLength="622.2"
clip-path="url(#breeze-pr-auto-triage-line-62)">Only show PRs with workflow runs awaiting&
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1557.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-63)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1557.2" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-63)">--checks-state         </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1557.2" textLength="524.6"
clip-path="url(#breeze-pr-auto-triage-line-63)">Only assess PRs&#
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1581.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-64)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1581.6" textLength="280.6"
clip-path="url(#breeze-pr-auto-triage-line-64)">--min-commits-behind   </text><text
class="breeze-pr-auto-triage-r1" x="329.4" y="1581.6" textLength="878.4"
clip-path="url(#breeze-pr-auto-triage-line-64)">Only assess PRs that are at 
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1606" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-65)">│</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1606" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-65)">(INTEGER)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1606" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-65)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1606" textLength="12.2" clip-pat
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1630.4"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-66)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1630.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-66)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1654.8"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-67)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1654.8" textLength="292.8"
clip-path="url(#breeze-pr-auto-triage-line-67)"> Pagination and sorting </text><text
class="breeze-pr-auto-triage-r5" x="317.2" y="1654.8" textLength="1122.4"
clip-path="url(#breeze-pr-auto-triage-line-67)">─────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1679.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-68)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1679.2" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-68)">--batch-size</text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1679.2" textLength="500.2"
clip-path="url(#breeze-pr-auto-triage-line-68)">Number of PRs to fetch per GraphQL page. </
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1703.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-69)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1703.6" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-69)">--max-num   </text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1703.6" textLength="793"
clip-path="url(#breeze-pr-auto-triage-line-69)">Maximum number of non-collaborator PRs to
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1728" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-70)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1728" textLength="146.4"
clip-path="url(#breeze-pr-auto-triage-line-70)">--sort      </text><text
class="breeze-pr-auto-triage-r1" x="195.2" y="1728" textLength="414.8"
clip-path="url(#breeze-pr-auto-triage-line-70)">Sort order for PR search results.&
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1752.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-71)">│</text><text
class="breeze-pr-auto-triage-r6" x="195.2" y="1752.4" textLength="622.2"
clip-path="url(#breeze-pr-auto-triage-line-71)">(created-asc|created-desc|updated-asc|updated-desc)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1752.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-71)">│</text><text
class="breeze-pr-auto-triage- [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1776.8"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-72)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="1776.8" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-72)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1801.2"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-73)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="1801.2" textLength="244"
clip-path="url(#breeze-pr-auto-triage-line-73)"> Assessment options </text><text
class="breeze-pr-auto-triage-r5" x="268.4" y="1801.2" textLength="1171.2"
clip-path="url(#breeze-pr-auto-triage-line-73)">────────────────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1825.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-74)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1825.6" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-74)">--check-mode     </text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1825.6" textLength="1037"
clip-path="url(#breeze-pr-auto-triage-line-74)">Which checks to run: 'both&#x
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1850" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-75)">│</text><text
class="breeze-pr-auto-triage-r5" x="256.2" y="1850" textLength="61"
clip-path="url(#breeze-pr-auto-triage-line-75)">both]</text><text
class="breeze-pr-auto-triage-r6" x="329.4" y="1850" textLength="158.6"
clip-path="url(#breeze-pr-auto-triage-line-75)">(both|ci|llm)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1850" textLength="12.2" c [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1874.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-76)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="1874.4" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-76)">--llm-model      </text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1874.4" textLength="1183.4"
clip-path="url(#breeze-pr-auto-triage-line-76)">LLM model for assessment (f
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1898.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-77)">│</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="1898.8" textLength="268.4"
clip-path="url(#breeze-pr-auto-triage-line-77)">for OpenAI Codex CLI. </text><text
class="breeze-pr-auto-triage-r5" x="524.6" y="1898.8" textLength="427"
clip-path="url(#breeze-pr-auto-triage-line-77)">[default: claude/claude-sonnet-4-6]</text><text
c [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1923.2"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-78)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1923.2" textLength="1159"
clip-path="url(#breeze-pr-auto-triage-line-78)">>claude/claude-sonnet-4-6< | claude/claude-opus-4-20250514 | claude/claude-sonnet-4-20250514 | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1923.2" textLength="12.2"
clip-path="u [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1947.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-79)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1947.6" textLength="976"
clip-path="url(#breeze-pr-auto-triage-line-79)">claude/claude-haiku-4-5-20251001 | claude/sonnet | claude/opus | claude/haiku | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1947.6" textLength="12.2"
clip-path="url(#breeze-p [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1972" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-80)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1972" textLength="1146.8"
clip-path="url(#breeze-pr-auto-triage-line-80)">codex/gpt-5.3-codex | codex/gpt-5.3-codex-spark | codex/gpt-5.2-codex | codex/gpt-5.1-codex | </text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1972" textLength="12.2"
clip-path="ur [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1996.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-81)">│</text><text
class="breeze-pr-auto-triage-r6" x="256.2" y="1996.4" textLength="695.4"
clip-path="url(#breeze-pr-auto-triage-line-81)">codex/gpt-5-codex | codex/gpt-5-codex-mini | codex/gpt-5)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="1996.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-81)">│</text><text cla [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2020.8"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-82)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2020.8" textLength="207.4"
clip-path="url(#breeze-pr-auto-triage-line-82)">--llm-concurrency</text><text
class="breeze-pr-auto-triage-r1" x="256.2" y="2020.8" textLength="524.6"
clip-path="url(#breeze-pr-auto-triage-line-82)">Number of concurrent LLM assessment calls. </tex
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2045.2"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-83)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2045.2" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-83)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2069.6"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-84)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="2069.6" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-84)"> Action options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="2069.6" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-84)">────────────────────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2094" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-85)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2094" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-85)">--answer-triage</text><text
class="breeze-pr-auto-triage-r1" x="231.8" y="2094" textLength="1207.8"
clip-path="url(#breeze-pr-auto-triage-line-85)">Force answer to triage prompts: [d]raft, [c]lose, [r
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2118.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-86)">│</text><text
class="breeze-pr-auto-triage-r6" x="231.8" y="2118.4" textLength="183"
clip-path="url(#breeze-pr-auto-triage-line-86)">(d|c|r|s|q|y|n)</text><text
class="breeze-pr-auto-triage-r5" x="1451.8" y="2118.4" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-86)">│</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2118.4" textLength="12 [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2142.8"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-87)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2142.8" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-87)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2167.2"
textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-88)">╭─</text><text
class="breeze-pr-auto-triage-r5" x="24.4" y="2167.2" textLength="195.2"
clip-path="url(#breeze-pr-auto-triage-line-88)"> Common options </text><text
class="breeze-pr-auto-triage-r5" x="219.6" y="2167.2" textLength="1220"
clip-path="url(#breeze-pr-auto-triage-line-88)">────────────────────────────────────────────────────────────────
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2191.6"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-89)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2191.6" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-89)">--dry-run</text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2191.6" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-89)">-D</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2191.6" textLength="719.8" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2216" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-90)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2216" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-90)">--verbose</text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2216" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-90)">-v</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2216" textLength="585.6" clip-pa
[...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2240.4"
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-91)">│</text><text
class="breeze-pr-auto-triage-r4" x="24.4" y="2240.4" textLength="109.8"
clip-path="url(#breeze-pr-auto-triage-line-91)">--help   </text><text
class="breeze-pr-auto-triage-r7" x="158.6" y="2240.4" textLength="24.4"
clip-path="url(#breeze-pr-auto-triage-line-91)">-h</text><text
class="breeze-pr-auto-triage-r1" x="207.4" y="2240.4" tex [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2264.8"
textLength="1464"
clip-path="url(#breeze-pr-auto-triage-line-92)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
class="breeze-pr-auto-triage-r1" x="1464" y="2264.8" textLength="12.2"
clip-path="url(#breeze-pr-auto-triage-line-92)">
</text>
</g>
</g>
diff --git a/dev/breeze/doc/images/output_pr_auto-triage.txt
b/dev/breeze/doc/images/output_pr_auto-triage.txt
index c002686029c..1e01a4a8ce8 100644
--- a/dev/breeze/doc/images/output_pr_auto-triage.txt
+++ b/dev/breeze/doc/images/output_pr_auto-triage.txt
@@ -1 +1 @@
-c8c9f4331a87750208ac66d22063d14e
+7852e5084578849706e6301aca1d11b7
diff --git a/dev/breeze/src/airflow_breeze/commands/pr_commands.py
b/dev/breeze/src/airflow_breeze/commands/pr_commands.py
index 6dd4e098524..3c72d3e73b8 100644
--- a/dev/breeze/src/airflow_breeze/commands/pr_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/pr_commands.py
@@ -16,11 +16,14 @@
# under the License.
from __future__ import annotations
+import json
import sys
import time
from collections import Counter
from concurrent.futures import ThreadPoolExecutor
from dataclasses import dataclass
+from pathlib import Path
+from threading import Thread
from typing import TYPE_CHECKING
import click
@@ -37,7 +40,7 @@ from airflow_breeze.commands.common_options import (
from airflow_breeze.utils.click_utils import BreezeGroup
from airflow_breeze.utils.confirm import Answer, TriageAction,
prompt_triage_action, user_confirm
from airflow_breeze.utils.console import get_console
-from airflow_breeze.utils.custom_param_types import NotVerifiedBetterChoice
+from airflow_breeze.utils.custom_param_types import
HiddenChoiceWithCompletion, NotVerifiedBetterChoice
from airflow_breeze.utils.run_utils import run_command
from airflow_breeze.utils.shared_options import get_dry_run, get_verbose
@@ -321,6 +324,69 @@ def _resolve_viewer_login(token: str) -> str:
return data["viewer"]["login"]
+def _get_collaborators_cache_path(github_repository: str) -> Path:
+ """Return the path to the local collaborators cache file."""
+ from airflow_breeze.utils.path_utils import BUILD_CACHE_PATH
+
+ safe_name = github_repository.replace("/", "_")
+ return Path(BUILD_CACHE_PATH) / f".collaborators_{safe_name}.json"
+
+
+def _fetch_collaborators_from_api(token: str, github_repository: str) ->
list[str]:
+ """Fetch the list of collaborators from the GitHub REST API."""
+ import requests
+
+ collaborators: list[str] = []
+ page = 1
+ while True:
+ response = requests.get(
+ f"https://api.github.com/repos/{github_repository}/collaborators",
+ headers={"Authorization": f"Bearer {token}", "Accept":
"application/vnd.github+json"},
+ params={"per_page": 100, "page": page},
+ )
+ if response.status_code != 200:
+ break
+ data = response.json()
+ if not data:
+ break
+ for user in data:
+ login = user.get("login")
+ if login:
+ collaborators.append(login)
+ page += 1
+ return sorted(collaborators)
+
+
+def _load_collaborators_cache(github_repository: str) -> list[str]:
+ """Load collaborators from local cache file. Returns empty list if no
cache."""
+ cache_path = _get_collaborators_cache_path(github_repository)
+ if cache_path.exists():
+ try:
+ return json.loads(cache_path.read_text())
+ except (json.JSONDecodeError, OSError):
+ pass
+ return []
+
+
+def _save_collaborators_cache(github_repository: str, collaborators:
list[str]) -> None:
+ """Save collaborators list to local cache file."""
+ cache_path = _get_collaborators_cache_path(github_repository)
+ cache_path.parent.mkdir(parents=True, exist_ok=True)
+ cache_path.write_text(json.dumps(collaborators))
+
+
+def _refresh_collaborators_cache_in_background(token: str, github_repository:
str) -> None:
+ """Fetch collaborators from API and update the cache in a background
thread."""
+
+ def _refresh():
+ collaborators = _fetch_collaborators_from_api(token, github_repository)
+ if collaborators:
+ _save_collaborators_cache(github_repository, collaborators)
+
+ thread = Thread(target=_refresh, daemon=True)
+ thread.start()
+
+
def _graphql_request(token: str, query: str, variables: dict) -> dict:
"""Execute a GitHub GraphQL request. Returns the 'data' dict or exits on
error."""
import requests
@@ -1375,6 +1441,40 @@ def _load_what_to_do_next() -> str:
)
+def _build_collaborator_comment(
+ pr_author: str,
+ violations: list,
+ commits_behind: int,
+ base_ref: str,
+ comment_only: bool = False,
+) -> str:
+ """Build a simplified comment for PRs authored by collaborators.
+
+ Collaborators know the project well — just state the issues directly
without
+ instructions, links, or encouragement.
+ """
+ violation_lines = []
+ for v in violations:
+ line = f"- **{v.category}**: {v.explanation}"
+ if v.details:
+ line += f" {v.details}"
+ violation_lines.append(line)
+ violations_text = "\n".join(violation_lines)
+
+ rebase_note = ""
+ if commits_behind > 0:
+ rebase_note = (
+ f"\n\nBranch is {commits_behind} "
+ f"commit{'s' if commits_behind != 1 else ''} behind `{base_ref}` "
+ "-- some failures may be from the base branch."
+ )
+
+ if comment_only:
+ return f"@{pr_author} Issues found:\n{violations_text}{rebase_note}"
+
+ return f"@{pr_author} Converted to draft. Issues
found:\n{violations_text}{rebase_note}"
+
+
def _build_comment(
pr_author: str,
violations: list,
@@ -1382,12 +1482,19 @@ def _build_comment(
commits_behind: int,
base_ref: str,
comment_only: bool = False,
+ is_collaborator: bool = False,
) -> str:
"""Build the comment to post on a flagged PR.
When comment_only is True, the comment just lists findings without
mentioning draft conversion.
+ When is_collaborator is True, produces a simplified comment without
instructions.
"""
+ if is_collaborator:
+ return _build_collaborator_comment(
+ pr_author, violations, commits_behind, base_ref,
comment_only=comment_only
+ )
+
violation_lines = []
for v in violations:
icon = "x" if v.severity == "error" else "warning"
@@ -1431,8 +1538,24 @@ def _build_comment(
)
-def _build_close_comment(pr_author: str, violations: list, pr_number: int,
author_flagged_count: int) -> str:
+def _build_close_comment(
+ pr_author: str,
+ violations: list,
+ pr_number: int,
+ author_flagged_count: int,
+ is_collaborator: bool = False,
+) -> str:
"""Build the comment to post on a PR being closed due to quality issues."""
+ if is_collaborator:
+ violation_lines = []
+ for v in violations:
+ line = f"- **{v.category}**: {v.explanation}"
+ if v.details:
+ line += f" {v.details}"
+ violation_lines.append(line)
+ violations_text = "\n".join(violation_lines)
+ return f"@{pr_author} Closing due to quality
issues:\n{violations_text}"
+
violation_lines = []
for v in violations:
icon = "x" if v.severity == "error" else "warning"
@@ -2104,14 +2227,21 @@ def _prompt_and_execute_flagged_pr(
action = TriageAction.SKIP
else:
violations = selected if selected is not None else
assessment.violations
+ is_collab = pr.author_association in _COLLABORATOR_ASSOCIATIONS
draft_comment = _build_comment(
- pr.author_login, violations, pr.number, pr.commits_behind,
pr.base_ref
+ pr.author_login,
+ violations,
+ pr.number,
+ pr.commits_behind,
+ pr.base_ref,
+ is_collaborator=is_collab,
)
close_comment = _build_close_comment(
pr.author_login,
violations,
pr.number,
ctx.author_flagged_count.get(pr.author_login, 0),
+ is_collaborator=is_collab,
)
comment_only_text = _build_comment(
pr.author_login,
@@ -2120,6 +2250,7 @@ def _prompt_and_execute_flagged_pr(
pr.commits_behind,
pr.base_ref,
comment_only=True,
+ is_collaborator=is_collab,
)
# Show the final comment that will be posted
if action == TriageAction.CLOSE:
@@ -2409,7 +2540,13 @@ def _review_workflow_approval_prs(ctx: TriageContext,
pending_approval: list[PRD
f"{'PRs' if author_count != 1 else 'PR'} "
f"— suggesting close instead of workflow approval.[/]"
)
- close_comment = _build_close_comment(pr.author_login, [],
pr.number, author_count)
+ close_comment = _build_close_comment(
+ pr.author_login,
+ [],
+ pr.number,
+ author_count,
+ is_collaborator=pr.author_association in
_COLLABORATOR_ASSOCIATIONS,
+ )
get_console().print(Panel(close_comment, title="Proposed close
comment", border_style="red"))
if ctx.dry_run:
@@ -2537,7 +2674,13 @@ def _review_workflow_approval_prs(ctx: TriageContext,
pending_approval: list[PRD
if fallback == TriageAction.SKIP:
get_console().print(f" [info]Skipping PR
{_pr_link(pr)} — no action taken.[/]")
elif fallback == TriageAction.CLOSE:
- close_comment = _build_close_comment(pr.author_login,
[], pr.number, 0)
+ close_comment = _build_close_comment(
+ pr.author_login,
+ [],
+ pr.number,
+ 0,
+ is_collaborator=pr.author_association in
_COLLABORATOR_ASSOCIATIONS,
+ )
_execute_triage_action(
ctx, pr, TriageAction.CLOSE, draft_comment="",
close_comment=close_comment
)
@@ -2558,7 +2701,13 @@ def _review_workflow_approval_prs(ctx: TriageContext,
pending_approval: list[PRD
comment_only_text=rebase_comment,
)
elif action == TriageAction.CLOSE:
- close_comment = _build_close_comment(pr.author_login, [],
pr.number, 0)
+ close_comment = _build_close_comment(
+ pr.author_login,
+ [],
+ pr.number,
+ 0,
+ is_collaborator=pr.author_association in
_COLLABORATOR_ASSOCIATIONS,
+ )
_execute_triage_action(
ctx, pr, TriageAction.CLOSE, draft_comment="",
close_comment=close_comment
)
@@ -2774,7 +2923,13 @@ def _review_workflow_approval_prs(ctx: TriageContext,
pending_approval: list[PRD
ctx, pr, TriageAction.DRAFT, draft_comment=rebase_comment,
close_comment=""
)
elif action == TriageAction.CLOSE:
- close_comment = _build_close_comment(pr.author_login, [],
pr.number, 0)
+ close_comment = _build_close_comment(
+ pr.author_login,
+ [],
+ pr.number,
+ 0,
+ is_collaborator=pr.author_association in
_COLLABORATOR_ASSOCIATIONS,
+ )
_execute_triage_action(
ctx, pr, TriageAction.CLOSE, draft_comment="",
close_comment=close_comment
)
@@ -3393,6 +3548,34 @@ def _cancel_and_rerun_in_progress_workflows(token: str,
github_repository: str,
default=None,
help="Triage a specific PR by number instead of searching.",
)
+# --- Select people ---
[email protected](
+ "--author",
+ "filter_user",
+ default=None,
+ help="Filter PRs to a specific author.",
+)
[email protected](
+ "--include-collaborators",
+ is_flag=True,
+ default=False,
+ help="Include PRs from collaborators/members/owners (normally skipped).",
+)
[email protected](
+ "--reviews-for-me",
+ "my_reviews",
+ is_flag=True,
+ default=False,
+ help="Only show PRs where review is requested for the authenticated user.",
+)
[email protected](
+ "--reviews-for",
+ "reviewers",
+
type=HiddenChoiceWithCompletion(_load_collaborators_cache("apache/airflow")),
+ multiple=True,
+ default=(),
+ help="Only show PRs where review is requested for this user. Can be
repeated.",
+)
# --- Filter options ---
@click.option(
"--label",
@@ -3408,12 +3591,6 @@ def _cancel_and_rerun_in_progress_workflows(token: str,
github_repository: str,
multiple=True,
help="Exclude PRs with this label. Supports wildcards. Can be repeated.",
)
[email protected](
- "--author",
- "filter_user",
- default=None,
- help="Filter PRs to a specific author.",
-)
@click.option(
"--created-after",
default=None,
@@ -3434,12 +3611,6 @@ def _cancel_and_rerun_in_progress_workflows(token: str,
github_repository: str,
default=None,
help="Only PRs updated on or before this date (YYYY-MM-DD).",
)
[email protected](
- "--include-collaborators",
- is_flag=True,
- default=False,
- help="Include PRs from collaborators/members/owners (normally skipped).",
-)
@click.option(
"--include-drafts",
is_flag=True,
@@ -3466,13 +3637,6 @@ def _cancel_and_rerun_in_progress_workflows(token: str,
github_repository: str,
show_default=True,
help="Only assess PRs that are at least this many commits behind base
branch.",
)
[email protected](
- "--review-requested",
- "review_requested",
- is_flag=True,
- default=False,
- help="Only show PRs where review is requested for the authenticated user.",
-)
# --- Pagination and sorting ---
@click.option(
"--batch-size",
@@ -3539,7 +3703,8 @@ def auto_triage(
pending_approval_only: bool,
checks_state: str,
min_commits_behind: int,
- review_requested: bool,
+ my_reviews: bool,
+ reviewers: tuple[str, ...],
check_mode: str,
llm_concurrency: int,
llm_model: str,
@@ -3575,12 +3740,28 @@ def auto_triage(
dry_run = get_dry_run()
- # Resolve the authenticated user login (used for --review-requested and
triage comment detection)
+ # Validate --reviews-for-me and --reviews-for are mutually exclusive
+ if my_reviews and reviewers:
+ get_console().print("[error]--reviews-for-me and --reviews-for are
mutually exclusive.[/]")
+ sys.exit(1)
+
+ # Resolve the authenticated user login (used for --reviews-for-me and
triage comment detection)
viewer_login = _resolve_viewer_login(token)
+
+ # Refresh collaborators cache in the background on every run
+ _refresh_collaborators_cache_in_background(token, github_repository)
+
+ # Resolve review-requested filter: --reviews-for-me uses authenticated
user, --reviews-for uses specified users
review_requested_user: str | None = None
- if review_requested:
+ review_requested_users: list[str] = []
+ if my_reviews:
review_requested_user = viewer_login
+ review_requested_users = [viewer_login]
get_console().print(f"[info]Filtering PRs with review requested for:
{review_requested_user}[/]")
+ elif reviewers:
+ review_requested_users = list(reviewers)
+ review_requested_user = reviewers[0]
+ get_console().print(f"[info]Filtering PRs with review requested for:
{', '.join(reviewers)}[/]")
# Phase 1: Fetch PRs via GraphQL
from fnmatch import fnmatch
@@ -3599,6 +3780,32 @@ def auto_triage(
if pr_number:
get_console().print(f"[info]Fetching PR #{pr_number} via
GraphQL...[/]")
all_prs = [_fetch_single_pr_graphql(token, github_repository,
pr_number)]
+ elif len(review_requested_users) > 1:
+ # Multiple reviewers: fetch PRs for each reviewer and merge
(deduplicate)
+ get_console().print("[info]Fetching PRs via GraphQL for multiple
reviewers...[/]")
+ seen_numbers: set[int] = set()
+ all_prs = []
+ for reviewer in review_requested_users:
+ batch_prs, _, _ = _fetch_prs_graphql(
+ token,
+ github_repository,
+ labels=exact_labels,
+ exclude_labels=exact_exclude_labels,
+ filter_user=filter_user,
+ sort=sort,
+ batch_size=batch_size,
+ created_after=created_after,
+ created_before=created_before,
+ updated_after=updated_after,
+ updated_before=updated_before,
+ review_requested=reviewer,
+ )
+ for pr in batch_prs:
+ if pr.number not in seen_numbers:
+ seen_numbers.add(pr.number)
+ all_prs.append(pr)
+ # Disable pagination for multi-reviewer queries
+ has_next_page = False
else:
get_console().print("[info]Fetching PRs via GraphQL...[/]")
all_prs, has_next_page, next_cursor = _fetch_prs_graphql(
diff --git a/dev/breeze/src/airflow_breeze/commands/pr_commands_config.py
b/dev/breeze/src/airflow_breeze/commands/pr_commands_config.py
index f125295b15f..3d81bf168df 100644
--- a/dev/breeze/src/airflow_breeze/commands/pr_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/pr_commands_config.py
@@ -31,22 +31,28 @@ PR_PARAMETERS: dict[str, list[dict[str, str | list[str]]]]
= {
"name": "Target selection",
"options": ["--pr"],
},
+ {
+ "name": "Select people",
+ "options": [
+ "--author",
+ "--include-collaborators",
+ "--reviews-for-me",
+ "--reviews-for",
+ ],
+ },
{
"name": "Filter options",
"options": [
"--label",
"--exclude-label",
- "--author",
"--created-after",
"--created-before",
"--updated-after",
"--updated-before",
- "--include-collaborators",
"--include-drafts",
"--pending-approval-only",
"--checks-state",
"--min-commits-behind",
- "--review-requested",
],
},
{
diff --git a/dev/breeze/src/airflow_breeze/utils/custom_param_types.py
b/dev/breeze/src/airflow_breeze/utils/custom_param_types.py
index 3046fcc2703..fcdf2a1144d 100644
--- a/dev/breeze/src/airflow_breeze/utils/custom_param_types.py
+++ b/dev/breeze/src/airflow_breeze/utils/custom_param_types.py
@@ -65,6 +65,22 @@ class BetterChoice(click.Choice):
return f"[{choices_str}]"
+class HiddenChoiceWithCompletion(BetterChoice):
+ """
+ Like NotVerifiedBetterChoice, but hides the choices list from --help
output.
+ Autocomplete still works in the shell, and any value is accepted (not just
+ the listed choices).
+ """
+
+ name = "TEXT"
+
+ def get_metavar(self, param, ctx=None) -> str:
+ return "TEXT"
+
+ def convert(self, value: Any, param: Parameter | None, ctx: Context |
None) -> Any:
+ return value
+
+
class NotVerifiedBetterChoice(BetterChoice):
"""
This parameter allows to pass parameters that do not pass verification by
choice. This is