writing-issues — Claude Code skill: what it does, how to install
Formats epics, stories, tasks, bugs, and spikes for issue trackers. It turns raw discussions and notes into tickets with verifiable acceptance checks.
npx skills add riekelt/technical-writer --skill writing-issues -a claude-codeWhat writing-issues does
The skill enforces a clear glossary for tracker items: epics, stories, tasks, defects, and time-boxed spikes. Everything runs through the survives-without-you test. A stranger reading the ticket must immediately grasp the desired outcome, the exact check that marks it Done, links to supporting evidence, and owners for any open items.
Bug reports lead with the observable symptom and step-by-step reproduction rather than speculative diagnoses. For stories and tasks, the skeleton demands testable acceptance checks, explicit non-goals, and named owners for open questions. Ticket keys belong strictly in commit messages and planning docs, never inside application code, comments, or test names.
This skill depends on rules from technical-writing as required background. It governs ticket writing rather than prioritization, so architectural trade-offs belong in a linked document managed by writing-design-docs.
What it helps with
- draft testable acceptance criteria for a user story
- structure a reproducible bug report focused on observable symptoms
- convert rough meeting notes into actionable engineering tasks
- define explicit out-of-scope boundaries to prevent scope creep
Example prompts for the agent
- Turn this crash log and notes into a bug report using the standard skeleton
- Draft a user story for file uploads with testable acceptance checks
- Split this feature discussion into an epic with clear open items and tasks
How to install writing-issues
1Skills CLI (Vercel)
npx skills add riekelt/technical-writer --skill writing-issues -a claude-code2Manually: put the files in place
~/.claude/skills/writing-issues/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/writing-issues/
1Skills CLI (Vercel)
npx skills add riekelt/technical-writer --skill writing-issues -a codex2Manually: put the files in place
.agents/skills/writing-issues/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add riekelt/technical-writer --skill writing-issues -a cursor2Manually: put the files in place
.cursor/skills/writing-issues/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install riekelt/technical-writer writing-issues2Manually: put the files in place
.github/skills/writing-issues/SKILL.md1Skills CLI (Vercel)
npx skills add riekelt/technical-writer --skill writing-issues -a gemini-cli2Platform CLI
gemini skills install https://github.com/riekelt/technical-writer --path plugins/technical-writer/skills/writing-issuesManually: put the files in place
.devin/skills/writing-issues/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add riekelt/technical-writer --skill writing-issues -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about writing-issues
How do I install writing-issues in Claude Code?
Run npx skills add riekelt/technical-writer --skill writing-issues -a claude-code. The tool adds the skill directly to your Claude Code setup.
What is the survives-without-you test?
It requires every ticket to answer four questions: the intended outcome, what decides Done, the source evidence behind decisions, and who owns open questions. This prevents ambiguity when the author is unavailable.
Does writing-issues handle architectural choices?
No, this skill covers issue formatting and clarity only. Weighing technical alternatives belongs in design docs handled by writing-design-docs, which the issue links rather than inlines.
Source text
SKILL.md · MIT
--- name: writing-issues description: Use when writing or refining tracker items - epics, stories, tasks, bug reports, spikes, or acceptance criteria - or when turning a discussion, review finding, or plan into tickets. Encodes the survives-without-you test, the issue-type glossary, and the story and bug skeletons. Use whenever work is written into a tracker, even from a rough verbal dump. --- # Writing issues **REQUIRED BACKGROUND:** the `technical-writing` skill (hard rules, truth rules, style). ## Overview Core principle: **write issues so they survive without you.** State the outcome, include the acceptance check that decides Done, link the evidence behind every decision, and name the owner of every open part. ## When to invoke, and not Invoke when writing or editing tracker items, filing a bug, splitting work into tickets, or writing acceptance criteria. Do NOT invoke for weighing alternatives: when an issue needs a design argued, that is `writing-design-docs`; the issue links the design doc and never inlines it. This skill covers the writing only, not prioritization or workflow advice. Read-first applies to the tracker: read up to two recent issues of the same type and match their conventions before filing. When the tracker holds fewer, read what exists and file anyway. When the reporter is unavailable, file with named gaps rather than blocking. The `technical-writing` checkpoint (kind, audience, purpose, non-goals) is what you stop and ask about. Missing content details (a repro step, a log line, a prior-incident link) become explicitly owned open items inside the issue. ## The survives-without-you test Every issue answers four questions a stranger will ask: 1. **What outcome?** The state of the world when this is done, not the steps to get there. Implementation belongs in the plan. 2. **What decides Done?** A concrete, independently testable acceptance check. "Handle errors appropriately" decides nothing; "a failed upload shows the retry banner and logs at WARN" does. 3. **What is the evidence?** Where a decision or constraint came from evidence, link the source: a repo path, a document, a URL. 4. **Who owns the open parts?** "Still needs investigation" without a name or role is a banned vague owner; name one or mark the field explicitly as unassigned. ## Issue types One glossary per tracker, defined in one line each and used consistently: | Type | Definition | |---|---| | Epic | A body of work; its description states the outcome and links the design doc | | Story | Something with user-visible value, written from the user's seat | | Task | Engineering work with no user-visible surface | | Bug | A defect: current behavior contradicts intended behavior | | Spike | A time-boxed investigation whose output is a decision, not code | A spike's Done is the decision recorded (see `recording-decisions`), never "looked into it". A decision followed by a body of work fits two shapes: a spike first with the epic filed after the decision, or an epic whose first acceptance item is the accepted design doc. Both are valid; pick one and say which. ## Story and task skeleton The issue description is the spec for what and why: ```markdown **Problem / Why:** [the observable problem, from the reader's seat, with numbers where they exist] **Outcome:** [the state of the world when done; not the steps] **Acceptance:** - [ ] [independently testable check] - [ ] [another] **Out of scope:** [what this issue deliberately does not cover] **Open items:** [each with a named owner or role, or an explicit "unassigned"] **Sources:** [repo paths, documents, measurements behind the above] ``` Apply the five vagueness defects from `writing-design-docs` to the acceptance list: an acceptance check that fails "what without how" or "no verifiable output" is not testable. Gherkin-style given/when/then is an accepted format for acceptance checks when the team uses it; the same testability bar applies either way. INVEST (independent, negotiable, valuable, estimable, small, testable) works as a sizing check for stories: a story failing "small" or "testable" splits before it is filed. ## Bug report skeleton Symptom first: the next reader arrives searching for the error. ```markdown **Symptom:** [verbatim error string or observable misbehavior, searchable] **Reproduction:** [numbered steps, one action each, from a clean state] **Expected:** [what should happen, with the source that says so, or an explicit "no written source found" rather than a fabricated reference] **Actual:** [what happens] **Environment:** [version, platform, config that matters] **Open items:** [each with a named owner or role, or an explicit "unassigned"] **Suspected cause:** [only if investigated; labeled as hypothesis, never stated as fact] ``` The title carries the symptom, not the diagnosis: "duplicate reminders at reminder time", not "race condition in scheduler", unless the cause is verified. ## Rules - **One home.** The issue owns what and why; the plan in the repo owns how. Never maintain two live copies. - **Ticket keys.** They live in commits and planning docs, never in code, comments, test names, or user-facing strings. - **Trust code, not issue status.** Self-reported state goes stale fast; before building on an imported or old issue, verify against the repository (grep the symbols, check the history). - **Append, do not rewrite.** Scope changes on an in-flight issue are dated appended notes, not silent edits. Follow-up work found after completion is a new issue, never an edit to a closed one. - **Subtasks.** Coarse reviewable slices, not every micro-step; the micro-steps live in the plan. - **Estimates.** Labeled as estimates, with what they depend on. - **Closing an issue.** It records the reason, especially for won't-fix and duplicates.
© riekelt · MIT · riekelt/technical-writer