Spec-Driven Development en la práctica: del prompt al código mantenible — Un walkthrough real mostrando cómo una buena spec cambia la calidad del output de Claude Code o Cursor. Caso antes/después
Tiempo estimado de lectura: 6 min
- Ideas clave:
- Una spec técnica reduce la ambigüedad en prompts y convierte salidas generativas en contratos verificables.
- Sin spec, los LLMs tienden a producir código rápido pero frágil y con deuda técnica.
- Una spec mínima (stack, artefactos, contratos, edge cases) es suficiente para outputs reproducibles y testeables.
- Integra specs en CI/PR para automatizar comprobaciones y mantener control humano sobre arquitectura.
Spec-Driven Development en la práctica: del prompt al código mantenible — esto no es una etiqueta elegante. Es la diferencia entre código que sobrevive y código que tendrás que reescribir dentro de tres sprints. Si usas Claude Code, Cursor o cualquier herramienta generativa, sin una spec clara estás empujando decisiones arquitectónicas a un modelo estadístico.
En estas primeras líneas: definimos el problema, mostramos un caso antes/después y entregamos una receta práctica para que tu equipo obtenga salidas reproducibles y revisables por humanos.
Resumen rápido (lectores con prisa)
Qué es: Una spec técnica es un documento corto que define stack, artefactos, contratos de datos y criterios de aceptación.
Cuándo usarla: Antes de pedirle a un LLM que genere código o acciones automáticas; imprescindible para features que afectan arquitectura o seguridad.
Por qué importa: Reduce ambigüedad, limita el espacio de decisión del modelo y convierte output en un contrato auditables y testeable.
Cómo funciona: Provee stack y contratos (ej. Zod schemas, tipos TS, API contracts) que el agente implementa exactamente, produciendo artefactos modulares y testeables.
Por qué una spec cambia todo
Los LLMs son excelentes en patrones, no en contexto de producto. Cuando reciben un prompt abierto, generan la solución más probable según su entrenamiento: ejemplos de tutoriales y antipatrón comunes. Esa es la razón por la que el output suele ser rápido pero frágil.
Una especificación técnica (spec) reduce el “espacio de probabilidad” del modelo. Le das:
- el stack exacto,
- las restricciones arquitectónicas,
- los contratos de datos,
- y los criterios de aceptación/edge cases.
Con esa entrada, herramientas como Cursor o Claude dejan de improvisar y comienzan a implementar un contrato.
Walkthrough real: formulario de registro en Next.js
Escenario: crear un registro de usuario con validación Zod y Server Actions (Next.js App Router). Te muestro el antes y el después, sin adornos.
Antes — Prompt conversacional (vibe coding)
Prompt enviado al modelo:
“Crea un formulario de registro en Next.js con email, password y confirmación. Conéctalo a la API.”
Salida típica:
- Un solo archivo
RegisterForm.tsxcon JSX, estadouseStateyfetchmezclados. - Validación DIY con regex.
- Manejo de errores =
console.log. - Tipos débiles (
anyo sin tipos). - No hay tests ni contractos reutilizables.
Resultado: funciona en local. Falla en producción. Es deuda técnica con firma.
Después — Prompt con spec (Spec-Driven Development)
Antes de preguntar al modelo, escribes spec-auth-register.md y lo adjuntas.
Fragmento de spec:
# Spec: Registro de usuario
Stack: Next.js App Router, React Hook Form, Zod
Outputs: 3 archivos
- src/lib/validations/auth.ts (registerSchema)
- src/actions/auth.actions.ts (Server Action) -> devuelve { success: boolean; error?: string }
- src/components/auth/RegisterForm.tsx
UI: usar useTransition para isPending; mostrar errores por campo; redirigir a /dashboard en éxito.
Edge cases: handling de timeouts, duplicados, validación server-side.
Prompt al modelo:
“Lee @spec-auth-register.md e implementa exactamente los archivos descritos, respetando tipos y contratos.”
Salida típica con spec:
registerSchemaenauth.ts(Zod) reutilizable en cliente y servidor.- Server Action tipada que devuelve
{ success, error }. - Componente de presentación que usa React Hook Form y solo hace binding.
- Estados de UI y manejo de errores explícito.
- Código modular, testeable y legible.
La diferencia es clara: la spec obliga al modelo a ceñirse a un contrato verificable. Lo que se genera se puede code-reviewar, testear e integrar.
Plantilla mínima de spec que funciona
No necesitas escribir una novela. Esta plantilla (portable en .specs/feature.md) es suficiente:
- Contexto de negocio (1-2 líneas).
- Stack y restricciones (libraries permitidas/prohibidas).
- Artefactos esperados (files + path).
- Contratos de datos (TS interfaces o Zod schemas).
- Estados UI y criterios de aceptación.
- Edge cases y métricas de éxito.
Incluye URLs útiles en la spec para librerías: Zod, OWASP para seguridad, documentación de Cursor si lo usas.
Integración práctica en el flujo de trabajo
- Guarda specs en
.specs/y referencia el archivo en el prompt (Cursor soporta@Files). - Automatiza comprobaciones básicas con linters/CI: que exista un schema Zod, que acciones devuelvan un tipo estándar, que tests unitarios pasen.
- Añade una regla en code review: si el cambio viene de un agente, el PR debe acompañar la spec original y un ADR si la modificación afecta arquitectura.
- No olvides observabilidad y testing: cada tool o action generada debe tener tests unitarios independientes del LLM.
Conclusión: la IA ejecuta, el ingeniero decide
Spec-Driven Development no elimina la IA; la pone en su lugar. En lugar de confiar en la creatividad del modelo, confías en el criterio técnico del equipo para dirigirlo. Los equipos que adoptan specs claras convierten a Claude Code y Cursor en herramientas productivas en lugar de fuentes de deuda técnica. Implementar specs no es una carga extra: es la inversión que transforma prototipos de IA en software mantenible y auditable.
La siguiente pieza en esta serie mostrará ejemplos de specs reales y scripts de CI que validan la conformidad automática entre spec y código.
Para continuidad con iniciativas de automatización y prácticas de ingeniería aplicadas a IA, revisa recursos adicionales y experimentos en Dominicode Labs. Estos materiales complementan la adopción de specs y proporcionan plantillas y scripts para integrar comprobaciones automatizadas en CI/PR.
FAQ
- ¿Qué es una spec técnica y cuánto debe medir?
- ¿Qué diferencia hay entre una spec y una historia de usuario?
- ¿Qué herramientas debo pedir en la spec para validación de datos?
- ¿Cómo integro specs en CI?
- ¿Qué hacer si el LLM ignora la spec?
¿Qué es una spec técnica y cuánto debe medir?
Una spec técnica es un documento conciso que define contexto, stack, artefactos requeridos, contratos de datos y criterios de aceptación. Suele medir entre 1 y 2 páginas; la clave es ser suficiente para convertir decisiones arquitectónicas en reglas ejecutables.
¿Qué diferencia hay entre una spec y una historia de usuario?
Una historia de usuario describe el problema de negocio y la necesidad. La spec técnica traduce esa necesidad en artefactos técnicos concretos (files, tipos, contratos, edge cases) que un agente o desarrollador implementará.
¿Qué herramientas debo pedir en la spec para validación de datos?
Especifica la librería (por ejemplo, Zod), el archivo donde residirá el schema y el contrato de retorno esperado para server actions. Indica validación client/server y casos límite relevantes.
¿Cómo integro specs en CI?
Automatiza comprobaciones que verifiquen la presencia de schemas Zod, la firma de acciones y tests unitarios mínimos. Añade una regla en PRs que requiera la spec original cuando cambios provengan de un agente.
¿Qué hacer si el LLM ignora la spec?
Ajusta el prompt para referenciar explícitamente la spec (ej. @spec-auth-register.md), valida output contra tests automatizados y rechaza cambios que no cumplan contratos en CI. Mantén revisión humana obligatoria para PRs generados por agentes.

Leave a Reply