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 82343f67812 Add filtering options to auto-triage command (#63300)
82343f67812 is described below

commit 82343f67812be56f23b1f02b163c67fc182f0914
Author: Jarek Potiuk <[email protected]>
AuthorDate: Tue Mar 10 23:39:07 2026 +0100

    Add filtering options to auto-triage command (#63300)
    
    Add several new filtering criteria organized into logical groups:
    
    Filter options:
    - --label: now supports wildcards (e.g. 'area:*', 'provider:amazon*')
    - --exclude-label: exclude PRs by label, supports wildcards
    - --created-after/--created-before: date range for PR creation
    - --updated-after/--updated-before: date range for last update
    - --include-collaborators: include collaborator PRs (normally skipped)
    - --pending-approval-only: only show PRs needing workflow approval
    - --checks-state: filter by CI status (failure/success/pending/any)
    - --min-commits-behind: filter by staleness
    
    Exact labels and date ranges are pushed to GitHub search for efficiency.
    Wildcard labels are matched client-side with fnmatch after fetching.
    Option groups in pr_commands_config.py reorganized into: Target selection,
    Filter options, Pagination and sorting, Assessment options, Action options.
    
    Co-authored-by: Claude Opus 4.6 <[email protected]>
---
 dev/breeze/doc/images/output_pr_auto-triage.svg    | 206 +++++++++++++++------
 dev/breeze/doc/images/output_pr_auto-triage.txt    |   2 +-
 .../src/airflow_breeze/commands/pr_commands.py     | 183 ++++++++++++++++--
 .../airflow_breeze/commands/pr_commands_config.py  |  31 +++-
 4 files changed, 343 insertions(+), 79 deletions(-)

diff --git a/dev/breeze/doc/images/output_pr_auto-triage.svg 
b/dev/breeze/doc/images/output_pr_auto-triage.svg
index c80d47d3a19..7210505b83e 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 1636.0" 
xmlns="http://www.w3.org/2000/svg";>
+<svg class="rich-terminal" viewBox="0 0 1482 2172.7999999999997" 
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="1585.0" />
+      <rect x="0" y="0" width="1463.0" height="2121.7999999999997" />
     </clipPath>
     <clipPath id="breeze-pr-auto-triage-line-0">
     <rect x="0" y="1.5" width="1464" height="24.65"/>
@@ -237,9 +237,75 @@
 <clipPath id="breeze-pr-auto-triage-line-63">
     <rect x="0" y="1538.7" width="1464" height="24.65"/>
             </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-64">
+    <rect x="0" y="1563.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-65">
+    <rect x="0" y="1587.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-66">
+    <rect x="0" y="1611.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-67">
+    <rect x="0" y="1636.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-68">
+    <rect x="0" y="1660.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-69">
+    <rect x="0" y="1685.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-70">
+    <rect x="0" y="1709.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-71">
+    <rect x="0" y="1733.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-72">
+    <rect x="0" y="1758.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-73">
+    <rect x="0" y="1782.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-74">
+    <rect x="0" y="1807.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-75">
+    <rect x="0" y="1831.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-76">
+    <rect x="0" y="1855.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-77">
+    <rect x="0" y="1880.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-78">
+    <rect x="0" y="1904.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-79">
+    <rect x="0" y="1929.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-80">
+    <rect x="0" y="1953.5" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-81">
+    <rect x="0" y="1977.9" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-82">
+    <rect x="0" y="2002.3" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-83">
+    <rect x="0" y="2026.7" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-84">
+    <rect x="0" y="2051.1" width="1464" height="24.65"/>
+            </clipPath>
+<clipPath id="breeze-pr-auto-triage-line-85">
+    <rect x="0" y="2075.5" width="1464" height="24.65"/>
+            </clipPath>
     </defs>
 
-    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="1634" rx="8"/><text 
class="breeze-pr-auto-triage-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;pr&#160;auto-triage</text>
+    <rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" 
x="1" y="1" width="1480" height="2170.8" rx="8"/><text 
class="breeze-pr-auto-triage-title" fill="#c5c8c6" text-anchor="middle" x="740" 
y="27">Command:&#160;pr&#160;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"/>
@@ -258,62 +324,84 @@
 </text><text class="breeze-pr-auto-triage-r5" x="0" y="166.4" 
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-6)">│</text><text 
class="breeze-pr-auto-triage-r4" x="24.4" y="166.4" textLength="231.8" 
clip-path="url(#breeze-pr-auto-triage-line-6)">--github-token&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="329.4" y="166.4" textLength="512.4" 
clip-path="url(#breeze-pr-auto-triage-line-6)">The&#160;token&#160;used&#160;to&#160;authenticate&#160;t
 [...]
 </text><text class="breeze-pr-auto-triage-r5" x="0" y="190.8" 
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-7)">│</text><text 
class="breeze-pr-auto-triage-r4" x="24.4" y="190.8" textLength="231.8" 
clip-path="url(#breeze-pr-auto-triage-line-7)">--github-repository</text><text 
class="breeze-pr-auto-triage-r7" x="280.6" y="190.8" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-7)">-g</text><text 
class="breeze-pr-auto-triage-r1" x="329.4" y="190.8" textLength="597 [...]
 </text><text class="breeze-pr-auto-triage-r5" x="0" y="215.2" 
