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.
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.
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.
El trabajo se parte en fases, cada una produce un documento, y entre fase y fase hay una persona que aprueba.
| 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.
design.md elige su solución, y la arquitectura del sistema acaba siendo la suma de lo que salió en cada uno. La memoria del proyecto debería evitarlo, pero aquí es un añadido: el peso sigue en los documentos de cada funcionalidad.| 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.
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:
// GENERATED FROM SPEC - DO NOT EDIT.| 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.
El motivo de fondo es que la unidad de SDD es la funcionalidad, y lo que se estropea es el sistema.
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.
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.
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).
Los dos primeros documentos son persistentes: se guardan en el repositorio y sirven de contexto en cada tarea.
VISION.md: qué es el sistema y qué no es. Una página.ARCHITECTURE.md: componentes, fronteras, responsabilidades y decisiones. Lo escribe la persona.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.
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):
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.
ARCHITECTURE.md; lo demás, al issue.
| 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 |
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.
VISION.md y ARCHITECTURE.md los escribe la persona, cada cambio es un issue pequeño y lo que implementa la IA se valida con tests y contra la arquitectura.Cómo se hace SDD con Kiro es el tema 19.
VISION.md, ARCHITECTURE.md e issues.architecture.md y tasks.md.