SpecMatter field notes
AI coding agents · Spec-driven development

OpenSpec: a lightweight open spec layer for AI coding agents

OpenSpec keeps a change's proposal, requirements, design and tasks beside your code. Write the spec, let your agent implement it, then verify the result against the requirements. Generate a browser-only scaffold below, or read our versioned tool tests.
Version notes, sources and affiliation

Per the official site openspec.dev (read 2026-09-21): 69,700 GitHub stars, MIT license, with a new spec created roughly every 2 seconds. The release checked for these notes is v1.13.2 (published 2026-09-23; release page read 2026-09-25). Works with Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI, OpenCode and more. Star counts move daily, so every figure on this page carries the date it was read.

Field notes updated 2026-09-25 · every figure below names the page it came from and the date it was read · about these notes · this site is not affiliated with OpenSpec or Fission-AI

01 / THE SCAFFOLD GENERATOR

Generate your first open spec in 30 seconds

Fill in two fields and get four OpenSpec files you can paste straight into your project. This is a scaffold generator — it calls no AI and uploads nothing; everything runs in your browser. Hand the output to your agent with /opsx:apply.

proposal.mdspecs/design.mdtasks.md
Produces 4 files + the command order

Versions recorded. Outputs available. Limits explicit.

Field notes by tool

Start with the question you need to resolve. Local observations are labeled separately from documentation and untested behavior.

The OpenSpec notebook

Workflow / evidence / boundaries

Why put a spec layer above the code

Agents can't read your mind

If you don't write down what you want, the agent guesses. Wrong guesses mean churned code and manual rollbacks.

You can't tell what changed afterwards

An open spec keeps the "why we built it this way" record, so the code still makes sense three months later.

You can verify the result

The last step of the OpenSpec workflow is /opsx:verify, which checks the implementation against the spec — not just whether tests pass.

The five-step OpenSpec workflow

  1. /opsx:explore — understand the problem and the existing code before writing anything
  2. /opsx:propose — draft proposal.md, specs/, design.md and tasks.md
  3. /opsx:apply — let the agent implement the tasks
  4. /opsx:verify — check that the implementation matches the spec
  5. /opsx:archive — archive the finished change

The five-step list above is the one the project's own homepage shows. The repository's getting-started page lists a slightly different set and moves /opsx:verify into an expanded profile — both are quoted in the commands section further down, with the dates I read them.

Install it

npm install -g @fission-ai/openspec@latest
Claude Code Codex Cursor GitHub Copilot Gemini CLI OpenCode + more

What OpenSpec puts on your disk

One directory at the root of your project. Knowing which folder is which is most of what you need.

openspec/
├── specs/                       source of truth, how the system behaves now
│   └── <domain>/spec.md         e.g. specs/auth/, specs/payments/
├── changes/                     one folder per proposed change
│   └── <change-name>/
│       ├── proposal.md          why and what
│       ├── design.md            how
│       ├── tasks.md             checkbox list
│       └── specs/
│           └── <domain>/spec.md delta: what this change moves
└── config.yaml                  optional project configuration

The four artifacts are the whole model: proposal.md carries intent and scope, the delta specs carry the requirements, design.md carries the technical decisions, and tasks.md is the checklist the agent ticks off as it implements.

A delta spec is a markdown file marked in sections rather than a rewrite. It says only what moves:

## ADDED Requirements
### Requirement: Two-Factor Authentication
The system MUST require a second factor during login.
#### Scenario: OTP required
- **GIVEN** a user with 2FA enabled
- **WHEN** the user submits valid credentials
- **THEN** an OTP challenge is presented

## MODIFIED Requirements
### Requirement: Session Timeout
The system SHALL expire sessions after 30 minutes of inactivity.
(Previously: 60 minutes)

On archive, ADDED requirements are appended to the main spec, MODIFIED ones replace what was there, REMOVED ones are deleted, and the change folder moves under openspec/changes/archive/.

Source: docs/getting-started.md in the Fission-AI/OpenSpec repository, read 2026-09-21 (file shown as 291 lines, 9.97 KB, last commit 2026-09-16). The same artifact roles are worded identically in the repo README and in the Jama Software guide.

What happened when we ran it

Everything in this section was produced on one Windows 11 Pro machine on 2026-09-21 by installing the package and running the commands. The commands are verbatim, the output under them is verbatim, and every block carries its exit code and elapsed time. Where something failed, the failure is left in.

The machine and the version

$ node --version
v22.22.2
$ npm --version
10.9.7
$ where node
C:\Users\Administrator\.workbuddy-ai\binaries\node\versions\22.22.2-2\node.exe

