Capítulo 03 de 10 · 11 min de lectura

Escribir la spec con la IA

No hace falta saber qué preguntas hacerse. Hace falta pedir que te las hagan, y no contestar las setenta.

Dale la vuelta al encargo

En el capítulo 1 pedimos «hazme un acortador de URLs» a once agentes y los once se pusieron a programar. Cada uno decidió por su cuenta qué pasa con una URL repetida, qué alias valen o si un enlace caduca. Ninguno preguntó, porque nadie se lo pidió.

La especificación del capítulo 2 es la solución, pero deja una objeción razonable: para escribirla hay que saber qué preguntas hacerse, y eso es justo lo que no sabes cuando empiezas.

No hace falta saberlo. El mismo modelo que rellena los huecos en silencio sabe muy bien cuáles son. Solo hay que cambiar una frase del encargo.

Si se lo pides, pregunta

Repetimos el experimento con tres modelos, uno por proveedor. La misma idea de una línea, y una instrucción más: que pregunten antes de escribir nada.

El encargo«Quiero un acortador de URLs. Antes de escribir código, hazme todas las preguntas que necesites para no tener que suponer nada.»

  • 23preguntasClaude Sonnet 5.5 · 2 oct 2026
  • 30preguntasdeepseek-v4-pro · 2 oct 2026
  • 70preguntasGPT-6.1-Sol · 2 oct 2026
Las 23 preguntas de Claude Sonnet 5.5
  1. ¿Es para uso personal, interno de un equipo o un servicio público? ¿Cuántos usuarios y qué volumen de enlaces y redirecciones esperas (por día/pico)?
  2. ¿Qué interfaces necesitas: web, API REST, CLI, o varias? ¿Debe haber interfaz para crear enlaces?
  3. ¿Hace falta autenticación y cuentas de usuario, o cualquiera puede acortar? ¿Roles (admin, usuario)?
  4. ¿Códigos cortos generados automáticamente, alias personalizados elegidos por el usuario, o ambos?
  5. ¿Longitud y alfabeto del código (base62, solo minúsculas, sin caracteres ambiguos)? ¿Palabras reservadas a evitar?
  6. Si se acorta dos veces la misma URL, ¿se devuelve el mismo código o uno nuevo?
  7. ¿Los enlaces caducan (por fecha o número de usos)? ¿Se pueden editar, desactivar o borrar?
  8. ¿Tipo de redirección: 301 o 302/307? (afecta a caché y SEO)
  9. ¿Estadísticas de clics (recuento, país, referrer, dispositivo, fechas)? ¿Hasta qué detalle y con qué política de privacidad/RGPD?
  10. ¿Códigos QR, protección con contraseña, vista previa antes de redirigir?
  11. ¿Qué validación de URLs: solo http/https, bloqueo de dominios, comprobación contra listas de malware/phishing?
  12. ¿Límites de uso (rate limiting) por IP o usuario? ¿Captcha?
  13. ¿Se permite acortar URLs de tu propio dominio (bucles de redirección)?
  14. ¿Lenguaje y framework preferidos? ¿Alguna restricción de stack?
  15. ¿Base de datos preferida (SQLite, PostgreSQL, Redis, otra)? ¿Necesitas caché?
  16. ¿Dónde se desplegará (VPS, Docker, Cloudflare, serverless, local)? ¿Dominio ya disponible, HTTPS?
  17. ¿Requisitos de disponibilidad, latencia o escalado horizontal?
  18. ¿Copias de seguridad, logs y monitorización?
  19. ¿Dónde se crea el código: en este repositorio (iadev) o en uno nuevo? ¿Qué estructura y convenciones debo seguir?
  20. ¿Qué nivel de tests esperas (unitarios, integración, e2e) y CI?
  21. ¿Documentación necesaria (README, OpenAPI)? ¿Idioma de la interfaz, mensajes y código (español/inglés)?
  22. ¿Es un prototipo mínimo o algo listo para producción? ¿Hay fecha límite?
  23. ¿Hay algo que explícitamente quede fuera de alcance?
