issue-triage
Organizes filed issues into milestones and repairs their metadata — severity labels and blocked-by relations.
Skill by philoserf
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/philoserf-issue-triage
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Shell scripts
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/issue-triage
What's inside
- Skill name
issue-triage- Description
- Organizes filed issues into milestones and repairs their metadata — severity labels and blocked-by relations. Use when sorting a backlog, planning a release's scope, recording what blocks what, or when issues have been filed but not placed.
- License
- MIT
- Instructions
- 127 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
Agent Skills spec issues
- name: missing
- allowed-tools: must be a space-separated string
Files (2)
- SKILL.md
- issue-meta.sh · scripts/
SKILL.md (first lines)
# Issue triage
The step between filing issues and working them. A finding written to `.issues/` and pushed
to GitHub arrives with a title, a body and a label; it does not arrive knowing which release
it belongs to, what it waits on, or how severe it really is. This skill supplies that.
Triage is about **placement**, not truth. Whether a finding is still correct is
`issue-verify`'s question, and a freshly filed issue usually has not had time to go stale.
## Start with the audit
```bash
~/.claude/skills/issue-triage/scripts/issue-meta.sh audit [milestone]
```
One row per open issue, then a `GAP` line for every missing piece. Exit `2` means gaps were
found. With no argument it audits the whole open backlog, which is the right way to catch an
issue that was filed and then forgotten because it belonged to no milestone.
## Deciding the milestone
The question is not "is this important" but **"what breaks if this ships in the same release
as everything else in that milestone"**.
- **A behaviour change belongs in a minor**, not a patch — including a bug fix that moves
values callers may have pinned.
- **Anything that changes an exported signature, removes a field, or alters an output
contract belongs in the next major**, even when the change is small. A rendering change
that breaks anyone parsing the output is a contract change.
- **Group by the seam they touch, not by size.** Five issues about one boundary are worth
one release that fixes the boundary; spread across three releases they are three partial
rewrites of the same code.
- **Leave it unmilestoned rather than guess.** An issue with no milestone is visible in the
audit. One in the wrong milestone silently widens a release's scope.
```bash
issue-meta.sh milestone v5.0.0 96 104
```
Where the call is genuinely the maintainer's — an accuracy fix that could be a minor or
could wait for the major already in flight — ask, with the two framings. Do not decide it by
what is convenient to do next.
## Recording what blocks what
```bash
issue-meta.sh block <blocked> <blocker>
issue-meta.sh unblock <blocked> <blocker>
```
**The API takes the blocking issue's database id, not its number** — `{"id":5406149848,
"number":71}`. The script resolves it; a hand-rolled `gh api` call passing the number is
rejected. It also needs `-F` rather than `-f`, because the field is typed as an integer and
a string is refused.
Record a relation when **one issue's work cannot start, or cannot be correct, until the
other lands**. That is narrower than "related":
- A deletion that removes the code another issue is about — the deletion blocks it, and
frequently _closes_ it.
- A duplicate: it is blocked by the issue that supersedes it, and closes on that PR.
- A fix that re-pins values a second fix will move again — the first blocks the second, so
the values are recorded once.
Do **not** record a relation for issues that merely touch the same file. That is ordering
information, and it belongs in the order the work is done in, not in the graph. Over-
recording turns a useful constraint into a chain that forbids parallel work.
**Sequencing stated only in prose is invisible to every tool.** When a body says _"sequence
this before #69"_ and no relation exists, this is the moment to create it — otherwise the
next reader gets an order that looks unconstrained and is not.
## Severity
The severity label is the priority; nothing else carries it. A missing label is a `GAP` in the
audit, so set one on every issue you place.
The `**Severity:**` line in the body is the finding as filed, and it is never edited. The label
mirrors it, except where promoted below, so `gh issue list` can filter without fetching bodies.
An issue with no body line — a decision issue, a hand-written one — carries the label alone.
Severity describes the finding, not the repo: a medium in a small plugin is a medium.
**Promote `severity:high` to `severity:critical` when the finding is silent data loss or
corruption** — the user loses work, or gets a wrong answer, without being told. The audit
cannot judge "silent"; the promotion is made by hand, here. If the repo has no
`severity:critical` label yet, create it rather than leaving the issue at high.
- **"Silent" is the load-bearing word.** A failure the user sees and can retry stays high; a
write that succeeds while destroying or falsifying something is critical.
- **"Wrong answer" covers computed and published output**, not only stored data: a library
returning a silently wrong number, a site publishing an expired notice or dropping content,
a rename that leaves a dead URL. For these projects the output is the product.
- **A latent defect counts.** If the mechanism is in place and only the triggering input is
missing, it is critical now.
- **A design finding is not promoted.** One that names where an invariant should live but
produces no wrong result today stays high, however alarming it reads.
- Tech debt is neither excluded nor admitted by being tech debt; it qualifies only if it
silently corrupts.
## Labels
Four independent axes, the same names in every repo:
| Axis | Values | Required |
| ---------- | ---------------------------------------------------------------------------------------------- | ------------------------------------- |
| Severity | `severity:low` `severity:medium` `severity:high` (`severity:critical`) | Every issue |
| Work kind | `bug` `tech-debt` `enhancement` `documentation` `chore` | Every issue, exactly one |
| Provenance | `kind:audit` `kind:reduction` `kind:refactor` `kind:theory` `kind:walkthrough` `kind:decision` | Every issue with a `**Source:**` line |
| Evidence | `evidence:read-verified` | Optional |
Provenance and work kind are not alternatives: `kind:audit` says which pass filed it, `bug`
says what it is. An audit-run umbrella issue — the "what this pass covered" report filed beside
the findings — closes once its findings exist as their own issues.
## Every issue gets a disposition
A triage pass that leaves issues untouched has not triaged them. For each one: placed in a
milestone, deliberately left unmilestoned with a reason, or closed. **List anything parked,
explicitly, at the end** — a backlog's real cost is the issues nobody decided about.From philoserf/claude-code-config, MIT.
More from philoserf/claude-code-config
- 0.641score
gh-stack
github
Manages stacked PRs and splits multi-part work into reviewable branches with gh-stack.
SkillAFreshness: A★ 13Claude Code +9 - 0.637score
editor
philoserf
Copy edits prose while preserving voice and register.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
code-audit
philoserf
Reviews a codebase for bugs, design issues, and code cleanliness problems with specific file paths and line numbers.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
cc-release-review
philoserf
Reviews Claude Code release notes and recommends config updates.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
release-ship
philoserf
Executes the release workflow for a repository after release-gate passes.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
issue-pr
philoserf
Fixes one issue and lands it as a merged pull request — branch, implement, run the repo's own gate, open a PR that closes the issue, merge.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
release-gate
philoserf
Validates a repository is ready to tag and ship.
SkillAFreshness: A★ 13Claude Code +9 - 0.631score
grill
philoserf
Interviews the user relentlessly about a plan or design until every decision in it is resolved.
SkillAFreshness: A★ 13Claude Code +9 - 0.630score
release-captain
philoserf
Works an entire milestone unattended: verifies every open issue, sequences them by dependency, ships each as a merged PR, then stops when the milestone is…
SkillAFreshness: A★ 13Claude Code +9 - 0.630score
issue-verify
philoserf
Re-reads open issues against the current tree and posts a verification comment on each, flagging anything already fixed, partly stale, or wrong to do.
SkillAFreshness: A★ 13Claude Code +9 - 0.628score
code-walkthrough
philoserf
Reads source code and produces a linear walkthrough document.
SkillAFreshness: A★ 13Claude Code +9 - 0.628score
code-theory
philoserf
Builds a Naur-style theory of a codebase — the understanding needed to change it without damaging its conceptual integrity.
SkillAFreshness: A★ 13Claude Code +9
Signals
- Stars
- 13
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Oct 11, 2026 (17 days ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/philoserf/claude-code-config
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from philoserf
- 0.637score
editor
philoserf
Copy edits prose while preserving voice and register.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
release-ship
philoserf
Executes the release workflow for a repository after release-gate passes.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
cc-release-review
philoserf
Reviews Claude Code release notes and recommends config updates.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
issue-pr
philoserf
Fixes one issue and lands it as a merged pull request — branch, implement, run the repo's own gate, open a PR that closes the issue, merge.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
release-gate
philoserf
Validates a repository is ready to tag and ship.
SkillAFreshness: A★ 13Claude Code +9 - 0.633score
code-audit
philoserf
Reviews a codebase for bugs, design issues, and code cleanliness problems with specific file paths and line numbers.
SkillAFreshness: A★ 13Claude Code +9
Cite this page
issue-triage skill. Agent Mart. https://agentmart.dev/skills/philoserf-issue-triage (last updated 2026-10-24)