write-feature-ticket
$
npx mdskill add ClipboardHealth/core-utils/write-feature-ticketDrafts precise Linear tickets by interviewing users for clarity.
- Captures user needs and problem framing without implementation details.
- Integrates with Linear and the interview-feature skill for gaps.
- Validates problem shape before drafting to ensure quality.
- Delivers a ready-to-submit ticket or requests clarification.
SKILL.md
.github/skills/write-feature-ticketView on GitHub ↗
--- name: write-feature-ticket description: Use when creating a Linear feature request ticket from conversation context, a brief description, or code/PR analysis. Interviews the user for clarity when context is insufficient. --- # Write Feature Ticket Draft Linear feature request tickets that describe what users need and why — never how to implement it. Dispatches to the `interview-feature` skill when context is insufficient to write a clear ticket. ## Process 1. **Assess context** — check what's known from conversation, HLD, PR, or prior investigation 2. **Clarity gate** — does the available context answer: (a) Who is affected? (b) What can't they do? (c) Why does it matter? Is the framing problem-shaped? Are there no invented details? - **Yes** → step 3 - **1-2 factual gaps** (missing repo, unclear who) → ask the user directly. Don't dispatch the full interview for a single missing data point. - **Structural problems** (solution-shaped framing, no problem articulated, mostly unknowns) → dispatch `interview-feature` skill. Receive a structured problem brief. Re-check gate against the brief. - If `interview-feature` terminates without producing a problem brief (user refused to articulate a problem), abort the ticket process. Inform the user that the ticket cannot be created without a problem statement. 3. **Final validation** — run the checklist below before drafting. This is the ticket skill's own quality check — it doesn't blindly trust upstream context. 4. **Assess scope** — does the problem contain multiple independent user-facing outcomes? If so, decompose into parent + sub-issues, each describing one outcome. Decomposition is about what the user gets, not how the engineer builds it. 5. **Draft** — title + description, structure scaled to complexity (see Ticket Format below) 6. **Self-review** — check every item in [red-flags.md](red-flags.md) before presenting 7. **Suggest metadata (conditional)** — priority (Urgent/High/Medium/Low/No Priority), labels, project when context supports it. Present metadata suggestions BELOW the ticket body, separate from the description. 8. **Present for review** — show the draft to the user. Wait for explicit approval before proceeding. 9. **Create in Linear** — once the user approves (or approves with changes), create the ticket in Linear using the Linear MCP tools. For sub-issues, create parent first, then children linked to it. Apply any confirmed metadata. NEVER create without user approval. ## Final Validation Checklist Before drafting, verify ALL of these. If any fail, bounce back to `interview-feature` or ask the user directly: | Check | Fail condition | | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | | Problem is user-facing | Describes an implementation, not a user need | | Who is specific | "Users" without qualification | | Pain point is concrete | "Improve X" without what's wrong today | | Impact is articulated | No reason given for why this matters | | No invented details | Any claim not from the user, research, or conversation | | Unknowns are explicit | Gaps filled with plausible-sounding guesses | | No solution language | Context contains implementation details (field names, technology choices, component names) that could leak into the ticket — scrub before drafting | | Repository documented | No repo specified | ## Hard Rules - **Problem-first, solution-never.** Describe what the user needs and why. Never prescribe how to build it. If input contains technical solutions, the interview skill should have already reframed these — if they survived, strip them now. NEVER include a "Proposed Solution", "Approach", "Implementation", or "Technical Details" section. - **Acceptance criteria = observable outcomes.** Each criterion describes something a user or system can DO or OBSERVE when the work is done. Not implementation steps, not internal system behavior, not database changes. - **One ticket, one deliverable outcome.** If the problem contains multiple independent user-facing outcomes, decompose into parent + sub-issues — each describing one outcome. - **Never invent.** If a detail isn't established from the user, research, or conversation, it doesn't go in the ticket. Period. - **Approval required.** Always present the draft for user review first. Only create the ticket in Linear after the user explicitly approves. - **Always document the repository.** Every ticket must specify which repo the work belongs in. If the feature spans multiple repos, flag this — it likely needs separate tickets. - **Feature requests only.** Redirect bug reports to `write-bug-ticket`, tech debt to `write-tech-debt-ticket`. ## Ticket Format **Title:** Short, imperative, describes the CAPABILITY — not the implementation. Under 70 characters. **Repository:** Always include the repository name in the ticket body. Run `git remote get-url origin | sed 's/\.git$//' | sed 's/.*[:/]\([^/]*\/[^/]*\)$/\1/'` to get the `org/repo` name. For simple features, include as a bold inline label at the end. For complex features, include in `## Context`. **Simple feature** (single user story, <4 acceptance criteria): A paragraph stating the problem and who it affects, then acceptance criteria as a checklist, then repository. No section headers. **Complex feature** (multiple user stories, 4+ AC, or cross-cutting): Sections as needed: - `## Problem` — who is affected, what they can't do today, why it matters - `## Acceptance Criteria` — observable outcomes checklist - `## Context` — repository, links to HLD, related tickets (linking to technical docs is fine; inlining implementation details is not) - `## Scope` — in/out, if ambiguity exists **Sub-issues** (when decomposed): Each sub-issue follows the same format. Note blocking relationships (e.g., "_Blocked by: [sub-issue title]_"). **For self-review anti-patterns**, see [red-flags.md](red-flags.md). **For ticket examples** (good and bad), see [examples.md](examples.md).
More from ClipboardHealth/core-utils
- adversarial-reviewPerform an adversarial review of proposed work. Use ONLY when the user explicitly types /adversarial-review. Never auto-trigger, even if the user mentions reviewing, questioning, or challenging their approach.
- clipboard-testingEnd-to-end testing playbook for Clipboard Health changes. Use when the user wants to verify, exercise, or set up test data for a backend or frontend change against a live environment — "test my change end-to-end", "verify this works in dev", "create a test workplace / worker / shift", "get a shift through to paid / invoiced", "prove the API change works". Defaults to the `development` AWS environment, API-first (cbh CLI tokens + curl). The skill knows enough to run the core happy-path flow (workplace → worker → shift → clock in/out → pay → invoice) autonomously; for anything else, it orients around the codebase and asks the user for missing directories.
- cognito-user-analysisUse when looking up Cognito user details by sub UUID, finding duplicate accounts sharing phone or email, analyzing which duplicates to keep vs delete, or fixing orphaned UNCONFIRMED signups. Symptoms include 403 Forbidden on login, multiple accounts for same phone, backend sync issues.
- datadog-investigateInvestigate production issues by querying Datadog logs, metrics, and APM traces, then correlating findings with the codebase. Use this skill whenever the user mentions production errors, Datadog, observability, log investigation, latency spikes, error rate increases, 500s, trace IDs, monitor alerts, or wants to debug any service issue in a deployed environment.
- flaky-test-debuggerDebug and fix flaky tests including Playwright E2E, NestJS service/integration, React component, and unit tests. Use this skill when investigating intermittent test failures, triaging flaky tests, or fixing test instability.
- interview-featureUse when clarifying requirements for a feature ticket. Iteratively researches and interviews the user until the problem is well-understood, then produces a structured problem brief. Dispatched by write-feature-ticket when context is insufficient.
- investigate-ticketUse when investigating a bug, incident, or issue before implementation. Researches codebase, queries Datadog, and presents structured findings with handoff options. Also use when asked to "look into" or "investigate" something.
- local-packageUse Clipboard's internal CLI to link and unlink @clipboard-health packages across repositories for local development. Use when testing local package changes, linking @clipboard-health packages between repos, or using the cbh CLI local-package command.
- seed-dataTrigger seed data generation for test environments via GitHub Actions. Use when asked to seed, create test data, or set up HCPs/facilities/shifts.
- write-bug-ticketUse when creating a Linear bug report ticket from conversation context, investigation findings, or user-provided evidence. Focuses on structuring and writing — not investigating.