Infra, Ops & WorkflowSûr8787/100

Issue Triage (.NET)

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

ou envoie-le directement à ton agent.

Installer dans ton projet

$ curl -fsSL https://arboristhree.xyz/cli/install-skill.mjs -o /tmp/arboris-install-skill.mjs && node /tmp/arboris-install-skill.mjs issue-triage__dotnet-maui__github-skills-4e1ddb9c2887
Contenu à copier
---
name: issue-triage
description: Queries and triages open GitHub issues that need attention. Helps identify issues needing milestones, labels, or investigation.
metadata:
  origin: .NET
  author: dotnet-maui
  version: "2.3"
compatibility: Requires GitHub CLI (gh) installed and authenticated. Run `gh auth login` before using.
---

# Issue Triage Skill

For the hosted, maintainer-only `/issue triage` label command, use
[issue-triage-labels](../issue-triage-labels/SKILL.md) and the
[command documentation](../../docs/issue-triage.md). This interactive skill retains
its human-approved milestone workflow.

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'
```
Colle ce Markdown dans ton agent ou utilise les boutons ci-dessus pour l’écrire dans ton projet.

Ce que fait Issue Triage (.NET)

"Find issues to triage"
"Let's triage issues"
"Grab me 10 issues to triage"
"Triage Android issues"

Comment utiliser Issue Triage (.NET)

1
Copie le prompt
Un clic copie le prompt packagé (ou l'envoie à ton agent).
2
L'agent installe le skill
Il ajoute le SKILL.md et ses ressources à ton projet.
3
Activation automatique
Le skill s'active dès que le contexte correspond.

Déclencheurs pour Issue Triage (.NET)

Dis simplement à ton agent quelque chose comme :

Applique le skill issue-triage__dotnet-maui__github-skills-4e1ddb9c2887 à cette tâche
Utilise issue-triage__dotnet-maui__github-skills-4e1ddb9c2887 pour améliorer cette implémentation
Passe en revue ce sujet avec issue-triage__dotnet-maui__github-skills-4e1ddb9c2887

Skills liés à Issue Triage (.NET)

Add CLI Command (.NET)
Add or change a dotnet CLI command, subcommand, or option across the relevant CLI projects. USE FOR: adding or changing a dotnet CLI command/subcommand, adding a new Option<T> or Argument<T>, registering a subcommand in the command tree, changing an option's help description or a command's runtime message, wiring a command parser, or updating --help output.
Add Dotnet Aot Command (.NET)
Add, enable, or review a dotnet CLI command or feature in the Native AOT CLI (src/Cli/dotnet-aot) and prove its compatibility. USE FOR: migrating a command or option to AOT, reviewing an AOT migration PR, defining conservative eligibility and managed fallback, changing AotSourceFiles.props or AotDependencies.props, validating AOT/managed parity, NativeAOT-publishing tests, checking binary-size impact, or using the dn harness and separated SDK layout. DO NOT USE FOR: resolving IL trim/AOT analyzer warnings alone (use dotnet-aot-compat), running dotnet.Tests incrementally (use incremental-test), or pure managed CLI work.
Add Net Analyzer (.NET)
Add, port, or change a .NET code analysis rule (CA####) under src/Microsoft.CodeAnalysis.NetAnalyzers. USE FOR: implementing a new CA analyzer and its code fixer, porting a rule or PR from the retired dotnet/roslyn-analyzers repo, allocating a diagnostic ID from DiagnosticCategoryAndIdRanges.txt, choosing RuleLevel/severity/category, wiring resx + xlf strings, recording the rule in AnalyzerReleases.Unshipped.md, regenerating the analyzer documentation/sarif files, and writing MSTest analyzer/code-fix tests with the VerifyCS/VerifyVB harness. DO NOT USE FOR: NETSDK#### MSBuild diagnostics (src/Tasks), CS####/BC#### compiler diagnostics or IDE#### analyzers (dotnet/roslyn), or CONTAINER#### diagnostics (src/Containers).