Esta guía es la tercera pieza de una serie. Si llegas directo y no leíste las anteriores, conviene pasar primero por ahí:

Esta guía asume que ya tienes ese contexto. Si solo quieres practicar los comandos puedes saltar directo, pero algunos conceptos (constitución, compuertas, las 4 técnicas ISTQB) van a aparecer como si ya los conocieras.

Hoy bajamos a tierra. Pero antes de tocar un comando, te quiero contestar la pregunta que se hace cualquier QA cuando ve una herramienta nueva: ¿para qué me sirve esto un lunes de sprint?

El caso concreto — un lunes a la mañana

Te llega esto en Jira:

TICKET-1042 — Agregar endpoint de registro de usuario para Academia sin Humo , nuestra plataforma pública de práctica para automatización QA. Inputs: email, username, password, age. Reglas de negocio: a confirmar.

Tu cabeza arranca. ¿Qué validaciones? ¿Edad mínima? ¿Ya hay máquina de estados o se inventa ahora? ¿Cómo manejamos colisiones de email/username sin filtrar info? ¿Cuánto dura el link de verificación? ¿Qué pasa si el email tiene un +alias?

Hoy las opciones que tienes son tres, y ninguna buena:

  • Pedir reunión con el PM → pierde la mañana de los dos, y muchas preguntas siguen abiertas porque el PM tampoco las pensó.
  • Arrancar sin preguntar → tres sprints después aparecen 4 bugs en prod por reglas que nadie escribió.
  • Escribir casos de prueba “razonables” basados en suposiciones → el dev implementa otras suposiciones, los tests no cazan nada y los bugs sí.

Con SDD el flujo cambia:

Hoy: 30 min de reunión + 1h escribiendo casos sobre suposiciones + 3 bugs de requerimientos en prod 2 sprints después
Con SDD: 15 min con /speckit-specify generando un spec con casos válidos, inválidos, errores, máquina de estados y catálogo de errores no-leaky. Las ambigüedades aparecen en /speckit-clarify y se resuelven antes de escribir una línea de código.

Qué ganas concretamente:

  • Los bugs de requerimientos desaparecen — la categoría más cara en cualquier proyecto. SDD los caza en la fase de clarificación, no en producción.
  • El test plan ya existe: los acceptance scenarios son tus casos, las tablas de equivalencia son tus particiones, la state machine son tus tests de transición. Lo que antes te tomaba un día, ahora viene generado.
  • La review de PR tiene una vara objetiva: ¿este código honra el spec? Si no, vuelve. Sin debate.
  • Los tests sobreviven al refactor: si el dev cambia la implementación pero el spec se mantiene, los tests siguen siendo válidos. Antes cada refactor te rompía media suite.

¿Cuándo sí y cuándo no usar SDD?

SDD no es bala de plata. Tiene casos donde brilla y casos donde estorba.

Situación¿Sirve SDD?Por qué
Feature nuevo desde cero✅ SíEl caso ideal. Constitución → spec → plan → tests → implementación
Refactor de módulo legacy✅ SíEscribes un spec retroactivo y “encierras” el módulo bajo constitución viva
Test plan de un endpoint✅ SíEl spec es el test plan
Review de PR🟡 ParcialSirve si el feature ya tiene spec; sin spec previo, no aporta
Bug urgente en prod❌ NoDemasiado overhead para apagar fuegos
Cambios cosméticos / tweaks visuales❌ NoOverkill
Testing exploratorio❌ NoSDD asume que sabes qué construir; lo exploratorio es lo opuesto

Para qué tipos de pruebas te sirve directamente:

Tipo de prueba¿Sirve?Cómo lo aprovecha SDD
Unitarios✅ SíCada Functional Requirement del spec → un test
API / contrato✅ SíInputs, outputs y errores están declarados como tabla
Integración✅ SíSide effects y entidades están declarados
E2E🟡 ParcialDa el user story completo; los flujos cross-system requieren setup adicional
No funcionales (performance, seguridad)🟡 ParcialSolo si los success criteria los declaran como números medibles

