@kensio/github-issue-drafting 1.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +14 -0
- package/README.md +89 -0
- package/package.json +39 -0
- package/skills/github-issue-drafting/SKILL.md +260 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://anthropic.com/claude-code/plugin.schema.json",
|
|
3
|
+
"name": "github-issue-drafting",
|
|
4
|
+
"version": "1.13.1",
|
|
5
|
+
"description": "A way of drafting GitHub issues that checks every claim against the repository first.",
|
|
6
|
+
"author": {
|
|
7
|
+
"name": "Kensio Software",
|
|
8
|
+
"email": "hugh@kensiosoftware.co.uk"
|
|
9
|
+
},
|
|
10
|
+
"homepage": "https://kensio.ai",
|
|
11
|
+
"repository": "https://github.com/KensioSoftware/kensio.ai",
|
|
12
|
+
"license": "Apache-2.0",
|
|
13
|
+
"keywords": ["github", "issues", "gh", "drafting", "triage"]
|
|
14
|
+
}
|
package/README.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# @kensio/github-issue-drafting
|
|
2
|
+
|
|
3
|
+
A way of turning a one-line note into a GitHub issue somebody can act on, packaged as an agent
|
|
4
|
+
skill.
|
|
5
|
+
|
|
6
|
+
The note is the easy part. "SSM params", "fix the retry backoff", "the CLI hangs on empty input" all
|
|
7
|
+
carry enough for the person who wrote them and too little for anybody else. Handed straight to an
|
|
8
|
+
LLM they produce a polished issue full of invented detail, which is worse than the note was.
|
|
9
|
+
|
|
10
|
+
## Install
|
|
11
|
+
|
|
12
|
+
Into any agent that reads `SKILL.md`:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx @kensio/skills add github-issue-drafting
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
That copies the skill directory into `.agents/skills/`, where Codex, Cursor, Copilot, Gemini CLI and
|
|
19
|
+
the other implementations of the specification look for one. Pass `--agent claude` for
|
|
20
|
+
`.claude/skills/`, `--agent copilot` for `.github/skills/`, and `--user` to install it for every
|
|
21
|
+
project at once.
|
|
22
|
+
|
|
23
|
+
Claude Code also takes it as a plugin:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
claude plugin marketplace add KensioSoftware/kensio.ai
|
|
27
|
+
claude plugin install github-issue-drafting@kensio
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Or pin it in a repository as a dependency:
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm install @kensio/github-issue-drafting
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Every skill is also published as a zip on each
|
|
37
|
+
[release](https://github.com/KensioSoftware/kensio.ai/releases), for a machine with no npm reach.
|
|
38
|
+
Unzip it into `.agents/skills/` and it is installed.
|
|
39
|
+
|
|
40
|
+
## What it does
|
|
41
|
+
|
|
42
|
+
**Reads the repository before drafting.** Greps for the identifiers in the note, reads the code that
|
|
43
|
+
would change and its tests, checks what the docs already promise, skims recent history, and searches
|
|
44
|
+
open and closed issues for duplicates. Half-built is the common case, and an issue asking for a
|
|
45
|
+
feature that already half exists embarrasses whoever filed it.
|
|
46
|
+
|
|
47
|
+
**Separates what it confirmed from what it assumed.** Anything the investigation failed to settle
|
|
48
|
+
comes back as a question under the draft, and goes into the body as a stated assumption.
|
|
49
|
+
|
|
50
|
+
**Splits a note that is really two issues.** One note frequently spans several pull requests, and
|
|
51
|
+
filed whole it becomes a branch that is hard to review and hard to stop halfway. The skill carries
|
|
52
|
+
the seams that yield independently shippable issues (a usable surface before what sits on top of it,
|
|
53
|
+
a blocked piece, a distinct usage mode) and the seams that fail (one issue per function,
|
|
54
|
+
implementation split from its tests, docs on their own).
|
|
55
|
+
|
|
56
|
+
**Follows the repository's conventions over its own.** An `.github/ISSUE_TEMPLATE/` wins. So does
|
|
57
|
+
the register of the issues already filed.
|
|
58
|
+
|
|
59
|
+
**Stops before posting.** The draft arrives in chat. Filing needs an explicit go-ahead, and then it
|
|
60
|
+
goes through `gh` with the type and labels that the repository actually has.
|
|
61
|
+
|
|
62
|
+
**Writes titles people can find.** Issues are indexed and they outrank pull requests. The title and
|
|
63
|
+
the opening paragraph are the search snippet, which makes plain words worth more than internal
|
|
64
|
+
shorthand. There is a line past which a title reads as written for a crawler, and the skill sets out
|
|
65
|
+
where it falls.
|
|
66
|
+
|
|
67
|
+
It also covers issues that already exist, retitling them and backfilling a missing type or label,
|
|
68
|
+
including closed ones.
|
|
69
|
+
|
|
70
|
+
## Two things it gets right that are easy to get wrong
|
|
71
|
+
|
|
72
|
+
**Private detail.** Notes and stack traces carry customer names, internal hostnames, ticket ids,
|
|
73
|
+
paths with a username in them, and occasionally a token. A public issue is publication, so the skill
|
|
74
|
+
redacts by default and asks about anything borderline.
|
|
75
|
+
|
|
76
|
+
**Hard-wrapped bodies.** GitHub renders issue Markdown with the GFM hard-line-break extension, so
|
|
77
|
+
every newline inside a paragraph becomes a `<br>`. A repository whose prose wraps at 80 columns
|
|
78
|
+
produces visibly ragged issues the moment that habit reaches a body. Paragraphs go in as one long
|
|
79
|
+
line.
|
|
80
|
+
|
|
81
|
+
## Related skills
|
|
82
|
+
|
|
83
|
+
[`technical-prose-style`](https://github.com/KensioSoftware/kensio.ai/tree/main/plugins/technical-prose-style)
|
|
84
|
+
and [`avoid-ai-writing`](https://github.com/conorbronsdon/avoid-ai-writing) are used for the body
|
|
85
|
+
text where they are installed. Neither is required.
|
|
86
|
+
|
|
87
|
+
Part of [kensio.ai](https://github.com/KensioSoftware/kensio.ai). Licensed under the Apache License
|
|
88
|
+
2.0. See the [LICENSE](https://github.com/KensioSoftware/kensio.ai/blob/main/LICENSE) in the
|
|
89
|
+
repository root.
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kensio/github-issue-drafting",
|
|
3
|
+
"version": "1.13.1",
|
|
4
|
+
"description": "A way of drafting GitHub issues that checks every claim against the repository first.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"agent-skills",
|
|
7
|
+
"claude",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"claude-code-plugin",
|
|
10
|
+
"codex",
|
|
11
|
+
"copilot",
|
|
12
|
+
"cursor",
|
|
13
|
+
"gh",
|
|
14
|
+
"git",
|
|
15
|
+
"github",
|
|
16
|
+
"issue-tracking",
|
|
17
|
+
"issues",
|
|
18
|
+
"kensio",
|
|
19
|
+
"skill",
|
|
20
|
+
"skill-md",
|
|
21
|
+
"triage"
|
|
22
|
+
],
|
|
23
|
+
"homepage": "https://kensio.ai",
|
|
24
|
+
"license": "Apache-2.0",
|
|
25
|
+
"author": "Kensio Software <hugh@kensiosoftware.co.uk>",
|
|
26
|
+
"repository": {
|
|
27
|
+
"type": "git",
|
|
28
|
+
"url": "git+https://github.com/KensioSoftware/kensio.ai.git",
|
|
29
|
+
"directory": "plugins/github-issue-drafting"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
".claude-plugin",
|
|
33
|
+
"skills",
|
|
34
|
+
"README.md"
|
|
35
|
+
],
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: github-issue-drafting
|
|
3
|
+
description: Draft a GitHub issue from a short note or a rough idea, grounding every claim about the code in the repository the issue will be filed against, splitting work that is really two issues, and filing it with `gh` once the user has approved the draft. Use when turning a to-do item, a Slack message, a code TODO, a failing test or a bug report into an issue, when asked to "write up an issue for" something, to "raise", "file" or "open an issue", when asked whether something should be one issue or several, and when tidying the titles, types or labels of issues that already exist.
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
metadata:
|
|
6
|
+
version: "1.13.1"
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# GitHub issue drafting
|
|
10
|
+
|
|
11
|
+
A short note ("fix the retry backoff", "SSM params", "the CLI hangs on empty input") carries enough
|
|
12
|
+
for whoever wrote it and too little for anyone else, including the same person in six months. The
|
|
13
|
+
job is an issue a reader can act on without asking what was meant, with every claim about the code
|
|
14
|
+
checked against the code.
|
|
15
|
+
|
|
16
|
+
## Process
|
|
17
|
+
|
|
18
|
+
1. **Get the note.** Use the text passed in as the skill argument. Ask the user for it if none
|
|
19
|
+
arrived. A note can come from anywhere (a to-do app, a chat message, a `TODO` comment, a stack
|
|
20
|
+
trace, a support thread) and the source changes nothing about the drafting.
|
|
21
|
+
|
|
22
|
+
2. **Work out which repository this belongs to, and how it files issues.** `gh repo view` names the
|
|
23
|
+
repository behind the working directory. Confirm with the user where the working directory is
|
|
24
|
+
ambiguous or where the issue belongs somewhere else. Then read how this project already works:
|
|
25
|
+
|
|
26
|
+
- `.github/ISSUE_TEMPLATE/` and `CONTRIBUTING.md`, if present. **A repository's own template wins
|
|
27
|
+
over the structure in this skill.** Fill in that template and follow its wording.
|
|
28
|
+
- `gh issue list --limit 10` and one or two full issues (`gh issue view <n>`) for the house
|
|
29
|
+
register, the section headings in use, and how long a typical issue runs.
|
|
30
|
+
|
|
31
|
+
3. **Investigate before drafting.** See
|
|
32
|
+
[Ground the draft in the repository](#ground-the-draft-in-the-repository).
|
|
33
|
+
|
|
34
|
+
4. **Decide whether it is one issue or several.** See
|
|
35
|
+
[One note is often more than one issue](#one-note-is-often-more-than-one-issue).
|
|
36
|
+
|
|
37
|
+
5. **Draft it**, separating what step 3 confirmed from what remains an assumption.
|
|
38
|
+
|
|
39
|
+
6. **Present the draft in chat as markdown, and stop.** Filing is the user's call. List any open
|
|
40
|
+
questions under the draft so they can be answered before anything is posted.
|
|
41
|
+
|
|
42
|
+
7. **File it with `gh` only after the user has explicitly asked.** See
|
|
43
|
+
[Filing the issue](#filing-the-issue).
|
|
44
|
+
|
|
45
|
+
## Ground the draft in the repository
|
|
46
|
+
|
|
47
|
+
The failure mode that matters is invention. A feature called missing when it half exists,
|
|
48
|
+
architecture nobody built, acceptance criteria assuming decisions nobody has made. A note is too
|
|
49
|
+
short to carry that context. The repository has to supply it.
|
|
50
|
+
|
|
51
|
+
Budget a handful of tool calls for this. A full audit is more than the draft needs.
|
|
52
|
+
|
|
53
|
+
- **Locate the area.** Grep for the nouns and identifiers in the note. A `README`, an architecture
|
|
54
|
+
doc or the directory layout usually points at the right subtree in one step.
|
|
55
|
+
- **Read the code that would change, and its tests.** Half-built is the common case, and it is the
|
|
56
|
+
case that embarrasses the issue.
|
|
57
|
+
- **Read what the docs already promise.** A behaviour documented as supported and a behaviour
|
|
58
|
+
actually supported are different facts, and the gap between them is sometimes the issue.
|
|
59
|
+
- **Check the history.** `git log --oneline -20` for work in flight, and
|
|
60
|
+
`git log --oneline --all --grep="<keyword>"` for work already done under another name.
|
|
61
|
+
- **Search the tracker, including closed issues.** `gh issue list --state all --search "<keyword>"`.
|
|
62
|
+
A near duplicate is usually worth a comment on the existing issue. Say so and let the user pick.
|
|
63
|
+
Where `gh` is missing or unauthenticated, skip this quietly and never claim to have checked.
|
|
64
|
+
|
|
65
|
+
Carry the unresolved parts forward. Anything step 3 failed to settle belongs in the draft as an
|
|
66
|
+
explicit question or a stated assumption, and in chat as something for the user to answer.
|
|
67
|
+
|
|
68
|
+
## One note is often more than one issue
|
|
69
|
+
|
|
70
|
+
A note is written in one breath. The work it names frequently spans several pull requests, and filed
|
|
71
|
+
whole it becomes one enormous branch that is hard to review and hard to stop halfway.
|
|
72
|
+
|
|
73
|
+
So before drafting, look for a seam that yields **independently shippable** issues. Seams that
|
|
74
|
+
usually work, roughly in build order:
|
|
75
|
+
|
|
76
|
+
- **A usable surface first, whatever sits on top of it second.** The library function is useful on
|
|
77
|
+
its own. The CLI flag, the config key or the framework integration exposing it reads better as a
|
|
78
|
+
follow-up that links back.
|
|
79
|
+
- **A piece blocked on something unbuilt.** Work waiting on another feature is its own issue, with
|
|
80
|
+
the dependency named, and not a caveat buried in this one.
|
|
81
|
+
- **A distinct usage mode.** The same capability reached at runtime and at build time is two
|
|
82
|
+
features with two sets of tests.
|
|
83
|
+
- **A bug fix and the hardening around it.** Ship the fix. File the class of problem separately.
|
|
84
|
+
|
|
85
|
+
Three seams produce issues nobody can ship alone. One issue per function or endpoint, implementation
|
|
86
|
+
split from its tests, and docs as their own issue. Docs belong with the behaviour they describe.
|
|
87
|
+
|
|
88
|
+
Two or three issues is the usual answer where a split is warranted. Five is over-slicing, and a
|
|
89
|
+
small self-contained note stays one issue. Where a split happens, say so in chat and present the set
|
|
90
|
+
together, each one naming its dependency and using **Out of scope** to hand work to the others.
|
|
91
|
+
|
|
92
|
+
## Drafting rules
|
|
93
|
+
|
|
94
|
+
- **Keep it short, and shorter than feels right.** Roughly 200 to 350 words of prose plus at most
|
|
95
|
+
one example. Three or four sections at most, and no more than six acceptance criteria. Cut any
|
|
96
|
+
section that fails to help a reader understand, implement, test or evaluate the change.
|
|
97
|
+
- **The design discussion in chat is not the issue.** Working a note through produces rejected
|
|
98
|
+
alternatives, trade-offs and cost estimates, and almost none of it belongs in the body. Record the
|
|
99
|
+
decision and one sentence of reason. Where the discussion settled something genuinely surprising,
|
|
100
|
+
one short paragraph earns its place.
|
|
101
|
+
- **Never invent behaviour, architecture, supported APIs or acceptance criteria.** Where step 3 left
|
|
102
|
+
something unconfirmed, write it as a question or a stated assumption.
|
|
103
|
+
- **Scrub anything private before it goes anywhere public.** Notes and stack traces carry customer
|
|
104
|
+
names, internal hostnames, internal ticket ids, paths with a username in them, tokens and API
|
|
105
|
+
keys. A public issue is publication. Redact by default and ask about anything borderline.
|
|
106
|
+
- **Write to the problem, and to the observable behaviour that would fix it.** An issue is not a
|
|
107
|
+
pull request description, and a detailed implementation plan belongs in it only where step 3
|
|
108
|
+
turned up a constraint the implementer would otherwise miss.
|
|
109
|
+
- **Prefer one concrete example** (a command, a config snippet, a failing assertion, the exact error
|
|
110
|
+
text) over a paragraph of description.
|
|
111
|
+
- **A bug needs the version, the environment, the steps, the expected result and the actual
|
|
112
|
+
result.** Anything absent is a question for the user, and a bug report missing them wastes the
|
|
113
|
+
first reply.
|
|
114
|
+
- **Leave the process fields alone.** No assignees, milestones, estimates, or wording implying that
|
|
115
|
+
the issue is approved or scheduled. Type and labels are set at filing time.
|
|
116
|
+
- **When in doubt, cut.** Erring long is the more common failure. Somebody re-reading this in six
|
|
117
|
+
months needs the problem, the intended behaviour, and enough grounding to trust both.
|
|
118
|
+
|
|
119
|
+
### Prose
|
|
120
|
+
|
|
121
|
+
Load the `technical-prose-style` and `avoid-ai-writing` skills before drafting where they are
|
|
122
|
+
installed, and run whatever check they ship over the body. Where neither is available, aim for one
|
|
123
|
+
claim per sentence, present tense, no em dashes, no marketing adjectives, and one name kept for one
|
|
124
|
+
thing.
|
|
125
|
+
|
|
126
|
+
## Structure
|
|
127
|
+
|
|
128
|
+
Use the repository's own issue template where it has one. Otherwise draw from the sections below,
|
|
129
|
+
taking only those this particular note needs. Most issues use three or four. **Problem** and
|
|
130
|
+
**Desired behaviour** are the two that nearly always earn their place. Reach for **Current
|
|
131
|
+
behaviour** where what exists today would surprise a reader, and for **Implementation notes** only
|
|
132
|
+
where step 3 turned up a real constraint.
|
|
133
|
+
|
|
134
|
+
```markdown
|
|
135
|
+
# Title
|
|
136
|
+
|
|
137
|
+
## Problem
|
|
138
|
+
|
|
139
|
+
The concrete limitation, missing capability or user need.
|
|
140
|
+
|
|
141
|
+
## Current behaviour
|
|
142
|
+
|
|
143
|
+
What happens today, grounded in what the repository actually shows. Omit where unknown.
|
|
144
|
+
|
|
145
|
+
## Desired behaviour
|
|
146
|
+
|
|
147
|
+
The observable behaviour that should exist once this is implemented.
|
|
148
|
+
|
|
149
|
+
## Example
|
|
150
|
+
|
|
151
|
+
A command, config, request or expected result. Include it only where it clarifies something.
|
|
152
|
+
|
|
153
|
+
## Acceptance criteria
|
|
154
|
+
|
|
155
|
+
Testable checklist items.
|
|
156
|
+
|
|
157
|
+
## Out of scope
|
|
158
|
+
|
|
159
|
+
Related work that should not be assumed to be included.
|
|
160
|
+
|
|
161
|
+
## Implementation notes
|
|
162
|
+
|
|
163
|
+
Grounded constraints from the investigation. Omit the section entirely where there are none.
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
For a bug, replace the middle three with **Steps to reproduce**, **Expected result**, **Actual
|
|
167
|
+
result** and **Environment** (version, runtime, operating system, anything version-pinned that
|
|
168
|
+
matters).
|
|
169
|
+
|
|
170
|
+
## Titles people can find
|
|
171
|
+
|
|
172
|
+
Issues get indexed, by GitHub's search and by search engines, and they surface far more readily than
|
|
173
|
+
pull requests do. For a public repository the title and the opening paragraph are the whole search
|
|
174
|
+
snippet, and they do nearly all the work of getting the issue in front of the person who has the
|
|
175
|
+
problem.
|
|
176
|
+
|
|
177
|
+
- **Write the words a user would type.** Internal shorthand and internal abbreviations describe the
|
|
178
|
+
problem to people who already know it. Spell them out.
|
|
179
|
+
- **Keep the term that makes the project distinctive**, even while cutting shorthand around it. The
|
|
180
|
+
two look like the same edit and are opposites. An abbreviation nobody searches for should go. The
|
|
181
|
+
one accurate word separating this project from every other page about the same topic should stay,
|
|
182
|
+
because a title without it competes with the upstream documentation and loses.
|
|
183
|
+
- **Front-load.** Search snippets truncate around 60 characters, so anything load-bearing goes
|
|
184
|
+
early.
|
|
185
|
+
- **Generic verbs are weak alone.** "add", "support", "fix" are fine where the sentence wants them
|
|
186
|
+
anyway. They differentiate nothing on their own, and forcing one in is where a title starts
|
|
187
|
+
sounding written for a crawler.
|
|
188
|
+
- **Keep it subtle.** An issue that reads as search filler makes a project look automated, and costs
|
|
189
|
+
more credibility than the traffic is worth. Aim for a title a developer would have written anyway,
|
|
190
|
+
which happens to use the words someone with this problem would search for.
|
|
191
|
+
- **Be honest about the size of the prize.** On a small repository these titles win long-tail
|
|
192
|
+
queries. That makes the work worth doing and never worth distorting a title for.
|
|
193
|
+
|
|
194
|
+
`SSR hydration bug in the DS button` becomes
|
|
195
|
+
`Design system button loses its click handler after server-side rendering`. The second expands the
|
|
196
|
+
shorthand nobody searches for, keeps the words that place the problem, and adds nothing that is
|
|
197
|
+
untrue of the bug.
|
|
198
|
+
|
|
199
|
+
On a private repository the audience is the team, and all of this reduces to one rule. Say what the
|
|
200
|
+
problem is in plain words.
|
|
201
|
+
|
|
202
|
+
## Filing the issue
|
|
203
|
+
|
|
204
|
+
Only once the user has explicitly asked.
|
|
205
|
+
|
|
206
|
+
Write the body to a file and pass it with `--body-file`, so quoting and backticks survive intact:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
gh issue create --repo <owner>/<repo> --title "<title>" --body-file <path> --label <label>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
**Do not hard-wrap the body.** This is the one formatting trap. GitHub renders issue and comment
|
|
213
|
+
Markdown with the GFM hard-line-break extension, so every newline inside a paragraph becomes a
|
|
214
|
+
`<br>`. A repository whose prose style wraps at 80 or 100 columns will produce visibly ragged output
|
|
215
|
+
when that habit reaches an issue body. Write each paragraph and each list item as one long line.
|
|
216
|
+
Blank lines between blocks still separate paragraphs, and code fences and list structure are
|
|
217
|
+
unaffected.
|
|
218
|
+
|
|
219
|
+
**Labels.** Read `gh label list` and pick from what exists. A label passed to `gh` that the
|
|
220
|
+
repository lacks fails the whole command.
|
|
221
|
+
|
|
222
|
+
**Type,** where the organisation has issue types configured. `--type` takes one of them (`Bug`,
|
|
223
|
+
`Feature` and `Task` are the GitHub defaults). Its value is in-repo filtering and a readable issue
|
|
224
|
+
list. Where the flag or the type is rejected, drop it and carry on.
|
|
225
|
+
|
|
226
|
+
**Think before applying `good first issue` or `help wanted`.** GitHub surfaces both in its
|
|
227
|
+
contributor-discovery UI, and third-party sites scrape them to list approachable open-source work.
|
|
228
|
+
For a project actively recruiting contributors that is the point. For a solo maintainer it invites
|
|
229
|
+
drive-by pull requests that cost more to review than they return. `CONTRIBUTING.md` and the existing
|
|
230
|
+
issues usually say which kind of project this is. Where it stays unclear, leave both off and mention
|
|
231
|
+
it.
|
|
232
|
+
|
|
233
|
+
**Skip Projects and date fields** unless the user asks for them. They are planning tools with
|
|
234
|
+
recurring upkeep and no search benefit. Milestones are the lighter option for grouping.
|
|
235
|
+
|
|
236
|
+
Where several issues came out of one note, file them in dependency order and put each preceding URL
|
|
237
|
+
into the issue that depends on it.
|
|
238
|
+
|
|
239
|
+
After filing, report the URL and state plainly which type and labels were applied.
|
|
240
|
+
|
|
241
|
+
## Revisiting existing issues
|
|
242
|
+
|
|
243
|
+
The same thinking applies to issues that already exist, whether retitling or backfilling a missing
|
|
244
|
+
type or label. Closed issues are worth including. They stay indexed, and a closed issue describing a
|
|
245
|
+
capability that now exists is often exactly what a searcher wants.
|
|
246
|
+
|
|
247
|
+
Retitling is cheap and low-risk (the URL survives, GitHub keeps the edit history, nobody gets
|
|
248
|
+
notified) and it is still a public edit. Propose the full set in chat and get an explicit go-ahead
|
|
249
|
+
before running any `gh issue edit`. A table of current against proposed makes the set easy to scan
|
|
250
|
+
and easy to reject one row at a time.
|
|
251
|
+
|
|
252
|
+
Two things to watch in bulk:
|
|
253
|
+
|
|
254
|
+
- **A run of near-identical titles is a real cost.** One formula applied across five issues makes
|
|
255
|
+
the list scannable and reads as a deliberate series. A shared long prefix is also the first thing
|
|
256
|
+
a sceptical reader notices. Accept it where the issues genuinely are one series, and vary the
|
|
257
|
+
phrasing on a couple where the run gets long.
|
|
258
|
+
- **The bodies are usually the bigger win.** The opening paragraph becomes the search snippet, so a
|
|
259
|
+
retitled issue still opening with internal shorthand has had half the job done. Rewriting the
|
|
260
|
+
first sentence of **Problem** often beats the title edit.
|