Las 30 preguntas de deepseek-v4-pro
  1. ¿El acortador es solo una API (backend) o también incluye interfaz web/frontend?
  2. ¿Qué funcionalidades debe tener además de acortar y redirigir? (p. ej., URLs personalizadas/alias, expiración, límite de clics, estadísticas, edición/borrado, listado de URLs del usuario)
  3. ¿Se permiten acortar cualquier URL o solo dominios permitidos (allowlist/denylist)?
  4. ¿Hay usuarios y cuentas, o es anónimo/abierto sin registro?
  5. Si hay cuentas, ¿qué método de autenticación prefieres? (sesiones, JWT, OAuth de terceros, API keys)
  6. ¿Debe haber roles o permisos (admin, usuario normal)?
  7. ¿Qué base de datos o almacenamiento quieres usar? (SQLite, PostgreSQL, MySQL, Redis, archivo JSON…)
  8. ¿Se deben guardar metadatos de cada URL (fecha de creación, creador, clics, etc.)?
  9. ¿Cómo quieres generar el código corto? (aleatorio seguro, hash, base62 incremental, longitud fija o variable)
  10. ¿Qué caracteres debe usar el código? (solo alfanuméricos, mayúsculas/minúsculas, evitar caracteres ambiguos como 0/O, 1/l)
  11. ¿Qué longitud prefieres para el código corto?
  12. ¿Qué debe pasar con URLs duplicadas (misma URL original)? (generar código nuevo siempre, reutilizar el existente)
  13. ¿Las URLs deben expirar? En ese caso, ¿tiempo por defecto y configuración?
  14. ¿Debe haber límite de clics/visitas y qué ocurre al superarlo?
  15. ¿Qué ocurre si el código corto no existe o está expirado? (404, redirección a una página de error, etc.)
  16. ¿Qué tipo de redirección usar? (301 permanente, 302 temporal, 307/308)
  17. ¿Debe validarse la URL original antes de acortarla? (formato, que sea alcanzable, prevenir bucles/autoreferencias, bloquear la propia URL del acortador)
  18. ¿Qué lenguaje, framework y runtime prefieres? (p. ej., Node/Express, Python/FastAPI, Go, etc.)
  19. ¿Hay alguna infraestructura o despliegue concreto (Docker, serverless, VPS, plataforma específica)?
  20. ¿Qué dominio o base de URL usará el servicio (p. ej., https://corto.ejemplo.com/abc123)?
  21. ¿Necesitas estadísticas de clics? ¿Qué métricas (total, por día, país, referer, dispositivo)?
  22. ¿Debe haber un dashboard o endpoints para consultar estadísticas?
  23. ¿Necesitas rate limiting para prevenir abusos?
  24. ¿Debe haber límite de tamaño en la URL original o en el total de URLs por usuario?
  25. ¿Consideraciones de privacidad (GDPR) o retención de datos?
  26. ¿Prefieres una API REST, GraphQL o ambas?
  27. ¿Qué formato de respuesta y códigos de error esperas?
  28. ¿Necesitas documentación (OpenAPI/Swagger) y tests?
  29. ¿Debe haber soporte para QR de la URL corta?
  30. ¿Hay algún requisito de marca, idioma de la interfaz o textos concretos?
Las 70 preguntas de GPT-6.1-Sol
  1. ¿Qué problema quieres resolver y quién utilizará el acortador?
  2. ¿Será un servicio público, una herramienta privada, un producto para clientes o un proyecto de aprendizaje?
  3. ¿Qué funciones deben estar en la primera entrega y cuáles pueden quedar para más adelante?
  4. ¿Hay servicios de referencia que quieras imitar o comportamientos que quieras evitar?
  5. ¿Qué entregables esperas: aplicación lista para desplegar, despliegue funcionando, documentación, pruebas u otros?
  6. ¿Qué presupuesto, fecha límite y criterios de aceptación tiene el proyecto?
  7. ¿Se podrán crear enlaces sin registrarse o será obligatorio iniciar sesión?
  8. ¿Qué métodos de acceso necesitas: correo y contraseña, enlaces de acceso, Google, otros proveedores o inicio de sesión corporativo?
  9. ¿Necesitas verificación de correo, recuperación de cuenta o autenticación de dos factores?
  10. ¿Habrá roles como usuario, administrador y miembro de equipo? ¿Qué podrá hacer cada uno?
  11. ¿Los enlaces pertenecerán a personas, organizaciones o equipos? ¿Se podrán compartir o transferir?
  12. ¿Habrá planes gratuitos y de pago, suscripciones, cuotas o cobro por uso? ¿Cuáles serán sus límites?
  13. ¿Qué datos deberá introducir el usuario al crear un enlace: URL, alias, título, etiquetas, campaña u otros?
  14. ¿Qué esquemas de destino aceptarás: únicamente HTTP/HTTPS o también otros? ¿Permitirás direcciones internas, IP, localhost o puertos personalizados?
  15. ¿Cómo se tratarán las URLs sin protocolo, los caracteres internacionales, los parámetros y los fragmentos?
  16. ¿Se permitirá acortar enlaces de otros acortadores o del propio servicio?
  17. ¿Qué formato y longitud tendrán los códigos generados? ¿Distinguirán entre mayúsculas y minúsculas?
  18. ¿Se podrán elegir alias personalizados? ¿Qué caracteres, longitud y palabras reservadas tendrán?
  19. ¿Qué debe ocurrir si un alias ya existe o se genera un código repetido?
  20. ¿Acortar varias veces la misma URL debe devolver el mismo enlace o crear uno nuevo? ¿Dependerá del usuario o del dominio?
  21. ¿Se podrá modificar el destino después de crear el enlace? ¿Necesitas historial de cambios?
  22. ¿Se podrán pausar, eliminar, restaurar, archivar o duplicar enlaces? ¿Se reutilizarán los códigos eliminados?
  23. ¿Necesitas fecha de caducidad, inicio programado, límite de visitas o enlaces de un solo uso? ¿Qué ocurrirá cuando se alcance cada límite?
  24. ¿Habrá enlaces protegidos con contraseña o restricciones por usuario, país, dispositivo o dirección IP?
  25. ¿Necesitas creación masiva, importación y exportación? ¿En qué formatos y con qué límites?
  26. ¿Necesitas buscador, filtros, ordenación, carpetas, etiquetas o selección de varios enlaces?
  27. ¿Necesitas códigos QR? ¿Con qué personalización y formatos de descarga?
  28. ¿Necesitas destinos diferentes según país, idioma, dispositivo, fecha o reparto de tráfico? ¿Cómo se decidirán?
  29. ¿Qué dominio principal se utilizará? ¿Ya lo tienes y quién gestionará el DNS y los certificados?
  30. ¿Se admitirán dominios personalizados o varios dominios? ¿Quién podrá añadirlos y cómo se verificará su propiedad?
  31. ¿Qué tipo de redirección HTTP necesitas y qué reglas de caché deberán aplicarse?
  32. ¿La redirección será inmediata o mostrará una vista previa, advertencia, anuncio o confirmación?
  33. ¿Se conservarán, reemplazarán o combinarán los parámetros recibidos en el enlace corto con los del destino? ¿Necesitas parámetros de campaña automáticos?
  34. ¿Qué respuesta verá el visitante ante un enlace inexistente, caducado, desactivado, privado o bloqueado?
  35. ¿Qué debe mostrar la ruta principal del dominio y qué rutas deberán quedar reservadas para la aplicación?
  36. ¿Cómo deben tratarse las peticiones HEAD, los robots, las vistas previas de redes sociales y las solicitudes distintas de GET?
  37. ¿Necesitas estadísticas de clics? ¿Cuáles: totales, únicos, fecha, país, dispositivo, navegador, origen o campaña?
  38. ¿Cómo definirás un clic y un visitante único? ¿Deben excluirse robots, vistas previas, visitas propias o repeticiones?
  39. ¿Las estadísticas deberán actualizarse en tiempo real? ¿Qué filtros, gráficos, exportaciones y periodo histórico necesitas?
  40. ¿Quién podrá consultar las estadísticas? ¿Habrá páginas públicas o enlaces para compartirlas?
  41. ¿Qué datos personales se podrán recoger y con qué finalidad? ¿Se almacenarán direcciones IP completas, anonimizadas o ninguna?
  42. ¿Qué requisitos legales, jurisdicciones, consentimiento y políticas de cookies o privacidad debe cumplir el servicio?
  43. ¿Cuánto tiempo se conservarán los enlaces, las estadísticas, los registros y las cuentas? ¿Qué opciones de eliminación y exportación de datos necesitas?
  44. ¿Cómo quieres detectar y gestionar spam, phishing, malware y destinos prohibidos? ¿Necesitas un proveedor externo de análisis?
  45. ¿Se comprobará el destino al crear el enlace, periódicamente o en cada visita? ¿Qué debe ocurrir si la comprobación falla?
  46. ¿Habrá denuncias de enlaces, moderación, bloqueos y un procedimiento para recurrir decisiones? ¿Quién los gestionará?
  47. ¿Qué límites de solicitudes, creación de enlaces y consumo tendrá cada usuario, IP o cliente de API? ¿Necesitas CAPTCHA?
  48. ¿Debe el servidor consultar las URLs para extraer títulos, imágenes o validar su disponibilidad? ¿Qué restricciones de acceso de red tendrá esa función?
  49. ¿Qué requisitos tienes para secretos, cifrado, permisos, auditoría y registro de acciones administrativas?
  50. ¿Necesitas una web, una API, una aplicación móvil, una extensión de navegador o varias de ellas?
  51. ¿Qué pantallas y acciones debe incluir la interfaz de usuario y el panel administrativo?
  52. ¿Tienes diseño, marca, logotipo, colores o textos definidos? ¿Prefieres algún estilo visual concreto?
  53. ¿En qué idiomas estará disponible? ¿Qué formatos de fecha y zona horaria debe utilizar?
  54. ¿Qué dispositivos, navegadores y nivel de accesibilidad debe admitir?
  55. ¿La API será pública o privada? ¿Qué operaciones, autenticación, versiones, límites y documentación necesitas?
  56. ¿Necesitas integraciones, webhooks o notificaciones? ¿Qué eventos, canales y servicios deben cubrir?
  57. ¿Habrá correos transaccionales? ¿Qué proveedor, remitente y mensajes necesitas?
  58. ¿Hay lenguajes, frameworks, bases de datos o versiones obligatorios, preferidos o descartados?
  59. ¿Debe integrarse en un sistema existente? Si es así, ¿qué contratos, datos y restricciones tendrá esa integración?
  60. ¿Dónde se ejecutará: equipo local, servidor propio, contenedores o un proveedor cloud concreto?
  61. ¿Qué entornos necesitas y cómo quieres gestionar configuración, secretos, despliegues y actualizaciones?
  62. ¿Cuántos usuarios, enlaces almacenados, enlaces nuevos y redirecciones esperas inicialmente y a medio plazo? ¿Qué picos de tráfico prevés?
  63. ¿Qué objetivos de latencia, disponibilidad y recuperación ante fallos debe cumplir?
  64. ¿Qué requisitos tienes para copias de seguridad, restauración, ubicación de datos y recuperación ante desastres?
  65. ¿Qué registros, métricas, alertas y herramientas de monitorización necesitas? ¿Quién recibirá y atenderá las incidencias?
  66. ¿Qué debe ocurrir con las redirecciones si fallan la base de datos, el sistema de estadísticas o un servicio externo?
  67. ¿Necesitas migrar enlaces o usuarios de otro sistema? ¿Qué datos, formatos y URLs existentes deben conservarse?
  68. ¿Qué pruebas y comprobaciones exigirás para aceptar la entrega, y qué casos concretos deben demostrarse?
  69. ¿Quién se encargará del mantenimiento y qué documentación operativa o de usuario necesita?
  70. ¿Hay alguna restricción o decisión adicional que no esté cubierta por estas preguntas? ¿Qué aspectos quieres decidir tú y cuáles autorizarías a resolver durante la implementación?

Ábrelas. Las tres preguntan por cosas que en el capítulo 1 se decidieron sin decir nada: si acortar dos veces la misma URL da el mismo enlace, qué tipo de redirección usar, cómo son los alias, si los enlaces caducan. El conocimiento estaba ahí. Faltaba pedirlo.

Setenta preguntas no son una entrevista

Fíjate ahora en las cifras: 23, 30 y 70. Nadie contesta setenta preguntas antes de empezar un proyecto pequeño, y si lo intenta contestará las últimas de cualquier manera.

Además, no todas pesan lo mismo. En la lista larga, junto a preguntas excelentes (qué debe ocurrir si un alias ya existe, cómo tratar las peticiones HEAD), aparecen los planes de pago, la autenticación de dos factores y los correos transaccionales. Para una herramienta de uso local son ruido, y el modelo no puede saberlo: tampoco le hemos dicho para qué es.

Pedir «todas las preguntas» cambia un problema por otro. Antes el modelo decidía todo sin consultarte. Ahora te consulta todo sin decidir nada.

Cuatro preguntas

acorta, el proyecto de este tutorial, empezó con una línea parecida. El agente no preguntó setenta cosas. Preguntó cuatro: las que no podía decidir él porque cambiaban el producto. Esta es la tabla, copiada de la bitácora del proyecto:

# Pregunta Opciones Respuesta de Xavi
1 ¿Cómo se llama y dónde vive el código? acorta, repo propio (recomendada: historial limpio para repetirlo commit a commit) · acorta dentro del repo de la web acorta, repo propio
2 Además del núcleo (crear, redirigir, listar), ¿qué entra en la v1? Contador de visitas · Borrar enlaces · Alias personalizado · Caducidad (se podían marcar varias) Las cuatro
3 ¿Dónde se guardan los enlaces? SQLite sin CGO (recomendada) · Fichero JSON · Solo en memoria SQLite sin CGO
4 ¿Quién puede crear y borrar enlaces en la v1? Sin autenticación (recomendada: llegará después como spec nueva) · Token de API desde la v1 · Usuario y contraseña Sin autenticación

Tres detalles hacen que se conteste en un minuto:

  • Son pocas. Solo las que cambian qué se construye. Lo demás no se pregunta.
  • Traen opciones. Elegir entre tres cosas es más rápido que redactar una respuesta, y obliga al modelo a enseñar qué alternativas ve.
  • Traen una recomendación con su porqué. Si no tienes opinión, aceptas la suya. Si la tienes, ya sabes contra qué discutir.

Lo que no se pregunta, se enseña

¿Y todo lo demás? Se decide igualmente. La diferencia con el capítulo 1 es que no se quedan escondidas en el código.

Al redactar la spec de acorta, el agente apuntó aparte cada decisión que había tomado por su cuenta. Salieron veintiuna, en una tabla: la pregunta que nadie había hecho, lo que dice la spec y dónde. Cosas como que los códigos tengan seis caracteres, que la redirección sea un 302 o que Oferta sea un alias inválido en vez de convertirse a oferta.

Esa lista cambia el trabajo de revisar. No hay que leer la spec entera buscando qué se ha dado por hecho: está enumerado. Xavi revisó la lista y cuestionó una, la de guardar en Git la interfaz compilada. Era la número veinte, se cambió en minutos y es el caso que cuenta el capítulo anterior.

De la respuesta al criterio

Una respuesta todavía no es una spec. «Los alias entran en la v1» es una decisión; falta convertirla en frases que se puedan comprobar. El formato que usa acorta, y medio mundo, tiene tres partes:

  • Dado: la situación de partida.
  • Cuando: lo que ocurre.
  • Entonces: lo que se puede comprobar después.

Pruébalo. El primer ejemplo es lo que sale a la primera; los otros tres son criterios reales de la spec de acorta.

El criterioTodavía no se puede comprobar

Dado un alias, cuando se crea el enlace, entonces funciona correctamente.

  • Tiene las tres partes.
  • Esconde una decisión: «correctamente».
  • El Entonces no se puede comprobar: ¿qué devuelve, qué se ve, qué cambia?
  • El Dado no trae un ejemplo: quien escriba el test tendrá que inventarlo.

Las comprobaciones son de forma, no de sentido: que estén las tres partes, que no haya palabras que escondan una decisión y que el Entonces diga algo que se vea desde fuera. «Funciona correctamente» no se puede comprobar. «El código del enlace es oferta-otono» sí.

Mira el tercer ejemplo real, BOR-01. Pasa, pero con un aviso: su Dado es «un código que existe», sin ejemplo. Es un criterio válido, y aun así quien escriba su test tiene que inventarse el código. Un ejemplo concreto en el Dado es medio test escrito.

Tampoco tienes que redactar tú los cien criterios. Los redacta el modelo, que para eso es rápido. Lo que haces tú es leerlos con estas tres preguntas en la cabeza.

El encargo completo

Junto, queda un encargo que cabe en un párrafo y sustituye al de una línea:

Quiero <la idea, en una frase, y para quién es>.

No escribas código todavía.

1. Hazme solo las preguntas cuya respuesta cambie qué se construye.
   Como mucho cinco, con opciones y con tu recomendación razonada.
2. Con mis respuestas, escribe la especificación en specs/: qué hace,
   qué queda fuera, y criterios numerados Dado / Cuando / Entonces
   con los mensajes de error exactos.
3. Aparte, enumera todo lo que hayas decidido tú sin preguntarme:
   la pregunta, lo que has decidido y dónde está en la spec.

El tercer punto es el que casi nadie pide y el que más vale. Sin él vuelves al capítulo 1, solo que con las decisiones escondidas en un documento en vez de en el código.

¿Quién le dice que pregunte?

Hasta aquí parece que basta con acordarse de pedirlo. No basta, y conviene ser claro con el caso de acorta: nadie escribió esa instrucción. El encargo fue una línea y no decía «pregúntame».

Que el agente preguntara, y que fueran justo cuatro preguntas con opciones y una recomendada, salió de tres sitios que no estaban en el proyecto. De la metodología que Xavi tenía escrita en otro lado. Del criterio del agente para elegir cuáles. Y de la herramienta: Claude Code le da al agente una utilidad para preguntar que admite como mucho cuatro preguntas por tanda, cada una con entre dos y cuatro opciones. El «cuatro» venía de ahí. Con otra herramienta, el mismo encargo habría empezado de otra manera.

Una instrucción así puede vivir en tres sitios:

  • En el encargo, como el de arriba. Funciona, y depende de que te acuerdes cada vez.
  • En la herramienta. Algunas traen un modo de planificar o de preguntar. Ayuda, pero no lo controlas tú y cambia de una a otra.
  • En el fichero de reglas del proyecto, AGENTS.md, que el agente lee solo cada vez que arranca. Es el sitio bueno: se escribe una vez y vale para cualquier agente y cualquier persona.

La regla cabe en dos líneas. Esta es la de la plantilla que acompaña al tutorial:

2. **Algo nuevo empieza por preguntas, no por código.** Ante un proyecto nuevo, una
   funcionalidad nueva o un encargo ambiguo, no escribas código ni spec todavía. Haz
   como mucho cinco preguntas: solo las que cambien qué se construye, cada una con
   opciones y con tu recomendación razonada.

El número lo pones tú, y hay que ponerlo: «todas las que necesites» dio 23, 30 y 70.

¿Funciona? Lo probamos con el encargo del capítulo 1, el que puso a programar a once agentes. Copiamos la plantilla a dos carpetas vacías, arrancamos un agente nuevo en cada una y les dimos esa misma línea, sin añadir nada. Uno hizo cuatro preguntas y el otro cinco, los dos con opciones y recomendación, y ninguno escribió código. Las respuestas completas están en la página de la plantilla.

De qué más conviene poner en ese fichero, y qué no, trata el capítulo 6. La plantilla ya trae uno listo para usar.

Lo que viene

Ya hay un contrato. Queda algo que lo haga cumplir, porque una spec que nadie comprueba envejece igual que cualquier otro documento. El capítulo siguiente trata de los tests, y de por qué con una IA hay que escribirlos antes que el código y verlos fallar.