letopis/spec-driven
SPEC-DRIVEN DEVELOPMENT · AI SDLC

Spec-driven development, with a record of what happened

OpenSpec, GitHub Spec Kit, BMAD and superpowers capture what you meant to build for your AI coding agents. dira and zavet record what happened next: who followed the plan, what it cost in human and agent time, and whether the spec was rewritten to match the code.

  • ✓ Keep your framework
  • ✓ Read-only
  • ✓ No compliance score
THE GAP

Spec-driven development captures intent. Nothing records what happened.

A spec says what should be built and how. Once the agents start, the spec has no way to say whether anyone followed it. That is not a flaw in the frameworks: a planning tool is not supposed to audit itself.

Who followed the plan

A task is ticked off by the same agent that claims to have finished it. The checkbox is a claim, and nothing witnesses the session behind it.

What it cost

A spec comes with a task list and no hours. Nobody can say how much human supervision, how much agent time and how many tokens a change took.

Whether the spec was rewritten

OpenSpec’s archive step rewrites the canonical spec from a change’s deltas, and any agent can edit a spec in the pull request that implements it. Nothing checks that the rewrite matched what shipped.

A spec without a chronicle is an unaudited promise, and a chronicle without a spec has no unit of intent to hang the hours on. See where this sits next to the other tools in the letopis comparison, or read how the four books fit together in letopis, the whole chain.

HOW IT WORKS

Adopt once. Cite the spec in commits. Read the record.

zavet resolves each unit of your framework into a living spec. dira joins that spec to the sessions, minutes and tokens behind it. More on zavet spec sources.

  1. 01

    Adopt once

    zavet detects which frameworks your repo uses and writes one spec-source line for each into .zavet/config. It is committed, and the adoption is recorded as a decision. dira onboard sets it up in the same pass.

  2. 02

    Cite the spec in commits

    A commit names the spec it belongs to with a Spec: trailer. The trailer is the only link between work and spec, so the record never relies on a guess.

  3. 03

    Attribute time and tokens

    dira joins the commit to the session that produced it and attributes human time, agent time and tokens to that spec. Sessions that never produce a cited commit stay unattributed.

  4. 04

    Read it in the cloud

    The dashboard shows which framework each project uses, each spec’s state, task progress as the framework’s own checkboxes, and the drift facts below.

.zavet/config
spec-source: openspec openspec
spec-source: speckit specs
spec-source: bmad _bmad-output
spec-source: superpowers docs/superpowers
git commit
feat(import): parse csv headers
Spec: openspec:add-csv-import

Drift facts the record keeps

Each one is observable and re-derivable from your repo. Each one is a fact to look at, not a finding that anything went wrong.

planned, not touched

A file a task named that no commit touched.

touched, not planned

A file changed under the spec that no task named.

edited with the implementation

The spec itself changed in the same pull request that implemented it.

no paths yet

A spec nothing has been cited against, so it covers nothing and is not counted as covered.

FRAMEWORKS

OpenSpec, GitHub Spec Kit, BMAD and superpowers, read as they are

Each adapter parses structure only: folder names, headings, ids and checkbox state. When a unit cannot be read it is reported as unresolved, with the reason, rather than guessed.

OpenSpec

Fission-AI

Change folders with proposals, tasks and delta specs, archived when they ship.

IN YOUR REPO
  • openspec/
  • changes/
  • add-csv-import/
  • proposal.md(read by dira)
  • tasks.md(read by dira)
  • specs/catalog/spec.md(read by dira)
  • archive/2026-10-07-legacy-carts/(read by dira)
  • specs/
openspec:add-csv-importactive

1/4 tasks checked in tasks.md

3 sessions · 2h 08m human · 3h 48m agent

RECORDED
  • R1 added
  • R3 modified
  • R4 removed
  • archived 2026-10-07

Names and repositories belong to their owners. They are used here only to say what is read.

READ-ONLY PROMISE

It never writes into your framework’s folders. There is no new spec format.

  • ✓Your framework’s own commands remain the only thing that writes to openspec/, specs/, _bmad-output and docs/superpowers.
  • ✓A unit of your framework resolves into zavet’s existing living spec, named kind:id. No new noun, no parallel coverage model.
  • ✓Such a spec is permanently unverified. Confirming a requirement is an act of the framework, so anything citing it cites it as a claim someone else made.
  • ✓Coverage is learned from the files commits touched under the spec, never guessed from capability names or filenames.
THE HONESTY BOUNDARY

Facts that can be checked. Never a verdict.

No product in letopis states an opinion, only records that can be checked again. “Requirement implemented” reads like a fact and is an opinion, so it is never written. “Tasks done” is the framework’s own checkbox, recorded as the framework’s claim.

May be recorded

  • ✓Which spec id each commit cited.
  • ✓How many tasks the artifact declares, and how many its own checkboxes mark done.
  • ✓How many requirements it declares, and how many still carry an open clarification.
  • ✓Which files were touched that no task planned, and which planned files nothing touched.
  • ✓Whether the spec was modified in the pull request that implemented it.
  • ✓Which recorded decisions the change referenced.

Never recorded

  • ✕That the implementation satisfies a requirement.
  • ✕That a requirement is well written, complete or testable.
  • ✕That the plan was good, or followed in spirit.
  • ✕Any score, grade or percentage of spec compliance.
FAQ

Spec-driven development questions

Do I have to change my spec framework?

No. Keep OpenSpec, GitHub Spec Kit, BMAD or superpowers exactly as you use them. dira and zavet read the files your framework already writes and keep a record beside them. There is no new spec format to adopt and nothing to migrate.

Does dira write into openspec/, specs/ or my other framework folders?

No. Spec sources are read-only. zavet notes which frameworks it found in its own .zavet/ folder, and everything else it learns is derived from your repo and your commits. Your framework’s own commands remain the only thing that writes to its folders.

What leaves my machine?

By default, metadata only: spec ids, states, requirement and task counts, task ids with their done flags, and the paths of files touched. Requirement text, task text and the spec documents themselves are sent only if you explicitly turn on full knowledge sync. With sync off, nothing leaves your machine.

Does it work with Claude Code, Codex and Cursor?

Yes. Spec attribution sits on top of dira capture, which records sessions from Claude Code, Codex CLI, Gemini CLI, Cursor, OpenCode, Grok Build. The harness does not need to know about your framework: the link between work and spec is the Spec: trailer on the commit.

What about plan mode?

A plan made in an agent’s plan mode is a session artifact: approved, executed and gone. It is not a file with an id, so it is not captured and there is nothing to cite in a commit. Write the plan into your framework’s files and it becomes something the record can follow.

What does a commit have to do to be attributed to a spec?

Carry a Spec: trailer naming the spec, such as Spec: openspec:add-csv-import. Several specs go in one comma-separated list. Work without a trailer stays unattributed. It is never guessed from a branch name or a file path.

Is there a spec compliance score?

No. dira and zavet record facts that can be checked again: which spec a commit cited, how many tasks the framework marks done, which files were touched that no task planned, and whether the spec was edited in the same change that implemented it. They never say that a requirement is satisfied, and they never produce a score.

New to the suite? Start with getting started, or read how zavet records decisions and how letopis compares with the tools you use today.

Keep your framework. Add the record.

One command, dira onboard, sets up both books in a single pass, and it works offline.

Get started free →