Write an issue a maintainer can act on without asking a follow-up question.
Evidence first, then the ask.
Target
jj show --git
Arguments: $ARGUMENTS
Work on the issue, draft, or reply named in the arguments if given. Otherwise
work on the problem visible in the current commit shown above. If there are no
arguments and the commit has no changes, ask the user what to file and stop.
Modes
Pick one from the arguments:
- Draft: no issue exists yet. Produce a title and a body
- Fill in: a partial draft or a template with blanks exists. Complete it in
place and leave the author's wording alone where it already says what it means
- Update: an issue exists and the work changed what it should say. Edit it with
gh issue edit
- Judge a reply: a maintainer or another user responded. Assess the response and
draft an answer. Don't post it
Workflow
- Identify the repo and the mode. For an issue number or URL, read it first:
gh issue view <n> --comments
- Run
show-repo-issues.sh (in this skill's directory) with the repo and the
keywords of the symptom: show-repo-issues.sh <owner/repo> <keyword>.... It
prints the issue templates, the labels, the recent issues with their labels,
and a duplicate search per keyword with pull requests included. A template's
sections state what the maintainer needs, so follow it. The recent issues
show the project's tone and which labels it uses
- Link the closest match the search found. If it is the same bug, say so and
stop. The search covers open and closed issues, so don't add a
--state flag
to a search of your own
- Establish the facts in "What a report must contain". Mark as unverified
anything you could not check. Never guess
- For a bug, reduce to a minimal reproduction per "Minimal reproduction". Run
it. A repro you have not executed does not go in the issue
- Write the body per "Body shape", and propose a title per "Title". For a
reply, follow "Judging a reply" instead. Save the draft to a file whose first
line is the title as a
# heading, followed by the body. A comment draft
has no heading. Cite upstream lines through show-repo-file.sh (in this
skill's directory): show-repo-file.sh <owner/repo> <path> [ref] prints the
file with line numbers and the permalink prefix, pinned to a commit, so the
link stays correct after the file changes
- Run
/humanize on the draft file in a subagent. Give the subagent nothing
but the file path and the instruction to run that one skill on it, so it
reads the draft cold. Tell the subagent to revise only the prose, leaving the
reproduction and every quoted output, error, and version untouched
- Send the draft file with the SendUserFile tool and stop, unless the arguments
ask you to post or edit. Never paste the draft into the reply: the file card
shows the path, and the user reads the file. Never post a comment, close,
label, or assign unless asked
- When asked to file, run
post-draft.sh (in this skill's directory):
post-draft.sh <owner/repo> <draft.md> [--label <name>]... creates the issue
from the draft's heading and body, and --comment-on <n> posts a headingless
draft as a comment. It prints the number, URL, state, and labels of what
landed. GitHub silently discards labels from an author without triage access
to the repo, so the script warns when a requested label is missing. Tell the
user, and don't retry: a maintainer must add the label
- When asked to update an issue, use
gh issue edit <n> --body-file <path>
with the heading stripped from the draft, and
gh issue edit <n> --title <title> to retitle. Verify with
gh issue view <n>
What a report must contain
- What you did, precisely enough to redo: the command, the input, the code
- What happened: the actual output, error, or stack trace, quoted verbatim
- What you expected instead, and why. The "why" is what the maintainer agrees or
disagrees with, so state it: the docs say X, the type says Y, the previous
version did Z
- Versions: the package version, the runtime version, the OS. Read them, don't
recall them:
node_modules/<pkg>/package.json for what you ran,
npm view <pkg> version for whether a newer release already fixed it
- Whether it regressed, and from which version. A bisect between two published
versions is worth more than the rest of the report combined
- Scope: does it reproduce on a clean install, in another runtime, with the
minimal config?
Minimal reproduction
Cut until removing anything more makes the bug disappear:
- Strip your application. Nothing from your codebase should remain except the
call that fails
- Remove every dependency but the one you are reporting against. A bug that
needs a second package is a finding, and it belongs in the issue
- Reduce the input to the smallest value that still fails, and note the nearest
value that passes. The boundary is the diagnosis
- Make it runnable as one paste: a single file, exact commands, no scaffolding
the reader has to invent
- Run it from a scratch directory on a clean install, so nothing in your local
environment affects it. For an npm package,
create-repro-project.sh (in
this skill's directory) creates the project:
create-repro-project.sh <dir> <pkg>@<version>... installs the packages and
prints the node version, the OS, and each package's installed and latest
versions for the environment section. Write <dir>/repro.mjs and run it with
node
If it will not reduce further, say what you tried and where it stopped
shrinking. A half-reduced repro with that note beats a link to a private repo.
Body shape
Lead with one sentence naming the defect. Then, in this order: reproduction,
actual, expected, environment, and only then any theory about the cause. A
maintainer reading the first three lines should know whether it is their bug.
- Separate what you observed from what you infer. Label the theory as a theory
- Don't offer a patch unless asked. If you have one, link the line you would
change and leave it at that
- Cut the story of how you found it
- Cut the body before showing it, not after the user asks
- Split unrelated problems into separate issues
- Match the project's tone. Leave headings and emoji out of an issue on a terse
repo
Title
A title is a claim, not a topic: name the symptom and the condition that
triggers it, in the project's own vocabulary. formatDuration rounds 999.5ms
up to 1s, not "rounding bug". Skip "bug:" and "issue:" prefixes unless the
repo's issues use them. Offer one title, plus an alternative when the framing is
arguable.
Judging a reply
Answer these questions before drafting a response:
- Did they understand the report? If not, the fix is a clearer repro, not a
rebuttal
- Is their objection right? Check it against the code and the docs instead of
defending the filing. Say plainly when they are correct
- What do they want next? A version bump, a smaller repro, a PR, a decision from
you. Do that thing
Then draft a reply that contains new information: a result, a narrowing, a repro
they can run. A reply that only restates the issue costs the maintainer a read
and returns nothing. If it is a "won't fix" you accept, say so and let the
thread close.
Guidelines
- Assume the maintainer is busy and unpaid. Length is a cost you impose
- Never invent a version, an error message, or an output you did not see
- Don't editorialize about severity. Show the impact and let them rank it
1---2name: issue3description: Write, fill in, or update a GitHub issue, including an upstream bug report with a minimal reproduction, and judge replies to it.4---56Write an issue a maintainer can act on without asking a follow-up question.7Evidence first, then the ask.89# Target1011```!12jj show --git13```1415Arguments: $ARGUMENTS1617Work on the issue, draft, or reply named in the arguments if given. Otherwise18work on the problem visible in the current commit shown above. If there are no19arguments and the commit has no changes, ask the user what to file and stop.2021# Modes2223Pick one from the arguments:2425- Draft: no issue exists yet. Produce a title and a body26- Fill in: a partial draft or a template with blanks exists. Complete it in27 place and leave the author's wording alone where it already says what it means28- Update: an issue exists and the work changed what it should say. Edit it with29 `gh issue edit`30- Judge a reply: a maintainer or another user responded. Assess the response and31 draft an answer. Don't post it3233# Workflow34351. Identify the repo and the mode. For an issue number or URL, read it first:36 `gh issue view <n> --comments`372. Run `show-repo-issues.sh` (in this skill's directory) with the repo and the38 keywords of the symptom: `show-repo-issues.sh <owner/repo> <keyword>...`. It39 prints the issue templates, the labels, the recent issues with their labels,40 and a duplicate search per keyword with pull requests included. A template's41 sections state what the maintainer needs, so follow it. The recent issues42 show the project's tone and which labels it uses433. Link the closest match the search found. If it is the same bug, say so and44 stop. The search covers open and closed issues, so don't add a `--state` flag45 to a search of your own464. Establish the facts in "What a report must contain". Mark as unverified47 anything you could not check. Never guess485. For a bug, reduce to a minimal reproduction per "Minimal reproduction". Run49 it. A repro you have not executed does not go in the issue506. Write the body per "Body shape", and propose a title per "Title". For a51 reply, follow "Judging a reply" instead. Save the draft to a file whose first52 line is the title as a `# ` heading, followed by the body. A comment draft53 has no heading. Cite upstream lines through `show-repo-file.sh` (in this54 skill's directory): `show-repo-file.sh <owner/repo> <path> [ref]` prints the55 file with line numbers and the permalink prefix, pinned to a commit, so the56 link stays correct after the file changes577. Run `/humanize` on the draft file in a subagent. Give the subagent nothing58 but the file path and the instruction to run that one skill on it, so it59 reads the draft cold. Tell the subagent to revise only the prose, leaving the60 reproduction and every quoted output, error, and version untouched618. Send the draft file with the SendUserFile tool and stop, unless the arguments62 ask you to post or edit. Never paste the draft into the reply: the file card63 shows the path, and the user reads the file. Never post a comment, close,64 label, or assign unless asked659. When asked to file, run `post-draft.sh` (in this skill's directory):66 `post-draft.sh <owner/repo> <draft.md> [--label <name>]...` creates the issue67 from the draft's heading and body, and `--comment-on <n>` posts a headingless68 draft as a comment. It prints the number, URL, state, and labels of what69 landed. GitHub silently discards labels from an author without triage access70 to the repo, so the script warns when a requested label is missing. Tell the71 user, and don't retry: a maintainer must add the label7210. When asked to update an issue, use `gh issue edit <n> --body-file <path>`73 with the heading stripped from the draft, and74 `gh issue edit <n> --title <title>` to retitle. Verify with75 `gh issue view <n>`7677# What a report must contain7879- What you did, precisely enough to redo: the command, the input, the code80- What happened: the actual output, error, or stack trace, quoted verbatim81- What you expected instead, and why. The "why" is what the maintainer agrees or82 disagrees with, so state it: the docs say X, the type says Y, the previous83 version did Z84- Versions: the package version, the runtime version, the OS. Read them, don't85 recall them: `node_modules/<pkg>/package.json` for what you ran,86 `npm view <pkg> version` for whether a newer release already fixed it87- Whether it regressed, and from which version. A bisect between two published88 versions is worth more than the rest of the report combined89- Scope: does it reproduce on a clean install, in another runtime, with the90 minimal config?9192# Minimal reproduction9394Cut until removing anything more makes the bug disappear:95961. Strip your application. Nothing from your codebase should remain except the97 call that fails982. Remove every dependency but the one you are reporting against. A bug that99 needs a second package is a finding, and it belongs in the issue1003. Reduce the input to the smallest value that still fails, and note the nearest101 value that passes. The boundary is the diagnosis1024. Make it runnable as one paste: a single file, exact commands, no scaffolding103 the reader has to invent1045. Run it from a scratch directory on a clean install, so nothing in your local105 environment affects it. For an npm package, `create-repro-project.sh` (in106 this skill's directory) creates the project:107 `create-repro-project.sh <dir> <pkg>@<version>...` installs the packages and108 prints the node version, the OS, and each package's installed and latest109 versions for the environment section. Write `<dir>/repro.mjs` and run it with110 `node`111112If it will not reduce further, say what you tried and where it stopped113shrinking. A half-reduced repro with that note beats a link to a private repo.114115# Body shape116117Lead with one sentence naming the defect. Then, in this order: reproduction,118actual, expected, environment, and only then any theory about the cause. A119maintainer reading the first three lines should know whether it is their bug.120121- Separate what you observed from what you infer. Label the theory as a theory122- Don't offer a patch unless asked. If you have one, link the line you would123 change and leave it at that124- Cut the story of how you found it125- Cut the body before showing it, not after the user asks126- Split unrelated problems into separate issues127- Match the project's tone. Leave headings and emoji out of an issue on a terse128 repo129130# Title131132A title is a claim, not a topic: name the symptom and the condition that133triggers it, in the project's own vocabulary. `formatDuration` rounds `999.5ms`134up to `1s`, not "rounding bug". Skip "bug:" and "issue:" prefixes unless the135repo's issues use them. Offer one title, plus an alternative when the framing is136arguable.137138# Judging a reply139140Answer these questions before drafting a response:141142- Did they understand the report? If not, the fix is a clearer repro, not a143 rebuttal144- Is their objection right? Check it against the code and the docs instead of145 defending the filing. Say plainly when they are correct146- What do they want next? A version bump, a smaller repro, a PR, a decision from147 you. Do that thing148149Then draft a reply that contains new information: a result, a narrowing, a repro150they can run. A reply that only restates the issue costs the maintainer a read151and returns nothing. If it is a "won't fix" you accept, say so and let the152thread close.153154# Guidelines155156- Assume the maintainer is busy and unpaid. Length is a cost you impose157- Never invent a version, an error message, or an output you did not see158- Don't editorialize about severity. Show the impact and let them rank it