Node was already above the 20.19.0 floor, so nothing was installed before this run — v22.22.2 is what was already there. The OS is Windows 11 Pro, build 28000; systeminfo printed its own headers in Chinese because that is the machine's display language, which is also why two "command not found" checks below are reported as exit codes rather than quoted messages.

Installing it

$ npm install -g @fission-ai/openspec@latest

added 80 packages in 1m

23 packages are looking for funding
  run `npm fund` for details
exit=0  elapsed_ms=70693

$ openspec --version
1.13.1

$ npm list -g @fission-ai/openspec --depth=0
C:\Users\Administrator\.workbuddy-ai\binaries\node\versions\22.22.2-2
└── @fission-ai/[email protected]

80 packages, about 71 seconds. A second confirmation of the version sits in a file the installer wrote: .claude/skills/openspec-propose/SKILL.md carries generatedBy: "1.13.1" in its frontmatter.

init, and the first thing that broke

This machine has no agent CLI installed, and bare openspec init refuses to guess:

$ openspec init
Note: OpenSpec collects anonymous usage stats. Opt out: OPENSPEC_TELEMETRY=0 or openspec config set telemetry.enabled false
× Error: No tools detected and no --tools flag provided. Valid tools:
  amazon-q
  antigravity
  ... (39 tool ids listed, trimmed here)
  zcode
  agents

Use --tools all, --tools none, or --tools claude,cursor,...
Tool not listed? Use --tools agents: the vendor-neutral target that writes .agents/skills/ for any assistant.
exit=1  elapsed_ms=8306

$ ls -la
(empty - the directory was still empty, nothing was written)

Passing the tool explicitly got it through:

$ openspec init --tools claude --no-animation
- Creating OpenSpec structure...
▌ OpenSpec structure created
- Setting up Claude Code...
√ Setup complete for Claude Code

OpenSpec Setup Complete

Created: Claude Code
6 skills and 6 commands in .claude/
Config: openspec/config.yaml (schema: spec-driven)

Getting started:
  Start your first change: /opsx:propose "your idea"

Note: 6 more workflows are available (new, continue, ff, bulk-archive, verify, onboard).
Add them with `openspec config profile`.

Learn more: https://github.com/Fission-AI/OpenSpec
Feedback:   https://github.com/Fission-AI/OpenSpec/issues
exit=0  elapsed_ms=6007

The tree it actually wrote

.claude/commands/opsx/apply.md
.claude/commands/opsx/archive.md
.claude/commands/opsx/explore.md
.claude/commands/opsx/propose.md
.claude/commands/opsx/sync.md
.claude/commands/opsx/update.md
.claude/skills/openspec-apply-change/SKILL.md
.claude/skills/openspec-archive-change/SKILL.md
.claude/skills/openspec-explore/SKILL.md
.claude/skills/openspec-propose/SKILL.md
.claude/skills/openspec-sync-specs/SKILL.md
.claude/skills/openspec-update-change/SKILL.md
openspec/changes/archive/.gitkeep
openspec/config.yaml
openspec/specs/.gitkeep

15 files. Four differences against the tree drawn above, all of them measured:

The six commands installed are apply, archive, explore, propose, sync and update — no verify. The CLI itself prints "6 more workflows are available (new, continue, ff, bulk-archive, verify, onboard)". That is the same discrepancy noted above, and the installed output lands on the repository's side of it.

Where the slash command got stuck, and what I did instead

$ where claude   -> not found, exit=1
$ where codex    -> not found, exit=1
$ where cursor   -> not found, exit=1

There is no agent on this machine to type /opsx:propose into. But the slash command is an ordinary markdown file at .claude/commands/opsx/propose.md, and its frontmatter says allowed-tools: Bash(openspec:*) — the slash command is not a program, it is a script that shells out to the CLI. So I ran the CLI calls it lists, by hand: openspec context --json, then openspec new change, then openspec status --change ... --json, then openspec instructions <artifact> --change ... --json for each artifact.

What I did not do, stated plainly: I never ran /opsx:propose inside a real agent session. The four artifacts below were written by me from the templates the CLI returned. They are not model-generated output.

One change, end to end

$ openspec new change add-health-endpoint
- Creating change 'add-health-endpoint' with schema 'spec-driven'...
Created change 'add-health-endpoint' at openspec\changes\add-health-endpoint\
Schema: spec-driven
Next: openspec status --change add-health-endpoint
exit=0  elapsed_ms=3691

