Adds spec-as-source enforcement to any project using spec-driven development
87
91%
Does it follow best practices?
Impact
82%
2.34xAverage score across 5 eval scenarios
Passed
No known issues
Run the full spec verification suite in this order. The only exception to running all steps: if Step 1 fails, stop and report — do not run Steps 2–4.
Run:
bash scripts/check-spec-links.shThis checks that every [@test] annotation in every .spec.md points to a file that actually exists on disk.
If scripts/check-spec-links.sh is missing or cannot run, do not give up — reproduce the check directly: read every specs/**/*.spec.md, extract each [@test] path, resolve it relative to the spec file, and test whether that file exists. The result is the same; the script is just a convenience.
[@test] path that does not exist, and why this is critical (no verifier = worse than a failing test). Tell the user to fix it by either creating the missing file at the expected path or correcting the [@test] annotation in the spec to point to an existing file, then re-run spec-verify. Record all of this in the report file described under Reporting — do not leave the findings only in chat.Run:
bash scripts/check-target-ownership.shThis checks that no file declared as a targets in a spec has been modified without a corresponding update to its owning spec.
Run:
python3 scripts/build-spec-manifest.pyThis writes .spec-source-manifest.json — a machine-readable map of specs → requirements → targets → tests.
Run the project test suite. Detect the test runner automatically:
pytest.ini, pyproject.toml, or setup.cfg exists → pytest tests/ -vpackage.json with a test script exists → npm testCargo.toml exists → cargo testAfter completing the run (whether it finished all four steps or stopped early at Step 1), always produce this summary with actual results filled in — write it to .spec-verify-report.md in the project root and print it to chat. The on-disk report is the durable, CI-uploadable record; the chat copy is the in-session view. A check that was skipped because an earlier one failed is reported as SKIPPED (Step 1 failed), never as PASSED.
spec-verify results
───────────────────
check-spec-links: PASSED / FAILED / SKIPPED
check-target-ownership: PASSED / FAILED / SKIPPED
build-spec-manifest: PASSED / FAILED / SKIPPED
test suite: PASSED / FAILED / SKIPPED (N tests)
Overall: PASSED / FAILEDWhen a check FAILED, append a Findings section to the report naming exactly what broke. For a check-spec-links failure this means, for each broken annotation: the spec file (e.g. specs/auth.spec.md), the missing [@test] path (e.g. tests/auth/test_login.py), the impact (a missing [@test] leaves the requirement with no verifier — worse than a failing test), and the fix (create the missing file, or correct the [@test] path in the spec). Then re-run spec-verify.
When all four steps pass, the last line must read exactly: Overall: PASSED
If anything failed: stop. Do not proceed to the next task, do not declare implementation complete, do not say "you can now merge". The only valid next action is fixing what failed and re-running spec-verify.