textLength="1464" 
clip-path="url(#breeze-pr-auto-triage-line-8)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-pr-auto-triage-r1" x="1464" y="215.2" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-8)">
-</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="195.2" 
clip-path="url(#breeze-pr-auto-triage-line-9)">&#160;Filter&#160;options&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="219.6" y="239.6" textLength="1220" 
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="97.6" 
clip-path="url(#breeze-pr-auto-triage-line-10)">--pr&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="146.4" y="264" textLength="646.6" 
clip-path="url(#breeze-pr-auto-triage-line-10)">Triage&#160;a&#160;specific&#160;PR&#160;by&#160;number&#160;instead&#160;of&
 [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="288.4" 
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-11)">│</text><text 
class="breeze-pr-auto-triage-r4" x="24.4" y="288.4" textLength="97.6" 
clip-path="url(#breeze-pr-auto-triage-line-11)">--label&#160;</text><text 
class="breeze-pr-auto-triage-r1" x="146.4" y="288.4" textLength="475.8" 
clip-path="url(#breeze-pr-auto-triage-line-11)">Filter&#160;PRs&#160;by&#160;label&#160;(can&#160;be&#160;repeated).&#160;</text><text
 [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="312.8" 
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-12)">│</text><text 
class="breeze-pr-auto-triage-r6" x="146.4" y="312.8" textLength="1207.8" 
clip-path="url(#breeze-pr-auto-triage-line-12)">area:Executors-core&#160;|&#160;area:Lineage&#160;|&#160;area:Logging&#160;|&#160;area:Plugins&#160;|&#160;area:Scheduler&#160;|&#160;area:Secrets&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="312.8" tex [...]
-</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-r6" x="146.4" y="337.2" textLength="1085.8" 
clip-path="url(#breeze-pr-auto-triage-line-13)">area:Triggerer&#160;|&#160;area:UI&#160;|&#160;area:airflow-ctl&#160;|&#160;area:core-operators&#160;|&#160;area:db-migrations&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="337.2" textLength="12.2" clip- 
[...]
-</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-r6" x="146.4" y="361.6" textLength="1122.4" 
clip-path="url(#breeze-pr-auto-triage-line-14)">area:deadline-alerts&#160;|&#160;area:dev-tools&#160;|&#160;area:docker-tests&#160;|&#160;area:go-sdk&#160;|&#160;area:helm-chart&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="361.6" textLength="12.2" cl 
[...]
-</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="146.4" y="386" textLength="1232.2" 
clip-path="url(#breeze-pr-auto-triage-line-15)">area:kubernetes-tests&#160;|&#160;area:production-image&#160;|&#160;area:providers&#160;|&#160;area:registry&#160;|&#160;area:system-tests&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="386" textLength="12.2" [...]
-</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="146.4" y="410.4" textLength="1220" 
clip-path="url(#breeze-pr-auto-triage-line-16)">area:task-sdk&#160;|&#160;area:translations&#160;|&#160;backport-to-v3-1-test&#160;|&#160;kind:documentation&#160;|&#160;provider:airbyte&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="410.4" textLength="12 [...]
-</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="146.4" y="434.8" textLength="1073.6" 
clip-path="url(#breeze-pr-auto-triage-line-17)">provider:alibaba&#160;|&#160;provider:amazon&#160;|&#160;provider:apache-beam&#160;|&#160;provider:apache-cassandra&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="434.8" textLength="12.2" 
clip-path="url(# [...]
-</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="146.4" y="459.2" textLength="1159" 
clip-path="url(#breeze-pr-auto-triage-line-18)">provider:apache-drill&#160;|&#160;provider:apache-druid&#160;|&#160;provider:apache-flink&#160;|&#160;provider:apache-hdfs&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="459.2" textLength="12.2" 
clip-path=" [...]
-</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="146.4" y="483.6" textLength="1195.6" 
clip-path="url(#breeze-pr-auto-triage-line-19)">provider:apache-hive&#160;|&#160;provider:apache-iceberg&#160;|&#160;provider:apache-impala&#160;|&#160;provider:apache-kafka&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="483.6" textLength="12.2" clip-p 
[...]
-</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="146.4" y="508" textLength="1134.6" 
clip-path="url(#breeze-pr-auto-triage-line-20)">provider:apache-kylin&#160;|&#160;provider:apache-livy&#160;|&#160;provider:apache-pig&#160;|&#160;provider:apache-pinot&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="508" textLength="12.2" 
clip-path="url(#b [...]
-</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="146.4" y="532.4" textLength="1293.2" 
clip-path="url(#breeze-pr-auto-triage-line-21)">provider:apache-spark&#160;|&#160;provider:apache-tinkerpop&#160;|&#160;provider:apprise&#160;|&#160;provider:arangodb&#160;|&#160;provider:asana&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="532.4" textLength= [...]
-</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="146.4" y="556.8" textLength="1134.6" 
clip-path="url(#breeze-pr-auto-triage-line-22)">|&#160;provider:atlassian-jira&#160;|&#160;provider:celery&#160;|&#160;provider:cloudant&#160;|&#160;provider:cncf-kubernetes&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="556.8" textLength="12.2" clip-p 
[...]
-</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="146.4" y="581.2" textLength="1037" 
clip-path="url(#breeze-pr-auto-triage-line-23)">provider:cohere&#160;|&#160;provider:common-ai&#160;|&#160;provider:common-compat&#160;|&#160;provider:common-io&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="581.2" textLength="12.2" 
clip-path="url(#breez [...]
-</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="146.4" y="605.6" textLength="1110.2" 
clip-path="url(#breeze-pr-auto-triage-line-24)">provider:common-messaging&#160;|&#160;provider:common-sql&#160;|&#160;provider:databricks&#160;|&#160;provider:datadog&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="605.6" textLength="12.2" 
clip-path="ur [...]
-</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="146.4" y="630" textLength="1146.8" 
clip-path="url(#breeze-pr-auto-triage-line-25)">provider:dbt-cloud&#160;|&#160;provider:dingding&#160;|&#160;provider:discord&#160;|&#160;provider:docker&#160;|&#160;provider:edge&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="630" textLength="12.2" clip-p 
[...]
-</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="146.4" y="654.4" textLength="1293.2" 
clip-path="url(#breeze-pr-auto-triage-line-26)">provider:elasticsearch&#160;|&#160;provider:exasol&#160;|&#160;provider:fab&#160;|&#160;provider:facebook&#160;|&#160;provider:ftp&#160;|&#160;provider:git&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="654.4" t [...]
-</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="146.4" y="678.8" textLength="1293.2" 
clip-path="url(#breeze-pr-auto-triage-line-27)">|&#160;provider:github&#160;|&#160;provider:google&#160;|&#160;provider:grpc&#160;|&#160;provider:hashicorp&#160;|&#160;provider:http&#160;|&#160;provider:imap&#160;|</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="678 [...]
-</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="146.4" y="703.2" textLength="1195.6" 
clip-path="url(#breeze-pr-auto-triage-line-28)">provider:influxdb&#160;|&#160;provider:informatica&#160;|&#160;provider:jdbc&#160;|&#160;provider:jenkins&#160;|&#160;provider:keycloak&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="703.2" textLength="12 [...]
-</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="146.4" y="727.6" textLength="1293.2" 
clip-path="url(#breeze-pr-auto-triage-line-29)">provider:microsoft-azure&#160;|&#160;provider:microsoft-mssql&#160;|&#160;provider:microsoft-psrp&#160;|&#160;provider:microsoft-winrm&#160;|</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="727.6" textLength="12.2" cli 
[...]
-</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="146.4" y="752" textLength="1281" 
clip-path="url(#breeze-pr-auto-triage-line-30)">provider:mongo&#160;|&#160;provider:mysql&#160;|&#160;provider:neo4j&#160;|&#160;provider:odbc&#160;|&#160;provider:openai&#160;|&#160;provider:openfaas&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="752" textL [...]
-</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="146.4" y="776.4" textLength="1268.8" 
clip-path="url(#breeze-pr-auto-triage-line-31)">provider:openlineage&#160;|&#160;provider:opensearch&#160;|&#160;provider:opsgenie&#160;|&#160;provider:oracle&#160;|&#160;provider:pagerduty&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="776.4" textLeng [...]
-</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="146.4" y="800.8" textLength="1207.8" 
clip-path="url(#breeze-pr-auto-triage-line-32)">provider:papermill&#160;|&#160;provider:pgvector&#160;|&#160;provider:pinecone&#160;|&#160;provider:postgres&#160;|&#160;provider:presto&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="800.8" textLength="1 [...]
-</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="146.4" y="825.2" textLength="1134.6" 
clip-path="url(#breeze-pr-auto-triage-line-33)">provider:qdrant&#160;|&#160;provider:redis&#160;|&#160;provider:salesforce&#160;|&#160;provider:samba&#160;|&#160;provider:segment&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="825.2" textLength="12.2" c [...]
-</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="146.4" y="849.6" textLength="1122.4" 
clip-path="url(#breeze-pr-auto-triage-line-34)">provider:sendgrid&#160;|&#160;provider:sftp&#160;|&#160;provider:singularity&#160;|&#160;provider:slack&#160;|&#160;provider:smtp&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="849.6" textLength="12.2" cl 
[...]
-</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="146.4" y="874" textLength="1134.6" 
clip-path="url(#breeze-pr-auto-triage-line-35)">provider:snowflake&#160;|&#160;provider:sqlite&#160;|&#160;provider:ssh&#160;|&#160;provider:standard&#160;|&#160;provider:tableau&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="874" textLength="12.2" clip-pa 
[...]
-</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="146.4" y="898.4" textLength="1171.2" 
clip-path="url(#breeze-pr-auto-triage-line-36)">provider:telegram&#160;|&#160;provider:teradata&#160;|&#160;provider:trino&#160;|&#160;provider:vertica&#160;|&#160;provider:weaviate&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="898.4" textLength="12.2 [...]
-</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="146.4" y="922.8" textLength="1256.6" 
clip-path="url(#breeze-pr-auto-triage-line-37)">provider:yandex&#160;|&#160;provider:ydb&#160;|&#160;provider:zendesk&#160;|&#160;translation:ar&#160;|&#160;translation:ca&#160;|&#160;translation:de&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="922.8" [...]
-</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="146.4" y="947.2" textLength="1293.2" 
clip-path="url(#breeze-pr-auto-triage-line-38)">translation:default&#160;|&#160;translation:el&#160;|&#160;translation:es&#160;|&#160;translation:fr&#160;|&#160;translation:he&#160;|&#160;translation:hi&#160;|</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="947.2" t [...]
-</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="146.4" y="971.6" textLength="1244.4" 
clip-path="url(#breeze-pr-auto-triage-line-39)">translation:hu&#160;|&#160;translation:it&#160;|&#160;translation:ja&#160;|&#160;translation:ko&#160;|&#160;translation:nl&#160;|&#160;translation:pl&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="971.6"  [...]
-</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="146.4" y="996" textLength="1085.8" 
clip-path="url(#breeze-pr-auto-triage-line-40)">translation:pt&#160;|&#160;translation:th&#160;|&#160;translation:tr&#160;|&#160;translation:zh-CN&#160;|&#160;translation:zh-TW)</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="996" textLength="12.2" 
clip-path="url(#breez [...]
-</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-r4" x="24.4" y="1020.4" textLength="97.6" 
clip-path="url(#breeze-pr-auto-triage-line-41)">--author</text><text 
class="breeze-pr-auto-triage-r1" x="146.4" y="1020.4" textLength="402.6" 
clip-path="url(#breeze-pr-auto-triage-line-41)">Filter&#160;PRs&#160;to&#160;a&#160;specific&#160;author.&#160;</text><text
 class="breez [...]