Regla práctica: si vas a tocar lógica de negocio nueva o estás definiendo un contrato de API, SDD te sirve. Si vas a cambiar un color de botón o reproducir un bug, abre el editor directo y resuélvelo a mano.

Lo que vas a tener al terminar esta guía

Spec Kit Instalado y conectado a Claude Code
1 constitución Con principios QA-first non-negotiable
1 spec Generado, clarificado y validado
4 técnicas ISTQB Aplicadas en cada fase del ciclo

Stack para esta guía: macOS o Linux, terminal, Claude Code instalado. Si usas Copilot o Cursor el flujo es casi idéntico — Spec Kit es agnóstico al agente. Yo voy a mostrar todo con Claude Code porque es lo que uso a diario.

1. Setup — instalar Spec Kit en 3 minutos

Spec Kit es un CLI que se distribuye como paquete Python. Para correrlo no necesitas instalar Python ni gestionar entornos virtuales — usamos uv, que es el gestor moderno de paquetes Python de Astral. Si no lo tienes, instálalo primero:

Terminal window
brew install uv

Verifica:

Terminal window
uv --version

Ahora arranca un proyecto nuevo. Vamos a crear un demo de registro de usuario, pero el flujo es el mismo para cualquier feature:

Terminal window
mkdir -p ~/Proyectos/sdd-demo-registro
cd ~/Proyectos/sdd-demo-registro
uvx --from git+https://github.com/github/spec-kit.git specify init .

Spec Kit te va a hacer dos preguntas:

  1. ¿Qué agente vas a usar? Selecciona Claude Code. Si usas Copilot o Cursor, elige el que corresponda. Spec Kit instala los slash commands específicos para tu agente.
  2. ¿Inicializar git? Sí. Spec Kit usa branches para aislar features y la integración es automática.

Cuando termina, vas a tener una estructura como esta:

sdd-demo-registro/
├── .specify/
│ ├── memory/ ← donde vive la constitución del proyecto
│ ├── templates/ ← los templates que usa para generar artefactos
│ └── scripts/ ← scripts de soporte
├── .claude/
│ └── commands/ ← los slash commands de Spec Kit, cargados en Claude Code
└── (tu proyecto aquí)

Abre el directorio en Claude Code:

Terminal window
claude

Y verifica que los slash commands se cargaron correctamente:

/speckit-

Debería autocompletar con /speckit-constitution, /speckit-specify, /speckit-clarify, /speckit-plan, /speckit-tasks, /speckit-implement, entre otros.

Si los slash commands no aparecen, reinicia Claude Code dentro del directorio. Spec Kit los registra al iniciar la sesión, así que un agente que estaba abierto antes del init no los va a ver.

¿Y si quiero usar Spec Kit en otro proyecto?

Spec Kit se inicializa por proyecto — cada uno tiene su propia constitución, sus templates y sus specs. Para usarlo en un proyecto nuevo, repite el specify init . en ese directorio. Lo que no tienes que volver a hacer: instalar uv (ya está, es global), descargar el paquete spec-kit (queda cacheado por uvx), ni reconfigurar el agente.

Si tienes una constitución afinada que quieres reutilizar, cópiala manualmente:

Terminal window
cp ~/Proyectos/proyecto-anterior/.specify/memory/constitution.md \
~/Proyectos/proyecto-nuevo/.specify/memory/constitution.md

Ese es el patrón de “constitución viva del equipo”: una vez que tienes una versión afinada, la replicas en cada proyecto nuevo y solo ajustas los nombres de los principios al dominio.

2. La constitución de tu proyecto — donde tu rol QA cambia el juego

La constitución es el primer artefacto que vas a escribir, y es el más importante. Es un archivo .md con los principios non-negotiable de tu proyecto. Spec Kit lo lee al inicio de cada comando y los usa como reglas que la IA no puede violar.

Aquí es donde tu rol como QA toma protagonismo. Los devs van a poner principios sobre arquitectura, naming, dependencias. Tú vas a poner principios sobre calidad y verificación.

Generala con:

/speckit-constitution

