Saltar al contenido

Spec-driven development: qué es y nuestro contrato de issue

Para CTO y desarrolladoresHarness y controles · Actualizado

Filip PapranecFundador de Digitaliko

La especificación es un issue. El control comprueba que se cumplió. Ilustración: un issue de GitHub con criterios de aceptación que pasa una comprobación de preparación y un control camino de un pull request.La especificación es un issue. El control comprueba que se cumplió. Ilustración: un issue de GitHub con criterios de aceptación que pasa una comprobación de preparación y un control camino de un pull request.

Spec-driven development (SDD) significa que deja por escrito qué construir y cómo sabrá que está terminado antes de que un agente de IA escriba una sola línea de código. Spec Kit de GitHub lo resume así: "Define what to build and why, then turn the specification into a plan, tasks, and working code." Es decir: defina qué construir y por qué, y convierta la especificación en un plan, tareas y código que funciona. Nosotros usamos una versión más ligera: la especificación es un issue de GitHub con tipo de tarea y criterios de aceptación, y un control automático comprueba que existe el resultado prometido.

Trabajamos como una fábrica de software: los agentes de IA hacen el trabajo rutinario, los seniors deciden qué se construye y revisan cada cambio. Así que nuestro trabajo se trasladó a la especificación y a las comprobaciones a su alrededor. A continuación, nuestro contrato de issue, el código que lo lee y lo que aprendimos cuando la especificación estaba mal.

Cuando construye un agente, dele buenos guardrails y un encargo claro. Póngalo en una tarea y especifique bien esa tarea.

Filip Papranec
Filip Papranec
Fundador de Digitaliko

¿Qué es el spec-driven development con agentes de IA?

La definición breve está en nuestro glosario. La idea es antigua: acordar qué significa terminado antes de construir. Con agentes de IA importa más, porque un agente construye algo de todos modos. Sin especificación rellena los huecos con suposiciones, y las suposiciones parecen terminadas.

Spec Kit lo ejecuta como comandos en el chat del agente: principios del proyecto, especificar, planificar, tareas, implementar. Otras herramientas tienen su propia variante. Todas comparten una cosa. La especificación va antes que el código y sigue siendo la referencia en la revisión.

Dónde encaja el context engineering: todo lo que ve el agente es contexto, desde los archivos de reglas hasta la salida de las herramientas. La especificación es la parte de ese contexto que dice qué significa terminado. Más contexto sin ella solo produce un resultado equivocado con más seguridad.

¿Por qué un issue de GitHub en lugar de un documento de especificación largo?

Nuestros issues son una cola que la gente lee cada mañana. Nuestra regla para ellos empieza con tres palabras: "Queue items, not specs." Elementos de una cola, no especificaciones. Una especificación larga va a un documento enlazado. El issue es lo que una persona o un agente recoge y termina.

Documento de especificación largo

  • Se escribe por adelantado para toda una funcionalidad.
  • Se aleja del código tras el primer cambio.
  • Difícil de comprobar línea a línea.
  • Útil para una gran decisión de diseño.

Lo que usamos

Contrato de issue

  • Un resultado, un responsable, un PR.
  • Tipo de tarea, aceptación, dónde va el resultado.
  • Comprobado por código antes y después del trabajo.
  • Enlaza un documento de diseño cuando hace falta.

Menos issues y más grandes funcionan mejor también para los agentes. Nuestra regla es un resultado terminado por issue y por pull request. Uno grande sigue siendo un solo PR, con un commit por capa, para que una persona pueda leerlo en el orden en que se construyó.

¿Qué incluye nuestro contrato de issue?

Tres cosas son obligatorias: un título con un verbo de acción y un objeto concreto, una etiqueta de prioridad y qué hay que hacer. Para un trabajo sencillo basta con el título. Secciones como ## What, ## Acceptance y ## Output aparecen solo cuando tienen contenido. Un ## Acceptance: TBD vacío está prohibido.

El tipo de tarea decide qué debe existir al final:

TipoQué da el issueResultado que debe existir
codequé está mal o qué se quiere, aceptaciónun PR que cierra el issue, un test que falla antes y pasa después, las comprobaciones del repositorio en verde
researchla pregunta, el alcance, el resultadohallazgos más un archivo de afirmaciones: cada afirmación con la URL de la fuente y una cita literal de esa página
qaURL o flujo, escenariosun informe con PASS o FAIL por escenario, más capturas
docqué, para quién, resultadoel documento, con enlaces que funcionan
replyel mensaje y su contextoun borrador en el idioma del remitente, nunca enviado

