- name
- linear-project-management
- description
- Guides Linear project management — creates projects over tracking issues, structures PRDs, phases milestones, sizes issues, applies labels, and formats cross-references. Use when creating Linear projects, planning work, or organizing issues.
- allowed-tools
- ToolSearch, Read
- metadata
- {"version":"1.0.0","author":"outfitter","category":"project-management","tags":["linear","project-management","workflow"]}
# Linear Project Management
Conventions for managing work in Linear. Covers project structure, PRDs, milestones, issue sizing, labeling, and cross-referencing.
## When to use this skill
- Creating or structuring a Linear project
- Writing a PRD or project description
- Breaking work into issues and milestones
- Deciding how to size, label, or cross-reference issues
- Posting project updates or status reports
## Projects Over Tracking Issues
**Always use Linear projects. Never use tracking issues** (parent issues with checklists or sub-issues used to group work).
Why:
- Projects have dedicated views, milestones, status updates, health tracking, and progress metrics
- Tracking issues conflate "the work" with "managing the work" — they show up in backlogs, get stale, and lack structure
- Projects support PRD-style content, timeline views, and cross-team visibility
### Project titles
Use backtick formatting for package names and technical terms:
```text
Batteries-included CLI conventions for `@outfitter/cli`
```
Linear renders backticks as inline code in titles, improving readability for technical projects.
### When to create a project
- Any coordinated effort spanning 3+ issues
- Work with distinct phases or milestones
- Efforts that need a PRD, success criteria, or status updates
Single issues don't need a project. But when in doubt, create the project — it's cheap and adds structure.
## Project Content as PRD
The project description field serves as the PRD. Use this structure:
### Template
```markdown
## Problem
What's wrong or missing. Be specific about who is affected and why the current state is inadequate.
## Solution
How we'll address it. High-level approach, not implementation details. Focus on the user-visible outcome.
## Design Principle
The guiding constraint that shapes decisions throughout implementation. One sentence.
Example: "Convention over configuration — sensible defaults, explicit overrides."
## Scope
### In scope
- Concrete deliverables (bullet list)
### Out of scope
- Things we're explicitly not doing (prevents scope creep)
## Milestones
### Milestone 1: Foundation
Core infrastructure. Issues: ...
### Milestone 2: Feature surface
User-facing functionality. Issues: ...
### Milestone 3: Polish
Edge cases, docs, DX refinements. Issues: ...
## Success Criteria
- Measurable outcomes that define "done"
- Include both technical criteria (tests pass, types check) and user criteria (workflow is faster, errors are clearer)
```
### Writing guidelines
- **Problem section**: Lead with the pain. Avoid solution-shaped problem statements ("We need to add X" is a solution, not a problem).
- **Design Principle**: One sentence. This is the tiebreaker for ambiguous decisions throughout the project.
- **Scope**: Be explicit about out-of-scope items. This prevents scope creep more than any other section.
- **Success Criteria**: Make them testable. "Better DX" is not a criterion. "CLI responds in <200ms for all commands" is.
## Milestones
Milestones group related issues into phases. They represent logical groupings, not strict sequential gates.
### Conventions
- **Milestones are concurrent within themselves** — issues in the same milestone can be worked in parallel
- **Milestones are roughly sequential** — Milestone 2 generally starts after Milestone 1 is mostly complete, but overlap is fine
- **Each milestone gets a description** — One sentence explaining what's achieved when this milestone is done
- **3-5 milestones per project** is typical. Fewer is fine. More suggests the project should be split.
### Naming pattern
Use descriptive names that convey what the milestone achieves:
| Pattern | Example |
| --------------- | ---------------------------------- |
| Foundation | Core types and contracts |
| Feature surface | User-facing commands and options |
| Integration | Cross-package wiring |
| Polish | Edge cases, docs, DX |
| Hardening | Performance, error handling, tests |
Avoid generic names like "Phase 1" or "Sprint 3" — they carry no meaning.
### Assigning issues to milestones
Every issue in a project should belong to a milestone. Unassigned issues create ambiguity about when they'll be addressed. If an issue doesn't fit a milestone, either:
1. Create a milestone for it
2. Question whether it belongs in this project
## Issue Sizing
Issues map 1:1 to pull requests. This is the fundamental sizing constraint.
### Target size
| Metric | Target | Hard limit |
| ------------- | --------- | --------------------- |
| Effective LOC | 100-250 | ~300 (non-mechanical) |
| Files touched | 3-5 | 8 |
| Review time | 30-60 min | 60 min |
**Effective LOC** = lines that require human review. Excludes lockfiles, codegen, formatting-only changes.
### Sizing heuristics
- **Too small**: Issue describes a one-line fix that doesn't warrant a PR description. Combine with related work.
- **Right size**: Issue has a clear single outcome, tests fit naturally, PR can be reviewed in one sitting.
- **Too large**: Issue requires multiple logical commits or touches unrelated subsystems. Split it.
### Stacked issues mirror stacked PRs
When work naturally sequences (each piece builds on the last), create stacked issues that mirror the PR stack:
```text
Issue: Add base types for config → PR 1 (foundation)
Issue: Implement config loader → PR 2 (stacked on PR 1)
Issue: Add CLI flags for config options → PR 3 (stacked on PR 2)
```
Use issue dependencies (`blocks`/`blocked by`) in Linear to express this ordering.
### Mechanical changes
Formatting, renames, codegen, lockfile updates — isolate these in their own issue/PR or mark clearly as mechanical. They inflate LOC counts and obscure meaningful changes when mixed with feature work.
## Labeling
**Every issue and project gets at least one label.** Labels enable filtering, reporting, and quick orientation.
### Common label dimensions
| Dimension | Examples | When to use |
| --------- | ------------------------------------------ | ---------------------------------- |
| Package | `@outfitter/cli`, `@outfitter/contracts` | Scopes issue to a specific package |
| Type | `feature`, `bug`, `chore`, `docs` | Classifies the nature of work |
| Concern | `DX`, `performance`, `security`, `testing` | Cross-cutting quality attribute |
### Guidelines
- **Use existing labels** before creating new ones. Check available labels first.
- **One package label per issue** when the change is scoped to a single package.
- **Multiple labels are fine** — an issue can be both `@outfitter/cli` and `DX`.
- **Project labels** should reflect the primary concern or domain, not individual issue types.
## Cross-Referencing
Consistent cross-referencing connects issues, PRs, and projects into a navigable web of context.
### Linear URLs — bare URLs only
When referencing Linear issues or projects from within Linear (descriptions, comments, updates), use bare URLs:
```text
https://linear.app/outfitter/issue/OS-176/outfittercli-first-class-queryability
https://linear.app/outfitter/project/batteries-included-cli-conventions-78e01e25016a
```
Linear auto-generates rich embeds with status badges, icons, and full titles. Using markdown link format (`[text](url)`) **downgrades** the rendering to plain text.
The URL slug after the issue ID is optional but improves readability.
### GitHub URLs — markdown links
When referencing GitHub PRs or issues from within Linear, use markdown link format:
```markdown
Implemented in [#405](https://github.com/outfitter-dev/stack/pull/405).
See [outfitter-dev/stack#42](https://github.com/outfitter-dev/stack/issues/42) for details.
```
GitHub URLs don't get rich embeds in Linear, so descriptive link text provides necessary context.
### Never use bare identifiers
`OS-176` and `#405` are not clickable in Linear. Always provide full URLs.
### Angle bracket gotcha
Linear's storage wraps URLs in angle brackets internally (`[text](<url>)`). This can break rendering in some contexts. This is another reason bare URLs are preferred for Linear-to-Linear references.
## Commenting conventions
### Issue comments
- Use comments for status updates, decisions, and context that emerged after issue creation
- Reference relevant PRs, related issues, or blocking items with proper cross-references
- Avoid noisy comments ("Working on this", "Started") — Linear has status fields for that
### Project updates
Post project updates for milestone completions, blockers, or significant progress. Include:
- **Health status**: `onTrack`, `atRisk`, or `offTrack`
- **What's changed** since the last update
- **What's next** — upcoming work or decisions needed
- **Blockers** if any
## API Quick Reference
### Tool selection
| Operation | Tool |
| ------------------------ | ---------------------------------------------------------------- |
| Create/update issues | `mcp__claude_ai_Linear__create_issue`, `update_issue` |
| Create/update projects | `mcp__claude_ai_Linear__create_project`, `update_project` |
| Milestones | `mcp__claude_ai_Linear__create_milestone`, `update_milestone` |
| List/search | `mcp__claude_ai_Linear__list_issues`, `list_projects` |
| Labels | `mcp__claude_ai_Linear__list_issue_labels`, `create_issue_label` |
| Documents | `mcp__claude_ai_Linear__create_document`, `update_document` |
| Project status updates | `save_status_update` or GraphQL for more control |
| Comments with formatting | GraphQL `commentCreate` (the `comment` action breaks newlines) |
### Before calling any Linear tool
Linear MCP tools are deferred. Load them first:
```text
ToolSearch with query: "+linear <operation>"
```
For complete API recipes, GraphQL patterns, and gotchas, see `references/api-patterns.md`.
View on GitHub