skills/sdd-spec/SKILL.md
Writes delta specifications with requirements and Given/When/Then scenarios for a change. Trigger: /sdd-spec <change-name>, write specs, functional requirements, specification phase.
npx skillsauth add fearovex/claude-config sdd-specInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Writes delta specifications with requirements and Given/When/Then scenarios.
Triggers: /sdd-spec <change-name>, write specs, specifications, functional requirements, sdd spec
Specs define WHAT the system must do from the perspective of observable behavior. They do not say how to implement it. They are the source of truth for verification.
Key concept — Delta Specs: Specs are deltas (changes) on top of what already exists, not full replacements.
When the orchestrator launches this sub-agent, it resolves the skill path using:
1. .claude/skills/sdd-spec/SKILL.md (project-local — highest priority)
2. ~/.claude/skills/sdd-spec/SKILL.md (global catalog — fallback)
Project-local skills override the global catalog. See docs/SKILL-RESOLUTION.md for the full algorithm.
Follow skills/_shared/sdd-phase-common.md Section F (Project Context Load). Non-blocking.
After loading project context and before identifying affected domains, I perform an optional, non-blocking domain context preload:
.md files in ai-context/features/, excluding _template.md and any file whose name begins with an underscore. If the directory is absent, skip this step silently..md extension).status: blocked or status: failed. Any file read error is treated as a miss (skip silently).summary field MUST note that domain context was preloaded (e.g., "domain context loaded from ai-context/features/auth.md"). Each loaded file path MUST appear in the artifacts list (read, not written).Follow skills/_shared/sdd-phase-common.md Section G (Spec Context Preload). Non-blocking.
I must read:
mem_search(query: "sdd/{change-name}/proposal") → mem_get_observation(id) for full content.ai-context/architecture.md if it exists (to understand the current system)After reading the proposal, I perform a Supersedes cross-check before writing any spec:
Check for Supersedes section: look for ## Supersedes in the proposal.
WARNING: proposal has no Supersedes section — backwards compat mode; skipping validation and proceed without validation.For each REMOVED item in Supersedes: scan the delta spec I am about to write for any requirement that says "preserve X", "X MUST remain", or "backward compatibility with X". If found:
MUST_RESOLVE warning: "Spec includes a preservation requirement for '[X]' but proposal says '[X]' is REMOVED. Confirm intent."For each REPLACED item in Supersedes: verify the spec describes the new replacement, not the old behavior. If spec only describes old behavior without acknowledging replacement, add a note: [PENDING: spec does not describe replacement behavior for [X] — clarify with design].
For CONTRADICTED items: verify the spec aligns with the resolution documented in ## Contradiction Resolution of the proposal. If mismatch, emit MUST_RESOLVE warning.
From the proposal I extract the domains that need specs:
For each affected domain, I persist the delta spec to engram:
Call mem_save with topic_key: sdd/{change-name}/spec, type: architecture, project: {project}, content = all domain specs concatenated (separated by ---). Do NOT write any file.
If Engram MCP is not reachable: skip persistence. Return spec content inline only.
Content format:
# Spec: [Domain]
Change: [change-name]
Date: [YYYY-MM-DD]
## Requirements
### Requirement: [Descriptive name]
[Description using RFC 2119 keywords]
#### Scenario: [Case name]
- **GIVEN** [precondition — system state]
- **WHEN** [action — what happens]
- **THEN** [observable result — what must happen]
- **AND** [additional result if applicable]
#### Scenario: [Edge case]
- **GIVEN** [...]
- **WHEN** [...]
- **THEN** [...]
# Delta Spec: [Domain]
Change: [change-name]
Date: [YYYY-MM-DD]
## ADDED — New requirements
### Requirement: [Name]
[Description]
#### Scenario: [Name]
- **GIVEN** [...]
- **WHEN** [...]
- **THEN** [...]
## MODIFIED — Modified requirements
### Requirement: [Name of existing requirement]
[New description]
_(Before: [previous description])_
#### Scenario: [Name] _(modified)_
- **GIVEN** [...]
- **WHEN** [...]
- **THEN** [...]
## REMOVED — Removed requirements
### Requirement: [Name]
_(Reason: [why it is being removed])_
| Keyword | Meaning | | ------------ | --------------------------------------------------- | | MUST | Absolute requirement | | MUST NOT | Absolute prohibition | | SHOULD | Recommended (exceptions allowed with justification) | | MAY | Optional |
For each requirement I include:
#### Scenario: Successful login with valid credentials
- GIVEN that the user exists with email "[email protected]" and the correct password
- WHEN they send POST /auth/login with those credentials
- THEN they receive status 200
- AND they receive a valid JWT in the "token" field
- AND the token expires in 24 hours
#### Scenario: Failed login with incorrect password
- GIVEN that the user exists with email "[email protected]"
- WHEN they send POST /auth/login with an incorrect password
- THEN they receive status 401
- AND the error message does NOT reveal whether the email exists
#### Scenario: The user can log in
- GIVEN there is a user
- WHEN they log in
- THEN it works
{
"status": "ok|warning|blocked",
"summary": "Specs for [change-name]: [N] domains, [M] requirements, [K] scenarios.",
"artifacts": ["engram:sdd/{change-name}/spec"],
"next_recommended": ["sdd-tasks (after sdd-design)"],
"risks": []
}
sdd-design)[Pending clarification] and list it in risksbusiness
Turns an already-investigated customer issue into a short, non-technical engineering-to-CS brief: one natural message that leads with the finding (root cause, real scope, open question), ready to paste into Slack for the support team. Trigger: /support-brief, support brief, brief for support, resumen soporte.
development
Parks the current Claude Code session before going to sleep. Analyzes the conversation, writes a handoff document to docs/handoffs/ in the current project, mirrors the same summary to engram tagged with the session ID, and prints the exact `claude --resume <id>` command for tomorrow. Zero interaction — runs end-to-end on a single invocation. Trigger: /night-park, night park, park session, me voy a dormir, guardar sesion.
testing
Interactive creator for a project feature: scaffolds the domain knowledge markdown at ai-context/features/<slug>.md AND the antenna skill at .claude/skills/<slug>/SKILL.md, both from the canonical templates. Also registers the antenna in the project's CLAUDE.md. Trigger: /feature-define <name>, define feature, documentar funcionalidad, nueva feature.
data-ai
Generates a short, non-technical, informal English summary of an already-investigated customer issue, ready to paste into Slack/email for support, CX, or ops teammates. Trigger: /customer-summary, customer summary, resumir customer issue, slack summary.