Nadie añade una etiqueta para el tipo. Quien recoge el issue lo deduce. Si falta ## Output o ## Acceptance, se completa como suposición explícita, nunca en silencio.

¿Cómo comprueba una máquina la especificación?

Dos veces: antes del trabajo y después.

La especificación es un issue de GitHub. Una comprobación READY de solo lectura la compara con el código, después el agente construye y luego un control revisa el resultado según el tipo de tarea: el código necesita un PR con un test que falla antes y pasa después, la investigación necesita cada afirmación con fuente y cita literal, QA necesita un informe PASS o FAIL con capturas, un documento necesita enlaces que funcionen.La especificación es un issue de GitHub. Una comprobación READY de solo lectura la compara con el código, después el agente construye y luego un control revisa el resultado según el tipo de tarea: el código necesita un PR con un test que falla antes y pasa después, la investigación necesita cada afirmación con fuente y cita literal, QA necesita un informe PASS o FAIL con capturas, un documento necesita enlaces que funcionen.

Antes del trabajo: READY. Una llamada de solo lectura a un modelo lee el issue y el código y devuelve una respuesta tipada. Recortado de nuestro esquema:

{
  "ready": true,
  "type": "code",
  "done_when": ["criteria a reviewer can answer yes or no"],
  "verifiable": "test",
  "confirmation": ["the test that carries the proof"],
  "premise": "verified against <file:line>",
  "question": ""
}

premise es lo que más tiempo nos ahorra. La comprobación compara cada afirmación que hace el issue sobre el comportamiento actual con el código, con archivo y línea. Si nada del issue sigue siendo cierto, propone cerrarlo. verifiable dice si un test puede demostrar el criterio más arriesgado, o solo una persona mirándolo. Si falta una decisión de producto, question hace una pregunta con dos opciones y una recomendación, y el trabajo no empieza.

Después del trabajo: el control. Bash sin más, con códigos de salida, una rama por tipo de tarea. Para el código ejecuta el typecheck, el lint, los tests y el build del propio repositorio, más un red-proof: el código fuente cambiado necesita un test cambiado, y ese test debe fallar en la rama base. Para la investigación abre cada URL de fuente y busca la cita en la página. Una paráfrasis no pasa. Esta parte nunca la califica un modelo.

¿Qué cambió cuando dejamos de dimensionar tareas?

Antes puntuábamos las tareas por tamaño y las repartíamos según eso. Lo sustituimos por la preparación: ¿está la premisa comprobada contra el código, está nombrada la prueba, queda algo por decidir?

Los controles son la otra mitad de la especificación. El issue dice qué significa terminado. Las comprobaciones se aseguran de que nadie, persona o agente, pueda darlo por terminado de otra forma.

Lo que queremos es construir los controles por los que el agente puede pasar y decidir qué le dejamos hacer.

Filip Papranec
Filip Papranec
Fundador de Digitaliko

¿Qué salió mal con nuestras especificaciones?

  • La comprobación de preparación llegó tarde. Al principio el agente tomaba el issue tal como estaba escrito. La comprobación de la premisa contra el código la añadimos después. Hoy es la primera etapa, y es por donde empezaríamos.
  • Un comentario equivocado no es un issue equivocado. Un plan antiguo en un comentario hacía que la comprobación refutara issues buenos. Ahora solo cuenta una afirmación en el cuerpo del issue. Un cuerpo refutado va a una persona, que responde OK antes de que empiece el trabajo.
  • Un control en verde que no demostraba nada. En un monorepo, el red-proof ejecutaba los tests sin el entorno correcto. Cada "falla en la rama base" era un test que nunca llegó a arrancar, no un rojo de verdad. Durante unos días, todos los red-proof de ese repositorio pasaron en falso. Ahora los tests se ejecutan con el gestor de paquetes del repositorio, por paquete, con la versión de Node fijada.

El último es la lección que más repetimos: una comprobación que no puede fallar no es una comprobación. Más sobre esto en TDD red-green con agentes de IA.

