ticket
Skill2 starsChanged 2 months agoMITView on GitHub
Create Linear or Jira tickets that read like a human wrote them — not AI slop. Detects which tracker a project uses (Linear vs Jira) and remembers the team/project mapping per project, asking only once. Handles both bug reports and new-feature handoffs, written for the tester who picks it up — a bug gets reproduction steps + where it lives; a feature gets what it solves, where to find it, the design, and how to test it. Writes a short, scannable ticket (plain language, real paths/flows, concrete test steps, observable acceptance) and enriches it from whatever useful MCPs are connected — renders Figma frames, pulls Sentry error context, reads the originating Slack thread, links the relevant PR — using only what's installed and relevant. Posts recent test results (qa-run, test runs, CI) and long evidence as a comment instead of bloating the description. Use when the user asks to "create a ticket", "file a bug", "open an issue", "make a Linear/Jira ticket", "log this", or invokes /ticket. Runs in the MAIN thread so it can read the conversation and confirm the draft before creating.
23 other projects use a version of this.
Adopted by
Most recently taken up by
- infenia/yuktatheir own version, first seen Nov 8, 2026
- peterpme/skillstheir own version, first seen Nov 8, 2026
- Mrbaeksang/skillstheir own version, first seen Nov 8, 2026
- kyle-chalmers/ticketwrighttheir own version, first seen Nov 8, 2026
- 0xfurai/peekapingtheir own version, first seen Nov 1, 2026
- codingpains/skillstheir own version, first seen Nov 1, 2026
Used with
Projects with it also use retro, spec and 6 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
AWSSkillretro
Conduct a retrospective on a coding session.
Also in 3 projects that use this
SentrySkillspec
Produce a verified spec — problem, desired outcome, and acceptance criteria — before building. Use when given a GitHub/Linear issue link, when starting from a fuzzy in-conversation idea, or asked to "figure out what to do" / "scope this" / "what should I build" — whenever the *what* isn't yet pinned down. Grills the ambiguities, checks the premise against the code, and produces acceptance criteria you sign off on — then hands to design-first.
Also in 3 projects that use this
AWSSkillship
Finalize dev work on an issue branch — update docs, push, and open a PR.
Also in 3 projects that use this
MicrosoftSkillhandoff
Compact the current conversation into a handoff document for another agent to pick up.
Also in 5 projects that use this
GoogleSkillprototype
Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.
Also in 3 projects that use this
Microsoft AzureSkillverify
End-to-end app testing pipeline for browser-based web apps on cloud browsers via Azure Playwright Workspaces: verify the live app, author tests for working flows, heal failing tests, then re-run with video and produce one consolidated report. Three phases (app verification, test authoring, test healing) plus a scoped final sanity run; each phase emits a sub-report. Use when asked to "verify my app", "make sure my app works and has good test coverage", "do a full QA pass", "add tests where I'm missing coverage", "fix failing tests and add new ones", "smoke test before deploy", "QA my deployment", or any combined verify-and-test ask. Requires Azure CLI (`az login`) and a Playwright Workspace resource ID — bootstraps configs on first invocation. Browser-based web apps with Playwright only — not for unit/API tests, native mobile/desktop, load/perf, or full accessibility audits.
Also in 3 projects that use this
Other versions23 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 23
- 0xfurai/peekaping★ 1.2ksame name
- kjnez/claude-code-django★ 177same name
- peterpme/skills★ 28same name
- ConnorGriffin/skills★ 21same name
- kyle-chalmers/ticketwright★ 4same name
- AaravChadha/acstack★ 2same name
- gingerminds/claude-skills★ 2same name
- codingpains/skills★ 1same name
- HoussemDjeghri/self-review★ 1same name
- ilamanov/skills★ 1same name
13 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository5 other files it gives its agents.
- graphifySkill
- orchestrateSkill
- playwright-qaSkill
- qa-runSkill
- worktree-graphsSkill
The file
We split this skill into the rules it gives an agent
1 rule. 0 are common, 1 is distinctive, and 0 are very specific to this project.
0
Common
Most of the 20 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 164
Always testable: Every ticket — bug or feature — ends with steps a tester can follow and observable outcomes to confirm, never a re-listing …
“Common” is measured: kept by at least 6 in 10 of the 20 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
ticket — human-readable Linear / Jira ticket creator
You (the main thread) run this skill to turn a request or a chunk of the current conversation into a clean, human-readable ticket in the project's tracker. The whole point is no AI slop: short, specific, scannable, written like a teammate filed it. You already have the conversation in context — mine it for the problem, the design links, and the test results; don't make the user repeat themselves.
Scope — global default, project override
This is the global ticket skill — it works in any project except ones that should use their own ticket workflow instead. Before anything else, check whether the current project owns ticket creation, and if so stand down:
- Project ships its own ticket skill — if the repo has a project-scoped ticket/issue-creation skill under
<root>/.claude/skills/, or one named in itsCLAUDE.md, defer to it. A project skill namedticketalready overrides this one automatically; this guard also covers skills with a different name. - Local opt-out list — if
~/.claude/ticket-defer-repos.txtexists, read it: one repo identifier per line (matched againstgit config --get remote.origin.url/git remote -v). If the current repo matches any line, do not run this skill — defer to that repo's own ticket workflow and tell the user you're using its standard, not this global one. The list is local and uncommitted, so private repo names never leave the machine.
Everywhere else, proceed with the steps below.
Config (per project)
State lives in <project-root>/.claude/tickets.local.json. It holds no secrets (just the tracker choice + team/project mapping), so a team may commit it as .claude/tickets.json to share. Read both if present; tickets.local.json wins.
{
"version": 1,
"tracker": "linear", // "linear" | "jira"
"linear": {
"team": { "id": "…", "key": "ENG", "name": "Engineering" },
"project": { "id": "…", "name": "Web app" }, // or null
"defaultLabels": ["bug"] // optional
},
"jira": {
"cloudId": "…", // Atlassian site id
"project": { "key": "PROJ", "name": "…" },
"defaultIssueType": "Bug" // Bug | Task | Story
}
}Tracker tool names are detected live each session (MCP names change) — never store them. Missing config → run the detect + mapping gates once, then write it.
Steps
- Resolve project + check scope.
root = $(git rev-parse --show-toplevel 2>/dev/null || pwd). First apply the scope guard above — if this repo ships its own ticket skill or matches the local defer list, stop here and defer. Otherwise read$root/.claude/tickets.jsonthen$root/.claude/tickets.local.json(local wins). - Detect the tracker (only if
trackernot in config):- List connected MCP tools (
claude mcp list, and the deferred-tool list in this session). Linear = a tool whose name containslinearand creates issues (e.g.…Linear__save_issue). Jira = an…Atlassian__…or…jira…MCP. - Corroborate from the repo: Jira if branch/commit identifiers look like
ABC-123(git log --oneline -20,git branch --show-current); Linear if commits/PRs referenceENG-123-style ids or a.linearconfig exists. - Both available / ambiguous → AskUserQuestion: "Which tracker does this project use?" (Linear / Jira). Only one → use it. Neither → stop and tell the user to connect a Linear or Atlassian (Jira) MCP (via claude.ai integrations or
claude mcp add), then re-run. - Save the choice.
- List connected MCP tools (
- Map team / project (only if not in config). Load the tracker's read tools via
ToolSearchand call them:- Linear —
list_teams→ AskUserQuestion which team (storeid/key/name). Thenlist_projectsfor that team → ask which project (or "none"). Optionallylist_issue_labelsto offer default labels. - Jira — find the Atlassian MCP; if it isn't authenticated, run its
authenticatetool and walk the user throughcomplete_authenticationfirst. Then list sites (cloudId) and projects → ask which project + default issue type. - Save the mapping so this gate never runs again.
- Linear —
- Mine the conversation for content. From the request + recent context, pull:
- The core point — in plain words: for a bug, the broken behavior; for a feature, the functionality added and the problem it solves / what the user can now do.
- Where it lives / where to find it — for a bug, the real file/component/endpoint (
src/auth/middleware.ts, thePOST /ordershandler); for a feature, how a tester reaches it (the page/screen/flow + entry point, plus any flag, role, or test data needed). Name it; never write "the relevant module". - Reproduction (bug) or how to test (feature) — concrete, numbered steps with the expected result, from what was actually discussed. Write them so QA can follow without guessing.
- Design / references — every
figma.comlink, Claude/v0/preview design URL, and screenshot or image path shared in the conversation. - Test results — the most recent qa-run / manual-qa verdict,
npm test/pytest/CI output, or repro logs. These go in a comment, not the body (step 8). - The flow — when the ticket involves multi-step or multi-component logic (a request path, state machine, async chain, permission cascade), note the actual path (user action → component → endpoint → data) so you can diagram it in the draft.
- One request may be several tickets ("create tickets for X, Y, Z") → draft one ticket per distinct problem. Don't cram unrelated things into one.
- Enrich from any connected MCP that adds real signal. Check what's connected (
claude mcp list+ this session's deferred-tool list) and pull context for this ticket only — never invent, never dump a dashboard:- Figma (
…Figma__…) — for anyfigma.comlink in the chat:get_screenshotto render the actual frame (attach the image, not just the URL) andget_design_context/get_metadata/get_variable_defsfor the intended layout, components, and key tokens (sizes, colors, spacing). Turns a bare link into a real Design section the implementer can build to. - Sentry (
…Sentry__…) — if the bug references an error, stack trace, or Sentry link:get_issue_full_context/get_issue_debug_summaryfor the real exception, affected releases/users, and top frames. One-line summary + link in the body; the full trace goes in the comment (step 8). - Slack (
…Slack__…) — if the report came from a thread (link, or "as discussed in #channel"): read it for the original context/decision and link it as the source. - GitHub / git — link the relevant PR, commit, or branch (
gh pr view,git log) so the ticket points at the code in flight. - PostHog / Grafana / Supabase — only when the ticket is about metrics or data: pull one concrete number (error rate, affected row count, funnel drop), not a dashboard dump.
- Notion / Google Drive — if a spec/PRD is referenced, link the doc instead of paraphrasing it.
- Rule: use an MCP only if it's installed AND relevant to this ticket. Each pull must earn its place — one line of real signal beats a paragraph of filler. Connected-but-irrelevant or not-connected → skip silently.
- Figma (
- Draft using the anti-slop template (below). Then show the rendered draft(s) to the user for a quick confirm before creating — unless they said "just create it / don't ask". Let them edit title/labels/scope inline. This review step is what keeps tickets human.
- Create the issue via the tracker's create tool (load its schema with
ToolSearchfirst):- Linear —
save_issuewithtitle,description(markdown),teamId,projectId(if set),labelIds(map default labels). Attach each design link / screenshot withcreate_attachment(or upload viaprepare_attachment_upload→create_attachment_from_uploadfor local image files) so they show as real attachments, not just inline text. - Jira — create the issue under the mapped project + issue type with a markdown/ADF description. Add design links as remote links or in a References section; upload screenshot files as attachments if the MCP supports it, else link them.
- Linear —
- Post test results (and other long evidence) as a comment (not in the description) when the conversation has a recent run:
save_comment(Linear) / the Jira comment tool. Keep it human — a one-line verdict plus the key pass/fail lines and a timestamp, e.g. "QA run 2026-06-18: login + checkout PASS; discount code FAIL (total ignores code) — see body." Full Sentry traces or logs gathered in step 5 go here too. Don't paste the entire dump; link it or trim to the failing lines. - Report back the created ticket's identifier + URL (one line per ticket). If a draft was rejected, don't create it.
The anti-slop ticket template
Write it the way a good engineer files a ticket for the teammate who picks it up next — often a tester / QA, not just the implementer. Pick Bug or Feature by the request. A feature ticket isn't a dev spec: a tester reading it must come away knowing what it does / what problem it solves, where to find it, the design, and exactly how to test it. Include only the sections that have real content — delete the rest. Markdown.
Bug
**What's happening**
<1–2 plain sentences: the observed broken behavior.>
**Where**
<the real file / component / page / endpoint — name it.>
**Steps to reproduce**
1. …
2. …
- Expected: …
- Actual: …
**How it flows** ← only for multi-step / multi-component logic
```mermaid
flowchart LR
User -->|clicks Pay| Checkout --> API["POST /orders"] --> DB[(orders)]
API -. breaks here .-> X[total ignores discount]
```
<one line: what the diagram shows and where it breaks.>
**Likely cause** ← only if you actually have a lead
<one line — the suspected root cause.>
**Design / references** ← only if links/screenshots exist
- Figma: <link>
- <screenshot / preview link>
**How to verify the fix**
- [ ] <observable outcome, not an implementation step>
- [ ] …Feature / task — written so a tester can pick it up and verify it
**What & why**
<1–2 plain sentences: the functionality added and the problem it solves / what the user can now do. The point, not a feature list.>
**Where to find it**
<how a tester reaches it: the page / screen / flow + entry point, plus any flag, role, or test data needed to see it.>
**How it flows** ← only for multi-step / multi-component logic
```mermaid
flowchart LR
User -->|uploads CSV| ImportPage --> API["POST /imports"] --> Queue --> Worker --> DB[(rows)]
```
<one line: what the diagram shows — the happy path a tester walks.>
**Design** ← only if links/screenshots exist
- Figma: <link> (frame rendered + attached if a Figma MCP is connected)
- <screenshot of the intended result>
**How to test**
1. <concrete step a tester follows>
2. …
- Expected: <what they should see / be able to do>
**Done when**
- [ ] <observable outcome a tester can confirm>
- [ ] …
**Out of scope** ← only if worth calling out
- <what this does not cover yet>Rules — what keeps it human, not AI slop
- Title says the actual thing, ≤ ~70 chars. Bug → the broken behavior ("Checkout total ignores discount code"). Feature → what's new ("Add CSV export to the reports page"). Never "Implement a comprehensive solution for…".
- Plain, direct voice. Present tense, like a Slack message to a colleague. No throat-clearing ("This ticket aims to…"), no restating the title in the first line.
- Ban filler. No comprehensive / robust / seamless / powerful / leverage / utilize, no emoji spam, no "As an AI". Cut every word that adds no information.
- Be specific. Real file paths, real symbols, real URLs, real numbers — never "the relevant component" or "various places".
- Short beats complete-looking. A small bug is a few lines. Don't manufacture sections or nested bullet trees to look thorough. Omit empty sections entirely.
- One problem per ticket. Split a multi-part request into multiple tickets.
- Diagram complex flow; skip trivial ones. When the logic spans multiple components or steps (request path, state machine, async chain, permission cascade), add ONE small Mermaid diagram (
flowchartorsequenceDiagram, ~5–10 nodes) in the How it flows section so a human grasps the flow at a glance — label the arrows with what actually happens ("clicks Pay", "retries 3×"), and in a bug mark where it breaks. Linear renders Mermaid natively; in Jira it shows as a code block, which is still readable — keep it small enough to read as text. A one-screen bug or single-component change gets no diagram — a forced diagram is its own kind of slop. - Always testable. Every ticket — bug or feature — ends with steps a tester can follow and observable outcomes to confirm, never a re-listing of the implementation steps. A feature without "where to find it" + "how to test" is unfinished.
- Evidence lives in a comment. Full logs, stack traces, complete test output → step 8's comment, so the description stays scannable.
- Confirm before creating (unless told not to). Surface the draft; the user's quick edit is the last guard against slop.
- Respect saved config. Tracker + team/project are decided once; don't re-ask. The user changes them by editing
.claude/tickets.local.json.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

