| name | afc:spec |
| description | Generate feature specification — write requirements, acceptance criteria, scope |
| argument-hint | [feature description in natural language] |
| allowed-tools | ["Read","Glob","Grep","Write","WebSearch","WebFetch"] |
| model | sonnet |
/afc:spec — Generate Feature Specification
Converts a natural language feature description into a structured specification (spec.md).
Validates completeness with convergence-based Critic Loop. Operates on pure prompts without external scripts.
Arguments
$ARGUMENTS — (required) Feature description in natural language
Project Config (auto-loaded)
!cat .claude/afc.config.md 2>/dev/null || echo "[CONFIG NOT FOUND] .claude/afc.config.md not found. Create it with /afc:init."
Config Load
Always read .claude/afc.config.md first (read manually if not auto-loaded above).
If config file is missing:
- Ask the user: "
.claude/afc.config.md not found. Run /afc:init to set up the project?"
- If user accepts → run
/afc:init, then restart this command with the original $ARGUMENTS
- If user declines → abort
Execution Steps
1. Set Up Feature Directory
- Check current branch →
BRANCH_NAME
- Determine feature name:
- Extract 2-3 key keywords from
$ARGUMENTS
- Convert to kebab-case (e.g., "add user authentication" →
user-auth)
- Prepend today's date in
YYYY-MM-DD format (e.g., 2026-03-13-user-auth)
- Create directory:
.claude/afc/specs/{YYYY-MM-DD}-{feature-name}/ (create parent .claude/afc/specs/ directory if it does not exist)
- If already exists, confirm with user: "Overwrite existing spec?"
2. Explore Codebase
Before writing the spec, understand the current project structure:
- Check key directories by
{config.architecture} layer
- Explore existing code related to the feature description (Grep/Glob)
- Identify related type definitions, APIs, and components
- Necessity & scope check — evaluate whether the request warrants a full spec:
- Already exists? If the feature substantially exists → report: "This feature appears to already exist at {path}." Ask user: enhance existing, replace entirely, or abort.
- Over-scoped? If
$ARGUMENTS implies multiple unrelated concerns or changes that span different architectural boundaries, warn and suggest splitting. Judge by the diversity and independence of concerns, not by file count — a well-organized feature touching many files in one module is fine, while a small change spanning security, database, and UI layers may be over-scoped.
- Trivial? If the change is small enough to implement directly (typo, config value, single-line fix) → suggest: "This can be implemented directly without a full spec. Proceed with direct edit?"
- If user chooses abort → end with
"No spec generated — {reason}." and suggest the appropriate alternative.
2.5. Research Gate (conditional)
Detect whether $ARGUMENTS references external libraries, APIs, or technologies not already present in the codebase:
- Scan for external references: extract library names, API names, protocol names, and framework references from
$ARGUMENTS
- Check codebase presence: Grep/Glob for each reference in the project
- If all references are internal (found in codebase): skip research, proceed to Step 3
- If external references detected:
- For each unknown reference, run a focused WebSearch query:
"{library/API name} latest stable version usage guide {current year}"
- Optionally use Context7 (
mcp__context7__resolve-library-id → mcp__context7__query-docs) for library-specific documentation
- Record findings to
.claude/afc/specs/{YYYY-MM-DD}-{feature-name}/research-notes.md (lightweight spec-scoped notes; distinct from plan phase's research.md which covers deep technical research)
- Also use findings inline as context for spec writing
- Tag each researched item in spec with
[RESEARCHED] for traceability
Research here is lightweight and spec-scoped — just enough to write accurate requirements. Deep technical research (alternatives comparison, migration paths) belongs in /afc:plan Phase 0.
3. Write Spec
Create .claude/afc/specs/{YYYY-MM-DD}-{feature-name}/spec.md following the template in ${CLAUDE_SKILL_DIR}/spec-template.md. Read it first, then generate the spec using that structure.
3.5. Inline Clarification (standalone mode only)
After writing the spec, check for [NEEDS CLARIFICATION] items:
- If no
[NEEDS CLARIFICATION] items exist: skip, proceed to Step 4
- If items exist and running standalone (
/afc:spec directly):
- Present each ambiguity to the user via AskUserQuestion (max 3 questions per batch)
- Apply answers directly into spec.md (replace
[NEEDS CLARIFICATION] with resolved text)
- If user chooses to defer: leave items as
[NEEDS CLARIFICATION] and note in final output
- If running inside
/afc:auto: skip this step entirely (auto.md handles auto-resolution in Phase 1)
This replaces the previous pattern of always deferring to /afc:clarify. Standalone spec now resolves ambiguities immediately when the user is present. /afc:clarify remains available for revisiting specs later.
4. Retrospective Check
If .claude/afc/memory/retrospectives/ directory exists, load the most recent 10 files (sorted by filename descending) and check:
- Were there previous
[AUTO-RESOLVED] items that turned out wrong? Flag similar patterns.
- Were there scope-related issues in past specs? Warn about similar ambiguities.
5. Critic Loop
Always read ${CLAUDE_SKILL_DIR}/../../docs/critic-loop-rules.md first and follow it.
Run the critic loop until convergence. Safety cap: 5 passes.
| Criterion | Validation |
|---|
| COMPLETENESS | Does every User Story have acceptance scenarios? Are any requirements missing? |
| MEASURABILITY | Are the success criteria measurable, not subjective? |
| INDEPENDENCE | Are implementation details (code, library names) absent from the spec? |
| EDGE_CASES | Are at least 2 edge cases identified? Any missing boundary conditions? |
| TESTABILITY | Does every System Requirement follow one of the 5 EARS patterns (WHEN/WHILE/IF/WHERE/SHALL)? Does each EARS requirement have a mapped TC (→ TC: should_...)? If not → FAIL and auto-fix: rewrite to EARS + generate TC mapping. |
Follow verdict handling and output format per docs/critic-loop-rules.md.
5.5. Auto-Checkpoint (standalone only)
When not running inside /afc:auto, save progress for /afc:resume:
- Create
.claude/afc/memory/ directory if it does not exist (mkdir -p .claude/afc/memory/)
- Write/update
.claude/afc/memory/checkpoint.md with: branch, last commit (or "none" if empty repo), feature name, current phase (spec complete), next step (/afc:plan)
- Skip if running inside auto pipeline (auto manages its own checkpoints via phase transitions)
6. Final Output
Spec generated
├─ .claude/afc/specs/{YYYY-MM-DD}-{feature-name}/spec.md
├─ User Stories: {count}
├─ Requirements: FR {count}, NFR {count}
├─ Research: {N} external references researched / skipped (all internal)
├─ Clarified: {N} items resolved inline / {M} deferred
├─ Unresolved: {[NEEDS CLARIFICATION] count}
└─ Next step: /afc:plan (unresolved items will be flagged at plan start)
Notes
- Do not write implementation details in the spec. Expressions like "manage with Zustand" belong in plan.md.
- Specify actual paths for entities related to existing code.
- If
$ARGUMENTS is empty, ask user for a feature description.
- Do not pack too many features into one spec. Suggest splitting if User Stories exceed 5.
- When running
/afc:auto, [AUTO-SUGGESTED] NFRs are included automatically. Review after completion is recommended.