¿Cómo se escribe un issue que un agente pueda terminar?

  1. Un resultado

    Verbo de acción y objeto concreto en el título. Un resultado terminado, un PR.

  2. Terminado como sí o no

    Criterios de aceptación que un revisor pueda responder con sí o no.

  3. Nombre la prueba

    Qué test lo demuestra, o qué persona tiene que mirarlo.

  4. Nombre el resultado

    PR, informe o documento, y dónde estará.

  5. Compruebe la premisa

    Antes de empezar, compare lo que dice el issue con el código.

El último paso es el que los equipos se saltan. También es el más barato: una llamada de solo lectura a un modelo, antes de que exista una línea de código.

Cómo es el resto de la configuración del agente, de las reglas a los hooks, lo contamos en Harness engineering en la práctica: del issue al PR. Cuándo basta el modo de planificación integrado en lugar de una especificación lo explicamos en Claude Code plan mode.

¿Está su issue listo para un agente?

¿Quiere un ciclo de la especificación al PR en su equipo?

Construimos este contrato y las comprobaciones que lo respaldan directamente en el repositorio del equipo como parte de AI-native SDLC para equipos de desarrollo. ¿Le faltan manos más que proceso? Vea un desarrollador senior para su equipo. Desde 2023 hemos entregado más de 15 proyectos en producción.

Le respondemos en un plazo de dos días hábiles con algunas preguntas sobre su trabajo. Después acordamos qué hacemos primero.

Si prefiere hablar antes, reserve una llamada introductoria de 15 minutos.

¿Qué significaba "terminado" en el último issue de su equipo, y quién lo comprobó?

En resumen

  • Spec-driven development: qué construir y cómo sabrá que está terminado, antes de que el agente escriba código.
  • Nuestra especificación es un issue de GitHub: un resultado, un tipo de tarea, criterios de aceptación y el resultado esperado.
  • Una comprobación de solo lectura compara el issue con el código antes de que empiece el trabajo.
  • Un control comprueba que el resultado existe: un test rojo y luego verde, fuentes citadas, un informe de QA.
  • Una comprobación que no puede fallar no es una comprobación.

Preguntas frecuentes

¿Qué es el spec-driven development?

Dejar por escrito qué construir, por qué y cómo sabrá que está terminado antes de que nadie escriba código, y convertir eso después en un plan, tareas y código. Con agentes de IA, la especificación es además el contexto con el que trabaja el agente.

¿Necesito un documento de especificación largo?

No. Para la mayoría del trabajo usamos un issue de GitHub: un título, un tipo de tarea, criterios de aceptación y dónde va el resultado. Una especificación larga vive en un documento enlazado, no en el issue.

¿Qué diferencia hay entre spec-driven development y context engineering?

El context engineering es todo lo que ve el agente: reglas, archivos, herramientas, historial. La especificación es la parte que dice qué significa terminado. Sin especificación, más contexto solo produce un resultado equivocado con más seguridad.

¿Cómo comprueban que el agente cumplió la especificación?

Con código, no con opiniones. Antes del trabajo, una comprobación de solo lectura compara el issue con el código. Después del trabajo, un control comprueba que existe el resultado prometido: un PR con un test que falla antes y pasa después, fuentes con citas literales, un informe de QA.

¿Cuándo no compensa una especificación?

Para un arreglo de una línea, el título es la especificación. Donde solo una persona puede juzgar el resultado, como un texto o la sensación visual, la especificación lo dice y el trabajo va a esa persona.

Pregunte a una IA sobre este artículo

La IA también tiene en cuenta nuestros otros artículos y la experiencia de proyectos reales.

ChatGPTClaudePerplexity
Engineering

Más artículos

Harness y controles

Context engineering para agentes de programación: qué va en el repo

El context engineering decide qué ve un agente de programación con IA mientras trabaja. Qué va en AGENTS.md o CLAUDE.md, qué reglas se cargan solo donde aplican, cómo la tarea se convierte en contexto y cómo mantenerlo todo pequeño.

Harness y controles

Playwright MCP: que el agente de IA demuestre que funciona

Playwright MCP da a un agente de IA un navegador real. Cómo lo usamos para que el agente compruebe su propio cambio en la app en marcha y entregue PASS o FAIL con capturas, qué detecta que los tests unitarios no ven y cuándo son mejor herramienta los scripts de Playwright.

Harness y controles

Revisión de código con IA: Claude Code en CI y lo que no ve

Cómo ejecutamos la revisión de código con Claude Code en cada pull request con una única GitHub Action reutilizable: qué se le pide al revisor de IA, cómo se quedó en verde y en silencio, qué se le escapa y por qué solo una persona aprueba.