The format
Markdown + YAML. Works in any editor that opens text. No new tooling required to start writing.
Then a clarifying question mid-build. Then a fix after it ships. Then the context you keep re-explaining.
SpecScore is an open, lintable file format for specifications β like JSON for data. With a CLI your agents call to query and edit them β like jq for JSON.

SpecScore is a Markdown + YAML format for features, requirements, and acceptance criteria. It defines a structure your team and your AI agents both understand β and it's just files in your repo.
A SpecScore project is three artifact kinds along a lifecycle: an Idea captures a half-formed direction; aFeature spec freezes the agreed behavior; aPlan decomposes the feature into ordered tasks that each cite the acceptance criteria they satisfy.
Why your agent cares. Because the structure is machine-readable, AI agents can query the spec through the CLI instead of reading every file. Ask "what should I work on next?" and the CLI returns open Features and unanswered questions. Same shape your team reviews; far less context the agent has to load.
Flat list at fifty Features becomes a dump. SpecScore keeps the tree navigable: parents own scope, children own detail, and the directory shape mirrors the product shape your team already reasons about.
Open questions roll up. Unresolved questions at any depth surface in every parent's index. You see what is blocking a release from the top of the tree, without spelunking to find it.
Most spec tools assume a flat list works. It does β until it doesn't. SpecScore is built for the moment when "where does this Feature live?" starts to matter.
specscore-cli/spec/features/cli/spec/features/cli/
βββ agent/
β βββ setup/
βββ feature/
β βββ change-status/
β βββ deps/
β βββ info/
β βββ list/
β βββ new/
β βββ refs/
β βββ tree/
βββ idea/
β βββ change-status/
β βββ new/
β βββ relocate/
βββ spec/
β βββ lint/
β βββ issue-rules/ β sub-sub-Feature
β βββ plan-rules/
βββ task/
β βββ info/
β βββ list/
β βββ new/
βββ β¦ 10 more top-level FeaturesThe spec in the doc, the thread in Slack, and the code in the PR quietly disagree for weeks. Nobody can find which version of the conversation is canonical.
The fix
One canonical spec, in the repo, versioned with the code.specscore lint runs in CI on every push; git history is the audit trail. The spec, the thread, and the PR can't quietly disagree β they share the same file under review.
"Handles errors gracefully" was supposed to mean"show a toast and roll back." Or was it"log and retry?" The agent has to guess.
The fix
The linter catches ambiguous criteria before any code is written. The verb fails lint because it has no concrete object or condition. Fixing the warning forces you to write what "handles" actually means.
Humans interpolate, ask, clarify. AI agents don't β they implement whatever pattern was most common in their training data. The code passes review because it doessomething sensible. It's just not what you meant.
The fix
Structured input. AI agents parse REQ IDs, AC IDs andGIVEN / WHEN / THENscenarios deterministically β there's nothing to interpolate. Plans must cite the AC IDs each task satisfies, so what was built is always checkable against what was specified.
The agent builds something from an ambiguous brief, you notice it's wrong, and you re-prompt β four different ways. Every half-built feature and every retry is billed in tokens. The vaguer the spec, the more rounds before it lands.
The fix
Lint the spec before the agent runs. specscore lintrejects vague verbs and missing acceptance criteria up front, so the agent implements a concrete brief once instead of guessing across retries. The cheapest agent run is the one you don't repeat.
An AI agent answering "what depends on this feature?"reads the whole feature README. Then every parent index. Then sibling features just in case. Every query is a re-parse. Tokens evaporate; latency rises; the bill rises with them.
The fix
Structured queries instead of file reads.specscore feature tree returns the hierarchy as YAML; feature deps walks the transitive dependency chain; feature info exposes status, owner, and open questions β each in one call. The agent navigates the graph, not the prose.
Six months later, you're debugging a function and nobody remembers which feature it implements. The link between code and spec lived in someone's head, and that person left. The PR that introduced it is in the archive.
The fix
Source annotations. Comments like// specscore: features/checkout/apply-discount/R1.AC-2make the link machine-readable and survive every refactor.specscore code deps answers"what spec does this file implement?" in one call; the linter flags references that point at deleted specs.
You move a feature from Draft to Approvedin its README, but the parent features-index still lists it as Draft. Three weeks later, an agent reading the index thinks it's still in flux. The status lives in two places now, and they disagree.
The fix
specscore feature change-status rewrites the feature's Status field and re-syncs the features-index row in one atomic step β lint failure rolls the rewrite back. The status exists in one canonical place; the index is a generated view of it.
A spec reads as if it's settled β until you remember the"and what about timezones?" question got lost in a Slack thread two months ago and never made it into the doc. Now you're in implementation, and nobody can say what the answer was.
The fix
Every SpecScore feature has a mandatoryOutstanding Questions section. The linter rejects features that omit it β empty is fine ("None at this time."), but missing isn't. Unresolved questions are visible in the doc, queryable from the CLI, and impossible to forget.
SpecStudio Skillsis a Claude Code plugin that turns the SpecScore lifecycle into four slash commands. Install it once, then run them in order β from raw idea to executable plan.
$ /plugin marketplace add specscore/ai-marketplace $ /plugin install specstudio@specscore
> /specstudio: /specstudio:ideate Refine a raw idea into a SpecScore Idea /specstudio:specify Turn an approved Idea into a Feature spec /specstudio:plan Decompose a Feature into a Plan of tasks /specstudio:implement Execute the next task in a Plan
Free for public and open-source repositories. The plugin source is atspecscore/specstudio-skills β MIT-licensed.
A fast deterministic linter, then a deeper AI review β run against the spec you just saw. Two passes, two kinds of certainty.
$ specscore lint apply-discount.md β R1 has acceptance criteria β R2 has acceptance criteria β R3 no acceptance criteria β link "Related Feature: discount-tiers" not found β section "Open Questions" missing 3 problems exit 1
Same result every run. Free, fast, runs on every commit.
> /score apply-discount.md Grade: B β ready with edits AC-2 vague trigger β name the actor and event AC-3 no error path for an expired code prose reads clean; criteria need tightening
Reads for meaning, like a human reviewer.
Markdown + YAML. Works in any editor that opens text. No new tooling required to start writing.
Go CLI. Validates structure, references, and completeness. Exits non-zero on failure β works in your terminal and your CI.
SpecScore is just files in your repo. No SaaS to sign up for. No orchestrator required. Use it with Linear, Jira, GitHub Projects, raw Markdown in a folder, or no project management at all. The format and the linter don't care where your tickets live.
Spec-driven development is a crowded space. Here's where SpecScore stands against the alternatives β honestly.
Don't use AI agents, or need spec validation in your CI pipeline? There's a CLI for that. Install it in 60 seconds β no account, no telemetry, works on any directory of Markdown specs.
$ curl -fsSL https://specscore.md/install/get-cli | sh> irm https://specscore.md/install/get-cli.ps1 | iexLint the example spec that ships with the binary:
$ specscore lint examples/checkout/apply-discount.mdSee the output:
examples/checkout/apply-discount.md
β R1 has acceptance criteria
β R2 has acceptance criteria
β R3 no acceptance criteria
β link "Related Feature: discount-tiers" not found
β section "Open Questions" missing
3 problems exit 1Read the full docsContribute on GitHub
Code-graph engine for fast code exploration and bidirectional specβcode linkage.
codegrapher.devGo data-access layer specified with SpecScore.
dal-go.github.ioGit-backed versioned database specified with SpecScore.
ingitdb.comAcceptance-evidence layer β runs a spec's acceptance criteria for real, with reusable checks and no glue code.
rehearse.inkWeb UI for viewing and editing SpecScore specifications.
specscore.studioHave an idea how to improve this page? Let us know.