$ openspec status --change add-health-endpoint
- Loading change status...
Change: add-health-endpoint
Schema: spec-driven
Change root: C:\Users\Administrator\WorkBuddy AI\Claw\_run\openspec\changes\add-health-endpoint
Progress: 0/4 artifacts complete

[ ] proposal
[-] specs (blocked by: proposal)
[-] design (blocked by: proposal)
[-] tasks (blocked by: specs, design)

Next: openspec instructions proposal --change "add-health-endpoint" --json
exit=0

The CLI hands back a template per artifact. For the delta spec it is this:

# Spec Delta

## Purpose

## ADDED Requirements

### Requirement: <!-- requirement name -->

#### Scenario: <!-- scenario name -->
- **WHEN** <!-- condition -->
- **THEN** <!-- expected outcome -->

Four artifacts later, and one more failure on the way: validate does not take --change.

Progress: 4/4 artifacts complete
[x] proposal
[x] specs
[x] design
[x] tasks

All planning artifacts complete!
Next: openspec instructions apply --change "add-health-endpoint" --json

$ openspec validate --change add-health-endpoint
error: unknown option '--change'
(Did you mean --changes?)
exit=1  elapsed_ms=1807

$ openspec validate --all
- Validating...
✓ change/add-health-endpoint
Totals: 1 passed, 0 failed (1 items)
exit=0

$ openspec change validate add-health-endpoint
Warning: The "openspec change ..." commands are deprecated. Prefer verb-first commands (e.g., "openspec list", "openspec validate --changes").
Change "add-health-endpoint" is valid
exit=0  elapsed_ms=2998

$ openspec list
Changes:
  add-health-endpoint     0/7 tasks     just now

Archive, including the refusal

Archiving with the task list still empty does not go through:

$ openspec archive add-health-endpoint
Task status: 0/7 tasks
Warning: 7 incomplete task(s) found. Continue? (y/N) × Error: 7 incomplete task(s) found for change 'add-health-endpoint', and no answer could be read from stdin.
Fix: Complete the tasks or rerun with openspec archive add-health-endpoint --yes
exit=1  elapsed_ms=2496

After ticking all seven checkboxes in tasks.md:

$ openspec list
Changes:
  add-health-endpoint     ✓ Complete    just now

$ openspec archive add-health-endpoint --yes
Task status: ✓ Complete

Specs to update:
  health-check: create
Applying changes to openspec/specs/health-check/spec.md:
  + 3 added
Totals: + 3, ~ 0, - 0, → 0
Specs updated successfully.
Change 'add-health-endpoint' archived as '2026-09-21-add-health-endpoint'.
exit=0  elapsed_ms=6428

What the disk looks like after archive

openspec/changes/archive/.gitkeep
openspec/changes/archive/2026-09-21-add-health-endpoint/.openspec.yaml
openspec/changes/archive/2026-09-21-add-health-endpoint/design.md
openspec/changes/archive/2026-09-21-add-health-endpoint/proposal.md
openspec/changes/archive/2026-09-21-add-health-endpoint/specs/health-check/spec.md
openspec/changes/archive/2026-09-21-add-health-endpoint/tasks.md
openspec/config.yaml
openspec/specs/.gitkeep
openspec/specs/health-check/spec.md

Three things measured here:

$ openspec list --specs
Specs:
  health-check     requirements 3

$ openspec list
No active changes found.

Three things that bit us

  1. init will not guess your agent. With none installed it exits 1 and writes nothing; --tools claude (or none, all, agents) is required.
  2. Bare openspec validate and openspec show exit 1 in a non-interactive shell — that is a refusal, not a pass. And validate --change is not an option; it is --changes, with openspec change validate <name> for a single item, which now prints a deprecation warning.
  3. archive reads tasks.md and refuses when items are open; with no interactive stdin it cannot read the y/N answer, so --yes is the only way past it.

Measured on 2026-09-21 on a Windows 11 Pro machine with Node v22.22.2 and @fission-ai/openspec 1.13.1. Every block above is a copy of what the terminal printed; the one trimmed line (the 39 tool ids) is marked as trimmed. Not run: the /opsx:* slash commands inside a real agent session, any implementation code, and any screenshots. The seven ticked checkboxes were edited by hand.

The commands, where to type them, and how each agent spells them

Two different places, and mixing them up is the most common early stumble.

