Spec-driven development on OpenSpec, with mechanical spec-as-source enforcement: a custom 'spec-as-source' OpenSpec schema adds file-ownership (targets) and test-verification ([@test]) metadata to every capability spec, three scripts (link check, ownership check, manifest build) keep code and specs from drifting apart, plus requirement-gathering, spec-writer, work-review, and a session-handoff skill with a proactive context-warning hook.
68
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Propose a new change - create the change and generate all artifacts in one step.
I'll create a change with artifacts:
When ready to implement, run /opsx:apply
Store selection: If the user names a store (a store is a standalone OpenSpec repo registered on this machine) or the work lives in one, run openspec store list --json to discover registered store ids, then pass --store <id> on the commands that read or write specs and changes (new change, status, instructions, list, show, validate, archive, doctor, context). Other commands do not take the flag. Hints printed by commands already carry the flag; keep it on follow-ups. Without a store, commands act on the nearest local openspec/ root.
Input: The user's request should include a change name (kebab-case) OR a description of what they want to build.
Precondition — the plan gate. Run it first, before creating anything.
No change may start without an approved entry in openspec/PLAN.md. Once you
have the change name, and before openspec new change or any artifact:
bash scripts/check-plan-gate.sh --change "<name>"NO-ENTRY, NOT-APPROVED, HASH-MISMATCH or STALE. Do not paraphrase it;
the reason names the fix. Then hand over to plan-mode, which owns the plan.
NO-ENTRY on work the user clearly wants is not a formality: it means the work
is not in the plan, and adding an entry is the user's call, not yours.--change — a made-up name passes the flag and defeats the
check.scripts/check-plan-gate.sh is missing or not executable, say so and
stop: report that the plan gate is not installed in this project and that
spec-as-source-setup installs it. A check that cannot run is not an
approval, and treating it as one is indistinguishable from an approved plan.Run the script; do not re-implement it. This skill never reads openspec/PLAN.md,
never inspects entries or their approval fields, and never computes or compares
an approval hash: scripts/check-plan-gate.sh is the only judge and the only
implementation of the hash. ROUTER.md § Stage 2B runs the same command before
routing here — same script, same reasons, one gate at two doors, so the routed
path and a direct invocation of this skill cannot disagree.
Steps
If no clear input provided, ask what they want to build
Ask the user, open-ended (no preset options):
"What change do you want to work on? Describe what you want to build or fix."
From their description, derive a kebab-case name (e.g., "add user authentication" → add-user-auth).
IMPORTANT: Do NOT proceed without understanding what the user wants to build.
Create the change directory — only after the plan gate above exited 0
openspec new change "<name>"This creates a scaffolded change in the planning home resolved by the CLI with .openspec.yaml.
Get the artifact build order
openspec status --change "<name>" --jsonParse the JSON to get:
applyRequires: array of artifact IDs needed before implementation (e.g., ["tasks"])artifacts: list of all artifacts with their status and dependenciesplanningHome, changeRoot, artifactPaths, and actionContext: path and scope context. Use these instead of assuming repo-local paths.Create artifacts in sequence until apply-ready
Track progress through the artifacts with a todo list (or your environment's equivalent progress-tracking mechanism).
Loop through artifacts in dependency order (artifacts with no pending dependencies first):
a. For each artifact that is ready (dependencies satisfied):
openspec instructions <artifact-id> --change "<name>" --jsoncontext: Project background (constraints for you - do NOT include in output)rules: Artifact-specific rules (constraints for you - do NOT include in output)template: The structure to use for your output fileinstruction: Schema-specific guidance for this artifact typeresolvedOutputPath: Resolved path or pattern to write the artifactdependencies: Completed artifacts to read for contexttemplate as the structure and write it to resolvedOutputPathcontext and rules as constraints - but do NOT copy them into the fileb. Continue until all applyRequires artifacts are complete
openspec status --change "<name>" --jsonapplyRequires has status: "done" in the artifacts arrayapplyRequires artifacts are donec. If an artifact requires user input (unclear context):
Show final status
openspec status --change "<name>"Output
After completing all artifacts, summarize:
/opsx:apply or ask me to implement to start working on the tasks."Artifact Creation Guidelines
instruction field from openspec instructions for each artifact typetemplate as the structure for your output file - fill in its sectionscontext and rules are constraints for YOU, not content for the file
<context>, <rules>, <project_context> blocks into the artifactGuardrails
apply.requires).tessl-plugin
rules
skills
handoff
handoff-skill
openspec-apply-change
openspec-archive-change
openspec-explore
openspec-propose
openspec-sync-specs
plan-judge
plan-mode
prompt-loop
requirement-gathering
spec-as-source-setup
templates
openspec-schema
spec-as-source
templates
spec-ci-sync
spec-loop
spec-rebuild
spec-verify
spec-writer
work-review