Issue Prioritizer
by @glucksberg
Prioritize issues from a named GitHub repository or supplied issue set by ROI, solution sanity, architectural impact, and actionability. Use only when the us...
clawhub install issue-prioritizerπ About This Skill
name: issue-prioritizer description: Prioritize GitHub issues by ROI, solution sanity, and architectural impact. Use when triaging or ranking issues to identify quick wins, over-engineered proposals, and actionable bugs. Don't use when managing forks (use fork-manager) or general GitHub queries (use github). Read-only β never modifies repositories. metadata: {"openclaw": {"requires": {"bins": ["gh"]}}}
Issue Prioritizer
Analyze issues from a GitHub repository and rank them by Adjusted Score β ROI penalized by Tripping Scale (solution sanity), Architectural Impact, and Actionability.
This is a read-only skill. It analyzes and presents information. The user makes all decisions.
When to use
When NOT to use
fork-manager insteadgithub insteadpr-review insteadRequirements
gh CLI authenticated (gh auth login)Instructions
Step 1: Get Repository
If the user didn't specify a repository, ask which one to analyze (format: owner/repo).
Step 2: Fetch Issues
Basic fetch (most recent):
gh issue list --repo {owner/repo} --state open --limit {limit} --json number,title,body,labels,createdAt,comments,url
Default limit is 30. Store the full JSON response.
Targeted fetch with --topic:
When the user specifies --topic (e.g. --topic telegram, --topic agents), use GitHub search to find issues matching that topic instead of just fetching the most recent:
# Search by topic keywords in title and body
gh issue list --repo {owner/repo} --state open --limit {limit} --search "{topic} in:title,body" --json number,title,body,labels,createdAt,comments,url
Multiple topics can be combined: --topic "telegram agents" searches for issues containing either term.
Targeted fetch with --search:
When the user specifies --search , pass it directly as a GitHub search query for full control:
gh issue list --repo {owner/repo} --state open --limit {limit} --search "{query}" --json number,title,body,labels,createdAt,comments,url
Examples:
--search "telegram in:title" β only title matches--search "label:bug telegram" β bugs mentioning telegram--search "label:bug,enhancement telegram agents" β bugs or enhancements about telegram/agents--search "comments:>5 telegram" β active discussions about telegramLabel-based fetch with --label:
gh issue list --repo {owner/repo} --state open --limit {limit} --label "{label}" --json number,title,body,labels,createdAt,comments,url
All fetch modes can be combined: --topic telegram --label bug --limit 50 fetches up to 50 open bugs about telegram.
Error handling:
gh auth login--limitowner/repoStep 3: Filter Issues with Existing PRs
Note: If user specified --include-with-prs, skip this entire step and proceed to Step 4 with all fetched issues.
Before analyzing, check for open PRs that already address issues to avoid duplicate work.
gh pr list --repo {owner/repo} --state open --json number,title,body,url
Detect linked issues using ALL of these methods:
Method 1 β Explicit Keywords (high confidence): Scan PR title and body (case-insensitive):
fixes #N, fix #N, fixed #Ncloses #N, close #N, closed #Nresolves #N, resolve #N, resolved #NMethod 2 β Issue References (medium confidence):
#N anywhere in textissue N, issue #N, related to #N, addresses #NMethod 3 β Title Similarity (fuzzy): Normalize titles (lowercase, remove punctuation/common words). If 70%+ word overlap β likely linked.
Method 4 β Semantic Matching (ambiguous cases): Extract key terms from issue (error names, function names, components). Check if PR body discusses same things.
Confidence icons:
Remove linked issues from analysis. Report them separately before the main report.
If all issues have PRs, report that and exit.
Step 4: Analyze Each Issue
For each remaining issue, score the following:
#### Difficulty (1-10)
Base score: 5. Adjustments:
| Signal | Adjustment | |--------|-----------| | Documentation only | -3 | | Has proposed solution | -2 | | Has reproduction steps | -1 | | Clear error message | -1 | | Unknown root cause | +3 | | Architectural change | +3 | | Race condition/concurrency | +2 | | Security implications | +2 | | Multiple systems involved | +2 |
#### Importance (1-10)
| Range | Level | Examples | |-------|-------|---------| | 8-10 | Critical | Crash, data loss, security vulnerability, service down | | 6-7 | High | Broken functionality, errors, performance issues | | 4-5 | Medium | Enhancements, feature requests, improvements | | 1-3 | Low | Cosmetic, documentation, typos |
#### Tripping Scale (1-5) β Solution Sanity (How "Out There" Is It?)
| Score | Label | Description | |-------|-------|-------------| | 1 | Total Sanity | Proven approach, standard patterns | | 2 | Grounded w/Flair | Practical with creative touches | | 3 | Dipping Toes | Exploring cautiously | | 4 | Wild Adventure | Bold, risky, unconventional | | 5 | Tripping | Questionable viability |
Red Flags (+score): rewrite from scratch, buzzwords (blockchain, AI-powered, ML-based), experimental/unstable, breaking change, custom protocol Green Flags (-score): standard approach, minimal change, backward compatible, existing library, well-documented
#### Architectural Impact (1-5)
Always ask: "Is there a simpler way?" before scoring.
| Score | Label | Description | |-------|-------|-------------| | 1 | Surgical | Isolated fix, 1-2 files, no new abstractions | | 2 | Localized | Small addition, follows existing patterns exactly | | 3 | Moderate | New component within existing architecture | | 4 | Significant | New subsystem, new patterns, affects multiple modules | | 5 | Transformational | Restructures core, changes paradigms, migration needed |
Red Flags (+score): "rewrite", "refactor entire", new framework for existing capability, changes across >5 files, breaking API changes, scope creep Green Flags (-score): single file fix, uses existing utilities, follows established patterns, backward compatible, easily revertible
Critical: If a simple solution exists, architectural changes are wrong. Don't create a "validation framework" when a single if-check suffices.
#### Actionability (1-5) β Can it be resolved with a PR?
| Score | Label | Description | |-------|-------|-------------| | 1 | Not Actionable | Question, discussion, duplicate, support request | | 2 | Needs Triage | Missing info, unclear scope, needs clarification | | 3 | Needs Investigation | Root cause unknown, requires debugging first | | 4 | Ready to Work | Clear scope, may need some design decisions | | 5 | PR Ready | Solution is clear, just needs implementation |
Blockers (-score): questions ("how do I?"), discussions ("thoughts?"), labels (duplicate, wontfix, question), missing repro Ready signals (+score): action titles ("fix:", "add:"), proposed solution, repro steps, good-first-issue label, specific files mentioned
#### Derived Values
issueType: "bug" | "feature" | "docs" | "other"
suggestedLevel:
- "beginner": difficulty 1-3, no security/architecture changes
- "intermediate": difficulty 4-6
- "advanced": difficulty 7+ OR security implications OR architectural changes
#### Calculation Formulas
ROI = Importance / Difficulty
AdjustedScore = ROI Γ TripMultiplier Γ ArchMultiplier Γ ActionMultiplier
Tripping Scale Multiplier:
| Score | Label | Multiplier | |-------|-------|------------| | 1 | Total Sanity | 1.00 (no penalty) | | 2 | Grounded w/Flair | 0.85 | | 3 | Dipping Toes | 0.70 | | 4 | Wild Adventure | 0.55 | | 5 | Tripping | 0.40 |
Architectural Impact Multiplier:
| Score | Label | Multiplier | |-------|-------|------------| | 1 | Surgical | 1.00 (no penalty) | | 2 | Localized | 0.90 | | 3 | Moderate | 0.75 | | 4 | Significant | 0.50 | | 5 | Transformational | 0.25 |
Actionability Multiplier:
| Score | Label | Multiplier | |-------|-------|------------| | 5 | PR Ready | 1.00 (no penalty) | | 4 | Ready to Work | 0.90 | | 3 | Needs Investigation | 0.70 | | 2 | Needs Triage | 0.40 | | 1 | Not Actionable | 0.10 |
Step 5: Categorize
Sort all issues by AdjustedScore descending.
Step 6: Present Results
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
ISSUE PRIORITIZATION REPORT
Repository: {owner/repo}
Filter: {topic/search/label or "latest"}
Analyzed: {count} issues
Excluded: {excluded} issues with existing PRs
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ Quick Wins: {n} | Critical Bugs: {n} | Tripping: {n} | Over-Engineered: {n} | Not Actionable: {n}
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
TOP 10 BY ADJUSTED SCORE
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#123 [Adj: 3.50] β Quick Win
Fix typo in README
ββ Difficulty: 1/10 | Importance: 4/10 | ROI: 4.00
ββ Trip: β
Total Sanity (1/5) | Arch: β
Surgical (1/5)
ββ Act: β
PR Ready (5/5) | Level: beginner
ββ https://github.com/owner/repo/issues/123
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
QUICK WINS (High Impact, Low Effort, Sane & Actionable)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#123: Fix typo in README [Adj: 3.50]
Difficulty: 1 | Importance: 4 | beginner
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
RECOMMENDATIONS BY LEVEL
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
BEGINNER (Difficulty 1-3, no security/architecture):
- #123: Fix typo - Low risk, good first contribution
INTERMEDIATE (Difficulty 4-6):
- #456: Add validation - Medium complexity, clear scope
ADVANCED (Difficulty 7-10 or security/architecture):
- #789: Refactor auth - Architectural knowledge needed
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CRITICAL BUGS (Importance β₯ 8)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#111 [Adj: 1.67] π΄ Critical
App crashes on startup with large datasets
ββ Difficulty: 6/10 | Importance: 9/10 | ROI: 1.50
ββ Trip: β
(2/5) | Arch: β
(2/5) | Act: β οΈ (3/5)
ββ https://github.com/owner/repo/issues/111
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
TRIPPING ISSUES (Trip β₯ 4 β Review Carefully)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#999 [Trip: π¨ 5/5 β Tripping]
Rewrite entire backend in Rust with blockchain storage
ββ Red Flags: "rewrite from scratch", "blockchain"
ββ Adjusted Score: 0.12 (heavily penalized)
ββ Consider: Is this complexity really needed?
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
OVER-ENGINEERED (Arch β₯ 4 β Simpler Solution Likely Exists)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#777 [Arch: ποΈ 5/5 β Transformational]
Add form validation
ββ Proposed: New validation framework with schema definitions
ββ Simpler Alternative: Single validation function, 20 lines
ββ Ask: Why create a framework for one form?
π‘ TIP: Maintainers often reject PRs that change architecture
unnecessarily. Always start with the simplest fix.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NOT ACTIONABLE (Actionability β€ 2)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- #222: "How do I deploy to Kubernetes?" (Act: 1/5 β question)
- #333: Duplicate of #111 (Act: 1/5 β duplicate)
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
EXCLUDED β EXISTING PRs
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#123: Login crashes on empty password
ββ π PR #456: "Fix login validation" (explicit: fixes #123)
Detection: π Explicit link | π Referenced | π Similar title | π‘ Semantic match
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SCALE LEGEND
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Trip (Solution Sanity): Arch (Structural Impact):
β
1-2 = Sane β
1-2 = Minimal change
β οΈ 3 = Cautious β οΈ 3 = Moderate
π¨ 4-5 = Risky ποΈ 4-5 = Over-engineered
Actionability:
β
4-5 = Ready for PR
β οΈ 3 = Needs Investigation
β 1-2 = Not Actionable
AdjustedScore = ROI Γ TripMult Γ ArchMult Γ ActionMult
Higher = Better (prioritize first)
π― SIMPLICITY PRINCIPLE: If a 10-line fix exists,
a 200-line refactor is wrong.
Mode: SKILL (read-only) β analyzes only, never modifies.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Options
--json: Raw JSON output--markdown / --md: Markdown table output--quick-wins: Show only quick wins--level beginner|intermediate|advanced: Filter by contributor level--limit N: Number of issues to analyze (default: 30)--topic : Search issues by topic (e.g. --topic telegram, --topic "agents telegram")--search : Raw GitHub search query for full control (e.g. --search "label:bug telegram in:title")--label : Filter by GitHub label (e.g. --label bug)--include-with-prs: Skip PR filtering, include all issuesLLM Deep Analysis (Optional)
For higher-quality scoring, use an LLM to analyze each issue individually. For each issue, prompt the model with the issue details and scoring criteria, requesting structured JSON output:
{
"number": 123,
"difficulty": 5,
"difficultyReasoning": "base 5; has repro (-1); unknown cause (+3) = 7",
"importance": 7,
"importanceReasoning": "broken functionality affecting users",
"tripScore": 2,
"tripLabel": "Grounded with Flair",
"tripRedFlags": [],
"tripGreenFlags": ["minimal change", "standard approach"],
"archScore": 2,
"archLabel": "Localized",
"archRedFlags": [],
"archGreenFlags": ["uses existing patterns"],
"archSimplerAlternative": null,
"actionScore": 4,
"actionLabel": "Ready to Work",
"actionBlockers": [],
"actionReadySignals": ["has proposed solution"],
"issueType": "bug",
"suggestedLevel": "intermediate",
"roi": 1.40,
"adjustedScore": 0.96
}
Truncate issue bodies longer than 2000 characters before sending to the model.
When to use LLM Deep Analysis:
Tradeoffs: Slower (~2-5s per issue) but more accurate. 1 API call per issue.
Integration: For each issue, call the LLM with the analysis prompt, parse the JSON response, and merge into results before Step 5 (Categorize).
β‘ When to Use
βοΈ Configuration
--json: Raw JSON output--markdown / --md: Markdown table output--quick-wins: Show only quick wins--level beginner|intermediate|advanced: Filter by contributor level--limit N: Number of issues to analyze (default: 30)--topic : Search issues by topic (e.g. --topic telegram, --topic "agents telegram")--search : Raw GitHub search query for full control (e.g. --search "label:bug telegram in:title")--label : Filter by GitHub label (e.g. --label bug)--include-with-prs: Skip PR filtering, include all issues