Tabla de Contenidos

18. Spec-driven development

Spec-driven development (SDD) es escribir qué tiene que hacer el software, y en qué consiste estar hecho, antes de que se escriba el código, y dejarlo escrito en un documento que vive en el repositorio y del que se deriva todo lo demás.

El cambio respecto a lo de siempre no está en que haya un documento: está en quién lo usa. Una especificación clásica se escribía, se aprobaba y se olvidaba, y la verdad acababa estando en el código. En SDD la especificación es la entrada de trabajo del agente: si no está escrita, no se implementa; y cuando el código y la especificación no concuerdan, se corrige la especificación primero. Hasta dónde se lleva esto depende del tipo de SDD.

SDD, tal y como se suele contar, no es suficiente. Vamos a verlo pieza a pieza, y cada apartado termina con dónde se queda corta esa pieza. Todos esos fallos llevan al mismo sitio: SDD centrado en la arquitectura.


1. El problema que intenta resolver

Con agentes de código, escribir código ha dejado de ser lo caro. Lo caro es decir bien qué hay que hacer. El cuello de botella se ha movido, y las prácticas de trabajo todavía no.

Los síntomas son siempre los mismos:

Todo eso es la misma causa: la ambigüedad sobrevive hasta el código, y en el código cuesta mil veces más quitarla.

Dónde se descubre el error Lo que cuesta corregirlo
En los requisitos Cambiar una frase
En el diseño Cambiar un párrafo y un diagrama
En las tareas Reordenar una lista
En el código Rehacer el trabajo, y normalmente también los tests
En producción Lo anterior, más el incidente

SDD no inventa nada de esto: es la misma vieja lección de que el error es más barato cuanto antes se pilla. Lo que cambia es que antes no compensaba escribirlo todo, porque la especificación costaba una parte importante de lo que costaba programarlo, y ahora sí, porque implementar se ha vuelto barato.

Dónde se queda corto

El diagnóstico solo mira el qué. Una especificación perfecta sigue sin decir dónde va el trabajo dentro del sistema: qué módulo lo lleva, qué se reutiliza, qué frontera no se cruza. Quiros lo resume así: la especificación le dice al agente qué construir, pero no le dice de forma fiable dónde encaja. El resultado es código que cumple la especificación, pasa los tests y estropea la arquitectura.


2. En qué consiste

El trabajo se parte en fases, cada una produce un documento, y entre fase y fase hay una persona que aprueba.

peticion, normalmente una fraserequisitos: el QUEaprobacion humanadiseno: el COMOaprobacion humanatareas: el plan de ejecucionimplementacionverificacionnola implementacion desmiente la specsicorregir la especificacionentregado

Documento Qué contesta Lo que no lleva
requirements.md Qué tiene que pasar, para quién y cómo se comprueba Soluciones técnicas. Aquí no se elige base de datos
design.md Cómo se va a hacer: arquitectura, modelo de datos, contratos, decisiones y las alternativas descartadas Requisitos nuevos colados por la puerta de atrás
tasks.md El plan: pasos pequeños, ordenados y verificables uno a uno Nada que no salga de los dos documentos anteriores

A esos tres se añade la memoria del proyecto —lo que vale para todas las funcionalidades y no para una: convenciones, arquitectura, reglas del negocio—, que es lo que evita repetir el mismo contexto en cada especificación.

La separación entre el QUÉ y el CÓMO es la que más se incumple y la que más rinde: mezclar la solución en los requisitos cierra el abanico antes de haber mirado, y es lo que convierte una revisión de requisitos en una discusión de implementación.

Dónde se queda corto

Agente Revisión humana Markdown Código
Con Spec Kit 33 min 3,5 h 2.577 líneas 689 líneas
Sin especificación 8 min 24 min 0 1.000 líneas

Buena parte de ese markdown repetía lo ya dicho o se lo inventaba, y el contrato de un módulo medía cuatro veces lo que el propio módulo. El código no salió mejor ni con menos errores. Es un solo caso y una aplicación pequeña, pero coincide con lo que dice Böckeler: prefiere revisar código antes que todos esos ficheros.

El coste no ha desaparecido, se ha movido: escribir la especificación lo hace el agente en minutos, leerla sigue siendo trabajo de una persona. Dos mil líneas de markdown no se revisan mejor que dos mil líneas de diff.

3. Tipos de SDD

