Skip to content
Writing
Skill

/spec-impl

Implements an approved spec. Validates that the state means "Approved" (in any language), creates a git branch named after the spec, switches to it, and starts the implementation step by step with pauses to review diffs.

BOOST
From plugin
fernando-skills
3112 skills
Install
$ npx -y skills add klerith/fernando-skills --skill spec-impl --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/spec-impl

Context preview

The summary Claude sees to decide when to auto-load this skill.

Implements an approved spec. Validates that the state means "Approved" (in any language), creates a git branch named after the spec, switches to it, and starts the implementation step by step with pauses to review diffs.

SKILL.md

spec-impl.SKILL.md
name: spec-impl
description: Implements an approved spec. Validates that the state means "Approved" (in any language), creates a git branch named after the spec, switches to it, and starts the implementation step by step with pauses to review diffs.
disable-model-invocation: true
argument-hint: <NN-spec-name>
allowed-tools: Read, Glob, Grep, Edit, Write, AskUserQuestion, Bash(git status:*), Bash(git branch:*), Bash(git checkout:*), Bash(git log:*), Bash(git diff:*), Bash(git stash:*), Bash(cat:*), Bash(ls:*)

/spec-impl — Implementer of approved specs

Session context

Current repository state: !`git status --short`

Current branch: !`git branch --show-current`

Specs available in this folder: !`ls specs/ 2>/dev/null || echo "The specs/ folder does not exist"`

Branch-creation config: !`cat specs/.spec-config.yml 2>/dev/null || echo "AutoCreateBranch: true (default, no config file)"`

---

Instructions

Follow these four phases in strict order. **Do not advance to the next phase if the previous one did not complete correctly.**

---

Phase 1 — Identify the spec

The received argument is: `$ARGUMENTS`

If `$ARGUMENTS` is empty:

  • List the files available in `specs/` (you already have them above).
  • Ask the user to specify the exact name of the spec.
  • Stop and wait for an answer. Do not continue.

If `$ARGUMENTS` has a value:

  • Look for the file in `specs/`. The user may have written the full name (`01-mvp-arkanoid`), only the number (`01`), or only the slug (`mvp-arkanoid`). Try to find the correct file in any of those cases.
  • If you do not find the file, show the available specs and ask the user to correct the name.
  • If you do find it, continue to Phase 2.

---

Phase 2 — Validate the spec's state

Read the spec file you located in Phase 1 using the Read tool or `cat`.

In the file's contents, look for the line that contains the spec's state. The header label is typically `**Status:**` (English) or `**Estado:**` (Spanish), but it may use any language. Match by position (status line near the top of the spec) and by the surrounding state machine, not by the exact label.

**Absolute rule:** You can only continue if the state **means "Approved"** — regardless of the language used.

Treat any of the following (and their equivalents in other languages) as the **Approved** state and continue:

  • English: `Approved`
  • Spanish: `Aprobado`
  • Portuguese: `Aprovado`
  • French: `Approuvé`
  • German: `Genehmigt`
  • Italian: `Approvato`
  • …or any other language's word that clearly means "approved"

Anything else (Draft / Borrador, In review / En revisión, Implemented / Implementado, Obsolete / Obsoleto, or any unrecognized value) means **stop** and show the error message below.

| State category | Examples (any language) | Action | | ----------------------------------------- | ------------------------------------------------- | -------------------------------------------------------------------------- | | Approved | `Approved`, `Aprobado`, `Aprovado`, `Approuvé`, … | Continue to Phase 3. | | Draft | `Draft`, `Borrador`, … | Stop. Show the error message below. | | In review | `In review`, `En revisión`, … | Stop. Show the error message below. | | Implemented | `Implemented`, `Implementado`, … | Stop. Show the error message below. | | Obsolete | `Obsolete`, `Obsoleto`, … | Stop. Show the error message below. | | State line not found / unrecognized value | — | Stop. The file does not follow the expected format. Tell this to the user. |

If you are unsure whether a value means "approved", **do not assume**. Stop and ask the user to clarify or to update the spec to the canonical wording.

**Standard error message when the state does not mean Approved:**

❌ I cannot implement this spec.

Current state: [STATE FOUND]
I only work with specs whose state means "Approved" (e.g. `Approved`, `Aprobado`,
or the equivalent in another language).

To continue you have two options:
  1. If the spec is ready to be implemented, open it and change the state
     to "Approved" (or the equivalent term your team uses) manually.
     That change is made by the human, not the agent.
  2. If the spec still needs work, use /spec [name] to resume it.

Do not offer alternatives, do not suggest "I can still start if you want". The block is intentional.

---

Phase 3 — Create the git branch and switch to it

Once you have confirmed the state means `Approved`:

0. **Check the working tree first.** Look at the `git status --short` output in the session context above. If it is **not empty**, stop and show the pending changes, then ask:

   ⚠️ There are uncommitted changes in the working tree.
   Switching branches would carry them over. What do you want to do?
     1. Commit or stash them yourself, then re-run this command  (recommended)
     2. Continue anyway — the changes travel to the new branch

Wait for the answer. **Do not stash or commit on the user's behalf** unless they explicitly ask for it. If the working tree is clean, skip straight to step 1 without mentioning it.

1. Derive the branch name from the spec file's full name, without the extension. Format: `spec-NN-slug`. Examples:

  • `01-mvp-arkanoid.md` → branch `spec-01-mvp-arkanoid`
  • `02-powerups.md` → branch `spec-02-powerups`

2. Read the `AutoCreateBranch` flag from the **Branch-creation co

Read more
Ships withfernando-skills

Spec-driven development skills for Claude Code, Cursor, Codex, and Antigravity. By Fernando Herrera.

Get the whole plugin
Stats
312
Stars
53
Forks
Active
Maintenance
Shell
Language
MIT
License
10d ago
Last commit
5mo ago
Created
3h ago
Added

Repo: klerith/fernando-skills

Other skills on fernando-skills.

spec
Skill

spec

Designs and develops specs following the spec-driven method. Asks clarifying questions before proposing structure, and builds the…