Issue Triage

Streamline GitHub issue triage with smart milestone suggestions

✨ The solution you've been looking for

Verified
Tested and verified by our team
23133 Stars

Queries and triages open GitHub issues that need attention. Helps identify issues needing milestones, labels, or investigation.

github issue-management triage project-management dotnet automation milestone workflow
Repository

See It In Action

Interactive preview & real-world examples

Live Demo
Skill Demo Animation

AI Conversation Simulator

See how users interact with this skill

User Prompt

Let's triage issues - grab me 10 Android issues to review

Skill Processing

Analyzing request...

Agent Response

Issues presented one-by-one with smart milestone suggestions based on linked PRs, regression status, and current servicing releases

Quick Start (3 Steps)

Get up and running in minutes

1

Install

claude-code skill install issue-triage

claude-code skill install issue-triage
2

Config

3

First Trigger

@issue-triage help

Commands

CommandDescriptionRequired Args
@issue-triage batch-issue-triageProcess multiple open issues systematically with milestone and label suggestionsNone
@issue-triage platform-specific-triageFocus triage efforts on specific platforms or areas of the codebaseNone
@issue-triage regression-priority-triageIdentify and prioritize regression issues for servicing releasesNone

Typical Use Cases

Batch Issue Triage

Process multiple open issues systematically with milestone and label suggestions

Platform-Specific Triage

Focus triage efforts on specific platforms or areas of the codebase

Regression Priority Triage

Identify and prioritize regression issues for servicing releases

Overview

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:

 1# Install
 2# Windows:
 3winget install --id GitHub.cli
 4
 5# macOS:
 6brew install gh
 7
 8# Linux:
 9# See https://cli.github.com/manual/installation
10
11# Authenticate (required before first use)
12gh 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:

1pwsh .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!

1pwsh .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:

 1## Issue #XXXXX
 2
 3**[Title]**
 4
 5🔗 [URL]
 6
 7| Field | Value |
 8|-------|-------|
 9| **Author** | username (Syncfusion if applicable) |
10| **Platform** | platform |
11| **Area** | area |
12| **Labels** | labels |
13| **Linked PR** | PR info with milestone if available |
14| **Regression** | Yes/No |
15| **Comments** | count |
16
17**Comment Summary** (if any):
18- [Author] Comment preview...
19
20**My Suggestion**: `Milestone` - Reason (based on init session output)
21
22---
23
24What 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.

1# Run query again to load next batch
2pwsh .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

ParameterValuesDefaultDescription
-Platformandroid, ios, windows, maccatalyst, allallFilter by platform
-AreaAny area label (e.g., collectionview, shell)""Filter by area
-Limit1-100050Maximum issues to fetch
-Skip0+0Skip first N issues (for pagination)
-OutputFormattable, json, markdown, triagetableOutput format
-RequireAreaLabelswitchfalseOnly return issues with area-* labels
-SkipDetailsswitchfalseSkip 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

ConditionSuggested MilestoneReason
Linked PR has milestonePR’s milestone“PR already has milestone”
Has i/regression labelHighest numbered SR milestone“Regression - needs servicing”
Has open linked PRCurrent servicing milestone“Has open PR”
DefaultBacklog“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

1# Set milestone only
2gh issue edit ISSUE_NUMBER --repo dotnet/maui --milestone "Backlog"
3
4# Set milestone and add labels  
5gh issue edit ISSUE_NUMBER --repo dotnet/maui --milestone "MILESTONE_NAME" --add-label "i/regression"
6
7# Set milestone on both issue AND linked PR
8gh issue edit ISSUE_NUMBER --repo dotnet/maui --milestone "MILESTONE_NAME"
9gh 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

MistakeWhy It’s WrongCorrect Approach
❌ Using github-mcp-server-list_issues directlyMissing exclusion filters (needs-info, needs-repro, etc.)✅ Use query-issues.ps1 script
❌ Stopping when batch is emptyThere 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 issuesCreates unnecessary interruption✅ Just load more automatically
❌ Using ad-hoc API queries with custom filtersLikely to miss or include wrong issues✅ Trust the skill’s scripts - they have the right logic

Session Tracking (Optional)

1# Record triaged issue
2pwsh .github/skills/issue-triage/scripts/record-triage.ps1 -IssueNumber 33272 -Milestone "Backlog"
3
4# View session stats
5cat CustomAgentLogsTmp/Triage/triage-*.json | jq '.Stats'

What Users Are Saying

Real feedback from the community

Environment Matrix

Dependencies

GitHub CLI (gh) - authenticated
PowerShell 5.1+
Git repository access to dotnet/maui

Context Window

Token Usage ~3K-8K tokens per triage session

Security & Privacy

Information

Author
dotnet
Updated
2026-01-30
Category
productivity-tools