Your first spec

From a one-line piece of work to requirements, a design, an approved plan, and code — with a human decision between each. Longer than the other two pages, because most of the time is spent reading what was drafted for you.

This page needs a GitHub 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 is the one half of the extension that does not work without it.

  1. What you are about to make
  2. 1. New Spec
  3. 2. Argue about the requirements
  4. 3. Design — and notice there is no Approve button
  5. 4. The plan
  6. 5. Implement
  7. 6. The one thing that will stop you
  8. What you now have

What you are about to make

A folder of Markdown under .local-workflows/specs/, committed alongside your code. That is the whole artefact — no database, no service, no hidden state. Delete the extension and the documents are still there, still readable, still in your history.

You need no configuration to start. With no .local-workflows/config.yml at all you get the kiro style, specs under .local-workflows/specs, checkpoints on, and whichever model Copilot would have chosen. This page assumes exactly that.


1. New Spec

Open the Specs view and click + New Spec. It asks at most two questions — what kind of spec, and where the work item comes from — then creates the folder.

The two kinds it offers come from the style, not from the engine:

  Phases
Feature requirementsdesigntasksimplement
Bug fix requirementstasksimplement

Pick Feature. A bug fix skips design, because a one-line fix does not need a design document and a process that demands one teaches people to write a paragraph of nothing to get past the gate.


2. Argue about the requirements

A Copilot chat opens and writes the first document with you. This 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. Nothing is pending, nothing is blocked — the pipeline picks up when the file lands.

The moment requirements.md appears, the spec shows up in the Specs view and the panel offers the next phase.


3. Design — and notice there is no Approve button

The panel offers design. Click it.

Starting the next phase is the approval. There is no separate approve step anywhere in the process, because a second thing to click that changes nothing is a button people learn to press without reading — and a run recording “approved” against an unread document is worse than recording nothing.

So what you are actually deciding, when you click design, is “requirements.md is good enough to build on”. That gate lives on the phase that depends on the document rather than on the phase that wrote it, because depending on it is when the judgement is real.

Two things about the session that runs:

  • It is a fresh session, seeded only by requirements.md. Not your intake chat, not the folder.
  • What crosses a phase boundary is a file on disk, never a conversation. That is what makes this 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 for them to be missing.

Read design.md when it lands. If it is wrong, this is the cheap moment.


4. The plan

Click tasks. It writes tasks.md: a numbered plan (1, 1.1) with a dependency graph between tasks expressed as ordered waves. Tasks in one wave may run at the same time; a wave begins only when every task in every earlier wave is finished and ticked.

The rule that decides where the boundaries fall is worth knowing before you read it, because it is not the obvious one:

Every task ends green. The repository builds and its tests pass at the end of each task, not just at the end of the plan. So an interface and its implementation are one task. A changed signature and every caller it breaks: one task. A behaviour and the test that proves it: one task. Splitting any of them would leave the tree red in between, and a plan you cannot stop half-way through is a script rather than a plan.

You will also see checkpoint tasks — a top-level task that runs the full test suite and confirms it passes. A checkpoint verifies; it does not ask. It never waits for a human, because whoever started the plan already asked for it to be carried out. Turn them off with checkpoints: none in .local-workflows/config.yml if you must.


5. Implement

This phase is different in a way that matters: the engine does not wait here, and it never finishes. There are no artifacts to satisfy it.

Each task launches a native Copilot chat from the panel’s implement lens, one at a time. The engine writes documents; it does not write your code. Git is the record, and a ticked checkbox in tasks.md is the definition of done.

There is no gate on this phase either — the plan was approved by starting its first task.

Whether anybody watches the session is your choice. The panel offers to open the conversation; the work is happening in your repository either way.


6. The one thing that will stop you

An ## Open Questions section in any document blocks the next phase. While it holds questions, the 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 is there because every alternative is worse: a phase that proceeds anyway invents an answer, and one that merely warns gets clicked through.


What you now have

Look at git status. Three Markdown files under .local-workflows/specs/<your-spec>/, and the process state alongside them. All of it reviewable in a pull request.

That is the part that compounds. The judgement about what was required, what the design should be, and how the work was cut up stops living in one person’s chat history and becomes a file the team inherits.

It reads other people’s specs too. Point the extension at a repository full of spec folders somebody else made and it works out which style wrote each one from the documents in it, then picks up at the right phase — there is no import step. A folder that already has requirements.md starts at design, whether that file arrived five minutes ago or in a colleague’s commit last month.

Where to go next:

Samples/HelloWorld/.local-workflows/specs/ has spec folders with their requirements already written — read them without running anything, or point the extension at one and it picks up at design.


Back to top

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