Receta: Corrección de Bug con SDD
Esta receta muestra cómo usar SpecForge para documentar, acotar y resolver un bug de una forma que crea una spec duradera — para que la misma clase de bug nunca vuelva a producción.
¿Por Qué Documentar Bugs como Specs?
La mayoría de los bugs recurren porque el comportamiento correcto nunca fue especificado formalmente. Corregir un bug sin una spec significa:
- La corrección no tiene criterios de aceptación (¿cómo sabes que está arreglado?)
- El test de regresión no tiene trazabilidad
- El mismo patrón puede reaparecer en código relacionado
SDD trata los bugs como specs faltantes o incorrectas. Corregir el bug significa escribir la spec que debería haber existido, y luego implementar para que coincida con ella.
Escenario
Los usuarios reportan que hacer dos pedidos simultáneamente resulta a veces en cargos duplicados. Este es un bug de concurrencia en el flujo de creación de pedidos.
Paso 1 — Clarificar el Bug
Prompt:
Use specforge to clarify requirements for a bug fix:
duplicate charges when placing simultaneous orders in project proj_abc123O en español:
Usa specforge para clarificar los requisitos de una corrección de bug:
cargos duplicados al hacer pedidos simultáneos en el proyecto proj_abc123SpecForge preguntará:
- ¿Dónde ocurre la duplicación — capa API, procesador de pagos o BD?
- ¿Es reproducible en condiciones específicas (carga, retraso de red)?
- ¿Cuál es el comportamiento esperado — exactamente un cargo por pedido, siempre?
- ¿Existen tests que deberían haber detectado esto?
Paso 2 — Crear la Spec del Bug Fix
Prompt:
Create a spec for fixing duplicate charge bug in order placement for project proj_abc123.
Root cause: race condition in OrderService.placeOrder — no idempotency key on Stripe call.
Expected: exactly one charge per order regardless of concurrent requests.Qué contendrá la spec:
markdown
## Criterios de Aceptación
1. Hacer el mismo pedido dos veces concurrentemente resulta en exactamente un cargo de Stripe
2. La segunda solicitud concurrente recibe una respuesta 409 Conflict con el ID del pedido
3. La idempotency key se deriva del orderId y se almacena en la tabla de pedidos
4. Los pedidos existentes no pueden modificarse después de que se inicia el pago
5. El test de integración cubre la creación simultánea de pedidos con 10 solicitudes simultáneas
6. El test unitario cubre los casos borde de generación de idempotency key (UUID v4, resistencia a colisiones)Paso 3 — Hacer Challenge del Diseño de la Corrección
Prompt:
Challenge spec SPEC-BUG-001 for project proj_abc123SpecForge indagará en:
- ¿Qué pasa si la generación de la idempotency key misma tiene una race condition?
- ¿Qué pasa si la primera solicitud falla a mitad de vuelo — tiene éxito la segunda?
- ¿Cuál es la política de expiración de las idempotency keys?
- ¿Maneja la corrección el caso en que el pago tiene éxito pero el write a la BD falla?
Paso 4 — Verificación de Seguridad
Prompt:
Run a security check on spec SPEC-BUG-001 for project proj_abc123Los bugs de pagos concurrentes a menudo tienen implicaciones de seguridad — asegúrate de que la corrección no introduzca una vulnerabilidad TOCTOU.
Paso 5 — Ingeniería Inversa del Código Existente
Documenta lo que hace actualmente el código (roto):
Prompt:
Reverse engineer the code at /Users/me/my-app/src/orders/OrderService.ts for project proj_abc123Esto crea una spec del comportamiento actual — útil para entender exactamente dónde divergieron la spec y la implementación.
Paso 6 — Generar Tests Primero (enfoque TDD)
Prompt:
Generate tests for spec SPEC-BUG-001 in project proj_abc123Escribe los tests de regresión antes de tocar la implementación. Esto garantiza:
- El bug es reproducible con un test (rojo)
- La corrección hace pasar el test (verde)
- El test queda en el suite para siempre (protección de regresión)
Paso 7 — Generar Plan de Ejecución
Prompt:
Generate an execution plan for spec SPEC-BUG-001 in project proj_abc123Para una corrección de bug, el plan típicamente se ve así:
markdown
## Fase 1: Reproducir
- [ ] Escribir test de integración fallando que dispara el cargo duplicado (RED)
- [ ] Confirmar que el test falla contra la implementación actual
## Fase 2: Corregir
- [ ] Agregar columna idempotency_key a la tabla de pedidos (migración)
- [ ] Generar idempotency key en OrderService antes de la llamada a Stripe
- [ ] Almacenar la key atómicamente con la creación del pedido (transacción)
- [ ] Manejar 409 del endpoint de idempotencia de Stripe
## Fase 3: Verificar
- [ ] Ejecutar test de integración (GREEN)
- [ ] Ejecutar suite completa de tests
- [ ] Test manual con solicitudes concurrentes en modo test de StripePaso 8 — Implementar y Validar
Después de implementar la corrección:
Prompt:
Validate spec SPEC-BUG-001 against the code at /Users/me/my-app/src for project proj_abc123Asegúrate de que los 6 criterios de aceptación estén cubiertos por la implementación y los tests.
Paso 9 — Detectar Drift desde la Spec Original
Si existe un SPEC para el flujo de creación de pedidos, verifica si la corrección introdujo drift:
Prompt:
Detect drift in spec SPEC-002 (order placement) for project proj_abc123La corrección puede necesitar reflejarse en la spec original como un nuevo criterio: "El sistema debe usar idempotency keys para todas las llamadas a la API de Stripe."
Paso 10 — Capturar el Aprendizaje
Prompt:
Capture learning: payment provider API calls must always include idempotency keys derived from the business entity ID, never from request-generated UUIDsEste patrón ahora está almacenado e influirá en specs futuras que involucren llamadas a APIs de pago.
Resultado de Esta Receta
Al final:
- Una spec de bug fix (SPEC-BUG-001) con criterios de aceptación completos
- Tests de regresión con trazabilidad a cada criterio
- La spec original actualizada para reflejar el comportamiento correcto
- Un aprendizaje capturado que previene que el patrón recurra
- Un rastro de auditoría: cuándo se encontró el bug, cuál fue la corrección, por qué fue la corrección correcta