Decompose a plan into dependency-ordered Linear issues (tracer-bullet vertical slices) and release them into the autonomous dispatch pipeline.
Scanned 9/4/2026
Install to Claude Code
npx -y skills add sliamh11/Deus --skill linear-slice --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Linear Slice?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/sliamh11-linear-slice)More formats (shields.io, HTML) on the badges page.
---
name: linear-slice
description: Decompose a plan into dependency-ordered Linear issues (tracer-bullet vertical slices) and release them into the autonomous dispatch pipeline.
user_invocable: true
---
# /linear-slice
Turn a plan or PRD into a set of **thin, vertical, independently-shippable slices**, each created
as a Linear issue in dependency order, then released into Deus's autonomous dispatch pipeline.
This is the missing front-end to the Linear pipeline: the webhook gates (`enrichment-gate` →
`bouncer-gate` → dispatcher) describe how an issue *flows through* the board, but not how a good,
independently-grabbable issue gets *created*. This skill creates them.
Creating issues is a deliberate action with real side effects. **Always preview and get explicit
approval before creating anything.**
## How the pipeline works (the contract you must honor)
The board is `Backlog → Todo → Ready for Agent → Agent Working → In Review → Done`. Gates fire on
**transitions into** a state, never on issue creation:
- **Backlog → Todo** fires the **enrichment gate**, a *mutating* controller that writes the scope
block into the issue description itself (wrapped in `<!-- gate:enrichment-gate:start -->` …
`<!-- gate:enrichment-gate:end -->`).
- **Todo → Ready for Agent** fires the **bouncer gate**, which validates that scope block.
- The dispatcher then picks up `Ready for Agent` issues autonomously.
Consequences for this skill:
- **Create issues in Backlog.** A freshly created issue fires no gate, so it sits inert until moved.
- **Never pre-write the enrichment scope block.** It is gate-owned. Write a normal human
description; the enrichment gate generates the `## Scope` block on the Backlog→Todo transition.
- **Never apply a `Scoped` label.** The dispatcher matches `Scoped`; applying it to a non-enriched
issue would make the dispatcher pick up unscoped work. The gate manages that label.
- **Releasing = moving Backlog → Todo.** That is how you start the pipeline on a slice.
## Steps
### 1. Get the plan
Take the plan from one of, in priority order:
- An explicit argument (a file path, or pasted text).
- The current conversation (a plan just drafted/approved here).
- A parent Linear issue (`mcp__linear__linear_getIssueById`) whose body is the plan to decompose.
If no plan is identifiable, ask the user for one. Do not invent scope.
### 2. Decompose into tracer-bullet vertical slices
Break the plan into the smallest set of **vertical slices**. Each slice must:
- Cut through every layer needed to be **independently demoable** (a thin end-to-end thread, not a
horizontal layer like "all the types" or "the whole API").
- Deliver one tangible increment of value on its own.
- Put **prefactoring first** — if a slice needs a seam that doesn't exist yet, make the
prefactor its own earlier slice.
**Use codegraph before estimating blast-radius** (a skill body inherits no exploration hook, so
this is on you): for each slice that touches existing code, run `codegraph_impact` /
`codegraph_callers` on the symbols it changes to size the real blast-radius and surface prefactor
opportunities. Do not guess from filenames. Fall back to `search_code` then grep only to confirm.
### 3. Build the dependency graph
Determine the `Blocked by` edges between slices (prefactors block the features that need them; a
shared scaffold blocks its consumers). Keep it a DAG. The **unblocked (root)** slices are the ones
that can start immediately.
### 4. Resolve Linear context
(If the plan came from a parent Linear issue in Step 1, you already used
`mcp__linear__linear_getIssueById` to read it.)
- `mcp__linear__linear_getTeams` → pick the team (single team `LIA` in this workspace).
- `mcp__linear__linear_getProjects` → confirm the target project with the user. **Every issue must
be assigned to a project — never leave an issue floating** (orchestration rule).
- `mcp__linear__linear_getWorkflowStates` (with `teamId`) → resolve the **Backlog** and **Todo**
state IDs. The call returns `[{id, name, type, position, …}]`. **Match by exact `.name`**
(`"Backlog"`, `"Todo"`) — **never by `.type`**: there are two `type:"backlog"` states ("Icebox"
and "Backlog"), so a type match is ambiguous and can land issues in Icebox. Resolve IDs at
runtime; never hardcode them.
### 5. Preview and get approval
Present, and then **stop and wait** for explicit approval:
- A slice table: `# | Title | One-line scope | Blocked by | Effort (trivial/small/medium/large)`.
- The dependency graph (ASCII or mermaid).
- The target project, and which slices will be auto-released to Todo (the unblocked ones).
Do not create anything until the user approves. If they want changes, revise and re-preview.
### 6. Create the issues (on approval)
For each slice, `mcp__linear__linear_createIssue`:
- `teamId`, `projectId` (mandatory), `title` = `[Slice N] <concise name>`.
- `description` written with **actual newlines, never `\n` escape sequences** (MCP double-escapes
them into literal `\\n`). Use these GENERAL sections (this is not a frontend skill — do not use
design-to-dev's Wireframe/Design-Tokens/shadcn sections):
```markdown
## Overview
What this slice delivers and why it is independently shippable.
## Acceptance criteria
- Observable, checkable outcomes that mean this slice is done.
## Dependencies
Blocked by: [Slice K] <name> (and the Linear relation below). "None" if a root slice.
## Definition of Done
- Builds/tests pass; criteria met; reviewed.
```
- Land in **Backlog** (set `stateId` to the resolved Backlog id, or leave unset — Backlog is the
default). Do **not** write the enrichment scope block. Do **not** add a `Scoped` label. **Omit
`priority` and `estimate`** — let the enrichment gate or the user set them; do not guess.
### 7. Link the dependencies
For each `Blocked by` edge, `mcp__linear__linear_createIssueRelation` (type `blocks`/`blocked_by`)
between the two created issue IDs, so the board reflects the DAG.
### 8. Release the unblocked slices
For each **root (unblocked)** slice, `mcp__linear__linear_updateIssue` to set `stateId` → the
resolved **Todo** id. This fires the enrichment gate and starts the autonomous pipeline. Leave
blocked slices in Backlog. Do **not** auto-release subsequent waves: tell the user which slices are
now blocked and on what, and let them re-approve (or manually release) each later wave. A blocked
slice advancing without fresh approval would push unreviewed work into the pipeline.
### 9. Cap handling — never silent-partial
If `mcp__linear__linear_createIssue` fails with `exceeded the free issue limit` (Linear free-plan
cap), **STOP immediately**. Report exactly which slices were created (with IDs) and which were not,
and which relations/releases did or didn't happen. Offer to archive old issues and resume, or to
resume later. Never leave a half-created graph unreported.
A gate or API failure is an **error, not an approval** — never proceed as if a failed step
succeeded.
### 10. Summary
Report: created issue IDs + URLs, the dependency graph, and which slices were released to Todo
(now in the pipeline) vs left in Backlog.
## Notes
- Preview-first is mandatory; this skill mutates a shared system of record.
- A change to a slice's scope after creation must move that issue back per the orchestration rules
(scope change → back to the relevant step so the gate re-evaluates).
- Companion to `/design-to-dev` (which creates issues from *design wireframes*); this is the
general-plan analog.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!