-</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-r4" x="24.4" y="1044.8" textLength="97.6" 
clip-path="url(#breeze-pr-auto-triage-line-42)">--sort&#160;&#160;</text><text 
class="breeze-pr-auto-triage-r1" x="146.4" y="1044.8" textLength="414.8" 
clip-path="url(#breeze-pr-auto-triage-line-42)">Sort&#160;order&#160;for&#160;PR&#160;search&#160;results.&#160;</text><text
 c [...]
-</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="146.4" y="1069.2" textLength="622.2" 
clip-path="url(#breeze-pr-auto-triage-line-43)">(created-asc|created-desc|updated-asc|updated-desc)</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1069.2" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-43)">│</text><text 
class="breeze-pr-auto-triage- [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1093.6" 
textLength="1464" 
clip-path="url(#breeze-pr-auto-triage-line-44)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-pr-auto-triage-r1" x="1464" y="1093.6" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-44)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1118" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-45)">╭─</text><text 
class="breeze-pr-auto-triage-r5" x="24.4" y="1118" textLength="244" 
clip-path="url(#breeze-pr-auto-triage-line-45)">&#160;Processing&#160;options&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="268.4" y="1118" textLength="1171.2" 
clip-path="url(#breeze-pr-auto-triage-line-45)">──────────────────────────────────────────────────────────────────
 [...]
-</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-r4" x="24.4" y="1142.4" textLength="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-46)">--batch-size&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="256.2" y="1142.4" textLength="500.2" 
clip-path="url(#breeze-pr-auto-triage-line-46)">Number&#160;of&#160;PRs&#160;to&#160;fetch&#160;per&#
 [...]
-</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-r4" x="24.4" y="1166.8" textLength="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-47)">--max-num&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="256.2" y="1166.8" textLength="793" 
clip-path="url(#breeze-pr-auto-triage-line-47)">Maximum&#160;number&#160;of&#160;non-col
 [...]
-</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-r4" x="24.4" y="1191.2" textLength="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-48)">--check-mode&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="256.2" y="1191.2" textLength="1037" 
clip-path="url(#breeze-pr-auto-triage-line-48)">Which&#160;checks&#160;to&#160;run:&#160;&#x27;both&#x
 [...]
-</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-r5" x="256.2" y="1215.6" textLength="61" 
clip-path="url(#breeze-pr-auto-triage-line-49)">both]</text><text 
class="breeze-pr-auto-triage-r6" x="329.4" y="1215.6" textLength="158.6" 
clip-path="url(#breeze-pr-auto-triage-line-49)">(both|ci|llm)</text><text 
class="breeze-pr-auto-triage-r5" x="1451.8" y="1215.6" textLength= [...]
-</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="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-50)">--llm-model&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="256.2" y="1240" textLength="1183.4" 
clip-path="url(#breeze-pr-auto-triage-line-50)">LLM&#160;model&#160;for&#160;assessment&#160;(format:
 [...]
