feat(skills): add /issue_cleanup — issue-tracker reconciliation door - #175
Merged
Conversation
No skill owned the GitHub issue trackers: /repo_cleanup sweeps git debris
only, /community handles external users' issues, and /create_issue and
/update_issue are single-issue primitives. The trackers had drifted to 82
open across 18 repos, 35 of them closable.
Adds /issue_cleanup as the issue-tracker counterpart to /repo_cleanup,
following the same audit-first shape: audit -> bucketed dashboard ->
per-bucket human confirmation -> execute -> recap. Closing requires two
independent evidence legs (a PyAutoMind record header plus a merged PR)
and always a human confirmation.
The reasoning is the deliverable. A naive "record references the issue ->
close it" rule is wrong five ways, each found by verification:
1. Body mentions are not claims — only header lines are evidence, and only
for a known set of keys (`- notes:` prose cites issue URLs freely).
2. The header KEY carries the meaning: `issue:` completes, but
`followup-issue:`/`parent-issue:`/`plan:` mean the record SPAWNED a
still-open issue. Completing keys are an allowlist so new spawn-style
keys fail closed.
3. Inline `(open …)`/`(STAYS OPEN …)` annotations and `Status: issued`
override — a record in complete/ can have merely FILED its issue.
4. A phase-scoped claim ("(Phase 5 item 4)") does not complete an umbrella.
5. Age is not evidence of obsolescence — probe whether the named API still
exists. Six 2018-19 PyAutoCTI issues closed on a zero-hit grep; two
PyAutoHands issues of the same vintage stayed open as still-valid asks.
Rules 1 and 4 were caught by the skill's own regression bar rather than by
inspection, which is why the bar is part of the skill: it pins the
post-sweep state (47 open / A=0 / B=1 / C=7 / F=22) and names the two
traps — PyAutoGalaxy#417 must land in the backlog, not a held bucket, and
PyAutoBrain#130 must land in B, not A.
Also wires the door into COMMANDS.md as a new "maintenance doors" tier
alongside /repo_cleanup, and adds a read-only issue-drift step to /wake_up
so drift surfaces daily instead of at 82-issue depth. The audit half is
safe to run unattended; every close stays human-gated.
Refs #174
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… as Claude The body referenced sibling doors in Claude-only /verb notation. Switch to the established $verb form used elsewhere ($repo-cleanup, $community, $create-issue, $update-issue, $hygiene, $wake-up), keeping one explicit dual-notation line so the Claude spelling is still discoverable. Also records why this skill is the harness-portable half of the cleanup pair: it needs only an authenticated gh and a readable PyAutoMind/, so it runs on Codex and mobile where /repo_cleanup cannot. Adds the constraint that no step may depend on a local checkout, a Claude-only tool or a ~/.claude path, and notes that SKILL.md's `name:` must stay hyphenated because Codex takes its skill name from it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #174.
Adds
/issue_cleanup, the missing door for reconciling the GitHub issue trackers — the issue-tracker counterpart to/repo_cleanup's git-debris sweep. Same proven shape: audit → bucketed dashboard → per-bucket human confirmation → execute → recap.Why
Nothing owned this.
/repo_cleanupsweeps branches, refs, stashes and worktrees and stops there;/communityhandles external users' issues awaiting a reply;/create_issueand/update_issueare single-issue primitives. The trackers had drifted to 82 open issues across 18 repos, of which 35 were closable. An ad-hoc sweep on 2026-07-28 cleared those (29 shipped-but-still-open + 6 obsolete 2018–2019 PyAutoCTI), leaving 47.The reasoning is the deliverable
A naive "a
complete/record references this issue, so close it" rule is wrong five ways, each found by verification rather than inspection:- notes:for long prose that cites issue URLs freely, so "any- word:line" re-admits exactly the prose the rule exists to exclude.issue:(630 uses) completes;followup-issue:/library-followup-issue:/parent-issue:/upstream-issues-filed:/plan:(13 uses) mean the record spawned a still-open issue. Completing keys are an allowlist, so a new spawn-style key fails closed.(open — …),(STAYS OPEN — …), andStatus: issued. A record can sit incomplete/having merely filed its issue (ep-hierarchical-scale-collapse.md→PyAutoFit#1405, a live bug).PyAutoBrain#130; none establishes it is done.autocti/;PyAutoHands#16/#17are the same ~1337-day vintage but stayed open as still-valid unimplemented asks.Closing requires two independent evidence legs (record header + merged PR) and always a human confirmation. The PR leg checks both the GitHub timeline and a PR named in the record body — timeline alone under-reports (12 of the 29 had only the latter).
Regression bar
Rules 1 and 4 were caught by the skill's own bar, not by inspection — which is why the bar ships with it. It pins the post-sweep state (47 open · A=0 · B=1 · C=7 · spawn-held=3 · D=6 · E=8 · F=22) and names the two traps explicitly:
PyAutoGalaxy#417must land in the backlog rather than a held bucket (or the header allowlist has regressed), andPyAutoBrain#130must land in B rather than A (or umbrellas are being closed on partial evidence). Verified passing at the tip of this branch.Also in this PR
COMMANDS.mdgains a maintenance doors tier documenting/repo_cleanupand/issue_cleanupas complements — neither was previously listed there./wake_upgains a read-only issue-drift step, so drift surfaces daily instead of at 82-issue depth. The audit half is safe unattended; every close stays human-gated.Notes for review
gh issue closeis broken in this environment; the skill uses the comment +gh api -X PATCHpair, withstate_reasoncompletedvsnot_planned.~/.claudesymlinks are intentionally not created here —bin/install.shrun from a worktree repoints~/.claudeat that worktree. Run it from the canonical checkout after merge.🤖 Generated with Claude Code