Create or update the feature specification from a natural language feature description.
$ARGUMENTS
You MUST consider the user input before proceeding (if not empty).
Check for extension hooks (before specification):
.specify/extensions.yml exists in the project root.hooks.before_specify keyenabled is explicitly false. Treat hooks without an enabled field as enabled by default.condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip the hook and leave condition evaluation to the HookExecutor implementationoptional flag:
optional: true):
## Extension Hooks
**Optional Pre-Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
optional: false):
## Extension Hooks
**Automatic Pre-Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
Wait for the result of the hook command before proceeding to the Outline.
.specify/extensions.yml does not exist, skip silentlyThe text the user typed after /speckit.specify in the triggering message is the feature description. Assume you always have it available in this conversation even if $ARGUMENTS appears literally below. Do not ask the user to repeat it unless they provided an empty command.
Given that feature description, do this:
Generate a concise short name (2-4 words) for the feature:
Branch creation (optional, via hook):
If a before_specify hook ran successfully in the Pre-Execution Checks above, it will have created/switched to a git branch and output JSON containing BRANCH_NAME and FEATURE_NUM. Note these values for reference, but the branch name does not dictate the spec directory name.
If the user explicitly provided GIT_BRANCH_NAME, pass it through to the hook so the branch script uses the exact value as the branch name (bypassing all prefix/suffix generation).
Create the spec feature directory:
Specs live under the default specs/ directory unless the user explicitly provides SPECIFY_FEATURE_DIRECTORY.
Resolution order for SPECIFY_FEATURE_DIRECTORY:
SPECIFY_FEATURE_DIRECTORY (e.g., via environment variable, argument, or configuration), use it as-isspecs/:
.specify/init-options.json for branch_numbering"timestamp": prefix is YYYYMMDD-HHMMSS (current timestamp)"sequential" or absent: prefix is NNN (next available 3-digit number after scanning existing directories in specs/)<prefix>-<short-name> (e.g., 003-user-auth or 20260319-143022-user-auth)SPECIFY_FEATURE_DIRECTORY to specs/<directory-name>NOTE: Branch creation is handled by the before_specify hook (git extension). Spec directory and file creation are always handled by this core command.
When creating this spec from a user prompt:
Examples of reasonable defaults (don't ask about these):
Success criteria must be:
Good examples:
Bad examples (implementation-focused):
Create the directory and spec file:
mkdir -p SPECIFY_FEATURE_DIRECTORY.specify/templates/spec-template.md to SPECIFY_FEATURE_DIRECTORY/spec.md as the starting pointSPEC_FILE to SPECIFY_FEATURE_DIRECTORY/spec.md.specify/feature.json:
{
"feature_directory": "<resolved feature dir>"
}
Write the actual resolved directory path value (for example, specs/003-user-auth), not the literal string SPECIFY_FEATURE_DIRECTORY.
This allows downstream commands (/speckit.plan, /speckit.tasks, etc.) to locate the feature directory without relying on git branch name conventions.IMPORTANT:
/speckit.specify invocationLoad .specify/templates/spec-template.md to understand required sections.
Follow this execution flow:
/oracle with
a specific question. Example prompt to the user:
This feature involves [decision area]. Before we commit to a requirement, run:
/oracle "[specific question about this decision]"If the oracle returns prior decisions that contradict or inform a requirement, incorporate the finding into the spec (as an assumption or constraint) and note it explicitly.
Write the specification to SPEC_FILE using the template structure, replacing placeholders with concrete details derived from the feature description (arguments) while preserving section order and headings.
Specification Quality Validation: After writing the initial spec, validate it against quality criteria:
a. Create Spec Quality Checklist: Generate a checklist file at SPECIFY_FEATURE_DIRECTORY/checklists/requirements.md using the checklist template structure with these validation items:
# Specification Quality Checklist: [FEATURE NAME]
**Purpose**: Validate specification completeness and quality before proceeding to planning
**Created**: [DATE]
**Feature**: [Link to spec.md]
## Content Quality
- [ ] No implementation details (languages, frameworks, APIs)
- [ ] Focused on user value and business needs
- [ ] Written for non-technical stakeholders
- [ ] All mandatory sections completed
## Requirement Completeness
- [ ] No [NEEDS CLARIFICATION] markers remain
- [ ] Requirements are testable and unambiguous
- [ ] Success criteria are measurable
- [ ] Success criteria are technology-agnostic (no implementation details)
- [ ] All acceptance scenarios are defined
- [ ] Edge cases are identified
- [ ] Scope is clearly bounded
- [ ] Dependencies and assumptions identified
## Feature Readiness
- [ ] All functional requirements have clear acceptance criteria
- [ ] User scenarios cover primary flows
- [ ] Feature meets measurable outcomes defined in Success Criteria
- [ ] No implementation details leak into specification
## Notes
- Items marked incomplete require spec updates before `/speckit.clarify` or `/speckit.plan`
b. Run Validation Check: Review the spec against each checklist item:
c. Handle Validation Results:
If all items pass: Mark checklist complete and proceed to step 7
If items fail (excluding [NEEDS CLARIFICATION]):
If [NEEDS CLARIFICATION] markers remain:
Extract all [NEEDS CLARIFICATION: ...] markers from the spec
LIMIT CHECK: If more than 3 markers exist, keep only the 3 most critical (by scope/security/UX impact) and make informed guesses for the rest
Report completion to the user with:
SPECIFY_FEATURE_DIRECTORY — the feature directory pathSPEC_FILE — the spec file path/speckit.clarify or /speckit.plan)Any decisions made during this spec elaboration should be captured now. Run:
/oracle-capture "[brief description of the decision]"for each confirmed decision before moving to planning.
Check for extension hooks: After reporting completion, check if .specify/extensions.yml exists in the project root.
hooks.after_specify keyenabled is explicitly false. Treat hooks without an enabled field as enabled by default.condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip the hook and leave condition evaluation to the HookExecutor implementationoptional flag:
optional: true):
## Extension Hooks
**Optional Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
optional: false):
## Extension Hooks
**Automatic Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
.specify/extensions.yml does not exist, skip silentlyFor each clarification needed (max 3), present options to user in this format:
## Question [N]: [Topic]
**Context**: [Quote relevant spec section]
**What we need to know**: [Specific question from NEEDS CLARIFICATION marker]
**Suggested Answers**:
| Option | Answer | Implications |
|--------|--------|--------------|
| A | [First suggested answer] | [What this means for the feature] |
| B | [Second suggested answer] | [What this means for the feature] |
| C | [Third suggested answer] | [What this means for the feature] |
| Custom | Provide your own answer | [Explain how to provide custom input] |
**Your choice**: _[Wait for user response]_
CRITICAL - Table Formatting: Ensure markdown tables are properly formatted:
| Content | not |Content||--------|Number questions sequentially (Q1, Q2, Q3 - max 3 total)
Present all questions together before waiting for responses
Wait for user to respond with their choices for all questions (e.g., "Q1: A, Q2: Custom - [details], Q3: B")
Update the spec by replacing each [NEEDS CLARIFICATION] marker with the user's selected or provided answer
Re-run validation after all clarifications are resolved
d. Update Checklist: After each validation iteration, update the checklist file with current pass/fail status