Propose a new change - create the change and generate all artifacts in one step.
I'll create a change with artifacts:
- proposal.md (what & why)
- design.md (how)
- tasks.md (implementation steps)
- opsx-delta.yaml (project OPSX delta, generated after specs are clear)
When ready to implement, run /opsx:apply
Input: The user's request should include a change name (kebab-case) OR a description of what they want to build.
Steps
If no clear input provided, ask what they want to build
Use the AskUserQuestion tool (open-ended, no preset options) to ask:
"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
openspec new change "<name>"This creates a scaffolded change at
openspec/changes/<name>/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 dependencies
Before reading other context files, check whether openspec/project.opsx.yaml exists.
- If it exists, read it first for domains → capabilities structure
- Check
openspec/project.opsx.code-map.yamlfor code location references - Check
openspec/specs/for behavior documentation - Treat it as navigation context, not as a replacement for change artifacts
Create artifacts in sequence until apply-ready
Use the TodoWrite tool to track progress through the artifacts.
Loop through artifacts in dependency order (artifacts with no pending dependencies first):
a. For each artifact that is
ready(dependencies satisfied):- Get instructions:
openspec instructions <artifact-id> --change "<name>" --json - The instructions JSON includes:
context: 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 typeoutputPath: Where to write the artifactdependencies: Completed artifacts to read for context
- Read any completed dependency files for context
- Create the artifact file using
templateas the structure - Apply
contextandrulesas constraints - but do NOT copy them into the file - Show brief progress: "Created "
b. Continue until all
applyRequiresartifacts are complete- After creating each artifact, re-run
openspec status --change "<name>" --json - Check if every artifact ID in
applyRequireshasstatus: "done"in the artifacts array - Stop when all
applyRequiresartifacts are done
c. If an artifact requires user input (unclear context):
- Use AskUserQuestion tool to clarify
- Then continue with creation
d. After the
specsartifact is complete in a spec-driven change, generateopsx-delta.yamlGenerate opsx-delta.yaml:- Get instructions:
- Read
openspec instructions opsx-delta --change "<name>" --json - Use the returned
template,instruction, andoutputPathto generateopsx-delta.yaml - Read
proposal.mdto extract the capability list - Read all delta specs in
openspec/changes/<name>/specs/*/spec.md - Read
openspec/project.opsx.yamlif it exists for current-system context - Treat
ADDED,MODIFIED, andREMOVEDas YAML object keys, not Markdown headings - Follow a concrete YAML object structure such as:
schema_version: 1 ADDED: capabilities: - id: cap.example.feature type: capability intent: Describe the new capability relations: - from: cap.example.feature type: contains to: dom.example MODIFIED: capabilities: - id: cap.example.existing intent: Updated intent text REMOVED: capabilities: - id: cap.example.legacy - Delta nodes contain only id, type, intent, status — no code_refs or spec_refs
- Keep this agent-driven: capture merge intent in the YAML, not in programmatic code
Run post-propose validation before the final summary
Run post-propose warning validation:
- This validation is warning-only. Do NOT turn
/opsx:proposeinto a blocking gate. - Validate generated change specs against the same contract used by downstream change delta validation:
- Prefer
openspec validate "<name>" --type change --jsonwhen available - Align with
Validator.validateChangeDeltaSpecs()semantics for delta sections, SHALL/MUST requirement text, and required#### Scenario:blocks
- Prefer
- Validate
opsx-delta.yamlthrough the same programmatic CLI path used by downstream change validation:- Prefer
openspec validate "<name>" --type change --jsonwhen available - Align with
Validator.validateOpsxDelta()semantics for Zod parsing, dry-runapplyOpsxDelta(), referential integrity, and code-map integrity - Do NOT run
openspec syncfor this check because it mutates project files - If
openspec/project.opsx.yamldoes not exist,Validator.validateOpsxDelta()skips this check and the final summary must report the skip
- Prefer
- Run lightweight structure checks for
proposal.md,design.md, andtasks.mdagainst the current schema templates, not scattered examples:- Read
openspec instructions proposal --change "<name>" --json,openspec instructions design --change "<name>" --json, andopenspec instructions tasks --change "<name>" --json - Check only key required headings and checkbox structure
- For
tasks.md, run a deterministic Actions/Checks structure check equivalent tovalidateTaskStructureinsrc/core/parsers/task-structure.ts - Programmatically verify
ActionsandCheckssections,A-prefixed action checkboxes,C-prefixed check checkboxes, requiredCovers:fields, validCovers:references, every action covered by at least one check, required non-emptyVerifies:fields, change-localVerifies:spec paths plus Requirement/Scenario references when local change specs exist, and at least oneCommand:,Evidence:, orExpect:field on every check - Do NOT invent semantic lint rules beyond the current templates
- Do NOT judge whether a check is semantically sufficient; defer semantic suitability to verify/reviewer
- Read
- If warnings are found, do exactly one repair pass on the generated artifacts, then re-check once
- Final summary MUST separate:
- fixed warnings
- remaining warnings
- skipped checks
- Even with remaining warnings, you MAY still declare the change ready for
/opsx:apply, but disclose the residual issues explicitly
- Show final status
openspec status --change "<name>"
Output
After completing all artifacts, summarize:
- Change name and location
- List of artifacts created with brief descriptions
- Validation summary with fixed warnings, remaining warnings, and skipped checks
- What's ready: "All artifacts created! Ready for implementation."
- Prompt: "Run
/opsx:applyor ask me to implement to start working on the tasks."
Artifact Creation Guidelines
- Follow the
instructionfield fromopenspec instructionsfor each artifact type - The schema defines what each artifact should contain - follow it
- Read dependency artifacts for context before creating new ones
- Use
templateas the structure for your output file - fill in its sections
Document Language Contract:
Treat
openspec/config.yamlas the compact source of truth, but consume its compiled prompt projection rather than reinterpreting raw keys ad hocIf the compiled projection includes
docLanguage, apply it only to natural-language prose you write in the artifact bodyFollow the existing template structure exactly; do not invent a different layout because the prose language changes
Keep template headings, IDs, schema keys, relation types, BDD keywords, file paths, commands, and code identifiers in their canonical form
If no
docLanguageprojection is present, keep the default writing behavior for proseIMPORTANT:
contextandrulesare constraints for YOU, not content for the file- Do NOT copy
<context>,<rules>,<project_context>blocks into the artifact - These guide what you write, but should never appear in the output
- Do NOT copy
Guardrails
- Create ALL artifacts needed for implementation (as defined by schema's
apply.requires) - Always read dependency artifacts before creating a new one
- If context is critically unclear, ask the user - but prefer making reasonable decisions to keep momentum
- If a change with that name already exists, ask if user wants to continue it or create a new one
- Verify each artifact file exists after writing before proceeding to next