spec-verify
Skill6 starsChanged 44 days agoMITView on GitHub
Check that an OpenSpec change's implementation actually matches its spec, before anything is archived - artifact validity via `openspec validate --strict`, the repo's own verify gate run for real, and scenario-by-scenario conformance against the spec delta. Read-only: it reports, it never fixes. Use when the user says "verify the change", "/spec-verify", "does the code match the spec", "check spec conformance", "is this ready to archive", "did we actually build it", "audit the ticks", or whenever `spec-apply` has ticked the last task. Boundaries - tasks still unticked -> `spec-apply`; verified and ready to fold into the specs -> `spec-archive`; reviewing a diff for bugs rather than for spec conformance -> `/code-review`; something is broken and needs diagnosing -> `diagnosing-bugs`.
We split this skill into the rules it gives an agent
10 rules. 0 are common, 7 are distinctive, and 3 are very specific to this project.
0
Common
Most of the 10 edited versions we read keep these.
7
Distinctive
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 23
Read-only by default. This skill fixes nothing.
- Very specific: line 58
Every #### Scenario: in the change's specs//*.md delta is a promise about observable behavior.
- Distinctive: line 68
Missing: - no counterpart found. This is the finding
- Very specific: line 76
Read tasks.md at its path from artifactPaths, not the lossy tasks[] from openspec instructions apply --json - that array strips the files: …
- Distinctive: line 101
Every finding routes to the skill that owns the fix.
- Distinctive: line 116
Read-only. Report findings, fix nothing, tick nothing, archive nothing
- Distinctive: line 118
Never report a check you did not run, and never report one this file predicts - verdicts come from the run
- Distinctive: line 119
Never invent a verify command.
- Distinctive: line 121
Never mutate the global openspec profile.
- Very specific: line 122
Never --no-verify, never openspec archive from here
“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Spec Verify
change -> validate -> gate -> scenario conformance -> report.
Three independent checks, reported separately, in increasing order of what they prove. openspec validate reads documents. The repo gate runs the code. Scenario conformance is the only one that asks whether the behavior the spec promised exists, and it is the reason this skill is in the set. Never collapse them into one verdict.
Read-only by default. This skill fixes nothing. Why -> a verifier that quietly patches what it finds stops being independent evidence and starts being a second author of the same claim.
Preflight
openspec context --jsonno_openspec_root -> stop, offer openspec init --tools claude, wait. Never auto-init, never fall back to the current directory. Use the returned root.path. The user naming a store -> openspec store list --json for ids, then --store <id> on every command below, sticky for the run.
.claude/commands/opsx/verify.md present -> the OpenSpec-side mechanics are its job; invoke it and own only the conformance and gate halves. Absent, which is the usual case -> run the flow below off the CLI directly. Mention the opt-in exactly once, as an offer:
openspec config set profile custom
openspec config set workflows '["propose","explore","apply","update","sync","archive","verify"]'
openspec init --tools claudeAccepted or declined, do not raise it again in this run, and never run it unasked. Why -> the profile is global state shared by every repo on the machine, so this is a machine-wide flip made to satisfy one change in one repo.
Flow
- Resolve the change and read its shape:
Keepopenspec status --change "<name>" --jsonchangeRootandartifactPaths. Treat everystatusfield as file-existence only - it says an artifact was written, never that it is right.isCompleteis the sharpest example: it goes true once all four artifact files exist, so a change with 1 of 3 tasks ticked still reportsisComplete: true. Task progress comes fromopenspec instructions apply --change "<name>" --jsoninstead - Artifact validity.
openspec validate <change> --strict --json-> parseitems[].issues[], report each with itsidandtype. This checks the spec documents are well-formed and nothing more. A clean run is not evidence about the code - The repo gate. Find the project's own verify command by reading the justfile or the package scripts -
just checkhere, a test suite elsewhere. Never invent one; nothing found -> ask. Then run it yourself as a shell command. Why -> this is the only check in the set that executes the code; the other two only read documents, and a worker's "tests pass" is a claim, not a result - Scenario conformance. Walk the delta as in Scenarios
- Tick audit. Walk
tasks.mdthe other way, as in Ticks - Report as in Report, then hand back as in Handback. Stop. Change nothing
Scenarios
Every #### Scenario: in the change's specs/**/*.md delta is a promise about observable behavior. Enumerate them, then find each one's counterpart in the implementation:
grep -rn '^#### Scenario:' "<changeRoot>/specs"A counterpart is a test, an assertion, or a code path that would actually differ if the scenario were false. Grade each one:
- Covered - a named test or assertion exercises it. Cite
path:line - Implemented, untested - the code path exists, nothing pins it. Cite the path
- Missing - no counterpart found. This is the finding
Why -> openspec status reports that specs/ exists and the repo gate reports that whatever tests exist pass; neither one notices a scenario nobody ever wrote a test for. Only this walk does.
A scenario whose counterpart contradicts the delta is drift, and drift is a finding. Never resolve it by editing the spec to match what was built. Why -> rewriting the promise to fit the code makes every future reader believe that is what was agreed, and destroys the only record that it was not.
Ticks
Read tasks.md at its path from artifactPaths, not the lossy tasks[] from openspec instructions apply --json - that array strips the files: and needs: continuation lines and renumbers ids, so it cannot support this check. Key tasks on the N.M label parsed out of the text.
For every - [x], confirm its files: were actually touched on this branch:
base=$(git symbolic-ref --short refs/remotes/origin/HEAD)
git diff --name-only "$(git merge-base HEAD "$base")"...HEADDetect the base, never assume origin/main - ref missing -> git remote set-head origin -a and re-read, no remote -> main, fall back master. Why -> a repo based on develop diffs against a parent it never branched from, and every task reads as a false tick.
A ticked task whose files: appear nowhere in that list is a false tick - report it by label. Why -> a checkbox is a claim made by whoever ticked it, and it is the only thing spec-archive's gate counts; a false tick walks a never-built feature straight into openspec/specs/.
Report
Three buckets, one line each, most severe first. No narration of the process, no per-file walkthrough, no agent-count.
- action - a promise is unmet: a missing scenario, a false tick, a red gate, a strict-validate error
- attention - real but not blocking: implemented-untested scenarios, validate warnings, drift worth a decision
- ok - checks that ran clean, named so the user can see coverage: "validate strict clean, gate green, 9/9 scenarios covered"
Lead with the counts: 3 ok, 2 attention, 1 action. Never report a check you did not run - a gate you could not find is action: no verify command, never a silent ok.
Handback
Every finding routes to the skill that owns the fix. Name it, do not do it:
- Code does not meet the spec -> back to
spec-apply - The spec itself was wrong, so the artifact needs correcting -> back to
spec-propose, or/opsx:updatewhere it is installed - Clean across all three checks ->
spec-archive
When Not To Use This
- Tasks still unticked ->
spec-apply. There is nothing to verify yet - Verified and ready to fold the deltas into the specs ->
spec-archive - Reviewing a diff for bugs rather than for spec conformance ->
/code-review - Something is broken and needs diagnosing ->
diagnosing-bugs
Rules
- Read-only. Report findings, fix nothing, tick nothing, archive nothing
- Three checks, three verdicts. Never let a green gate stand in for conformance, or a clean validate stand in for either
- Never report a check you did not run, and never report one this file predicts - verdicts come from the run
- Never invent a verify command. Read the justfile or the package scripts, or ask
- Drift is a finding, never a reason to edit the spec
- Never mutate the global openspec profile. Offer the opt-in once, then drop it
- Never
--no-verify, neveropenspec archivefrom here
Other versions10 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 10
- arfar-x/agent-skills★ 13same name
- sourjya/kiro-rails★ 9same name
- orrrrli/ai-engineering-stack★ 2same name
- orrrrli/clawd-harness★ 2same name
- anxndsgn/skills★ 1same name
- rainmancswh-dot/claude-skills★ 1same name
- ba0918/claude-skills★ 0same name
- cldanielhernandez/claude-skills★ 0same name
- mahdyarief/spec-driven-agent-kit★ 0same name
- telefrek/vallorcine★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
Used alongsideProjects with it also use grill-me and handoff.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.In this repository21 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- blog-writeSkill
- cloudflare-hygieneSkill
- git-branch-cleanupSkill
- git-branch-createSkill
- git-branch-syncSkill
- git-commitSkill
- git-issue-createSkill
- git-issue-startSkill
- git-issue-triageSkill
- git-pr-createSkill
- herdr-dispatchSkill
- humanizeSkill
- macos-cleanupSkill
- macos-maintenanceSkill
- obsidian-markdownSkill
- spec-applySkill
- spec-archiveSkill
- spec-exploreSkill
- spec-proposeSkill
- vercel-hygieneSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

