spec-impl
klerith/fernando-skills
Implements approved specs by creating git branches and stepping through implementation with diff reviews.
What is spec-impl?
Automates the workflow of taking an approved specification and implementing it step-by-step. Validates the spec's approval state (in any language), creates a dedicated git branch, and guides implementation with pauses to review changes before proceeding.
- Validates that a spec's state means 'Approved' regardless of language
- Derives and creates a git branch named after the spec (e.g., spec-01-mvp-arkanoid)
- Checks for uncommitted changes before switching branches
- Resumes previous work by reading git history if the branch already exists
- Displays spec objective and scope before starting implementation
- Steps through implementation incrementally with pauses to review diffs
How to install spec-impl
npx skills add https://github.com/klerith/fernando-skills --skill spec-impl- Git repository initialized in the current directory
- specs/ folder containing .md specification files
- Optional: specs/.spec-config.yml for AutoCreateBranch configuration
How to use spec-impl
- 1.Run the skill with the spec name or number (e.g., npx skills add ... --skill spec-impl 01-mvp-arkanoid)
- 2.If no argument provided, select from the list of available specs in specs/
- 3.Review the spec's approval state when prompted
- 4.Confirm branch creation or choose to implement on current branch
- 5.Review the spec objective and scope summary
- 6.Proceed through implementation steps, pausing at each diff for review
Use cases
- Starting implementation of a newly approved feature specification
- Resuming work on a partially-implemented spec from a previous session
- Ensuring team specs follow approval workflow before development begins
- Managing multiple parallel spec implementations across different branches
- Reviewing implementation progress incrementally rather than all at once
- Development teams using spec-driven workflows
- Project leads managing feature specifications and implementation tracking
- Individual developers implementing approved specifications
- Teams using git-based branch strategies for feature work
spec-impl FAQ
The skill stops and shows an error message. You must manually update the spec's state to 'Approved' (or its equivalent in your language) before the skill will proceed.
Yes. The skill recognizes 'Approved' equivalents in Spanish (Aprobado), Portuguese (Aprovado), French (Approuvé), German (Genehmigt), Italian (Approvato), and other languages.
The skill warns you and asks whether to commit/stash them yourself or continue anyway. It does not stash or commit on your behalf unless explicitly requested.
Yes. If the branch already exists, the skill reads the git log, shows which steps appear done, and asks which step to resume from.
If set to true (default), the skill automatically creates and switches to the spec branch. If set to false in specs/.spec-config.yml, it asks for permission first.
Full instructions (SKILL.md)
Source of truth, from klerith/fernando-skills.
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:
-
Check the working tree first. Look at the
git status --shortoutput 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 branchWait 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.
-
Derive the branch name from the spec file's full name, without the extension. Format:
spec-NN-slug. Examples:01-mvp-arkanoid.md→ branchspec-01-mvp-arkanoid02-powerups.md→ branchspec-02-powerups
-
Read the
AutoCreateBranchflag from the Branch-creation config shown in the session context above.- If the config file does not exist, the value is missing, or the value is unrecognized → treat it as
true(the default). - Only an explicit
false(in any capitalization) disables automatic branch creation.
If
AutoCreateBranchistrue(default): proceed without asking.- If the branch does not exist: create it with
git checkout -b spec-NN-slug. - If it already exists: this means previous work is being resumed. Switch to it, read
git log --onelineon the branch, and tell the user which steps of the plan already look done and which step you propose to resume from. Wait for confirmation on the resume point before implementing anything. - In both cases: switch to the branch with
git checkout spec-NN-slugand confirm the change was successful before continuing.
If
AutoCreateBranchisfalse: ask before touching git. Show:AutoCreateBranch is set to false. Create and switch to the branch spec-NN-slug? [y/N]- If the user answers yes: create/switch to the branch exactly as in the
truecase above. - If the user answers no or leaves it empty: do not create any branch. Tell the user you will implement on the current branch (the one shown in the session context above) and ask for explicit confirmation to continue there. Do not improvise — wait for the answer.
- If the config file does not exist, the value is missing, or the value is unrecognized → treat it as
-
Visually confirm to the user the spec is ready and which branch is active:
✅ Ready to implement. Spec: specs/NN-slug.md Branch: spec-NN-slug (active) (← or the current branch, if no new branch was created) State: Approved (← echo back the actual value found in the spec) -
Do not start implementing yet. First show the spec summary to the user so they have it fresh. Extract and show:
- The objective (the line after
**Objective:**/**Objetivo:**/ equivalent label). - The scope (the
## Scope/## Alcance/ equivalent section). - The implementation plan (the section with the numbered steps —
## Implementation plan/## Plan de implementación/ equivalent). - The acceptance criteria (the checklist —
## Acceptance criteria/## Criterios de aceptación/ equivalent).
- The objective (the line after
Match section headings by meaning, not by exact wording — the spec may be authored in any language.
Phase 4 — Implement step by step
After showing the spec summary, tell the user:
I am going to implement the spec following the implementation plan exactly.
I will pause after each step so you can review the diff.
Shall we start with Step 1?
Wait for explicit confirmation ("yes", "go ahead", "go", or equivalent). Do not start without it.
Once confirmed, follow these rules during the entire implementation:
Never commit automatically. Not per step, not at the end. You write the code and show the diff; committing is the user's decision and the user's command. Only commit if they explicitly ask you to.
One rule above all: implement what the spec says. If something in the spec looks suboptimal to you, mention it as an observation but implement what was agreed. Changes to the spec go into the spec, not into the code by surprise.
Work rhythm:
- Implement one step of the plan.
- Show a summary of which files you touched and what you did.
- Say:
Step N completed. Could you review the diff and let me know if I continue with Step N+1? - Wait for confirmation before continuing.
If during the implementation you find an ambiguity the spec does not resolve:
- Stop.
- Describe the ambiguity exactly.
- Present two or three concrete options.
- Wait for the user's decision.
- Do not improvise.
If the user asks for something that is out of the spec's scope:
- Remind them that it is out of this spec's scope.
- Suggest noting it down for the next spec.
- Do not implement it on this branch.
When finishing the last step:
✅ All steps of the plan are implemented.
Next step: verify the spec's acceptance criteria one by one.
If they all pass, update the spec's state to "Implemented" (or the equivalent
in your repo's language) and make the final commit before merging this branch.
Summary of expected behavior
/spec-impl 01-mvp-arkanoid
Phase 1 → Finds specs/01-mvp-arkanoid.md
Phase 2 → Reads the state → "Approved" (or "Aprobado", etc.) → ✅ continues
Phase 3 → git checkout -b spec-01-mvp-arkanoid → git checkout spec-01-mvp-arkanoid
Shows objective, scope, plan and criteria
Phase 4 → Implements step by step with pauses
Ends by reminding to verify the acceptance criteria
/spec-impl 02-powerups (state: Draft / Borrador)
Phase 1 → Finds specs/02-powerups.md
Phase 2 → Reads the state → "Draft" → ❌ stops
Shows the standard error message
Does not create branch, does not touch code
Branch creation is controlled by the AutoCreateBranch flag in specs/.spec-config.yml. It defaults to true (create the branch automatically, as shown above). Set it to false to make Phase 3 ask [y/N] before creating the branch.
Related skills
More from klerith/fernando-skills and the wider catalog.

spec
Guided spec designer that clarifies requirements before writing code.

kling-cli
Official Kling AI CLI for image/video generation, reusable Elements, and motion control via MCP.

mcp2cli
Turn any MCP server, OpenAPI spec, or GraphQL endpoint into a CLI without code generation.

memory-optimize
Optimize Claude Code memory files in 4 interactive steps, reducing token count by 30-50%.

text-optimizer
Reduces token count in prompts and docs by 20–40% using 52 research-backed optimization rules.

finlab
Comprehensive quantitative trading package for global stock markets with backtesting, factor analysis, and strategy development.