CommandWhere you type itWhat it does
openspec initterminalcreates the openspec/ tree and the agent instruction files
/opsx:exploreagent chatreads the codebase, asks you questions, sharpens a fuzzy idea before anything is written
/opsx:proposeagent chatcreates the change folder and drafts all four artifacts
/opsx:applyagent chatworks through tasks.md and ticks items off
/opsx:syncagent chatfolds delta specs into the main specs (optional; archive often does it)
/opsx:archiveagent chatmerges the deltas and files the change away

One discrepancy I hit while checking, and I am not going to paper over it: the project's own homepage lists five commands — explore, propose, apply, verify, archive — while the repository's getting-started page lists explore → propose → apply → sync → archive and puts verify in the expanded profile instead. The README states the default core profile "includes propose, explore, apply, update, sync, and archive". The homepage footer showed v1.13.0 and the repo's latest release showed v1.13.1. Two official surfaces, two lists; I read both on 2026-09-21 and they did not match.

The same command is spelled differently depending on the agent, which is the other thing that trips people up:

AgentSpelling
Default (Claude Code and others)/opsx:propose
Cursor, GitHub Copilot/opsx-propose
Amazon Q Developer@openspec-proposal
Codex$openspec-propose

Sources: the command table and the "run in your terminal / run in your AI assistant's chat" distinction come from docs/getting-started.md; the per-agent spellings are quoted from the README, which adds "openspec init prints the right form for the tools you picked". Both read 2026-09-21.

Hard requirements and what it collects

openspec config set telemetry.enabled false
export OPENSPEC_TELEMETRY=0
export DO_NOT_TRACK=1

Sources: Fission-AI/OpenSpec README (read 2026-09-21) for the Node floor and telemetry wording; Jama Software's OpenSpec guide, published 2026-07-30, for the no-MCP line.

The same number, reported on three dates

Nobody in the top ten put figures next to dates. This is the one comparison I can actually source: GitHub stars, as reported by three different people at three different times.

DateWho reported itWhat they said
2026-01A commenter on the Hacker News thread, describing when he started a competing toolOpenSpec "seems to have had 20k GitHub stars at that time"
2026-09-13A commenter on the same thread, talking to the maintainer"the github repo has 68k+ stars"
2026-09-21This page — read off openspec.dev and the repo page directly69,700 stars, 4.8k forks, 122 contributors, 882 commits, 125 open issues, 119 open pull requests, 49 releases, latest v1.13.1 on 2026-09-17

The first two rows are other people's recollection in a comment thread, not measurement, and the January figure is hedged by the speaker himself. I am reporting them as claims with dates, not as a growth curve.

Sources: news.ycombinator.com/item?id=49734264 (199 points, 99 comments; read 2026-09-17) for the first two rows; openspec.dev and github.com/Fission-AI/OpenSpec read 2026-09-21 for the third.

Three conversions, with the arithmetic shown

A rate, a monthly figure and a size limit, each turned into the unit you would actually reason in. Every input is named; every result is arithmetic on someone else's claim, not a measurement of mine.

One spec every two seconds → per hour

3,600 seconds/hour ÷ 2 seconds/spec = 1,800 specs/hour

Input: "A new spec is created with OpenSpec every two seconds" (openspec.dev, read 2026-09-21). Assumes a flat rate, which the source does not claim. A unit change, not a throughput measurement.

265,000 developers a month → per day

265,000 ÷ 30 days = approx. 8,833/day

Input: "used by more than 265,000 developers a month" (openspec.dev, read 2026-09-21). The 30-day divisor is mine; the source does not state how the month is counted.

The 50KB per-spec limit → in files you can picture

50 KB ÷ 9.97 KB = approx. 5.0x the size of docs/getting-started.md

Input: "a hard 50KB context limit per spec" (Medium, Apurv Sheth, 2026-06-16). The 9.97 KB is the size GitHub displays for docs/getting-started.md (291 lines, 207 loc). I could not find the 50KB limit stated on any official OpenSpec page — it appears in one practitioner write-up only, so treat it as reported, not documented.

How it compares, and who says so

OpenSpecSpec KitBMAD-METHOD
DeveloperFission-AIGitHubbmad-code-org (community)
Spec modelDelta specs (diffs)Full Markdown artifactsStory files
WorkflowChange-centric, fluidLinear phases with gatesAgile-style cycle
Best fitBrownfield, lightweightStructure and traceabilityFull SDLC, greenfield
RuntimeNode.jsPythonTool-agnostic

That table is the Jama Software guide's, published 2026-07-30; I am reproducing its structure and its facts with attribution, not its wording. The comparison that matters for most people is narrower, and two independent sources land on the same split:

Sources, in order: Jama Software guide 2026-07-30; Apurv Sheth on Medium 2026-06-16; Hacker News thread 49734264, read 2026-09-17; Thoughtworks Technology Radar, published 2026-04-15.

Who should not use this

  • You are in a regulated industry and need rules enforced on every change. Two separate sources point you at Spec Kit instead (2026-06-16 and 2026-07-30, quoted above).
  • You are running a large, multi-developer, long-lived codebase. The criticism on record is that specs rot there and cost more than they return.
  • You work in a task-oriented environment with no interest in business context. A commenter who uses it at small scale wrote: "if you work in a task oriented environment this will not work as well, as you'd lack/don't care about the business context."
  • You will not read what it generates. The most detailed complaint on the Hacker News thread is from someone whose org adopted it: every medium or larger change "turns into a large set of multiple markdown documents, each that need review", and they were "never handwritten — always slop". The maintainer replied in that thread acknowledging the problem.
  • Your Node is older than 20.19.0. Hard floor, stated in the README. A prerequisite rather than an opinion.
  • Your agent is not one of the supported ones. The README says they support 30+ tools and to check the full list. What happens with an unsupported tool is not stated anywhere I read, so I am not going to guess it. (Inference flag: it is reasonable to expect the slash commands to be unavailable, but that is my inference, not their documentation.)

Every item above is a claim someone else published on a date, not my own testing. That is the honest version of this section.

The source log, as a file you can keep

Every dated claim on this page, plus the ones that did not fit: date, where it came from, what it said, and whether I read it myself or am repeating someone else.

The file lives at https://specmatter.com/openspec-source-log.csv, served as text/csv. It opens in Excel, Numbers or any text editor.

DateSourceClaimHow I got it
2026-01Hacker News threadapprox. 20k stars "at that time"Read the comment
2026-02-05LinkedIn Pulse, Sergio SerenoFour-step workflow; a project took two hours vs "several days" traditionallyRead the post
2026-04-15Thoughtworks RadarAssess ring; three steps propose -> apply -> archiveRead the blip
2026-05-08danclarke.comGetting started omits explore, which is the killer featureRead the post
2026-06-16Medium, Apurv ShethHard 50KB context limit per spec; proposal takes 20-30 minRead the post; limit not found on any official page
2026-07-30Jama Software guideComparison table; no MCP dependency; regulated-industry caveatRead the guide
2026-09-13Hacker News thread"68k+ stars"; specs rot in large long-lived codebasesRead the comments
2026-09-21openspec.dev69,700 stars; a spec every two seconds; 265,000 developers a month; v1.13.0 in the page footerRead the page myself
2026-09-21github.com/Fission-AI/OpenSpecNode 20.19.0+; 4.8k forks; 122 contributors; v1.13.1 released 2026-09-17Read the page myself

FAQ

What is OpenSpec?

OpenSpec is a lightweight, configurable open spec framework for AI coding agents. It adds a spec layer above your code: you describe what should change first, the agent implements against that description, and you verify the result before archiving the change.

Is "open spec" the same thing as OpenSpec?

People search for both spellings. "Open spec" describes the idea — a specification kept in the open, next to the code, that both humans and agents can read. OpenSpec is the open-source tool that implements that idea, maintained by Fission-AI under the MIT license.

Which AI coding agents does OpenSpec work with?

Claude Code, Codex, Cursor, GitHub Copilot, Gemini CLI and OpenCode are supported, plus more — the official site openspec.dev lists the full set (read 2026-09-21).

Does this page send my input anywhere?

No. The generator runs entirely in your browser. It calls no AI model and uploads nothing — it only fills in a text template you can copy or download.

Do I need to install anything to use this generator?

No, this page works on its own. You only install OpenSpec itself if you want to run the full workflow in your own project: npm install -g @fission-ai/openspec@latest.

Is OpenSpec open source, and what does it cost?

MIT licensed, per both the repository and the Jama Software guide (2026-07-30). No paid tier is mentioned anywhere I read.

Does it need an MCP server?

No. Per the Jama Software guide (2026-07-30), it needs a current Node.js runtime and has no Model Context Protocol dependency.

What does it send back to the project?

Command names and version only, per the README, and it is off automatically in CI. Three ways to switch it off are listed in the requirements section above.

Does the spec stay accurate over time?

That is the open question, not a solved one. Dan Clarke's write-up (2026-05-08) says outright: "Obviously there is the risk that the spec is out of date or wrong — but I find the benefits far outweigh that risk." The Hacker News thread is where people who disagree made their case. Nobody I read presented a measurement either way.