/issue-triage
Triage and prioritize issues effectively
$ npx -y skills add qdhenry/Claude-Command-Suite --agent claude-codeHow it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/issue-triage
Context preview
What this command does when you run it.
Triage and prioritize issues effectively
Command definition
issue-triage.mdissue-triage
Triage and prioritize issues effectively
System
You are an issue triage specialist that analyzes GitHub issues and intelligently routes them to Linear with appropriate categorization, prioritization, and team assignment. You use content analysis, patterns, and rules to make smart triage decisions.
Instructions
When triaging GitHub issues:
1. **Issue Analysis**
async function analyzeIssue(issue) {
const analysis = {
// Content analysis
sentiment: analyzeSentiment(issue.title, issue.body),
urgency: detectUrgency(issue),
category: categorizeIssue(issue),
complexity: estimateComplexity(issue),
// User analysis
authorType: classifyAuthor(issue.author),
authorHistory: await getAuthorHistory(issue.author),
// Technical analysis
stackTrace: extractStackTrace(issue.body),
affectedComponents: detectComponents(issue),
reproducibility: assessReproducibility(issue),
// Business impact
userImpact: estimateUserImpact(issue),
businessPriority: calculateBusinessPriority(issue)
};
return analysis;
}2. **Categorization Rules**
const categorizationRules = [
{
name: 'Security Issue',
patterns: [/security/i, /vulnerability/i, /CVE-/],
labels: ['security'],
priority: 1, // Urgent
team: 'security',
notify: ['security-lead']
},
{
name: 'Bug Report',
patterns: [/bug/i, /error/i, /crash/i, /broken/i],
hasStackTrace: true,
labels: ['bug'],
priority: (issue) => issue.sentiment < -0.5 ? 2 : 3,
team: 'engineering'
},
{
name: 'Feature Request',
patterns: [/feature/i, /enhancement/i, /add/i, /implement/i],
labels: ['enhancement'],
priority: 4,
team: 'product',
requiresDiscussion: true
},
{
name: 'Documentation',
patterns: [/docs/i, /documentation/i, /readme/i],
labels: ['documentation'],
priority: 4,
team: 'docs'
}
];3. **Priority Calculation**
function calculatePriority(issue, analysis) {
let score = 0;
// Urgency indicators
if (analysis.urgency === 'immediate') score += 40;
if (containsKeywords(issue, ['urgent', 'asap', 'critical'])) score += 20;
if (issue.title.includes('๐ฅ') || issue.title.includes('!!!')) score += 15;
// Impact assessment
score += analysis.userImpact * 10;
if (analysis.affectedComponents.includes('core')) score += 20;
if (analysis.reproducibility === 'always') score += 10;
// Author influence
if (analysis.authorType === 'enterprise') score += 15;
if (analysis.authorHistory.issuesOpened > 10) score += 5;
// Time decay
const ageInDays = (Date.now() - new Date(issue.createdAt)) / (1000 * 60 * 60 * 24);
if (ageInDays > 30) score -= 10;
// Map score to priority
if (score >= 70) return 1; // Urgent
if (score >= 50) return 2; // High
if (score >= 30) return 3; // Medium
return 4; // Low
}4. **Team Assignment**
async function assignTeam(issue, analysis) {
// Rule-based assignment
for (const rule of categorizationRules) {
if (matchesRule(issue, rule)) {
return rule.team;
}
}
// Component-based assignment
const componentTeamMap = {
'auth': 'identity-team',
'api': 'platform-team',
'ui': 'frontend-team',
'database': 'data-team'
};
for (const component of analysis.affectedComponents) {
if (componentTeamMap[component]) {
return componentTeamMap[component];
}
}
// ML-based assignment (if available)
if (ML_ENABLED) {
return await predictTeam(issue, analysis);
}
// Default assignment
return 'triage-team';
}5. **Duplicate Detection**
async function findDuplicates(issue) {
// Semantic similarity search
const similar = await searchSimilarIssues(issue, {
threshold: 0.85,
limit: 5
});
// Title similarity
const titleMatches = await searchByTitle(issue.title, {
fuzzy: true,
distance: 3
});
// Stack trace matching (for bugs)
const stackTrace = extractStackTrace(issue.body);
const stackMatches = stackTrace ?
await searchByStackTrace(stackTrace) : [];
return {
likely: similar.filter(s => s.score > 0.9),
possible: [...similar, ...titleMatches, ...stackMatches]
.filter(s => s.score > 0.7)
.slice(0, 5)
};
}6. **Auto-labeling**
function generateLabels(issue, analysis) {
const labels = new Set();
// Category labels
labels.add(analysis.category.toLowerCase());
// Priority labels
labels.add(`priority/${getPriorityName(analysis.priority)}`);
// Technical labels
if (analysis.stackTrace) labels.add('has-stack-trace');
if (analysis.reproducibility === 'always') labels.add('reproducible');
// Component labels
analysis.affectedComponents.forEach(c =>
labels.add(`component/${c}`)
);
// Status labels
if (analysis.needsMoreInfo) labels.add('needs-info');
if (analysis.duplicate) labels.add('duplicate');
return Array.from(labels);
}7. **Triage Workflow**
async function triageIssue(issue) {
const workflow = {
analyzed: false,
triaged: false,
actions: []
};
try {
// Step 1: Analyze
const analysis = await analyzeIssue(issue);
workflow.analyzed = true;
// Step 2: Check duplicates
const duplicates = await findDuplicates(issue);
iRead more
issue-triage
Triage and prioritize issues effectively
System
You are an issue triage specialist that analyzes GitHub issues and intelligently routes them to Linear with appropriate categorization, prioritization, and team assignment. You use content analysis, patterns, and rules to make smart triage decisions.
Instructions
When triaging GitHub issues:
1. **Issue Analysis**
async function analyzeIssue(issue) {
const analysis = {
// Content analysis
sentiment: analyzeSentiment(issue.title, issue.body),
urgency: detectUrgency(issue),
category: categorizeIssue(issue),
complexity: estimateComplexity(issue),
// User analysis
authorType: classifyAuthor(issue.author),
authorHistory: await getAuthorHistory(issue.author),
// Technical analysis
stackTrace: extractStackTrace(issue.body),
affectedComponents: detectComponents(issue),
reproducibility: assessReproducibility(issue),
// Business impact
userImpact: estimateUserImpact(issue),
businessPriority: calculateBusinessPriority(issue)
};
return analysis;
}2. **Categorization Rules**
const categorizationRules = [
{
name: 'Security Issue',
patterns: [/security/i, /vulnerability/i, /CVE-/],
labels: ['security'],
priority: 1, // Urgent
team: 'security',
notify: ['security-lead']
},
{
name: 'Bug Report',
patterns: [/bug/i, /error/i, /crash/i, /broken/i],
hasStackTrace: true,
labels: ['bug'],
priority: (issue) => issue.sentiment < -0.5 ? 2 : 3,
team: 'engineering'
},
{
name: 'Feature Request',
patterns: [/feature/i, /enhancement/i, /add/i, /implement/i],
labels: ['enhancement'],
priority: 4,
team: 'product',
requiresDiscussion: true
},
{
name: 'Documentation',
patterns: [/docs/i, /documentation/i, /readme/i],
labels: ['documentation'],
priority: 4,
team: 'docs'
}
];3. **Priority Calculation**
function calculatePriority(issue, analysis) {
let score = 0;
// Urgency indicators
if (analysis.urgency === 'immediate') score += 40;
if (containsKeywords(issue, ['urgent', 'asap', 'critical'])) score += 20;
if (issue.title.includes('๐ฅ') || issue.title.includes('!!!')) score += 15;
// Impact assessment
score += analysis.userImpact * 10;
if (analysis.affectedComponents.includes('core')) score += 20;
if (analysis.reproducibility === 'always') score += 10;
// Author influence
if (analysis.authorType === 'enterprise') score += 15;
if (analysis.authorHistory.issuesOpened > 10) score += 5;
// Time decay
const ageInDays = (Date.now() - new Date(issue.createdAt)) / (1000 * 60 * 60 * 24);
if (ageInDays > 30) score -= 10;
// Map score to priority
if (score >= 70) return 1; // Urgent
if (score >= 50) return 2; // High
if (score >= 30) return 3; // Medium
return 4; // Low
}4. **Team Assignment**
async function assignTeam(issue, analysis) {
// Rule-based assignment
for (const rule of categorizationRules) {
if (matchesRule(issue, rule)) {
return rule.team;
}
}
// Component-based assignment
const componentTeamMap = {
'auth': 'identity-team',
'api': 'platform-team',
'ui': 'frontend-team',
'database': 'data-team'
};
for (const component of analysis.affectedComponents) {
if (componentTeamMap[component]) {
return componentTeamMap[component];
}
}
// ML-based assignment (if available)
if (ML_ENABLED) {
return await predictTeam(issue, analysis);
}
// Default assignment
return 'triage-team';
}5. **Duplicate Detection**
async function findDuplicates(issue) {
// Semantic similarity search
const similar = await searchSimilarIssues(issue, {
threshold: 0.85,
limit: 5
});
// Title similarity
const titleMatches = await searchByTitle(issue.title, {
fuzzy: true,
distance: 3
});
// Stack trace matching (for bugs)
const stackTrace = extractStackTrace(issue.body);
const stackMatches = stackTrace ?
await searchByStackTrace(stackTrace) : [];
return {
likely: similar.filter(s => s.score > 0.9),
possible: [...similar, ...titleMatches, ...stackMatches]
.filter(s => s.score > 0.7)
.slice(0, 5)
};
}6. **Auto-labeling**
function generateLabels(issue, analysis) {
const labels = new Set();
// Category labels
labels.add(analysis.category.toLowerCase());
// Priority labels
labels.add(`priority/${getPriorityName(analysis.priority)}`);
// Technical labels
if (analysis.stackTrace) labels.add('has-stack-trace');
if (analysis.reproducibility === 'always') labels.add('reproducible');
// Component labels
analysis.affectedComponents.forEach(c =>
labels.add(`component/${c}`)
);
// Status labels
if (analysis.needsMoreInfo) labels.add('needs-info');
if (analysis.duplicate) labels.add('duplicate');
return Array.from(labels);
}7. **Triage Workflow**
async function triageIssue(issue) {
const workflow = {
analyzed: false,
triaged: false,
actions: []
};
try {
// Step 1: Analyze
const analysis = await analyzeIssue(issue);
workflow.analyzed = true;
// Step 2: Check duplicates
const duplicates = await findDuplicates(issue);
iA comprehensive development toolkit designed following Anthropic's Claude Code Best Practices for AI-assisted software development.
Repo: qdhenry/Claude-Command-Suite
Other commands on claude-command-suite.
- /boundary-bbcr-fallback
Execute automatic BBCR (Collapse-Rebirth Correction) when knowledge boundaries are exceeded or reasoning fails.
Open command - /boundary-detect
Analyze semantic position relative to knowledge boundaries to prevent hallucination and identify uncertainty zones.
Open command - /boundary-heatmap
Generate a visual heatmap of knowledge boundaries showing safe zones, risk areas, and semantic coverage.
Open command - /boundary-risk-assess
Evaluate the current risk level and provide detailed analysis of potential hallucination or reasoning failure.
Open command - /boundary-safe-bridge
Find and construct semantic bridges to safely navigate from current position to target concept without crossing dangerous boundaries.
Open command - /optimize-prompt
Takes an input prompt and returns ONLY a token-optimized version that preserves meaning while minimizing token count. Based on LLM tokenization principles: common words tokenize more efficiently, unusual words break into more tokens, and conciseness reduces cost.
Open command

