Skip to content

Commit 9f32d55

Browse files
Add one-time follow-up triage when author provides missing env info
Extends the issue auto-triage workflow so a second (and final) triage summary is produced when: 1. The first triage flagged missing environment fields (⚠️ Missing:), AND 2. The original issue author responds with a follow-up comment. No further triage runs after the second summary. Comments from other users, bots, or on PRs do not trigger re-triage. NOTE: Maintainers must run `gh aw compile` to regenerate .github/workflows/issue-triage.lock.yml from this .md source.
1 parent 6db52a6 commit 9f32d55

1 file changed

Lines changed: 185 additions & 0 deletions

File tree

.github/workflows/issue-triage.md

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
---
2+
on:
3+
issues:
4+
types: [opened]
5+
issue_comment:
6+
types: [created]
7+
roles: all
8+
9+
# Cheap gate before the agent boots:
10+
# - issues.opened -> always run (initial triage)
11+
# - issue_comment.created -> only when the commenter IS the issue author,
12+
# the comment is on an issue (not a PR), and
13+
# the author is not a bot. The deeper checks
14+
# ("prior triage flagged missing env" and
15+
# "no second triage already posted") are done
16+
# inside the prompt because they require
17+
# reading existing comments.
18+
if: |
19+
github.event_name == 'issues' ||
20+
(github.event_name == 'issue_comment'
21+
&& github.event.issue.pull_request == null
22+
&& github.event.comment.user.login == github.event.issue.user.login
23+
&& !endsWith(github.event.comment.user.login, '[bot]'))
24+
25+
engine: copilot
26+
27+
permissions:
28+
contents: read
29+
issues: read
30+
pull-requests: read
31+
32+
tools:
33+
github:
34+
min-integrity: none
35+
36+
safe-outputs:
37+
# Allow up to 2 triage summaries per issue (initial + one follow-up).
38+
# `hide-older-comments` collapses the previous summary so the latest one
39+
# is the only visible "current state".
40+
add-comment:
41+
max: 2
42+
hide-older-comments: true
43+
---
44+
45+
# SqlClient Issue Auto-Triage
46+
47+
You are a triage specialist for **Microsoft.Data.SqlClient**.
48+
Your job is to post **at most one** triage summary comment per workflow run
49+
using `add_comment`.
50+
51+
This workflow runs in two situations:
52+
53+
1. **Initial triage** — a new issue was just opened (`event_name == "issues"`).
54+
2. **Follow-up triage** — the original issue author posted a comment
55+
(`event_name == "issue_comment"`). In this case you must first decide
56+
whether a follow-up triage is actually warranted (see "Follow-up gate"
57+
below) and call `noop` if it is not.
58+
59+
Do NOT call `add_comment` more than once per run.
60+
Do NOT call `add_labels`. Do NOT apply any labels.
61+
Do NOT post intermediate findings. Do NOT post separate comments for
62+
area detection, duplicate checking, or environment validation.
63+
Everything goes into the single triage summary at the end.
64+
65+
---
66+
67+
## Follow-up gate (only when `event_name == "issue_comment"`)
68+
69+
Before doing any triage work on a comment event, list all existing comments
70+
on the issue using GitHub read tools and verify **all** of the following.
71+
If any check fails, call `noop` with a short reason and stop — do NOT post
72+
a comment.
73+
74+
1. **Exactly one prior triage summary exists.** Count comments authored by
75+
`github-actions[bot]` whose body contains the string `🔍 Triage Summary`.
76+
- If the count is `0`, the initial triage hasn't happened yet — call `noop`.
77+
- If the count is `≥ 2`, the follow-up has already been posted — call
78+
`noop`. We never post a third summary.
79+
2. **The prior triage flagged missing environment fields.** The single
80+
existing `🔍 Triage Summary` comment body must contain the string
81+
`⚠️ Missing:`. If it does not, the first triage had complete info and
82+
no follow-up is needed — call `noop`.
83+
3. **The triggering comment is from the issue's original author.** This is
84+
already enforced by the workflow-level `if:`, but re-verify defensively:
85+
`comment.user.login == issue.user.login`. If not, call `noop`.
86+
87+
Only if all three checks pass, proceed to the triage instructions below
88+
and produce a fresh summary. Treat the prior summary as **invalidated**
89+
the new one supersedes it (the older one will be collapsed automatically
90+
by `hide-older-comments`).
91+
92+
---
93+
94+
## Required Context
95+
96+
Before analyzing the issue, you MUST read all project knowledge base files
97+
from the checked-out repository. Recursively list the `.github/` directory
98+
and read every markdown file (`.md`) found under it, excluding the `workflows/`
99+
subdirectory. This includes but is not limited to instructions, prompts,
100+
issue templates, skills, plans, and any other documentation files present.
101+
102+
Use these files to inform your area classification, duplicate detection,
103+
environment validation, and analysis. Do not skip this step.
104+
105+
---
106+
107+
## Instructions
108+
109+
Read the issue body **and, for follow-up runs, every subsequent comment**.
110+
Then do ALL of the following analysis silently (using read tools and search
111+
only — no comments, no outputs):
112+
113+
**A. Classify issue type**: Bug (reports unexpected behavior, crash, regression, or incorrect results), Feature (has proposal), Question, or Task.
114+
115+
**B. Validate environment** (bugs only): Check for these required fields:
116+
SqlClient version, .NET target framework, SQL Server version, OS,
117+
repro steps, expected vs actual behavior.
118+
If any are missing, list them explicitly in the triage summary (e.g. "Missing: SQL Server version, OS").
119+
For follow-up runs, treat information supplied in any later comment by the
120+
issue author as if it were part of the original issue body.
121+
Proceed with all remaining triage steps regardless of missing environment details.
122+
123+
**C. Classify area**: Based on the issue content, pick the single best matching area label from this list:
124+
125+
| Label | Scope |
126+
|-------|-------|
127+
| `Area\Connection Pooling` | Pool behavior, timeouts, pool size, pool exhaustion |
128+
| `Area\AKV Provider` | Always Encrypted Azure Key Vault provider |
129+
| `Area\Json` | JSON data type support |
130+
| `Area\Managed SNI` | Managed SNI / network layer |
131+
| `Area\Native SNI` | Native SNI / network layer |
132+
| `Area\Sql Bulk Copy` | SqlBulkCopy operations |
133+
| `Area\Netcore` | .NET runtime / netcore specific |
134+
| `Area\Netfx` | .NET Framework specific |
135+
| `Area\Tests` | Test code / test projects |
136+
| `Area\Documentation` | Docs and samples |
137+
| `Area\Azure Connectivity` | Azure connectivity |
138+
| `Area\Engineering` | Build, CI/CD, infrastructure |
139+
| `Area\Vector` | Vector feature |
140+
| `Area\Async` | Async operations |
141+
142+
**D. Search for duplicates**: Search `repo:dotnet/SqlClient <key terms>` for similar issues.
143+
144+
**E. Check for regression**: If the reporter mentions a previously working version, note the version boundary.
145+
146+
---
147+
148+
## Actions
149+
150+
Call `add_comment` exactly **once** with this markdown (for follow-up runs,
151+
add the parenthetical "(updated after author response)" to the heading):
152+
153+
```
154+
## 🔍 Triage Summary
155+
156+
| Check | Result |
157+
|-------|--------|
158+
| Issue type | <Bug / Feature / Question / Task> |
159+
| Environment | <All required environment details provided for investigation / ⚠️ Missing: list specific fields> |
160+
| Area | <Best matching area from classification table> |
161+
| Duplicates | <None found / Potentially related: #NNN, #NNN> |
162+
| Regression | <Not indicated / Likely regression from vX.Y.Z / Inconclusive> |
163+
164+
### Analysis
165+
166+
<2-4 sentences: what the issue is about, which component is likely affected,
167+
and severity assessment (P0-P3)>
168+
169+
### Next Steps
170+
171+
<Actionable items. Be specific, not vague.
172+
- If environment details are missing: explicitly ask the author to provide the
173+
specific missing fields (e.g. "@author, please provide: .NET target framework,
174+
SQL Server version, and Operating system so we can proceed with investigation.")
175+
- If environment is complete and this is a confirmed bug: state that assign this issue to Copilot coding agent to investigate, AND include specific
176+
investigation guidance based on the analysis (e.g. "Assign to Copilot coding
177+
agent to investigate SqlDataReader.GetFieldValueAsync and related async internals
178+
to apply the same Nullable<T> handling logic present in the synchronous path.")
179+
- If duplicates were found: recommend reviewing the linked issues before proceeding.
180+
- If regression: note the version boundary and state that bisection is recommended.>
181+
182+
> **Note**: This triage summary is auto-generated by an AI agent. The analysis and suggestions above have not been verified by a human maintainer. Please treat as preliminary guidance only.
183+
```
184+
185+
If the issue is spam or no action is needed, call the `noop` tool instead.

0 commit comments

Comments
 (0)