-</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-r1" x="256.2" y="1264.4" textLength="268.4" 
clip-path="url(#breeze-pr-auto-triage-line-51)">for&#160;OpenAI&#160;Codex&#160;CLI.&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="524.6" y="1264.4" textLength="427" 
clip-path="url(#breeze-pr-auto-triage-line-51)">[default:&#160;claude/claude-sonnet-4-6]</text><text
 c [...]
-</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="256.2" y="1288.8" textLength="1159" 
clip-path="url(#breeze-pr-auto-triage-line-52)">&gt;claude/claude-sonnet-4-6&lt;&#160;|&#160;claude/claude-opus-4-20250514&#160;|&#160;claude/claude-sonnet-4-20250514&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1288.8" textLength="12.2" 
clip-path="u [...]
-</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="256.2" y="1313.2" textLength="976" 
clip-path="url(#breeze-pr-auto-triage-line-53)">claude/claude-haiku-4-5-20251001&#160;|&#160;claude/sonnet&#160;|&#160;claude/opus&#160;|&#160;claude/haiku&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1313.2" textLength="12.2" 
clip-path="url(#breeze-p [...]
-</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="256.2" y="1337.6" textLength="1146.8" 
clip-path="url(#breeze-pr-auto-triage-line-54)">codex/gpt-5.3-codex&#160;|&#160;codex/gpt-5.3-codex-spark&#160;|&#160;codex/gpt-5.2-codex&#160;|&#160;codex/gpt-5.1-codex&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1337.6" textLength="12.2" 
clip-pa [...]
-</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-r6" x="256.2" y="1362" textLength="695.4" 
clip-path="url(#breeze-pr-auto-triage-line-55)">codex/gpt-5-codex&#160;|&#160;codex/gpt-5-codex-mini&#160;|&#160;codex/gpt-5)</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1362" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-55)">│</text><text class="br [...]
-</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="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-56)">--llm-concurrency</text><text 
class="breeze-pr-auto-triage-r1" x="256.2" y="1386.4" textLength="524.6" 
clip-path="url(#breeze-pr-auto-triage-line-56)">Number&#160;of&#160;concurrent&#160;LLM&#160;assessment&#160;calls.&#160;</tex
 [...]
-</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="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-57)">--answer-triage&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="256.2" y="1410.8" textLength="1183.4" 
clip-path="url(#breeze-pr-auto-triage-line-57)">Force&#160;answer&#160;to&#160;triage&#160;prompts:&#160;[d]raft,&#
 [...]
-</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-r6" x="256.2" y="1435.2" textLength="183" 
clip-path="url(#breeze-pr-auto-triage-line-58)">(d|c|r|s|q|y|n)</text><text 
class="breeze-pr-auto-triage-r5" x="1451.8" y="1435.2" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-58)">│</text><text 
class="breeze-pr-auto-triage-r1" x="1464" y="1435.2" textLength="12 [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1459.6" 
textLength="1464" 
clip-path="url(#breeze-pr-auto-triage-line-59)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-pr-auto-triage-r1" x="1464" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-59)">
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1484" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-60)">╭─</text><text 
class="breeze-pr-auto-triage-r5" x="24.4" y="1484" textLength="195.2" 
clip-path="url(#breeze-pr-auto-triage-line-60)">&#160;Common&#160;options&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="219.6" y="1484" textLength="1220" 
clip-path="url(#breeze-pr-auto-triage-line-60)">──────────────────────────────────────────────────────────────────────
 [...]
-</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-r4" x="24.4" y="1508.4" textLength="109.8" 
clip-path="url(#breeze-pr-auto-triage-line-61)">--dry-run</text><text 
class="breeze-pr-auto-triage-r7" x="158.6" y="1508.4" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-61)">-D</text><text 
class="breeze-pr-auto-triage-r1" x="207.4" y="1508.4" textLength="719.8" [...]
-</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="109.8" 
clip-path="url(#breeze-pr-auto-triage-line-62)">--verbose</text><text 
class="breeze-pr-auto-triage-r7" x="158.6" y="1532.8" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-62)">-v</text><text 
class="breeze-pr-auto-triage-r1" x="207.4" y="1532.8" textLength="585.6" [...]
-</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="109.8" 
clip-path="url(#breeze-pr-auto-triage-line-63)">--help&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r7" x="158.6" y="1557.2" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-63)">-h</text><text 
class="breeze-pr-auto-triage-r1" x="207.4" y="1557.2" tex [...]
-</text><text class="breeze-pr-auto-triage-r5" x="0" y="1581.6" 
textLength="1464" 
clip-path="url(#breeze-pr-auto-triage-line-64)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-pr-auto-triage-r1" x="1464" y="1581.6" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-64)">
+</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)">&#160;Target&#160;selection&#160;</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&#160;a&#160;specific&#160;PR&#160;by&#160;number&#160;instead&#160;of&#160;searching.&#160;</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)">&#160;Filter&#160;options&#160;</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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.&#160;</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&#160;|&#160;area:CLI&#160;|&#160;area:ConfigTemplates&#160;|&#160;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&#160;|&#160;area:Lineage&#160;|&#160;area:Logging&#160;|&#160;area:Plugins&#160;|&#160;area:Scheduler&#160;|&#160;</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&#160;|&#160;area:Triggerer&#160;|&#160;area:UI&#160;|&#160;area:airflow-ctl&#160;|&#160;area:core-operators&#160;|&#160;</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&#160;|&#160;area:deadline-alerts&#160;|&#160;area:dev-tools&#160;|&#160;area:docker-tests&#160;|&#160;</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&#160;|&#160;area:helm-chart&#160;|&#160;area:kubernetes-tests&#160;|&#160;area:production-image&#160;|&#160;</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&#160;|&#160;area:registry&#160;|&#160;area:system-tests&#160;|&#160;area:task-sdk&#160;|&#160;area:translations&#160;|&#160;</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&#160;|&#160;kind:documentation&#160;|&#160;provider:airbyte&#160;|&#160;provider:alibaba&#160;|&#160;</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&#160;|&#160;provider:apache-beam&#160;|&#160;provider:apache-cassandra&#160;|&#160;provider:apache-drill&#160;</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)">|&#160;provider:apache-druid&#160;|&#160;provider:apache-flink&#160;|&#160;provider:apache-hdfs&#160;|&#160;</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&#160;|&#160;provider:apache-iceberg&#160;|&#160;provider:apache-impala&#160;|&#160;</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&#160;|&#160;provider:apache-kylin&#160;|&#160;provider:apache-livy&#160;|&#160;provider:apache-pig&#160;</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)">|&#160;provider:apache-pinot&#160;|&#160;provider:apache-spark&#160;|&#160;provider:apache-tinkerpop&#160;|&#160;</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&#160;|&#160;provider:arangodb&#160;|&#160;provider:asana&#160;|&#160;provider:atlassian-jira&#160;|&#160;</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&#160;|&#160;provider:cloudant&#160;|&#160;provider:cncf-kubernetes&#160;|&#160;provider:cohere&#160;|&#160;</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&#160;|&#160;provider:common-compat&#160;|&#160;provider:common-io&#160;|&#160;</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&#160;|&#160;provider:common-sql&#160;|&#160;provider:databricks&#160;|&#160;provider:datadog&#160;|&#160;</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&#160;|&#160;provider:dingding&#160;|&#160;provider:discord&#160;|&#160;provider:docker&#160;|&#160;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)">|&#160;provider:elasticsearch&#160;|&#160;provider:exasol&#160;|&#160;provider:fab&#160;|&#160;provider:facebook&#160;|&#160;</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&#160;|&#160;provider:git&#160;|&#160;provider:github&#160;|&#160;provider:google&#160;|&#160;provider:grpc&#160;|&#160;</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&#160;|&#160;provider:http&#160;|&#160;provider:imap&#160;|&#160;provider:influxdb&#160;|&#160;</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&#160;|&#160;provider:jdbc&#160;|&#160;provider:jenkins&#160;|&#160;provider:keycloak&#160;|&#160;</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&#160;|&#160;provider:microsoft-mssql&#160;|&#160;provider:microsoft-psrp&#160;|&#160;</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&#160;|&#160;provider:mongo&#160;|&#160;provider:mysql&#160;|&#160;provider:neo4j&#160;|&#160;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)">|&#160;provider:openai&#160;|&#160;provider:openfaas&#160;|&#160;provider:openlineage&#160;|&#160;provider:opensearch&#160;|&#160;</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&#160;|&#160;provider:oracle&#160;|&#160;provider:pagerduty&#160;|&#160;provider:papermill&#160;|&#160;</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&#160;|&#160;provider:pinecone&#160;|&#160;provider:postgres&#160;|&#160;provider:presto&#160;|&#160;</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&#160;|&#160;provider:redis&#160;|&#160;provider:salesforce&#160;|&#160;provider:samba&#160;|&#160;provider:segment&#160;</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)">|&#160;provider:sendgrid&#160;|&#160;provider:sftp&#160;|&#160;provider:singularity&#160;|&#160;provider:slack&#160;|&#160;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)">|&#160;provider:snowflake&#160;|&#160;provider:sqlite&#160;|&#160;provider:ssh&#160;|&#160;provider:standard&#160;|&#160;</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&#160;|&#160;provider:telegram&#160;|&#160;provider:teradata&#160;|&#160;provider:trino&#160;|&#160;</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&#160;|&#160;provider:weaviate&#160;|&#160;provider:yandex&#160;|&#160;provider:ydb&#160;|&#160;provider:zendesk&#160;|&#160;</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&#160;|&#160;translation:ca&#160;|&#160;translation:de&#160;|&#160;translation:default&#160;|&#160;translation:el&#160;|&#160;</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&#160;|&#160;translation:fr&#160;|&#160;translation:he&#160;|&#160;translation:hi&#160;|&#160;translation:hu&#160;|&#160;</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&#160;|&#160;translation:ja&#160;|&#160;translation:ko&#160;|&#160;translation:nl&#160;|&#160;translation:pl&#160;|&#160;</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&#160;|&#160;translation:th&#160;|&#160;translation:tr&#160;|&#160;translation:zh-CN&#160;|&#160;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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;with&#160;
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;created&#160;
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;created&#160;on&#1
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;updated&#160;
 [...]