Spec Kit te va a pedir que listes los principios. Esto NO lo improvises: piensa qué es no-negociable en tu proyecto desde la mirada QA. Para el demo de registro, yo definí estos cinco:

P1. ISTQB-FIRST Antes de generar código, todo spec debe aplicar las 4 técnicas Cap. 4 del syllabus ISTQB: partición de equivalencia, valores límite, tabla de decisión, transición de estados. Si una de las cuatro no aplica, el spec debe declarar explícitamente por qué.

P2. ZERO HAPPY-PATH-ONLY Todo caso de uso debe cubrir las 4 categorías mínimas: válido típico, valor límite, inválido por reglas de validación, error de sistema. Specs con solo el camino feliz se rechazan.

P3. STATES MUST BE EXPLICIT Si una entidad tiene estados, el spec debe declarar el conjunto cerrado de estados permitidos, las transiciones permitidas, y las transiciones prohibidas con su justificación. Lo que no está declarado prohibido, la IA va a asumir que es permitido.

P4. ERROR LEAKAGE FORBIDDEN Las respuestas de error visibles para el cliente no pueden revelar: qué campo causó el conflicto, stack traces, identificadores internos, queries, ni detalles de infraestructura. Las diferencias de timing entre “existe” y “no existe” cuentan como leak.

P5. GATEKEEPING BEFORE CODE /speckit-clarify es obligatorio antes de /speckit-plan. Un checklist constitution-grade es obligatorio antes de /speckit-implement. Saltarse cualquiera de los dos invalida el ciclo.

La constitución no es decoración. Es donde decides cuál es el piso de calidad que la IA no puede romper, sin importar qué le pidas después.

Spec Kit guarda la constitución en .specify/memory/constitution.md y la versiona (v1.0.0). Cada vez que corras un comando posterior, esos cinco principios van a estar en el contexto del agente.

Cuidado con generalizar tu constitución. Si pones “el código debe ser de calidad” o “los tests deben pasar”, eso no obliga a nada — son frases, no reglas. Cada principio debe ser verificable: alguien que lea un spec debe poder marcar ✅ o ❌ contra cada uno. Si no es verificable, no es principio.

3. /speckit-specify — tu primer spec generado

Con la constitución lista, genera tu primer spec. Este es el comando que define qué se va a construir, expresado en lenguaje de negocio (sin código).

/speckit-specify

Spec Kit te va a pedir la descripción del feature. Para el demo voy a usar un caso del proyecto Academia sin Humo — una plataforma pública con bugs intencionales para que practiques automatización contra una app real. El ticket que llegó al sprint:

TICKET-1042 — Agregar endpoint de registro de usuario para Academia sin Humo. Inputs: email, username, password, age. Reglas de negocio: a confirmar.

Sí, este ticket es deliberadamente ambiguo. Lo elegí así a propósito porque es el escenario que más duele en la vida real — el ticket que te llega un lunes con 3 líneas y “a confirmar” en lugar de criterios de aceptación. En tu trabajo puede que recibas tickets más detallados (con AC, wireframes, matriz de validaciones), y eso está bien — vas a recibir menos clarificaciones de Spec Kit. Pero el patrón se mantiene: incluso los tickets más completos tienen huecos. SDD los caza igual.

Cuando termina de generar, Spec Kit hace algo crucial: si detecta ambigüedades en tu input, te pregunta antes de seguir. La cantidad y el contenido de las preguntas dependen de:

  • Qué tan ambiguo es tu input
  • Qué reglas declara tu constitución (Spec Kit se asegura de que el spec las pueda cumplir)
  • Qué información falta para definir la lógica de negocio

En mi corrida del demo, recibí 3 clarificaciones. Las tuyas pueden ser distintas en cantidad y contenido. Las mías fueron:

#Pregunta que recibíPor qué importa
Q1Modelo de verificación: ¿inmediato, email pendiente, aprobación admin?Define la máquina de estados del feature
Q2Unicidad: ¿solo email, solo username, ambos?Define la regla de validación
Q3Edad mínima: ¿13 (COPPA), 16 (GDPR), 18, otra?Define el límite legal