Todo SDD empieza escribiendo la especificación. Lo que cambia es qué pasa con ella después, y eso decide cuál es la fuente de verdad al final. Böckeler distingue tres niveles, cada uno construido sobre el anterior:

Tipo La especificación al acabar la tarea El código lo edita Fuente de verdad al final
Spec-first Se tira. Es el punto de partida de esa tarea El agente y la persona El código
Spec-anchored Se conserva y se edita con cada cambio de la funcionalidad El agente y la persona La especificación, y hay que mantener el código de acuerdo con ella
Spec-as-source Es el fichero fuente: la persona solo edita esto Nadie: se genera La especificación. El código es un derivado

Con el mismo cambio se ve la diferencia. Seis meses después hay que exportar los pedidos también a Excel:

Dónde colocó Böckeler cada herramienta al probarlas en 2025:

Dónde se queda corto

Esto ya se intentó. En el desarrollo dirigido por modelos (MDD) los modelos eran la especificación y un generador sacaba el código, y nunca cuajó en aplicaciones de negocio: demasiada sobrecarga y demasiadas restricciones. Böckeler avisa de que spec-as-source, e incluso spec-anchored, pueden acabar con lo peor de los dos mundos: la rigidez de MDD y el no determinismo de los LLM.

4. Por qué encaja tan bien con los agentes

Dónde se queda corto


5. Lo que SDD no es

Dónde se queda corto


6. Cuándo compensa

Compensa No compensa
Funcionalidad que toca varios ficheros Un arreglo de una línea
Trabajo que dura más de una sesión Un script de usar y tirar
Más de una persona implicada Un prototipo que se va a tirar
Dominio con reglas de negocio que no se deducen del código Cambios mecánicos y evidentes
Código que va a vivir años Explorar: cuando todavía no sabes qué quieres

La regla corta: si el encargo cabe en una frase sin ambigüedad, escribirlo dos veces es ceremonia. Y si no sabes lo que quieres, primero se explora —a mano, con prototipos que se tiran— y se especifica después, con lo aprendido; especificar no es un método para averiguar qué quieres.

Dónde se queda corto

El motivo de fondo es que la unidad de SDD es la funcionalidad, y lo que se estropea es el sistema.


7. Un ejemplo de por qué hace falta

La petición, tal y como llega:

hay que poder exportar los pedidos

Ahí hay cinco decisiones escondidas, y el agente va a tomar las cinco por su cuenta sin avisar:

Contestarlas cuesta cinco minutos por delante. Descubrirlas por detrás cuesta rehacer la funcionalidad, y encima con la sensación de que el agente «ha hecho algo raro» cuando lo que hizo fue rellenar los huecos que le dejamos.

Escrito como requisito queda comprobable, que es lo único que le pedimos:

Cuando un usuario solicita la exportación de pedidos, el sistema DEBERÁ
generar un fichero CSV con los pedidos visibles para su rol.
Si la consulta supera los 10.000 pedidos, el sistema DEBERÁ generarlo
en segundo plano y avisar por correo al terminar.
Si no hay ningún pedido, el sistema DEBERÁ informar de ello y no
generar ningún fichero.

Esa forma de escribir —cuando pasa esto, el sistema deberá hacer esto otro— es el formato EARS, y no es un capricho de estilo: obliga a nombrar la condición que dispara cada comportamiento, que es exactamente donde se esconden los casos que nadie había pensado. Se ve en detalle en Kiro.

Dónde se queda corto

El requisito está bien escrito y aun así deja otros huecos, estos de arquitectura:

El agente puede cumplir los tres requisitos al pie de la letra con la peor respuesta a las cuatro preguntas, y todos los tests pasarán. Además, no son preguntas de esta funcionalidad: valen para todas, así que no tiene sentido contestarlas en cada especificación.


8. SDD centrado en la arquitectura

Todos los fallos anteriores vienen de lo mismo: SDD pone el peso en el documento de cada funcionalidad. La solución es darle la vuelta y poner el peso en la arquitectura.

SDD centrado en la arquitectura es una variante del desarrollo guiado por especificaciones en la que el documento principal no describe el comportamiento de cada funcionalidad, sino la estructura del sistema: fronteras, interfaces, responsabilidades y decisiones técnicas. La persona define esa arquitectura antes de generar código y la IA se limita a implementarla.