+</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&#160;&#160;&#160;&#160;&#160;&#160;&#160;</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&#160;PRs&#160;updated&#160;on&#1
 [...]
+</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&#160;PRs&#160;from&#160;collaborators/members/owners&#160;(normally&#160
 [...]
+</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)">--pending-approval-only</text><text
 class="breeze-pr-auto-triage-r1" x="329.4" y="1386.4" textLength="622.2" 
clip-path="url(#breeze-pr-auto-triage-line-56)">Only&#160;show&#160;PRs&#160;with&#160;workflow&#160;runs&#160;awaiting&
 [...]
+</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)">--checks-state&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="329.4" y="1410.8" textLength="524.6" 
clip-path="url(#breeze-pr-auto-triage-line-57)">Only&#160;assess&#160;PRs&# 
[...]
+</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)">--min-commits-behind&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="329.4" y="1435.2" textLength="878.4" 
clip-path="url(#breeze-pr-auto-triage-line-58)">Only&#160;assess&#160;PRs&#160;that&#160;are&#160;at&#160
 [...]
+</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-r6" x="329.4" y="1459.6" textLength="109.8" 
clip-path="url(#breeze-pr-auto-triage-line-59)">(INTEGER)</text><text 
class="breeze-pr-auto-triage-r5" x="1451.8" y="1459.6" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-59)">│</text><text 
class="breeze-pr-auto-triage-r1" x="1464" y="1459.6" textLength="12.2"  [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1484" textLength="1464" 
clip-path="url(#breeze-pr-auto-triage-line-60)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-pr-auto-triage-r1" x="1464" y="1484" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-60)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1508.4" 
textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-61)">╭─</text><text 
class="breeze-pr-auto-triage-r5" x="24.4" y="1508.4" textLength="292.8" 
clip-path="url(#breeze-pr-auto-triage-line-61)">&#160;Pagination&#160;and&#160;sorting&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="317.2" y="1508.4" textLength="1122.4" 
clip-path="url(#breeze-pr-auto-triage-line-61)">─────────────────────────────────────────────────
 [...]
+</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="146.4" 
clip-path="url(#breeze-pr-auto-triage-line-62)">--batch-size</text><text 
class="breeze-pr-auto-triage-r1" x="195.2" y="1532.8" textLength="500.2" 
clip-path="url(#breeze-pr-auto-triage-line-62)">Number&#160;of&#160;PRs&#160;to&#160;fetch&#160;per&#160;GraphQL&#160;page.&#160;</
 [...]
+</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="146.4" 
clip-path="url(#breeze-pr-auto-triage-line-63)">--max-num&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="195.2" y="1557.2" textLength="793" 
clip-path="url(#breeze-pr-auto-triage-line-63)">Maximum&#160;number&#160;of&#160;non-collaborator&#160;PRs&#160;to&#16
 [...]
+</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="146.4" 
clip-path="url(#breeze-pr-auto-triage-line-64)">--sort&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="195.2" y="1581.6" textLength="414.8" 
clip-path="url(#breeze-pr-auto-triage-line-64)">Sort&#160;order&#160;for&#160;PR&#160;search&#160;res
 [...]