Esto es /speckit-clarify aplicado implícitamente. Spec Kit lo dispara dentro de /speckit-specify cuando detecta ambigüedades. Es la primera compuerta del principio P5 de tu constitución funcionando en automático.

Para el demo, mis respuestas fueron:

  • Q1: verificación pendiente por email — estados: pending_verification → active | expired
  • Q2: ambos — email y username globalmente únicos
  • Q3: 16 años — GDPR digital consent threshold

Por qué importa tomarte estas preguntas en serio: cada respuesta cierra una rama del árbol de decisiones. Si respondes ligero, el spec sale ambiguo y los bugs caros aparecen 3 sprints después en producción. Es exactamente el momento donde tu mirada QA agrega más valor del ciclo. Si tu PM tiene la respuesta, ahí es donde la pides — no después de implementar.

Después de que respondes las preguntas, Spec Kit genera dos archivos:

  • specs/001-user-registration/spec.md — el spec en sí
  • specs/001-user-registration/checklists/requirements.md — un checklist de calidad que valida si el spec está bien escrito

Spec Kit también automatiza algo que vas a agradecer: crea una rama (branch) en tu repositorio git con el nombre 001-user-registration. Lo hace a través de un git hook — un pequeño script que git ejecuta automáticamente cuando ocurren ciertos eventos (en este caso, al generar el spec).

¿Por qué importa esta convención de una feature por rama? Imagínate que tu equipo está trabajando en tres features al mismo tiempo: registro, login y recuperación de contraseña. Si todos esos specs vivieran en la rama main, los archivos de cada feature se mezclarían y revisar qué cambió por qué razón sería un infierno.

Con una rama por feature obtienes cuatro cosas que importan:

  • Cada spec, plan, tareas y código del feature viven aislados en su propia rama.
  • El equipo trabaja en paralelo sin pisarse — tú en registro, otra persona en login, sin conflictos.
  • El Pull Request final muestra solo lo que cambió por ese feature específico, no una mezcla.
  • Si decides descartar el feature, borrar la rama lo elimina todo en un comando — sin dejar rastros sueltos en main.

Es la misma convención que usan equipos serios de desarrollo desde hace años. Spec Kit la trae instalada por defecto para que no tengas que pensarlo.

4. Revisar antes de generar código — donde la IA todavía te necesita

Aquí es donde la mayoría de la gente comete el primer error: leer el spec por encima, decir “se ve bien”, y saltar a /speckit-plan. Si haces eso, estás condenando el ciclo.

Tu trabajo en este paso es leer el spec.md línea por línea y responder dos preguntas:

¿Las acceptance scenarios cubren los 4 buckets ISTQB? (válido, límite, inválido, error de sistema)
¿Los Functional Requirements son verificables uno a uno, o hay frases tipo 'el sistema debe ser robusto'?

Una vez que el spec está limpio, genera un checklist constitution-grade con /speckit-checklist. Este checklist NO es el genérico que ya viene en requirements.md. Es uno específico que valida tu spec contra los principios que pusiste en tu constitución.

/speckit-checklist Genera un checklist constitution-grade que valide explícitamente
los 5 principios de la constitución: P1 ISTQB-FIRST con las 4 técnicas Cap. 4 (con
tablas), P2 ZERO HAPPY-PATH-ONLY con las 4 categorías, P3 STATES MUST BE EXPLICIT
con allowed + forbidden transitions, P4 ERROR LEAKAGE FORBIDDEN con catálogo de
errores, P5 GATEKEEPING como bloqueante. Cada item verificable contra spec.md, con
cross-reference a la sección donde se cumple, o marcado como [Gap] si no.

Spec Kit genera specs/001-user-registration/checklists/constitution.md con típicamente entre 30 y 40 ítems agrupados por principio. Cada uno marcado como ✅ Satisfecho, ⚠️ Parcial, o ❌ Gap.

Regla simple: si tu checklist constitution-grade tiene más de 5 gaps, no avances a /speckit-plan. Vuelve al spec y resuélvelos. Avanzar con un spec que falla tu propia constitución garantiza que los gaps se propaguen al código.

