Plan, create, and improve Linear issues with business-level clarity. Use this skill whenever the user wants to create a Linear issue, improve an existing one, file a bug, plan a feature, create a chore/enabler, or mentions "linear issue", "file an issue", "create a ticket", "log a bug", "new issue", "plan this work", "improve this issue", or "clean up this ticket". Also trigger when the user says "I found a bug", "we need a ticket for...", "can you create an issue for...", "break this down into issues", or pastes a Linear issue URL/ID. This is the required way to create and maintain issues — it ensures every issue follows the team's format and is scoped for small PRs.
91
88%
Does it follow best practices?
Impact
97%
2.48xAverage score across 3 eval scenarios
Passed
No known issues
This skill helps structure well-defined Linear issues that serve as the source of truth for implementers and testers. Issues describe the business problem and expected behavior — never the implementation approach.
The human provides the business context. Claude helps structure it clearly, fill in gaps by asking questions, and ensure consistency with team standards. Claude does not invent business requirements or prescribe technical solutions.
Issues must be written at the business level. They define what needs to happen and why — not how to implement it. The implementer (human or AI) decides the technical approach.
Never include in an issue:
Always include in an issue:
The issue is the "protection line" — when an implementer says "I did everything the task says," the task must clearly define what success looks like in business terms.
## Why
We need to adjust prices to be displayed in ACT
## What
USDC will gone, so ACT needs to replace it in all places but instead of ACT
AEP-76 requires deploy-web to show `$`
There are few flows that should work:
1. Deployment creation flow
2. Money authorization creation flow
3. Add funds to escrow account
Transactions fee is paid in uAKTShort. Business-focused. Describes the flows that need to work. No file paths. No implementation plan. An implementer knows exactly what to validate.
This skill operates in two modes. Detect which one based on what the user asks:
CON-123, or URL). Follow the Improve Existing Issues workflow instead.There are three templates. Pick the one that matches what the user describes:
If the user doesn't specify a type, infer it from context. A report about something not working → Bug. A request for new behavior → Feature. Internal cleanup or tooling → Enabler.
Every issue must be assigned to a project. Suggest a project by querying the live project list, then ask the user to confirm or change it before creating the issue.
linear project list --all-teams to get the current list of projects — names and slugs change over time, so always query the live list rather than relying on a static mapping.Note: "Console" (CON) is the team, not a project. All issues belong to team CON and are assigned to a project within it.
When creating the issue, use --project "<project name>" in the CLI command.
Every issue should have a source label indicating where it came from. Infer from context or ask the user:
| Label | When to use |
|---|---|
source:customer | User/customer reported the issue (support ticket, feedback, user complaint) |
source:error-log | Discovered via Grafana, Sentry, error logs, or monitoring alerts |
source:internal | Team-identified improvement, tech debt, or internal request |
source:roadmap | Planned feature from product roadmap, Figma designs, or product specs |
If the user pastes a Sentry error or Grafana alert → source:error-log. If they say "a user reported..." → source:customer. If they describe a planned feature or link Figma → source:roadmap. Internal cleanup or DX improvements → source:internal.
Include the source label alongside the type label (Bug/Feature/Improvement) using multiple --label flags.
Set the initial workflow status based on issue readiness:
| Status | When to use |
|---|---|
| Triage | Default for most new issues — needs validation/prioritization by tech lead |
| Backlog | Issue is well-defined with clear acceptance criteria but not yet prioritized for a cycle |
| Todo | Issue is fully ready to pick up — has all context, is prioritized, and a dev can start immediately |
Use --status "<status>" in the CLI command. Default to Triage unless the user explicitly says the issue is ready to work on.
Ask the user what they need. If they give enough context upfront, don't interrogate — fill in what you can and confirm the rest.
The user's input is the primary source of business context. Claude cannot invent business requirements — if something is unclear, ask. Focus on understanding:
Infer the source from how the user describes the issue (customer report, error log, internal idea, roadmap item). If unclear, ask.
For bugs and production incidents, observability data adds real evidence to the issue description.
Grafana — Search logs for errors and stack traces, find error patterns, check error rates and latency. Include links to dashboards and key log lines in the issue.
Amplitude — Query event data to understand scope/frequency, check if users have reported the issue. Include usage numbers to quantify impact.
Use ToolSearch to discover available methods on these MCP servers before calling them. Only query what's relevant. Redact tokens, emails, user IDs, and any sensitive payload fields before posting.
The goal is to add evidence (error rates, affected user counts, log links) to the issue — not to derive implementation plans from the data.
Write the issue at the business level. It should be useful to anyone — implementer, tester, product manager, tech lead — as a source of truth for what needs to happen.
What belongs in the issue:
This is critical. Every issue should map to a single small PR that's easy to review. The repo has an automated PR size labeler — aim for S or M PRs. Avoid L and XL at all costs.
PR size labels (from .github/workflows/labeler.yml, excludes lock files and drizzle migration meta):
| Label | Lines changed | Target |
|---|---|---|
| XS | < 50 | Ideal for config changes, one-liner fixes |
| S | 50–199 | Ideal for most issues |
| M | 200–499 | Acceptable for features with tests |
| L | 500–999 | Too large — split further |
| XL | 1000+ | Never — always split |
When splitting, each issue should still be a business-level slice — not a technical layer. "Add ACT pricing to deployment creation flow" is a good split. "Update utility functions" is not.
How to split:
Issue ordering:
When NOT to split:
For each issue, fill the appropriate template.
## What's broken
[One sentence describing the broken behavior. Link to Sentry/Grafana if available.]
## Repro
1. ...
2. ...
## Expected vs Actual
Expected: [what the user should see/experience]
Actual: [what happens instead]## Why
[The business need or user problem.]
## What
[What we're building, described in user-facing terms. Link Figma/AEP/discussion if applicable.]
Flows that should work:
1. [Business flow 1]
2. [Business flow 2]
## Acceptance Criteria
- [ ] [Business-level criterion a tester can validate]
- [ ] ...
## Notes
[References, edge cases. Do NOT list dependencies here — use native Linear relationships instead.]## Why
[What this unblocks or improves — in business terms.]
## What
[What needs to change, described at the business level.]Drop any section that has no content — empty placeholders are worse than no section.
Show the user ALL issues you plan to create with the following details for each:
Let them adjust before you create anything.
Then create each issue using the Linear CLI:
DESC_FILE=$(mktemp /tmp/linear-issue-desc.XXXXXX.md)
cat <<'EOF' > "$DESC_FILE"
<description content>
EOF
linear issue create \
--title "<title>" \
--description-file "$DESC_FILE" \
--no-interactive \
--team "CON" \
--project "<project name>" \
--status "<Triage|Backlog|Todo>" \
--label "<Bug|Feature|Improvement>" \
--label "<source:customer|source:error-log|source:internal|source:roadmap>" \
[--priority <1-4>] \
[--assignee "<assignee>"] \
[--parent "<parent-issue-id>"]
rm "$DESC_FILE"Always use --description-file (not inline --description) and --no-interactive. Use mktemp for unique temp file names to avoid collisions.
For multi-issue plans, create the parent issue first, then create child issues with --parent pointing to the parent's ID.
After creation, set up relationships between issues using the Linear MCP save_issue tool. Linear supports these native relationship types — use them instead of writing dependencies in the description text:
| Relationship | save_issue field | Meaning |
|---|---|---|
| Parent / Sub-issue | parentId | Set during creation with --parent or via save_issue({ id, parentId }) |
| Blocked by | blockedBy: ["CON-123"] | This issue cannot start until CON-123 is done |
| Blocks | blocks: ["CON-456"] | This issue must be done before CON-456 can start |
| Related | relatedTo: ["CON-789"] | Issues are related but don't block each other |
These fields are append-only — adding a new relationship never removes existing ones. To remove a relationship, use removeBlockedBy, removeBlocks, or removeRelatedTo.
Example: After creating three issues where issue 2 depends on issue 1, and issue 3 is related to both:
save_issue({ id: "CON-102", blockedBy: ["CON-101"] })
save_issue({ id: "CON-103", relatedTo: ["CON-101", "CON-102"] })After creation, show the user all issue identifiers/URLs.
Each issue gets two labels — one for type and one for source:
Type labels (based on issue type):
BugFeatureImprovementSource labels (based on where the issue came from):
source:customer — customer/user reportedsource:error-log — discovered via monitoring/logssource:internal — team-identifiedsource:roadmap — planned from roadmapUse multiple --label flags in the CLI command to apply both labels.
When the user references an existing issue, the goal is to bring it up to team standards — add missing business context and ensure it serves as a clear source of truth.
linear issue view <issue-id> --json --no-pagerCompare the current description against the appropriate template (Bug / Feature / Enabler). Identify:
Focus on adding business clarity:
If the issue is too large for a single PR, propose splitting it into child issues — each covering a business flow or feature boundary. Present the split plan to the user before executing.
Show the user what you propose to change. Let them adjust.
Then update:
DESC_FILE=$(mktemp /tmp/linear-issue-desc.XXXXXX.md)
cat <<'EOF' > "$DESC_FILE"
<updated description>
EOF
linear issue update <issue-id> \
--description-file "$DESC_FILE"
rm "$DESC_FILE"If splitting into sub-issues, create the new child issues with --parent <issue-id> after updating the parent.
If the title also needs improvement, add --title "<improved title>" to the update command.
After updating, set up any missing relationships using the Linear MCP save_issue tool (see the relationship table in Phase 5). If the issue mentions dependencies in plain text, convert them to native blockedBy/blocks/relatedTo relationships and remove the text from the description.
609b56d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.