We build Reqlan, which is one of the tools in this comparison, so read this with that bias in mind. We've tried to describe each tool from its own docs, credit others where they got there first, and be clear where ours falls short. If we've got something wrong about your tool, tell us and we'll fix it.
Spec-driven development has gone from niche to normal over the last year, mostly because of coding agents. If an agent is going to write the code, you'd better write down what you want first. Most of the tools agree on that part.
Where they differ is what happens after. Once you have a requirement and some tests, how do you know which test proves which requirement? And how do you find out when that link breaks? That's requirements traceability, and with agents writing many of the tests, it matters more than it used to (the first post covers why).
This post compares how several tools handle the requirement-to-test link. It isn't a ranking, more us trying to decompose the problem into a few dimensions and see where each tool lands. These tools do different jobs, and several of them work together.
First, a note on names
There are a few projects with names close to ours, and it's worth clearing up. Reqlan isn't related to reql or reqlang, and it's not a fork or rebrand of SpecGraph. If you searched for one of those and found reqlan, you're in a different place. We're not claiming any connection, and it's not a clone of Spec Kit, OpenSpec or Kiro either. It sits at a different layer, which we'll explain below.
What we're comparing
For each tool, we asked the same four questions:
- Where does the link live? In the spec, in the test, or inferred?
- How is it found? Declared syntax, token search, or a model guessing?
- When is it checked? While editing, in CI, or on demand?
- What does it cover? Requirement to test only, or code too?
Spec Kit
Spec Kit is GitHub's toolkit for spec-driven development. It gives you a structured flow from specification to plan to tasks, and it works with a range of coding agents.
On traceability, we couldn't find a built-in requirement-to-test matrix in core Spec Kit. If it's there and we missed it, we'll happily correct this.
The community has filled the gap. The spec-kit-trace extension reads REQ-XXX identifiers in spec.md and the test suite, surfaces untested requirements, and flags orphan tests whose requirement IDs have disappeared from the spec.
Strengths: simple, works with any test framework, easy to adopt, and it covers both directions. Where it stops: the link is a token in the test, found by search. A test that mentions REQ-012 counts as linked whether or not it actually tests that requirement.
OpenSpec
OpenSpec structures requirements as SHALL statements with GIVEN/WHEN/THEN scenarios, which read a lot like test cases. It has a clean change-proposal workflow that suits brownfield work.
Tests aren't a first-class part of the model yet. Users have asked for that in Discussion #1760, and in the meantime people work around it with schema.yaml or AGENTS.md rules telling the agent how to connect scenarios to tests.
Strengths: scenarios are written in a test-shaped way, so the step from scenario to test is short, and the proposal flow is good at keeping change intent explicit. Where it stops: there's no checked link from a scenario to the test that implements it, so you rely on convention and the agent following instructions. The community discussion suggests this is on people's minds.
Kiro
Kiro takes a different and genuinely interesting approach. It writes requirements in EARS notation, extracts properties from them, and generates property-based tests. Its docs describe a "traceable link" between requirements and those tests. Property tests are optional by default.
Strengths: property-based tests check a rule across many generated inputs, which goes some way towards answering "does this test actually check the requirement?" That's a question most traceability tools, ours included, don't answer. Where it stops: the link is to tests Kiro generates. Tests you already have, or write by hand, are a separate matter. And if the same agent extracts the property and writes the code, you still need a person reading the property.
Reqlan
Here's ours, limited to what we can confirm in the repository.
Requirements are named ideas in .rq files, in plain language. In the spec, an idea declares proven by links to the tests that prove it (a file, or a named test case in a file) and can declare implemented in links to code. In code and tests, rq: comments pin a location back to the idea. Backlinks are computed. reqlan check statically analyses the whole graph and flags references that don't resolve and linked files that are missing. A VS Code/Cursor extension and language server show this while you edit, there's a CLI for CI, and an MCP server lets agents search and retrieve ideas from the graph, run the same check, and compare the graph between two git revisions.
Strengths: links are declared, not grepped or inferred. They're checked as a graph, including while you type. It covers idea to test and idea to code in one place. Where it stops (and we want to be specific):
- It won't catch a test that asserts nothing. If
proven bypoints at a test that's effectivelyassert 1 == 1, the link is valid andcheckpasses. Mutation testing complements Reqlan here. Reqlan doesn't include mutation testing. - It flags a missing test file, not a deleted test case. If an agent removes one test case from a file that still exists,
checkwon't notice, even whenproven bynamed that case. - No rename support. Links are by name. Rename an idea and you update references yourself.
checkshows you what broke. - It isn't a workflow. It doesn't do proposals, plans or task breakdowns. Our intent is for it to sit alongside tools like Spec Kit or OpenSpec rather than replace them, but there's no integration with either.
Others worth knowing
This comparison would be unfair without a few tools that do some of this well, in some cases better.
- Tessl. Spec requirements link to tests with
[@test] ../tests/..., and acheck-spec-links.shscript checks that the linked files exist. That's the same shape as reqlan'sproven by. We didn't invent the idea of declaring the test from the spec. - BMAD's Test Architect (TEA). A
traceworkflow builds a matrix and a PASS/CONCERNS/FAIL gate with coverage thresholds by priority (P0 at 100%, P1 at 90% or more, overall at 80% or more). It resolves the test oracle in order: formal requirements, then contract/spec artefacts, then external pointers, and as a brownfield fallback, "synthetic" journeys inferred from source. The gate is a thoughtful touch for teams that want a release decision, not just a report. - StrictDoc. It models REQ, TEST_CASE and TEST_RESULT as typed nodes and can ingest JUnit and Robot XML results (commit). It's aimed at safety and ASPICE work, and it already does rigorous typed requirement-to-test-to-result traceability. If you need that level of rigour, especially with test results linked in, look at StrictDoc first.
Side by side
| Tool | Where the link lives | How it's found | When it's checked | Covers |
|---|---|---|---|---|
| Spec Kit + spec-kit-trace | REQ-XXX token in tests |
Token search | On demand / CI | Req ↔ test |
| OpenSpec | Convention (scenario → test) | Agent instructions | Not checked | Req → scenario |
| Kiro | Generated property tests | Generated from EARS | When tests run | Req → property test |
| Tessl | [@test] in spec |
Declared | Script | Req → test file |
| BMAD TEA | Requirements, pointers, or inferred | Oracle order + inferred fallback | Trace run, gate | Req ↔ test, with gate |
| StrictDoc | Typed nodes | Declared | Build / import | Req → test → result |
| Reqlan | proven by / implemented in in spec, rq: comments in code and tests |
Declared | Editor (LSP) + CLI | Idea → test, idea → code |
The summaries are ours, written from each project's docs, so check the source links for the full picture.
The thing none of them solve
Every tool here, ours included, mostly answers "is there a link?" Few answer "is the linked test any good?" Kiro's property tests and mutation testing come closest. A traceability matrix full of green ticks pointing at tautological tests is still the problem Kun Chen described in his DeepSWE thread (mirror): the agent's tests can be "simply the agent's interpretation of our intent."
What traceability does buy you is knowing where to look. If you can see which test claims to prove which requirement, you can read that test. If a link breaks (a name or file disappears), you hear about it. It won't tell you when the meaning drifts and the names stay put. That's useful, but it's not proof of correctness, and anyone selling it as such (us included) should be called on it.
How to choose
Some honest suggestions, held loosely:
- Already using Spec Kit and want a quick win? Try spec-kit-trace. It's light and works today.
- Using OpenSpec? Follow Discussion #1760, and consider something that checks scenario-to-test links alongside it.
- Want tests that check rules, not examples? Kiro's property-based approach is worth a look, and you can add property tests to any stack.
- Regulated or safety work? StrictDoc.
- Want links checked in the editor, across tests and code, in one graph, alongside whichever workflow tool you use? That's what we built Reqlan for. Have a look at reqlan.com or the GitHub repo, and keep the limits above in mind.
Whichever you pick, add mutation testing or property testing for the "does this test actually check anything" question. No traceability tool answers that one for you.
Sources
- Spec Kit: https://github.com/github/spec-kit
- spec-kit-trace: https://github.com/Quratulain-bilal/spec-kit-trace
- OpenSpec concepts: https://github.com/Fission-AI/OpenSpec/blob/main/docs/concepts.md
- OpenSpec Discussion #1760: https://github.com/Fission-AI/OpenSpec/discussions/1760
- Kiro, correctness: https://kiro.dev/docs/specs/correctness/
- Tessl spec-driven development tile: https://github.com/tesslio/spec-driven-development-tile
- BMAD TEA trace workflow: https://bmad-code-org.github.io/bmad-method-test-architecture-enterprise/how-to/workflows/run-trace/
- StrictDoc issue #2107: https://github.com/strictdoc-project/strictdoc/issues/2107
- StrictDoc commit: https://github.com/strictdoc-project/strictdoc/commit/9fb3f06bfa171fe6bcba8083e05f2d55d36c1692
- Kun Chen thread (mirror): https://twiscan.com/en/x/kunchenguid/2108030810691629403
- Reqlan: https://reqlan.com · https://github.com/littletuna4/reqlan
Comments
Post a Comment