Spec-driven development for coding agents

The engineering discipline your coding agent is missing.

Empirical SDD turns a request into a spec, checks, review, and a clean merge, all recorded in your repository. Every step has proof. Nothing ships without your sign-off. And any session can pick up exactly where the last one stopped.

Shell · install
npm install --global empirical-sdd
empirical install

Why

Fast is not the same as done.

Coding agents write code quickly. Empirical SDD adds the process that makes it safe to ship.

Without a harness

The agent guesses what you meant.

With Empirical SDD

A spec you agreed on, before any code.

Without a harness

Done means it looked done.

With Empirical SDD

Done means the checks ran, with receipts.

Without a harness

The agent reviews its own work.

With Empirical SDD

An independent review of the exact diff.

Without a harness

Merged wherever, whenever.

With Empirical SDD

Merged into a clean target, only with your sign-off.

How it works

Install once. Then just ask.

  1. 01

    Shell

    Install

    Run npm install --global empirical-sdd, then empirical install and pick your agents.

  2. 02

    In your agent

    Initialize

    Type /empirical-init in Claude Code or $empirical-init in Codex. Review the proposed setup, then apply it.

  3. 03

    In your agent

    Ask for a change

    Ask like you always do. Empirical SDD takes it from there: spec, checks, proof, next step.

Coming back later?

Open the same checkout and say:

In your agentContinue the active feature.

Workflow

Process sized to the change.

Anything that changes behavior runs the full Complex loop. Small, reversible edits take the Fast route.

The Complex loop

  1. 01Specify

    Agree what done means.

  2. 02Design

    Pick the approach.

  3. 03Plan

    Break it down.

  4. 04Implement

    Write the code.

  5. 05 · if neededContext

    Refresh repo knowledge if stale.

  6. 06Verify

    Run the checks.

  7. 07Review

    Judge the diff.

  8. 08Integrate

    Merge into a clean target.

Verify failsBack to Implement. The failed attempt stays on record.
Review asks for changesBack to Implement, then verify and review again.

In words. Specify, Design, Plan, Implement. Refresh context only if the repo knowledge is stale. Verify, Review, Integrate. Any failure sends the work back to Implement. Deliver and Publish are separate, and each needs your sign-off.

Fast routeImplement Verify

Small, reversible edits skip the loop. The checks still run, and if a Fast attempt fails the work is promoted to Complex with the failed attempt on record.

01implementedthe code exists
02verifiedthe checks passed
03integratedreviewed and merged clean
04deliveredshipped where you allowed
05publishedreleased, for good

You get the level you actually reached, never the one you asked for.

Guardrails

It runs the process. You keep the authority.

Empirical SDD does

Keep the work honest.

  • Sorts every change by risk.
  • Writes down what was agreed and where things stand.
  • Runs the right checks and keeps every attempt on record.
  • Reports only what it can prove.

Empirical SDD never

Decides for you.

  • Replaces your model, Git, CI, or agent.
  • Keeps running after your agent stops.
  • Treats a confident answer as proof.
  • Merges, releases, or publishes without your say-so.

Proof

Three questions. Three separate answers.

01 · Evidence

Did the checks run?

Every acceptance criterion points to a real run and a receipt tied to that exact code. Change the code and the receipt goes stale.

02 · Review

Who looked at the diff?

A fresh-context reviewer or your review bot judges the exact committed diff. A green test is never mistaken for a review.

03 · Integration

Did it land clean?

Reviewed changes are replayed against a separate target before they count as shared behavior.

Using Linear or another tracker? Empirical SDD mirrors milestones outward and the repo stays in charge. Read how tracking works.

Under the hood

Everything it writes is a file you can read.

Setup adds a .empirical/ folder and a small entry in your agent instructions. Work adds specs, decisions, and receipts next to your code. No database, no background service.

Full treeBrowse every file it creates.
  • Marker-ownedEmpirical SDD manages only its bounded entry or block, preserving surrounding user content.
  • Agent/team-maintainedEmpirical SDD scaffolds it; repository evidence and maintainers refine it.
  • ConditionalCreated only for a chosen agent, route, phase, or required policy.
  • OptionalCreated only after explicit configuration or when that outcome exists.

Use Up and Down to move through paths, or Home and End to jump. Selecting a path updates the ownership detail beside the tree.

01

Written during Init

02

May appear as work advances

Not persisted: the dynamic packet returned to an isolated reviewer. Only a submitted canonical result, its human-readable rendering, pointer, and receipt belong in the committed tree.

Day to day

No commands to learn. Just ask.

Where am I?

In your agentWhere does the current feature stand?

Keep going

In your agentContinue the active feature.

Something off?

In your agentRun Empirical SDD Doctor and explain any findings.
Stuck?Fix the cause. Keep the record.
What you seeWhat to do
Changes don't go through Empirical SDDRun Init again to repair the setup, then reopen your agent.
A new request resumed old workOn purpose: unfinished work comes first. Finish it, or approve a separate worktree for the new thing.
Proof went stale after an editRun the checks again. Old receipts can't be edited or reused.
It asks for credentialsUse OAuth or the secrets file. Never paste secrets into chat.

Free and open source

Try it on one repo.

Install, run Init, and ask for the change you were going to make anyway.