Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Start work on a Linear ticket — fetches the issue, creates a properly-named local git branch in the right repo, moves the ticket to "In Progress", and assigns it to the current user. Use when the user says "start ticket", "start linear ticket", "begin work on EXSC-XXX", "/start-ticket", "let's start <ID>", or supplies a Linear issue ID/URL with intent to begin work. Mirrors the "Create branch" button from Jira, but also handles the status flip and ownership claim in one step — designed for orgs
.claude/skills/lifinance-start-linear-ticket/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | 581% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 439% | 0% |
| case-23 | ✗→✓ | ▲ Improved | 603% | 0% |
| case-18 | ✓→✗ | ▼ Worse | 221% | 0% |
| case-19 | ✓→✗ | ▼ Worse | 393% | 0% |
User says any of:
/start-ticket <ID-or-URL>Do NOT trigger on read-only intents ("what's EXSC-282 about?", "show me <ID>", "any updates on <ID>"). Those are get_issue calls, not start-work.
EXSC-282, COM-14, EXP-377 (case-insensitive, normalize to upper)https://linear.app/lifi-linear/issue/EXSC-282/some-slugLinear team prefix maps to the repo where work happens. Keep this list close to the user's actual workflow — extend by adding rows:
| Team prefix | GitHub repo | Default branch | Local clone (default search) | |---|---|---|---| | EXSC | lifinance/contracts | main | ~/Documents/GitHub/contracts | | COM | lifinance/Yggdrasil | main | ~/Documents/GitHub/Yggdrasil | | EXP | lifinance/lifi-backend | main | ~/Documents/GitHub/lifi-backend | | DO | lifinance/devops | main | ~/Documents/GitHub/devops |
If the team prefix isn't in the table, ask the user which repo before proceeding. Don't guess.
Finding the local clone — try in order, stop at first hit:
~/Projects/<repo-name>, ~/Code/<repo-name>, ~/dev/<repo-name>, ~/src/<repo-name>.find ~/Documents ~/Projects ~/Code ~/dev ~/src -maxdepth 4 -type d -name "<repo-name>" (case-sensitive).git clone into the default location if they want.EXSC-282-style ID from the path segment after /issue/.^[A-Z]+-\d+$.Use Linear MCP get_issue with the parsed ID. Pull these fields:
id, identifier, title, state.name, assignee, team.key, urlattachments / gitBranches (if exposed) — to detect existing linked branchesIf the issue can't be found, surface the error verbatim and stop. Don't invent.
Skip-the-work conditions, in priority order:
<name> exists. Want me to switch to it locally?" If yes:git fetch origin <branch>git show-ref --verify --quiet refs/heads/<branch>) → git checkout <branch> and then git merge --ff-only origin/<branch> to pick up any remote commits.git checkout --track origin/<branch> to create a local tracking branch from the remote.This works regardless of whether the branch was created remotely (e.g. via Linear's "Create branch" button) or already exists locally from a previous session — the plain git checkout <branch> fails in the remote-only case.
If none of these apply, continue.
Format: feature/<lowercase-id>-<slugified-title> — this matches the workspace-configured Linear branch format (feature/identifier-title) so the integration auto-links on first push.
Slugification rules (apply in order):
-.-.- within the limit).- if truncation created one.Examples:
EXSC-282 + "Earn Monetization v2: Custom Vault Wrapper Design & Estimate" → feature/exsc-282-earn-monetization-v2-custom-vault-wrapper-designCOM-14 + "Fix flaky test in route resolver" → feature/com-14-fix-flaky-test-in-route-resolverShow the computed name to the user before checkout — they may want to override (e.g. fix/, chore/, scoped prefix). Accept any valid git ref name; if it doesn't contain the ID, warn that Linear won't auto-link.
In the resolved repo path:
bash# verify clean state — don't clobber uncommitted work cd <repo-path> git status --porcelain
If git status --porcelain returns anything, stop. Show the user the dirty state and ask what to do:
git stash push -m "auto-stash before <ID>", then continue.Once clean:
bashgit fetch origin <default-branch> git checkout -b <branch> origin/<default-branch>
Always base off fresh origin/<default-branch> — never off the local repo's current HEAD. The local repo is very often parked on a feature branch from previous work, and silently inheriting whatever commits sit on that branch would mix unrelated changes into the new ticket. Explicitly using origin/<default-branch> as the base ref sidesteps this completely: the new branch starts from exactly the same commit a fresh git clone would land on.
Do NOT use git checkout main && git pull && git checkout -b <branch> — that mutates the local main branch, which the user may have intentionally pinned for some reason, and it requires a temporary checkout of main that fails if the working tree is dirty in ways the step-5 clean check missed. The git fetch + checkout -b origin/<default> pattern updates only the remote-tracking ref and never touches local main.
Use origin/main for all repos in the mapping above. If a repo uses a different default (e.g. master, develop), detect via git symbolic-ref refs/remotes/origin/HEAD (or git remote show origin | grep "HEAD branch" as a fallback) and use that.
Use Linear MCP save_issue with:
id: the issue ID from step 2state: "In Progress" (the MCP resolves state names server-side against the issue's team)If the call fails because the name doesn't resolve (e.g. a team uses a non-standard label), fall back to list_issue_statuses for the team, surface the available states, and ask the user which one to use.
Skip if the ticket is already In Progress (idempotent — don't error).
Use Linear MCP save_issue with:
id: the issue IDassignee: "me" (the MCP resolves this to the authenticated user — don't hardcode an email or user ID so the skill works for any teammate who installs it)Skip if the ticket is already assigned to the current user. If assigned to someone else, follow the rule from step 3 — only reassign if the user confirmed takeover.
One-line summary:
Started <ID> — <title>
branch: <branch-name>
repo: <local-path>
linear: <linear-url>If anything was skipped (already In Progress, already assigned, etc.), note it in a second line so the user knows what state things are in.
git checkout -b fails because branch exists) → surface the existing branch; offer to switch to it (git checkout <branch>) or pick a suffix like -2.git stash automatically; always ask.feature/identifier-title) so the auto-link works on first push without manual PR-body magic words. Magic words (Fixes EXSC-282) are still a fine fallback for ad-hoc branches that don't follow the format.git fetch && git checkout dance locally. Doing it locally is one step.fix/ instead of feature/" → honor for this run; don't persist.git worktree add ../<repo>-wt-<short-id> -b <branch> origin/<default> instead of checkout -b. Useful when the user has uncommitted work on the current branch they don't want to stash.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | fail→fail | 5,864 | 9,524 | +62% | 1 | 1 | 0% | 906 | 3,473 | +283% | 0 | 0 | — |
case-13 | fail→pass | 3,530 | 7,122 | +102% | 1 | 1 | 0% | 606 | 4,125 | +581% | 0 | 0 | — |
case-01 | fail→fail | 6,348 | 5,204 | -18% | 1 | 1 | 0% | 413 | 3,064 | +642% | 0 | 0 | — |
case-02 | fail→fail | 7,527 | 5,665 | -25% | 1 | 1 | 0% | 1,193 | 3,048 | +155% | 0 | 0 | — |
case-03 | fail→fail | 13,079 | 5,649 | -57% | 1 | 1 | 0% | 447 | 3,033 | +579% | 0 | 0 | — |
case-04 | fail→fail | 5,733 | 4,921 | -14% | 1 | 1 | 0% | 304 | 3,009 | +890% | 0 | 0 | — |
case-05 | fail→fail | 5,981 | 7,060 | +18% | 1 | 1 | 0% | 1,003 | 3,808 | +280% | 0 | 0 | — |
case-06 | fail→fail | 4,309 | 10,423 | +142% | 1 | 1 | 0% | 723 | 2,986 | +313% | 0 | 0 | — |
case-07 | fail→pass | 4,647 | 13,827 | +198% | 1 | 1 | 0% | 772 | 4,159 | +439% | 0 | 0 | — |
case-08 | fail→fail | 3,094 | 8,623 | +179% | 1 | 1 | 0% | 461 | 3,603 | +682% | 0 | 0 | — |
case-09 | fail→fail | 6,069 | 13,858 | +128% | 1 | 1 | 0% | 942 | 3,259 | +246% | 0 | 0 | — |
case-10 | pass→pass | 3,685 | 7,158 | +94% | 1 | 1 | 0% | 598 | 3,902 | +553% | 0 | 0 | — |
case-11 | fail→fail | 3,383 | 7,221 | +113% | 1 | 1 | 0% | 362 | 3,185 | +780% | 0 | 0 | — |
case-14 | pass→pass | 16,654 | 8,929 | -46% | 1 | 1 | 0% | 3,020 | 4,645 | +54% | 0 | 0 | — |
case-15 | fail→fail | 3,526 | 7,301 | +107% | 1 | 1 | 0% | 599 | 3,130 | +423% | 0 | 0 | — |
case-16 | fail→fail | 9,942 | 5,883 | -41% | 1 | 1 | 0% | 847 | 3,073 | +263% | 0 | 0 | — |
case-17 | fail→fail | 3,802 | 5,439 | +43% | 1 | 1 | 0% | 463 | 3,022 | +553% | 0 | 0 | — |
case-18 | pass→fail | 6,569 | 8,391 | +28% | 1 | 1 | 0% | 1,082 | 3,471 | +221% | 0 | 0 | — |
case-19 | pass→fail | 4,148 | 5,082 | +23% | 1 | 1 | 0% | 605 | 2,983 | +393% | 0 | 0 | — |
case-20 | fail→fail | 6,304 | 7,053 | +12% | 1 | 1 | 0% | 890 | 3,123 | +251% | 0 | 0 | — |
case-21 | fail→fail | 4,139 | 3,573 | -14% | 1 | 1 | 0% | 540 | 3,161 | +485% | 0 | 0 | — |
case-22 | pass→fail | 3,573 | 6,259 | +75% | 1 | 1 | 0% | 512 | 3,127 | +511% | 0 | 0 | — |
case-23 | fail→pass | 3,182 | 1,601 | -50% | 1 | 1 | 0% | 420 | 2,952 | +603% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 7 counted toward the lift figure. The other 16 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of 0 percentage points is the difference between those two pass rates over the 7 comparable cases. 5 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.