+</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="195.2" y="1606" textLength="622.2" 
clip-path="url(#breeze-pr-auto-triage-line-65)">(created-asc|created-desc|updated-asc|updated-desc)</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= [...]
+</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="244" 
clip-path="url(#breeze-pr-auto-triage-line-67)">&#160;Assessment&#160;options&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="268.4" y="1654.8" textLength="1171.2" 
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="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-68)">--check-mode&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="256.2" y="1679.2" textLength="1037" 
clip-path="url(#breeze-pr-auto-triage-line-68)">Which&#160;checks&#160;to&#160;run:&#160;&#x27;both&#x
 [...]
+</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-r5" x="256.2" y="1703.6" textLength="61" 
clip-path="url(#breeze-pr-auto-triage-line-69)">both]</text><text 
class="breeze-pr-auto-triage-r6" x="329.4" y="1703.6" textLength="158.6" 
clip-path="url(#breeze-pr-auto-triage-line-69)">(both|ci|llm)</text><text 
class="breeze-pr-auto-triage-r5" x="1451.8" y="1703.6" textLength= [...]
+</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="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-70)">--llm-model&#160;&#160;&#160;&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r1" x="256.2" y="1728" textLength="1183.4" 
clip-path="url(#breeze-pr-auto-triage-line-70)">LLM&#160;model&#160;for&#160;assessment&#160;(format:
 [...]
+</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-r1" x="256.2" y="1752.4" textLength="268.4" 
clip-path="url(#breeze-pr-auto-triage-line-71)">for&#160;OpenAI&#160;Codex&#160;CLI.&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="524.6" y="1752.4" textLength="427" 
clip-path="url(#breeze-pr-auto-triage-line-71)">[default:&#160;claude/claude-sonnet-4-6]</text><text
 c [...]
+</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-r6" x="256.2" y="1776.8" textLength="1159" 
clip-path="url(#breeze-pr-auto-triage-line-72)">&gt;claude/claude-sonnet-4-6&lt;&#160;|&#160;claude/claude-opus-4-20250514&#160;|&#160;claude/claude-sonnet-4-20250514&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1776.8" textLength="12.2" 
clip-path="u [...]
+</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-r6" x="256.2" y="1801.2" textLength="976" 
clip-path="url(#breeze-pr-auto-triage-line-73)">claude/claude-haiku-4-5-20251001&#160;|&#160;claude/sonnet&#160;|&#160;claude/opus&#160;|&#160;claude/haiku&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1801.2" textLength="12.2" 
clip-path="url(#breeze-p [...]
+</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-r6" x="256.2" y="1825.6" textLength="1146.8" 
clip-path="url(#breeze-pr-auto-triage-line-74)">codex/gpt-5.3-codex&#160;|&#160;codex/gpt-5.3-codex-spark&#160;|&#160;codex/gpt-5.2-codex&#160;|&#160;codex/gpt-5.1-codex&#160;|&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1825.6" textLength="12.2" 
clip-pa [...]
+</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="695.4" 
clip-path="url(#breeze-pr-auto-triage-line-75)">codex/gpt-5-codex&#160;|&#160;codex/gpt-5-codex-mini&#160;|&#160;codex/gpt-5)</text><text
 class="breeze-pr-auto-triage-r5" x="1451.8" y="1850" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-75)">│</text><text class="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-r4" x="24.4" y="1874.4" textLength="207.4" 
clip-path="url(#breeze-pr-auto-triage-line-76)">--llm-concurrency</text><text 
class="breeze-pr-auto-triage-r1" x="256.2" y="1874.4" textLength="524.6" 
clip-path="url(#breeze-pr-auto-triage-line-76)">Number&#160;of&#160;concurrent&#160;LLM&#160;assessment&#160;calls.&#160;</tex
 [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1898.8" 
textLength="1464" 
clip-path="url(#breeze-pr-auto-triage-line-77)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-pr-auto-triage-r1" x="1464" y="1898.8" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-77)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1923.2" 
textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-78)">╭─</text><text 
class="breeze-pr-auto-triage-r5" x="24.4" y="1923.2" textLength="195.2" 
clip-path="url(#breeze-pr-auto-triage-line-78)">&#160;Action&#160;options&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="219.6" y="1923.2" textLength="1220" 
clip-path="url(#breeze-pr-auto-triage-line-78)">────────────────────────────────────────────────────────────────
 [...]
+</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="183" 
clip-path="url(#breeze-pr-auto-triage-line-79)">--answer-triage</text><text 
class="breeze-pr-auto-triage-r1" x="231.8" y="1947.6" textLength="1207.8" 
clip-path="url(#breeze-pr-auto-triage-line-79)">Force&#160;answer&#160;to&#160;triage&#160;prompts:&#160;[d]raft,&#160;[c]lose,&#
 [...]
+</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="231.8" y="1972" textLength="183" 
clip-path="url(#breeze-pr-auto-triage-line-80)">(d|c|r|s|q|y|n)</text><text 
class="breeze-pr-auto-triage-r5" x="1451.8" y="1972" textLength="12.2" 
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 [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="1996.4" 
textLength="1464" 
clip-path="url(#breeze-pr-auto-triage-line-81)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-pr-auto-triage-r1" x="1464" y="1996.4" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-81)">
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2020.8" 
textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-82)">╭─</text><text 
class="breeze-pr-auto-triage-r5" x="24.4" y="2020.8" textLength="195.2" 
clip-path="url(#breeze-pr-auto-triage-line-82)">&#160;Common&#160;options&#160;</text><text
 class="breeze-pr-auto-triage-r5" x="219.6" y="2020.8" textLength="1220" 
clip-path="url(#breeze-pr-auto-triage-line-82)">────────────────────────────────────────────────────────────────
 [...]
+</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-r4" x="24.4" y="2045.2" textLength="109.8" 
clip-path="url(#breeze-pr-auto-triage-line-83)">--dry-run</text><text 
class="breeze-pr-auto-triage-r7" x="158.6" y="2045.2" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-83)">-D</text><text 
class="breeze-pr-auto-triage-r1" x="207.4" y="2045.2" textLength="719.8" [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2069.6" 
textLength="12.2" clip-path="url(#breeze-pr-auto-triage-line-84)">│</text><text 
class="breeze-pr-auto-triage-r4" x="24.4" y="2069.6" textLength="109.8" 
clip-path="url(#breeze-pr-auto-triage-line-84)">--verbose</text><text 
class="breeze-pr-auto-triage-r7" x="158.6" y="2069.6" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-84)">-v</text><text 
class="breeze-pr-auto-triage-r1" x="207.4" y="2069.6" textLength="585.6" [...]
+</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="109.8" 
clip-path="url(#breeze-pr-auto-triage-line-85)">--help&#160;&#160;&#160;</text><text
 class="breeze-pr-auto-triage-r7" x="158.6" y="2094" textLength="24.4" 