No es un nombre establecido, sino una etiqueta descriptiva para un enfoque que cada autor llama de una forma: Layered Generation (Djukic), Spec-driven Development (Chambers), Spec Growth Engine (Grabowski) o Architecture Driven Development (Quiros).

El flujo

Los dos primeros documentos son persistentes: se guardan en el repositorio y sirven de contexto en cada tarea.

  1. VISION.md: qué es el sistema y qué no es. Una página.
  2. ARCHITECTURE.md: componentes, fronteras, responsabilidades y decisiones. Lo escribe la persona.
  3. Tareas o issues pequeños: cada uno abarcable en una sola interacción con la IA.
  4. Implementación: un issue por sesión. El agente lee los dos documentos y el issue.
  5. Validación: cada resultado se comprueba con tests y contra la arquitectura. Si falla, primero hay que preguntarse de quién es el error: si el issue estaba mal, se corrige el issue; si no, se le pide al agente que arregle ese problema concreto.
  6. Revisión de la deriva: periódicamente se comparan código y arquitectura. Si el código se ha desviado, se corrige; si la implementación ha descubierto algo nuevo, se actualiza la arquitectura.

El ejemplo, resuelto

Las cuatro preguntas de la exportación se contestan una sola vez y valen para todas las funcionalidades:

## Módulos
- pedidos: dominio de pedidos. No conoce a los demás módulos.
- informes: exportaciones. Lee los pedidos solo con PedidoQueryService.
- notificaciones: el único módulo que envía correo.

## Reglas
- Los permisos por rol se comprueban con PermisosService.
- Lo que dure más de 30 segundos va a la cola de trabajos.
- Los controladores no tienen lógica: llaman a un servicio y responden.

Y lo que queda por escribir de la funcionalidad es poco:

Exportar pedidos a CSV en el módulo informes.
- Solo los pedidos visibles para el rol del usuario.
- Más de 10.000 pedidos: en segundo plano y aviso por correo al terminar.
- Sin pedidos: se informa y no se genera fichero.
Tests: uno por cada caso.

Lo bueno de SDD no se tira: las cinco decisiones siguen contestadas y por escrito antes de empezar. Lo que desaparecen son los tres documentos por funcionalidad.

Antes de implementar: el diseño por niveles

Sin un punto de control, el primer sitio donde ves las decisiones del agente es el código, que es el más caro. Por eso, en un cambio que no sea trivial, el diseño se acuerda de lo abstracto a lo concreto, un nivel cada vez (Garg):

  1. Capacidades: qué tiene que hacer y qué queda fuera.
  2. Componentes: qué módulos y servicios intervienen.
  3. Interacciones: cómo se comunican.
  4. Contratos: interfaces, tipos y esquemas.
  5. Implementación: el código, solo cuando lo anterior está aprobado.

Diseña esto por niveles: capacidades, componentes, interacciones y contratos.
Presenta cada nivel por separado y espera mi aprobación antes de pasar al siguiente.
No escribas código hasta que los contratos estén acordados.

No siempre hacen falta los cinco: una utilidad empieza en los contratos, un único componente en los componentes y una funcionalidad con varios componentes en las capacidades.

Esto es una conversación y no deja documento. Lo que valga para más de un cambio se pasa a ARCHITECTURE.md; lo demás, al issue.

Qué fallo arregla cada cosa

Fallo de SDD Cómo se resuelve
La especificación no dice dónde va el trabajo ARCHITECTURE.md lo dice para todas las funcionalidades
El mismo proceso para cualquier tamaño La especificación de cada cambio es un issue, tan corto como el cambio
El diseño se decide funcionalidad a funcionalidad La arquitectura se decide antes, y la decide una persona
Demasiado markdown que revisar Dos documentos que cambian poco. Lo que se revisa cada vez es el código de un issue
El agente se salta las instrucciones Tarea pequeña y validación contra la arquitectura. Las fronteras se comprueban con una herramienta, como ArchUnit (tema 14), no confiando en que el agente las lea
La especificación deriva La deriva se revisa de forma explícita, y Grabowski propone automatizarlo para que bloquee el merge

Cómo encaja en los niveles de Böckeler

Con los tipos de SDD de Böckeler, aquí se usan dos:

Con su terminología, esos documentos se parecen más al memory bank que a una especificación por funcionalidad: el contexto del sistema pesa mucho y la especificación de cada cambio es ligera.

Lo que no resuelve


9. Resumen

Cómo se hace SDD con Kiro es el tema 19.

Más información