Skip to content
Back to skills

Linear Sync

ASecurity

Sync an approved toto-wolff P10 plan into a Linear issue through an already-authenticated Linear MCP connector. Use only when the user explicitly runs `/linear-sync <plan-path> --team <name> --project <name>`; never run it automatically or as a side effect of a /p10 approval.

  • 7 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 29, 2026
ai-agentsgoapi

Works with

  • cli
  • api
  • mcp

Security analysis

A100/100

Scanned October 6, 2026

npx -y skills add ray-aqno/Toto-Wolff --skill linear-sync --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Linear Sync?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Linear Sync
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/ray-aqno-linear-sync/badge)](https://www.skillsdirectory.com/skills/ray-aqno-linear-sync)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: linear-sync
description: >
  Sync an approved toto-wolff P10 plan into a Linear issue through an already-authenticated
  Linear MCP connector. Use only when the user explicitly runs
  `/linear-sync <plan-path> --team <name> --project <name>`; never run it automatically or
  as a side effect of a /p10 approval.
---

# linear-sync

Syncs an approved toto-wolff P10 plan into a Linear issue, using an already-authenticated
Linear MCP connector. No custom Linear client, no new package dependency — this skill only
orchestrates existing MCP tool calls (`get_user`, `list_teams`, `list_projects`,
`list_issue_statuses`, `save_issue`).

**Trigger:** `/linear-sync <plan-path> --team <name> --project <name>`. Human-invoked only.
Never runs automatically, never as a side effect of a `/p10` approval.

**Assumption (explicit, not implicit):** this skill depends on an authenticated Linear MCP
connector being present in the invoking session. It does not manage, initiate, or guarantee
that connection — it only verifies it at the start of each run (Step 0 below).

---

## Step 0 — Runtime connector pre-flight (every invocation, before all else)

Attempt a lightweight Linear MCP call (`get_user` with `query: "me"`, or `list_teams`).

- If it errors, is unavailable, or Linear MCP tools are not present in the current
  session's tool list: refuse immediately. Tell the user to authorize the Linear
  connector via `claude mcp` or their connector settings, and stop.
- No retry. No fallback path. Do not proceed to any step below until this check passes.

## Step 1 — Required inputs

- Plan file path (required).
- Team name or ID (required).
- Project name or ID (required).

If team or project is omitted, ask the user for it. **Never** guess or fuzzy/semantic-match
a team or project from a partial name — this workspace has 15+ projects across multiple
teams and an already-cluttered backlog; a wrong match creates real clutter in a real
workspace.

## Step 2 — Pre-flight checks (in order, after Step 0)

1. **Plan status.** Read the plan file. Confirm its frontmatter has `status: approved`.
   If not, refuse and explain why — do not proceed with a draft, blocked, or
   revision-required plan.
2. **Team and project resolution.** Call `list_teams` and `list_projects`. Confirm the
   given team/project names or IDs resolve to an exact match. If either does not match,
   refuse and explain — do not let Linear's own API error on `save_issue` be the first
   signal of a bad name.
3. **Backlog-status resolution.** Call `list_issue_statuses` for the resolved team.
   Find the entry whose `type` field indicates a backlog-type status — **do not** match
   on the literal string `"Backlog"`, since workspace status names vary. Use that
   status's ID as the default `state` param for `save_issue`. If no backlog-type status
   exists for the team, refuse and explain.

## Step 3 — Title classification (deterministic, not judgment)

Search the plan file's body text for the regex `Revision:\s*\d+`.

- **Match found** (the plan went through a revision cycle — investigatory/uncertain):
  prefix the title with `"SPIKE: "`.
- **No match** (clean single-pass approval): prefix the title with `"STORY: "`.

Full title: `"{PREFIX}{task title}"`, where the task title comes from the plan's H1
heading or its `task:` frontmatter field.

This is a mechanical string check. Do not use judgment or "does this feel exploratory"
reasoning here — the regex is the entire rule.

## Step 4 — Description synthesis (fixed template only)

Build the description in exactly this shape — no free-form matching to any other
issue's style, no additional sections:

```
**User Story:** *As a [role], I want [capability], so that [outcome]*

## Overview

- [one-line stage summary]
- [the plan's single biggest named risk, from its Risk Surface / Consequences section]
- Full plan: [vault path to the P10 plan file]
```

Rules:
- The User Story line is synthesized **only** from the plan's "Why this approach" section.
- The Overview has **exactly three** sub-bullets — no more, no fewer.
- Hard cap: **under 400 words total**, title + description combined.
- **Do not invent, infer, or add any fact not present in the plan file's own text.** If
  a required section (Why this approach, Risk Surface, etc.) is missing from the plan,
  say so in the Step 5 confirmation preview and ask the user how to proceed — never
  fabricate content to fill the template.

## Step 5 — Confirm-before-write (mandatory, unconditional, no bypass)

> **This is the first real, hard-to-fully-undo write this skill can make.** Everything
> before this point is read-only. Do not skip this step. Do not default through it
> silently under any condition, including reruns.

Render the full proposed issue back to the user:

- Title
- Full synthesized description
- Resolved team
- Resolved project
- Resolved status (the backlog-type status from Step 2.3, shown as the **default**)

Require explicit user go-ahead before calling `save_issue`.

- If the user wants a different initial status (e.g. `Todo` instead of `Backlog`), use
  their choice for **this run only** — the default resolution logic in Step 2.3 is
  unchanged for future runs.
- If Step 4 surfaced a missing-section fallback, this is where the user decides how to
  proceed — the skill never guesses on their behalf.

## Step 6 — Create the issue

Call `save_issue` with exactly these parameters:

- `title` (Step 3)
- `description` (Step 4)
- `team` (resolved, Step 2.2)
- `project` (resolved, Step 2.2)
- `state` (resolved default or user override, Step 5)

**Closed parameter set.** Do not pass `labels`, `assignee`, `delegate`, `cycle`, or
`milestone` — none of these are in scope for this skill. Adding any of them requires a
new P10 plan.

## Step 7 — Report the result

- **Success:** surface the created issue's ID and URL to the user.
- **Error:** show the raw error message and stop. No retry. No silent continue.

---

## Non-goals (binding — do not extend this skill to cover these without a new P10 plan)

- No semantic or fuzzy matching for team or project selection.
- No automatic sync triggered by a `/p10` approval — this skill is always human-invoked.
- No automatic stage/status movement after the initial sync (a separate future skill).
- No delegation to Linear's native "agent" assignee concept.
- No non-interactive/headless/CI-triggered sync path. If ever needed, that requires a
  real MCP client built inside `packages/mcp-server` (which already depends on
  `@modelcontextprotocol/sdk`), gated by its own future P10 plan — not silently added
  here.

## Reference

Full P10 plan and arbiter conditions:
`P10-Plans/2026-07-06-toto-wolff-linear-sync-skill.md` in the governance vault.
ADR-0009 (`ADR/adr-0009-use-linear-mcp-server-instead-of-custom-integration.md`)
established the "use Linear's MCP server, no custom client" decision this skill
implements.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.