clip-path="url(#breeze-pr-auto-triage-line-85)">-h</text><text 
class="breeze-pr-auto-triage-r1" x="207.4" y="2094" textLength= [...]
+</text><text class="breeze-pr-auto-triage-r5" x="0" y="2118.4" 
textLength="1464" 
clip-path="url(#breeze-pr-auto-triage-line-86)">╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯</text><text
 class="breeze-pr-auto-triage-r1" x="1464" y="2118.4" textLength="12.2" 
clip-path="url(#breeze-pr-auto-triage-line-86)">
 </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 e8fccbe20ab..f2d3002dbd2 100644
--- a/dev/breeze/doc/images/output_pr_auto-triage.txt
+++ b/dev/breeze/doc/images/output_pr_auto-triage.txt
@@ -1 +1 @@
-25763a408c0f0ab52c95d4e816184b53
+f32e601513ba3cce3b3f42b5beeae0e5
diff --git a/dev/breeze/src/airflow_breeze/commands/pr_commands.py 
b/dev/breeze/src/airflow_breeze/commands/pr_commands.py
index 6ee27349bad..e41c38ab10c 100644
--- a/dev/breeze/src/airflow_breeze/commands/pr_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/pr_commands.py
@@ -600,9 +600,14 @@ def _fetch_prs_graphql(
     token: str,
     github_repository: str,
     labels: tuple[str, ...],
+    exclude_labels: tuple[str, ...],
     filter_user: str | None,
     sort: str,
     batch_size: int,
+    created_after: str | None = None,
+    created_before: str | None = None,
+    updated_after: str | None = None,
+    updated_before: str | None = None,
 ) -> list[PRData]:
     """Fetch a single batch of matching PRs via GraphQL."""
     query_parts = [f"repo:{github_repository}", "type:pr", "is:open", 
"draft:false"]
@@ -610,6 +615,21 @@ def _fetch_prs_graphql(
         query_parts.append(f"author:{filter_user}")
     for label in labels:
         query_parts.append(f'label:"{label}"')
+    for label in exclude_labels:
+        query_parts.append(f'-label:"{label}"')
+    # Date range filters — GitHub search supports created: and updated: 
qualifiers
+    if created_after and created_before:
+        query_parts.append(f"created:{created_after}..{created_before}")
+    elif created_after:
+        query_parts.append(f"created:>={created_after}")
+    elif created_before:
+        query_parts.append(f"created:<={created_before}")
+    if updated_after and updated_before:
+        query_parts.append(f"updated:{updated_after}..{updated_before}")
+    elif updated_after:
+        query_parts.append(f"updated:>={updated_after}")
+    elif updated_before:
+        query_parts.append(f"updated:<={updated_before}")
     search_query = " ".join(query_parts)
 
     sort_field, sort_direction = sort.rsplit("-", 1)
@@ -1237,6 +1257,7 @@ def _approve_workflow_runs(token: str, github_repository: 
str, pending_runs: lis
 )
 @option_github_token
 @option_github_repository
+# --- Target selection ---
 @click.option(
     "--pr",
     "pr_number",
@@ -1244,13 +1265,74 @@ def _approve_workflow_runs(token: str, 
github_repository: str, pending_runs: lis
     default=None,
     help="Triage a specific PR by number instead of searching.",
 )
+# --- Filter options ---
 @click.option(
     "--label",
     "labels",
     type=NotVerifiedBetterChoice(_load_labels_from_boring_cyborg()),
     multiple=True,
-    help="Filter PRs by label (can be repeated).",
+    help="Filter PRs by label. Supports wildcards (e.g. 'area:*', 
'provider:amazon*'). Can be repeated.",
 )
[email protected](
+    "--exclude-label",
+    "exclude_labels",
+    type=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.",
+)
[email protected](
+    "--created-after",
+    default=None,
+    help="Only PRs created on or after this date (YYYY-MM-DD).",
+)
[email protected](
+    "--created-before",
+    default=None,
+    help="Only PRs created on or before this date (YYYY-MM-DD).",
+)
[email protected](
+    "--updated-after",
+    default=None,
+    help="Only PRs updated on or after this date (YYYY-MM-DD).",
+)
[email protected](
+    "--updated-before",
+    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).",
+)
[email protected](
+    "--pending-approval-only",
+    is_flag=True,
+    default=False,
+    help="Only show PRs with workflow runs awaiting approval.",
+)
[email protected](
+    "--checks-state",
+    type=click.Choice(["failure", "success", "pending", "any"]),
+    default="any",
+    show_default=True,
+    help="Only assess PRs with this CI checks state.",
+)
[email protected](
+    "--min-commits-behind",
+    type=int,
+    default=0,
+    show_default=True,
+    help="Only assess PRs that are at least this many commits behind base 
branch.",
+)
+# --- Pagination and sorting ---
 @click.option(
     "--batch-size",
     type=int,
@@ -1272,12 +1354,7 @@ def _approve_workflow_runs(token: str, 
github_repository: str, pending_runs: lis
     show_default=True,
     help="Sort order for PR search results.",
 )
[email protected](
-    "--author",
-    "filter_user",
-    default=None,
-    help="Filter PRs to a specific author.",
-)
+# --- Assessment options ---
 @click.option(
     "--check-mode",
     type=click.Choice(["both", "ci", "llm"]),
@@ -1293,6 +1370,7 @@ def _approve_workflow_runs(token: str, github_repository: 
str, pending_runs: lis
     help="Number of concurrent LLM assessment calls.",
 )
 @option_llm_model
+# --- Action options ---
 @click.option(
     "--answer-triage",
     type=click.Choice(["d", "c", "r", "s", "q", "y", "n"], 
case_sensitive=False),
@@ -1306,10 +1384,19 @@ def auto_triage(
     github_repository: str,
     pr_number: int | None,
     labels: tuple[str, ...],
+    exclude_labels: tuple[str, ...],
     batch_size: int,
     max_num: int,
     sort: str,
     filter_user: str | None,
+    created_after: str | None,
+    created_before: str | None,
+    updated_after: str | None,
+    updated_before: str | None,
+    include_collaborators: bool,
+    pending_approval_only: bool,
+    checks_state: str,
+    min_commits_behind: int,
     check_mode: str,
     llm_concurrency: int,
     llm_model: str,
@@ -1345,13 +1432,45 @@ def auto_triage(
 
     dry_run = get_dry_run()
 
+    # Split labels into exact (for GitHub search) and wildcard (for 
client-side filtering)
+    from fnmatch import fnmatch
+
+    exact_labels = tuple(lbl for lbl in labels if "*" not in lbl and "?" not 
in lbl)
+    wildcard_labels = [lbl for lbl in labels if "*" in lbl or "?" in lbl]
+    exact_exclude_labels = tuple(lbl for lbl in exclude_labels if "*" not in 
lbl and "?" not in lbl)
+    wildcard_exclude_labels = [lbl for lbl in exclude_labels if "*" in lbl or 
"?" in lbl]
+
     # Phase 1: Lightweight fetch of PRs via GraphQL (no check contexts — fast)
     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)]
     else:
         get_console().print("[info]Fetching PRs via GraphQL...[/]")
-        all_prs = _fetch_prs_graphql(token, github_repository, labels, 
filter_user, sort, batch_size)
+        all_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,
+        )
+
+    # Apply wildcard label filters client-side
+    if wildcard_labels:
+        all_prs = [
+            pr for pr in all_prs if any(fnmatch(lbl, pat) for pat in 
wildcard_labels for lbl in pr.labels)
+        ]
+    if wildcard_exclude_labels:
+        all_prs = [
+            pr
+            for pr in all_prs
+            if not any(fnmatch(lbl, pat) for pat in wildcard_exclude_labels 
for lbl in pr.labels)
+        ]
 
     # Resolve how far behind base branch each PR is (chunked GraphQL)
     get_console().print("[info]Checking how far behind base branch each PR 
is...[/]")
@@ -1411,14 +1530,16 @@ def auto_triage(
     get_console().print(pr_table)
     get_console().print()
 
-    # Phase 2: Filter out collaborators, bots, and ready-for-review PRs, then 
apply --max-num
+    # Phase 2: Filter out collaborators, bots, and ready-for-review PRs, then 
apply post-fetch filters
     candidate_prs: list[PRData] = []
     total_skipped_collaborator = 0
     total_skipped_bot = 0
     total_skipped_accepted = 0
+    total_skipped_checks_state = 0
+    total_skipped_commits_behind = 0
     verbose = get_verbose()
     for pr in all_prs:
-        if pr.author_association in _COLLABORATOR_ASSOCIATIONS:
+        if not include_collaborators and pr.author_association in 
_COLLABORATOR_ASSOCIATIONS:
             total_skipped_collaborator += 1
             if verbose:
                 get_console().print(
@@ -1435,22 +1556,43 @@ def auto_triage(
                 get_console().print(
                     f"  [dim]Skipping PR {_pr_link(pr)} — already has 
'{_READY_FOR_REVIEW_LABEL}' label[/]"
                 )
+        elif checks_state != "any" and pr.checks_state.lower() != checks_state:
+            total_skipped_checks_state += 1
+            if verbose:
+                get_console().print(
+                    f"  [dim]Skipping PR {_pr_link(pr)} — checks state 
{pr.checks_state} != {checks_state}[/]"
+                )
+        elif min_commits_behind > 0 and pr.commits_behind < min_commits_behind:
+            total_skipped_commits_behind += 1
+            if verbose:
+                get_console().print(
+                    f"  [dim]Skipping PR {_pr_link(pr)} — only "
+                    f"{pr.commits_behind} commits behind (min: 
{min_commits_behind})[/]"
+                )
         else:
             candidate_prs.append(pr)
 
     if max_num and len(candidate_prs) > max_num:
         candidate_prs = candidate_prs[:max_num]
 
-    skipped_parts = [
-        f"{total_skipped_collaborator} {'collaborators' if 
total_skipped_collaborator != 1 else 'collaborator'}"
-    ]
+    skipped_parts: list[str] = []
+    if total_skipped_collaborator:
+        skipped_parts.append(
+            f"{total_skipped_collaborator} "
+            f"{'collaborators' if total_skipped_collaborator != 1 else 
'collaborator'}"
+        )
     if total_skipped_bot:
         skipped_parts.append(f"{total_skipped_bot} {'bots' if 
total_skipped_bot != 1 else 'bot'}")
     if total_skipped_accepted:
         skipped_parts.append(f"{total_skipped_accepted} ready-for-review")
+    if total_skipped_checks_state:
+        skipped_parts.append(f"{total_skipped_checks_state} checks-state 
mismatch")
+    if total_skipped_commits_behind:
+        skipped_parts.append(f"{total_skipped_commits_behind} below 
min-commits-behind")
+    skipped_text = f"skipped {', '.join(skipped_parts)}, " if skipped_parts 
else ""
     get_console().print(
         f"\n[info]Fetched {len(all_prs)} {'PRs' if len(all_prs) != 1 else 
'PR'}, "
-        f"skipped {', '.join(skipped_parts)}, "
+        f"{skipped_text}"
         f"assessing {len(candidate_prs)} {'PRs' if len(candidate_prs) != 1 
else 'PR'}"
         f"{f' (capped at {max_num})' if max_num else ''}...[/]\n"
     )
@@ -1524,6 +1666,19 @@ def auto_triage(
             else:
                 llm_candidates.append(pr)
 
+    # If --pending-approval-only, discard all assessment results and only keep 
pending_approval
+    if pending_approval_only:
+        assessments = {}
+        llm_candidates = []
+        total_deterministic_flags = 0
+        if not pending_approval:
+            get_console().print("[success]No PRs with pending workflow 
approvals found.[/]")
+            sys.exit(0)
+        get_console().print(
+            f"[info]--pending-approval-only: found {len(pending_approval)} "
+            f"{'PRs' if len(pending_approval) != 1 else 'PR'} awaiting 
workflow approval.[/]\n"
+        )
+
     # Phase 4: Run LLM assessments concurrently for PRs without CI failures
     total_llm_errors = 0
 
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 049ccaf9412..31532e59f23 100644
--- a/dev/breeze/src/airflow_breeze/commands/pr_commands_config.py
+++ b/dev/breeze/src/airflow_breeze/commands/pr_commands_config.py
@@ -27,20 +27,41 @@ PR_PARAMETERS: dict[str, list[dict[str, str | list[str]]]] 
= {
             "name": "GitHub parameters",
             "options": ["--github-token", "--github-repository"],
         },
+        {
+            "name": "Target selection",
+            "options": ["--pr"],
+        },
         {
             "name": "Filter options",
-            "options": ["--pr", "--label", "--author", "--sort"],
+            "options": [
+                "--label",
+                "--exclude-label",
+                "--author",
+                "--created-after",
+                "--created-before",
+                "--updated-after",
+                "--updated-before",
+                "--include-collaborators",
+                "--pending-approval-only",
+                "--checks-state",
+                "--min-commits-behind",
+            ],
         },
         {
-            "name": "Processing options",
+            "name": "Pagination and sorting",
+            "options": ["--batch-size", "--max-num", "--sort"],
+        },
+        {
+            "name": "Assessment options",
             "options": [
-                "--batch-size",
-                "--max-num",
                 "--check-mode",
                 "--llm-model",
                 "--llm-concurrency",
-                "--answer-triage",
             ],
         },
+        {
+            "name": "Action options",
+            "options": ["--answer-triage"],
+        },
     ],
 }


Reply via email to