Lo que hagas en este paso decide la mitad de la calidad del ciclo. La otra mitad la decide la fase de plan, que viene a continuación.

5. De la spec al código — /speckit-plan, /speckit-tasks, /speckit-implement

Con el spec validado, las siguientes tres fases bajan progresivamente al código.

/speckit-plan — el diseño técnico

/speckit-plan

Genera specs/001-user-registration/plan.md. Este archivo traduce tu spec a decisiones técnicas: qué stack, qué módulos, qué endpoints, qué tabla de base de datos, qué librerías. Es lo que en cualquier proyecto sería el documento de “arquitectura del feature”.

Tu trabajo como QA en este paso:

  • Verificar que las decisiones técnicas honren los principios constitucionales. Si la constitución dice “no leak en errores” (P4), el plan debe declarar el catálogo de errores con shape genérico, NO una página de Sentry expuesta al cliente.
  • Verificar que los puntos de testing estén identificados. ¿Dónde van los tests unitarios? ¿Qué cubre integración vs end-to-end? Si el plan no lo dice, vas a heredar una suite improvisada.

/speckit-tasks — el desglose ejecutable

/speckit-tasks

Genera specs/001-user-registration/tasks.md: una lista ordenada de tareas atómicas, cada una pequeña y verificable. Es la traducción del plan en items que cualquiera del equipo puede ejecutar sin decisiones grandes pendientes.

Tu trabajo como QA:

  • Confirmar que cada tarea tiene criterios de aceptación claros, no solo descripción.
  • Confirmar que las tareas de testing aparecen junto a las de implementación, no relegadas al final como un bloque “agregar tests”.

/speckit-implement — donde la IA escribe código

/speckit-implement

Aquí es donde la IA finalmente escribe código. Toma las tareas, las ejecuta una por una, y genera commits.

Antes de correr /speckit-implement, relee tu checklist constitution-grade. Si todavía tiene gaps en P1 o P4, la IA va a propagar esos gaps al código y vas a estar revisando bugs que se pudieron prevenir 30 minutos antes. Es la última compuerta del principio P5 de tu constitución.

6. Las 4 técnicas ISTQB — dónde aplicar cada una en el ciclo

Esta es la sección que más me piden. Si tu mirada QA está formada en ISTQB Cap. 4, sabes que las 4 técnicas no son intercambiables: cada una sirve para un tipo de hueco distinto. SDD te da los puntos exactos donde aplicarlas.

Partición de equivalencia → en spec.md (sección Inputs)

Cada input del spec debe declarar sus clases válidas e inválidas. Para el demo:

