Spec-driven development

A workflow whose tasks are AI-drafted documents and human decisions: requirements, design, plan, then implementation. Each phase runs a fixed prompt in a clean session, and the whole process state is committed to git.

Keys and defaults only: the cheat sheet.

  1. What a spec is
  2. The loop
    1. There is no Approve button
    2. Each phase runs in a fresh session
    3. The last phase is yours
  3. The one hard block
  4. Existing specs are read, not just written
  5. Choosing a style
  6. Configuration

What a spec is

A folder of Markdown under .local-workflows/specs/, committed alongside your code. Nothing else — no database, no service, no hidden state. Pull the repository and you have the specs; delete the extension and the documents are still there, still readable, still in your history.

Needs a Copilot sign-in. The document phases run on the ai@1 plugin with its default ghcp provider, and the implement phase launches Copilot Chat, so this half of the extension is the one part that does not work without it.


The loop

+ New Spec asks at most two questions — what kind of spec, and where the work item comes from — then creates the folder and opens a Copilot chat to write the first document with you.

That first one is a conversation rather than a form, deliberately. It is the document worth arguing about, and a chat gets more out of a person than a set of fields does. The engine starts that session and does not wait on it — the pipeline picks up when the document lands.

The moment that file lands, the spec appears in the Specs view and the panel offers the next phase. From there each phase is one click.

There is no Approve button

Starting the next phase is the approval. One click, one decision.

A separate approve task would be a second thing to click that changes nothing — and a button people learn to press without reading is worse than no gate at all.

Each phase runs in a fresh session

A phase is seeded only by the documents before it. What crosses a phase boundary is a file on disk, never a conversation.

That is what makes the process portable: a teammate pulls the folder and carries on from exactly where you left off, because there was never any context living in your chat history that they would be missing.

The last phase is yours

The engine writes documents; it does not write your code. The implement phase starts a session and does not wait on it — the agent works, the panel offers to open the conversation, and whether anybody watches is your choice. Git is the record, and a ticked checkbox in tasks.md is the definition of done.


The one hard block

An ## Open Questions section stops the pipeline. While it holds questions, the next phase will not start, and the panel says so.

Answer them in the document, or delete the section.

It is the only hard block in the whole process, and it exists because every other way of handling an unresolved question is worse: a phase that proceeds anyway invents an answer, and one that merely warns gets clicked through.


Existing specs are read, not just written

Point the extension at a repository full of specs somebody else made and it works out which style wrote each folder from the documents in it, then picks up at the right phase. There is no import task.

This falls out of one rule: a stage whose artifacts already exist is satisfied. A spec folder that already contains requirements.md starts at design without visiting requirements — whether that file arrived from an intake chat five minutes ago or from a colleague’s commit last month.


Choosing a style

A style is the process: which phases exist, what each writes, where the gates are, and the prompts behind them.

Two ship, and they are genuinely different shapes rather than the same one renamed:

  Phases Shape
Kiro requirementsdesigntasksimplement three documents, a gate between each; Bug fix skips design
Spec Kit specifyplantasksimplement one phase writes several documents; a flat T001 task list

Pick the one your team already writes. If neither, start with Kiro — three documents with a gate between each is the smaller idea, and switching later costs one line of config.

You are not limited to those two. Writing your own style is a YAML file and a folder of prompts; no code changes, and your style appears in the + New Spec menu beside the built-ins.


Configuration

Everything is optional. With no configuration at all, kiro runs on whichever model Copilot would have chosen.

Create .local-workflows/config.yml to change that:

# The process. 'kiro' or 'spec-kit', or a style you wrote yourself.
style: kiro

# Where spec folders live, relative to the repository.
# Ignored when a .code-workspace is open - see below.
specRoot: .local-workflows/specs

# Where work items come from. Leave it out and New Spec asks each time.
source: ado          # manual | ado | gh

# Full-test-suite verification tasks in the plan.
checkpoints: required   # required | optional | none

ai:
  # What runs the AI phases.
  uses: ai@1

  # Which agent runtime it runs them on. The vendor is named here and
  # nowhere else.
  provider: ghcp

  # 'auto' lets the provider choose, which is the right default - a
  # pinned model name goes stale, and a team with no opinion should not
  # be made to hold one.
  model: auto

  # Per-phase, keyed by phase id. Merged over the defaults above one
  # setting at a time, so naming only 'thinking' keeps the model.
  stages:
    design:
      model: claude-opus-5
      thinking: high

Every key, its default, and every error the file can raise: config.yml.


Table of contents


Back to top

Local Workflows is a VS Code extension. Everything it does is declared in a YAML file you own.