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.
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 —escribir la especificación costaba una parte importante de lo que costaba programarlo— y ahora sí, porque implementar se ha vuelto barato y especificar es lo único que sigue costando lo mismo.
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.
| 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.
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 el tema 11.
Cómo se hace esto con herramientas concretas —OpenSpec, GitHub Spec Kit, BMAD y Kiro— es el tema 11.