InputClases válidasClases inválidas
emailFormato válido (sintaxis estándar de email) y no registrado en la baseSintaxis inválida (sin @, doble @, espacios), email ya registrado, campo vacío, solo espacios en blanco
usernameEntre 3 y 32 caracteres, alfanumérico más guión bajoMenos de 3 caracteres, más de 32, caracteres especiales (!@#$), nombres reservados (admin, root), ya registrado
password12 caracteres o más, con complejidad mínimaMenos de 12 caracteres, sin complejidad, contiene el username o email
ageNúmero entero entre 16 y 120Menor a 16, negativo, no entero, mayor a 120

Para profundizar (opcional): el “formato válido” de email lo define oficialmente el estándar RFC 5322 . En la práctica, casi todas las librerías de validación de email implementan una versión simplificada del estándar. No tienes que memorizarlo — solo saber que el spec debe declarar QUÉ formato acepta tu validador.

Dónde aplicarla: cuando lees spec.md después de /speckit-specify, busca si los Functional Requirements declaran estas clases. Si dicen “el email debe ser válido” sin definir qué es válido, marca gap.

Valores límite → también en spec.md (sección Boundary Values)

Para cada input numérico o con longitud, declarar los tres valores críticos: valor-1 / valor / valor+1. Para el demo:

InputLower boundaryUpper boundary
age15 / 16 / 17119 / 120 / 121
username length2 / 3 / 431 / 32 / 33
password length11 / 12 / 13(no upper, o 128)

Dónde aplicarla: el spec debe enumerar estos valores explícitamente, no decir “validar el rango”. La razón: si la implementación usa >= cuando debería usar >, los tests de boundary lo cazan al primer commit.

Tabla de decisión → en spec.md (sección Decision Table) o en plan.md

Cuando el sistema toma decisiones basadas en combinaciones de inputs, una tabla de decisión las hace exhaustivas. Para el registro:

#Email válidoUsername válidoEmail únicoUsername únicoPassword OKAge OKAcción
1TTTTTTAceptar — crear pending_verification
2F*****Rechazar — invalid input genérico
3TF****Rechazar — invalid input genérico
4TTF***Rechazar — conflict genérico (P4)
5TTTF**Rechazar — conflict genérico (P4)
6TTTTF*Rechazar — invalid input genérico
7TTTTTFRechazar — invalid input genérico

Dónde aplicarla: cuando lees spec.md, debe haber una tabla así (o equivalente). Si solo hay prosa describiendo “se valida cada input”, marca gap. La tabla es el contrato de la lógica.

Transición de estados → en spec.md (sección State Machine)

Si tu feature tiene estados (pendiente, activo, expirado, eliminado), la spec debe declarar los tres bloques completos:

Estados permitidos (conjunto cerrado):

  • pending_verification — cuenta creada, email no verificado, sign-in rechazado
  • active — email verificado, cuenta usable
  • expired — ventana de verificación vencida, sign-in rechazado

Transiciones permitidas:

DesdeEventoA
(none)POST exitosopending_verification
pending_verificationverificación dentro de la ventanaactive
pending_verificationventana vencidaexpired

Transiciones PROHIBIDAS (la mitad que casi nadie escribe):

  • active → pending_verification — no se puede regresar una cuenta verificada
  • active → expired — las cuentas verificadas no expiran por este lifecycle
  • expired → active directo — debe pasar por re-verificación

Las transiciones prohibidas son donde más bugs caros se cuelan. La IA, si no las declaras, va a asumir que cualquier transición es permitida. Tu trabajo como QA es leer el spec y verificar que el conjunto prohibido esté declarado explícitamente.

7. Cierre — qué tienes y qué viene

Si seguiste la guía completa, ahora tienes:

  • ✅ Spec Kit instalado y funcionando con Claude Code
  • ✅ Una constitución QA-first con 5 principios verificables
  • ✅ Un spec generado, clarificado, y validado contra tu constitución
  • ✅ Un plan técnico y tareas listas para que la IA implemente
  • ✅ Las 4 técnicas ISTQB mapeadas a fases concretas del ciclo

Lo más importante: tienes un flujo repetible. La próxima feature de tu proyecto sale por exactamente los mismos pasos. Y los bugs que antes aparecían en producción, ahora aparecen en el spec — donde cuestan 100x menos arreglarlos.

SDD no te reemplaza como QA. Te mueve a operar en la fase donde se decide la calidad: la especificación. Si lees specs como leías código, tu valor crece. Si esperas a que el código exista para empezar a pensar, tu valor decrece.

Qué leer después

Si te interesó esto, en el blog tienes el artículo conceptual que explica el porqué — Spec-Driven Development para QA: el futuro o el reemplazo.

Estoy preparando dos piezas más para esta serie:

  1. SDD para devs, PM, PO y arquitectos — porque SDD no es solo de QA, y el rol de cada uno cambia.
  2. El hueco que descubrí en Spec Kit cuando lo llevé al límite — un experimento que prueba dónde Spec Kit todavía está flojo, y cómo arreglarlo en tu propio fork.

Si quieres recibirlas apenas salen, suscríbete al newsletter. No spam — solo la siguiente pieza cuando esté lista.

¿Estás aplicándolo en tu equipo y te trabas? Escríbeme. Leo todas las respuestas, y los bloqueos reales me sirven para escribir las próximas guías. Tu pregunta puede destrabarle el camino a 100 QAs más.