homericintelligence/odyssey/gh-deduplicate-issues
- community
- ext:[{"type":"hook","description":"Pre/post lifecycle hooks"}]
Checking that the SKILL.md file is still in the repository.
Install
npx vskill@latest install homericintelligence/odyssey/gh-deduplicate-issuesSemi-extensibleMentions customization, but needs skill-specific knowledge. Read the extensible skills standard
SKILL.md
Skill: gh-deduplicate-issues
Overview
| Field | Value | |
|---|---|---|
| Date | 2026-03-08 | |
| Category | tooling | |
| Objective | Close duplicate GitHub issues with "Duplicate of #XXXX" comment, keeping oldest as canonical survivor | |
| Outcome | ✅ Success - 114 issues closed across 9 groups, open count reduced 683→570 |
When to Use
Invoke this skill when:
- The repository has accumulated many near-duplicate issues from repeated sessions
- You need to consolidate issues with the same intent but slightly different wording
- Backlog clutter is making it hard to track actual work
- Issues have been recreated 10+ times across multiple sessions (common with ADR-related issues)
Verified Workflow
Step 1: Identify Duplicate Groups
Before closing anything, enumerate groups. For each group identify:
- Survivor: the oldest (lowest-numbered) open issue
- Duplicates: all other open issues with the same intent
Use gh issue list with JSON output to gather data efficiently:
Step 2: Write the Close Function
Key details:
- Always comment BEFORE closing (comment on closed issues still works, but comment first is cleaner)
- Use
--reason "not planned"for duplicate closures - Suppress stderr with
2>/dev/nullto avoid noise from already-closed issues
Step 3: Execute in Batches of 30
GitHub's API handles this volume fine (~5000 req/hr limit), but batching in 30s keeps output manageable and makes it easy to spot failures:
Step 4: Verify Results
Failed Attempts
1. Closing Before Commenting
What was tried: gh issue close first, then gh issue comment
Why it mattered: Not actually a failure — GitHub allows comments on closed issues. But commenting first is the canonical order because:
- The "Duplicate of #X" comment explains WHY it was closed
- If close fails but comment succeeds, the issue is at least annotated
- GitHub's duplicate closure UI does it in this order
Resolution: Always comment first, close second.
2. Using --reason "duplicate" flag
What was tried: gh issue close "$issue" --repo "$REPO" --reason "duplicate"
Why it failed: GitHub's CLI only accepts "completed" or "not planned" as close reasons. "duplicate" is a valid state reason in the GitHub web UI but not exposed as a CLI option.
Resolution: Use --reason "not planned" with the comment providing the duplicate reference.
3. Single Giant Loop Without Batching
What was tried: Running all 114 issues in a single loop
Why it didn't fail but could: If rate limits kick in mid-loop, you get partial state with no easy way to see which issues were processed. Batching by group makes it easy to resume.
Resolution: Group by intent (9 groups), run each group separately with echo markers.
Results & Parameters
Session Metrics
| Metric | Value | |
|---|---|---|
| Total issues closed | 114 | |
| Groups processed | 9 | |
| Survivors kept open | 9 | |
| Open count before | 683 | |
| Open count after | 570 | |
| Success rate | 100% | |
| Time to execute | ~8 minutes |
Group Summary
| Group | Theme | Survivor | Closed | |
|---|---|---|---|---|
| 1 | Test file compliance/enforcement | #3962 | 79 | |
| 2 | Test file splitting documentation | #3776 | 11 | |
| 3 | Remove continue-on-error Core Tensors | #4100 | 9 | |
| 4 | Core Utilities CI splitting | #4116 | 7 | |
| 5 | Apply file splitting to others | #4150 | 4 | |
| 6 | Core Activations CI glob | #4157 | 1 | |
| 7 | Remove continue-on-error Core Loss | #4172 | 1 | |
| 8 | Negative index __setitem__ | #3387 | 2 | |
| 9 | validate_test_coverage track splits | #4109 | 1 |
Complete Close Script Template
Consolidation Rules
When deciding what counts as a duplicate, apply these rules:
- Same intent = duplicate — "Add file-split pre-commit hook" and "Enforce fn test_ limit via CI" are the same goal
- Oldest issue wins — Always keep the lowest issue number as survivor
- Unique feature requests stay — Even if related to the same area, keep issues that request distinct features
- When in doubt, keep separate — If two issues could produce different PRs, they're not duplicates
Platform Notes
- GitHub CLI (
gh) handles rate limiting automatically at ~5000 req/hr - At 2 API calls per issue (comment + close), 114 issues = 228 calls — well within limits
- The
2>/dev/nullsuppression on already-closed issues prevents false alarm output - Batch size of 30 is arbitrary but provides good progress visibility
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryChecking.claude-plugin/skills/gh-deduplicate-issues/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Extension points
hookPre/post lifecycle hooks
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/homericintelligence/odyssey/gh-deduplicate-issues)