- name
- issue-triage
- description
- Queries and triages open GitHub issues that need attention. Helps identify issues needing milestones, labels, or investigation.
- metadata
- {"author":"dotnet-maui","version":"2.3"}
- compatibility
- Requires GitHub CLI (gh) installed and authenticated. Run `gh auth login` before using.
# Issue Triage Skill
This skill helps triage open GitHub issues in the dotnet/maui repository by:
1. Initializing a session with current milestones and labels
2. Loading a batch of issues into memory
3. Presenting issues ONE AT A TIME for triage decisions
4. Suggesting milestones based on issue characteristics
5. Tracking progress through a triage session
## Prerequisites
**GitHub CLI (gh) must be installed and authenticated:**
```bash
# Install
# Windows:
winget install --id GitHub.cli
# macOS:
brew install gh
# Linux:
# See https://cli.github.com/manual/installation
# Authenticate (required before first use)
gh auth login
```
The scripts will check for `gh` and exit with installation instructions if not found.
## When to Use
- "Find issues to triage"
- "Let's triage issues"
- "Grab me 10 issues to triage"
- "Triage Android issues"
## Triage Workflow
**🚨 CRITICAL: ALWAYS use the skill scripts. NEVER use ad-hoc GitHub API queries.**
The scripts have proper filters, exclusions, and milestone logic built-in. Don't bypass them.
### Step 1: Initialize Session
Start by initializing a session to load current milestones and labels:
```bash
pwsh .github/skills/issue-triage/scripts/init-triage-session.ps1
```
**What this does:**
- Fetches current milestones (SR4, SR5, etc.) from GitHub API
- Displays servicing milestones for reference during triage
- Creates session file to track progress
### Step 2: Load Issues Into Memory
**MANDATORY: Use query-issues.ps1 - it has the right filters!**
```bash
pwsh .github/skills/issue-triage/scripts/query-issues.ps1 -Limit 50 -OutputFormat triage
```
**What this does:**
- Queries GitHub with exclusion filters: `-label:s/needs-info -label:s/needs-repro -label:area-blazor -label:s/try-latest-version -label:s/move-to-vs-feedback`
- Returns issues without milestones
- Stores results for one-at-a-time presentation
**DON'T:**
- ❌ Use `github-mcp-server-list_issues` directly
- ❌ Use `github-mcp-server-search_issues` without the same filters
- ❌ Try to replicate the logic yourself - use the script!
### Step 3: Present ONE Issue at a Time
**IMPORTANT**: When user asks to triage, present only ONE issue at a time in this format:
```markdown
## Issue #XXXXX
**[Title]**
🔗 [URL]
| Field | Value |
|-------|-------|
| **Author** | username (Syncfusion if applicable) |
| **Platform** | platform |
| **Area** | area |
| **Labels** | labels |
| **Linked PR** | PR info with milestone if available |
| **Regression** | Yes/No |
| **Comments** | count |
**Comment Summary** (if any):
- [Author] Comment preview...
**My Suggestion**: `Milestone` - Reason (based on init session output)
---
What would you like to do with this issue?
```
### Step 4: Wait for User Decision
Wait for user to say:
- A milestone name (e.g., "Backlog", ".NET 10 SR5", ".NET 10 Servicing")
- "yes" to accept suggestion
- "skip" or "next" to move on without changes
- Specific instructions (e.g., "next SR and add regression label")
### Step 5: Move to Next Issue
After user decision, automatically present the NEXT issue.
### Step 6: When Batch is Empty
**🚨 CRITICAL: When you run out of issues, AUTOMATICALLY reload more issues.**
```bash
# Run query again to load next batch
pwsh .github/skills/issue-triage/scripts/query-issues.ps1 -Limit 50 -Skip <current_count> -OutputFormat triage
```
**DO NOT:**
- ❌ Stop and ask "Load more?"
- ❌ Say "No more issues found"
- ❌ Use different GitHub queries
**DO:**
- ✅ Automatically run `query-issues.ps1` again with `-Skip` parameter
- ✅ Continue presenting issues one at a time
- ✅ Only stop when query returns zero issues
## Script Parameters
### query-issues.ps1
| Parameter | Values | Default | Description |
|-----------|--------|---------|-------------|
| `-Platform` | android, ios, windows, maccatalyst, all | all | Filter by platform |
| `-Area` | Any area label (e.g., collectionview, shell) | "" | Filter by area |
| `-Limit` | 1-1000 | 50 | Maximum issues to fetch |
| `-Skip` | 0+ | 0 | Skip first N issues (for pagination) |
| `-OutputFormat` | table, json, markdown, triage | table | Output format |
| `-RequireAreaLabel` | switch | false | Only return issues with area-* labels |
| `-SkipDetails` | switch | false | Skip fetching PRs/comments (faster) |
## Milestone Suggestion Logic
**🚨 CRITICAL: ALWAYS use actual milestone names from init-triage-session.ps1 output. NEVER guess or assume milestone names.**
The skill dynamically queries current milestones from dotnet/maui at session initialization. Milestone names change frequently (e.g., SR4, SR5, SR6), so **always reference the session output** when suggesting milestones.
### Suggestion Guidelines
| Condition | Suggested Milestone | Reason |
|-----------|---------------------|--------|
| Linked PR has milestone | PR's milestone | "PR already has milestone" |
| Has `i/regression` label | Highest numbered SR milestone | "Regression - needs servicing" |
| Has open linked PR | Current servicing milestone | "Has open PR" |
| Default | Backlog | "No PR, not a regression" |
**Example Session Output:**
```
Servicing Releases:
- .NET 9 Servicing [246 open]
- .NET 10 Servicing [213 open]
- .NET 10 SR5 [55 open] ← Use this for .NET 10 regressions
- .NET 10.0 SR4 [103 open]
Other:
- .NET 11 Planning [167 open]
- .NET 11.0-preview1 [8 open]
Backlog:
- Backlog [3037 open]
```
**How to suggest milestones:**
- ✅ "Assign to `.NET 10 SR5`" (from session output)
- ❌ "Assign to `.NET 10 SR2`" (guessing, might not exist)
- ❌ "Assign to current SR" (ambiguous, multiple active)
## Applying Triage Decisions
```bash
# Set milestone only
gh issue edit ISSUE_NUMBER --repo dotnet/maui --milestone "Backlog"
# Set milestone and add labels
gh issue edit ISSUE_NUMBER --repo dotnet/maui --milestone "MILESTONE_NAME" --add-label "i/regression"
# Set milestone on both issue AND linked PR
gh issue edit ISSUE_NUMBER --repo dotnet/maui --milestone "MILESTONE_NAME"
gh pr edit PR_NUMBER --repo dotnet/maui --milestone "MILESTONE_NAME"
```
## Label Quick Reference
**Regression Labels:**
- `i/regression` - Confirmed regression
- `regressed-in-10.0.0` - Specific version
**Priority Labels:**
- `p/0` - Critical
- `p/1` - High
- `p/2` - Medium
- `p/3` - Low
**iOS 26 / macOS 26:**
- `version/iOS-26` - iOS 26 specific issue
## Common Mistakes to Avoid
| Mistake | Why It's Wrong | Correct Approach |
|---------|----------------|------------------|
| ❌ Using `github-mcp-server-list_issues` directly | Missing exclusion filters (needs-info, needs-repro, etc.) | ✅ Use `query-issues.ps1` script |
| ❌ Stopping when batch is empty | There are likely more issues available | ✅ Automatically run `query-issues.ps1 -Skip N` |
| ❌ Suggesting milestone names like "SR2" | Milestone doesn't exist, based on assumptions | ✅ Use actual milestone names from `init-triage-session.ps1` output |
| ❌ Asking "Load more?" when out of issues | Creates unnecessary interruption | ✅ Just load more automatically |
| ❌ Using ad-hoc API queries with custom filters | Likely to miss or include wrong issues | ✅ Trust the skill's scripts - they have the right logic |
## Session Tracking (Optional)
```bash
# Record triaged issue
pwsh .github/skills/issue-triage/scripts/record-triage.ps1 -IssueNumber 33272 -Milestone "Backlog"
# View session stats
cat CustomAgentLogsTmp/Triage/triage-*.json | jq '.Stats'
```
View on GitHub