@saulwade/swl-ses 1.9.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/CLAUDE.md +196 -196
  2. package/README.md +579 -579
  3. package/agentes/_propose-step.md +90 -0
  4. package/agentes/accesibilidad-wcag-swl.md +3 -3
  5. package/agentes/auto-evolucion-swl.md +908 -908
  6. package/agentes/disenador-ui-swl.md +6 -5
  7. package/agentes/frontend-angular-swl.md +2 -2
  8. package/agentes/frontend-css-swl.md +2 -2
  9. package/agentes/frontend-react-swl.md +4 -4
  10. package/agentes/frontend-swl.md +6 -6
  11. package/agentes/implementador-swl.md +2 -0
  12. package/agentes/investigador-ux-swl.md +5 -5
  13. package/agentes/orquestador-swl.md +9 -7
  14. package/agentes/perfilador-usuario-swl.md +321 -308
  15. package/agentes/producto-prd-swl.md +1 -1
  16. package/agentes/red-team-swl.md +218 -218
  17. package/agentes/tdd-qa-swl.md +17 -1
  18. package/bin/swl-ses.js +1 -1
  19. package/comandos/swl/actualizar.md +1 -1
  20. package/comandos/swl/aprender.md +2 -2
  21. package/comandos/swl/aprobar-plan.md +153 -0
  22. package/comandos/swl/ayuda.md +3 -3
  23. package/comandos/swl/briefing.md +122 -0
  24. package/comandos/swl/compactar.md +29 -2
  25. package/comandos/swl/discutir-fase.md +23 -2
  26. package/comandos/swl/ejecutar-fase.md +59 -6
  27. package/comandos/swl/evolucionar.md +1 -1
  28. package/comandos/swl/inbox.md +1 -1
  29. package/comandos/swl/instalar.md +1 -1
  30. package/comandos/swl/nemesis.md +1 -1
  31. package/comandos/swl/planear-fase.md +19 -1
  32. package/comandos/swl/plugins.md +1 -1
  33. package/comandos/swl/release.md +47 -1
  34. package/comandos/swl/status.md +348 -0
  35. package/comandos/swl/verificar.md +27 -1
  36. package/habilidades/ai-runtime-security/SKILL.md +1 -1
  37. package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
  38. package/habilidades/benchmark-memoria/SKILL.md +1 -1
  39. package/habilidades/calidad-contract-testing/SKILL.md +165 -0
  40. package/habilidades/changelog-generator/SKILL.md +9 -2
  41. package/habilidades/changelog-generator/scripts/parse-commits.js +13 -1
  42. package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
  43. package/habilidades/drift-detection/SKILL.md +179 -179
  44. package/habilidades/ejecutar-fase/SKILL.md +541 -468
  45. package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
  46. package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
  47. package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
  48. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
  49. package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
  50. package/habilidades/harness-claude-code/SKILL.md +10 -7
  51. package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
  52. package/habilidades/instalar-sistema/SKILL.md +3 -3
  53. package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
  54. package/habilidades/perfil-usuario/SKILL.md +200 -200
  55. package/habilidades/planear-fase/SKILL.md +26 -4
  56. package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
  57. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  58. package/habilidades/proceso-debate-adversarial/SKILL.md +2 -2
  59. package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
  60. package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
  61. package/habilidades/swl-claudemd/SKILL.md +50 -210
  62. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
  63. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
  64. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
  65. package/habilidades/swl-dashboard/SKILL.md +9 -9
  66. package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
  67. package/habilidades/tdd-workflow/SKILL.md +715 -673
  68. package/habilidades/validacion-ci-sistema/SKILL.md +20 -4
  69. package/hooks/calidad-pre-commit.js +344 -3
  70. package/hooks/check-update.js +39 -1
  71. package/hooks/ciclo-evolucion-subagente.js +26 -0
  72. package/hooks/ciclo-evolucion.js +26 -0
  73. package/hooks/extraccion-aprendizajes.js +13 -0
  74. package/hooks/lib/autonomia.js +208 -0
  75. package/hooks/lib/briefing.js +474 -0
  76. package/hooks/lib/ciclo-evolucion.js +47 -0
  77. package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
  78. package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
  79. package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
  80. package/hooks/lib/evolution-tracker.js +24 -3
  81. package/hooks/lib/propose-step.js +357 -0
  82. package/hooks/session-briefing.js +98 -0
  83. package/hooks/spec-gate.js +211 -0
  84. package/hooks/tdd-gate.js +241 -0
  85. package/hooks/telemetria-skill-routing.js +100 -0
  86. package/hooks/validar-intent-spec.js +30 -10
  87. package/instintos/autonomia.yaml +27 -0
  88. package/llms.txt +6 -6
  89. package/manifiestos/hooks-config.json +44 -17
  90. package/manifiestos/modulos.json +40 -15
  91. package/manifiestos/skills-lock.json +64 -57
  92. package/package.json +93 -93
  93. package/plugin.json +371 -375
  94. package/reglas/accesibilidad.md +10 -0
  95. package/reglas/analizar-directorios-antes-de-escribir.md +228 -0
  96. package/reglas/api-diseno.md +9 -0
  97. package/reglas/auditorias-documentales-estructurales.md +7 -0
  98. package/reglas/cloud-infra.md +8 -0
  99. package/reglas/consultar-vault-primero.md +195 -0
  100. package/reglas/debatir-antes-de-aceptar.md +158 -0
  101. package/reglas/fragmentos-compartidos.md +5 -0
  102. package/reglas/git-coauthor.md +100 -0
  103. package/reglas/gobernanza.md +4 -4
  104. package/reglas/hooks.md +6 -0
  105. package/reglas/intent-engineering.md +4 -0
  106. package/reglas/markitdown.md +8 -0
  107. package/reglas/memoria-consolidada.md +1 -1
  108. package/reglas/monitor-ci.md +309 -0
  109. package/reglas/patrones.md +6 -0
  110. package/reglas/registro-componentes-nuevos.md +39 -2
  111. package/reglas/seguridad-agentes.md +1 -1
  112. package/reglas/sesiones-paralelas.md +180 -0
  113. package/reglas/skills-estandar.md +6 -0
  114. package/reglas/testing.md +7 -0
  115. package/reglas/tests-cleanup.md +4 -0
  116. package/reglas/usar-code-review-graph.md +155 -0
  117. package/reglas/usar-sistema-swl.md +1 -1
  118. package/reglas/verificar-citas-normativas.md +548 -0
  119. package/scripts/instalador.js +52 -6
  120. package/scripts/lib/ci-reader.js +193 -0
  121. package/scripts/lib/detectar-host-swl.js +175 -0
  122. package/scripts/lib/evidencia-release.js +322 -0
  123. package/scripts/lib/gate-hooks-requires.js +249 -0
  124. package/scripts/lib/gate-licencias.js +212 -0
  125. package/scripts/lib/git-metricas.js +257 -0
  126. package/scripts/lib/gitignore-manifest.js +29 -1
  127. package/scripts/lib/metricas-dora.js +204 -0
  128. package/scripts/lib/plan-lock.js +275 -0
  129. package/scripts/migrar-fase-dominio.js +0 -1
  130. package/scripts/tui/ejecutores.js +1 -1
  131. package/scripts/validar-manifest.js +92 -1
  132. package/scripts/verificar-evolucion.js +54 -4
  133. package/scripts/verificar-release.js +102 -0
  134. package/scripts/verificar-trazabilidad.js +298 -0
  135. package/agentes/ux-disenador-swl.md +0 -503
  136. package/comandos/swl/dashboard.md +0 -146
  137. package/comandos/swl/evolucion-estado.md +0 -191
  138. package/comandos/swl/metricas.md +0 -376
  139. package/comandos/swl/salud.md +0 -481
  140. package/reglas/arquitectura.evolved.json +0 -7
  141. package/reglas/seguridad.evolved.json +0 -7
  142. package/reglas/verificar-citas-temporales.md +0 -139
@@ -1,468 +1,541 @@
1
- ---
2
- name: ejecutar-fase
3
- description: Ejecuta el PLAN.md de una fase con commits atómicos por tarea. Aplica reglas de desviación, maneja checkpoints HITL, soporta TDD opcional, y mantiene ESTADO.md y HOJA-RUTA.md actualizados tras cada tarea completada.
4
- version: "1.1.0"
5
- herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
6
- exclusiones:
7
- - "No cargar si no existe PLAN.md con `estado: aprobado` — ejecutar `planear-fase` primero."
8
- - "No cargar para ejecutar tareas ad-hoc sin plan formal; si no hay oleadas ni criterios de verificación, no hay fase que ejecutar."
9
- - "No cargar para retomar una sesión pausada en checkpoint `decision` o `human-action` sin resolverlo primero — el agente no debe avanzar pasando por alto una decisión pendiente del usuario."
10
- - "No cargar solo para verificar el trabajo ya hecho; en ese caso usar `verificar-trabajo`."
11
- # Nota: este skill supera el límite estándar de 380 líneas (406 líneas en v1.1.0).
12
- # Excepción aprobada: las secciones Phase Gates y Dev↔QA Loop formal aportan
13
- # protocolos de calidad de alto valor que no pueden condensarse sin perder
14
- # precisión operativa. No eliminar contenido para ajustar al límite.
15
- evolvable: true # default para skill estandar
16
- ---
17
- # Habilidad: Ejecutar Fase de Desarrollo
18
-
19
- ## Propósito
20
-
21
- La ejecución es donde el plan se convierte en código. Esta habilidad convierte
22
- el PLAN.md en cambios reales, verificables y atómicamente comprometidos, con
23
- trazabilidad completa entre cada tarea y su commit correspondiente. Evita el
24
- antipatrón de acumular cambios sin verificar y commitear "todo de golpe".
25
-
26
- ## Cuándo activar
27
-
28
- - Existe un PLAN.md válido en `.planning/`
29
- - El usuario dice "ejecuta la fase" o "ejecuta el plan"
30
- - Se retoma una fase interrumpida (ESTADO.md indica progreso parcial)
31
-
32
- ## Cuándo NO cargar
33
-
34
- - No hay PLAN.md o el plan tiene `estado: propuesto` (no aprobado) — ejecutar `planear-fase` y obtener aprobación primero.
35
- - El objetivo es solo verificar calidad del trabajo ya implementado; usar `verificar-trabajo`.
36
- - Hay un checkpoint `decision` o `human-action` sin resolver en ESTADO.md — resolver el checkpoint antes de continuar la ejecución.
37
- - Se quiere ejecutar solo una sub-tarea fuera de la secuencia de oleadas del plan; hacerlo rompe el grafo de dependencias y el estado en ESTADO.md.
38
-
39
- ## Prerrequisito obligatorio
40
-
41
- Leer `.planning/fases/0N-PLAN.md` y `.planning/ESTADO.md` (si existe) antes de
42
- ejecutar la primera tarea.
43
-
44
- ---
45
-
46
- ## Protocolo de ejecución por tarea
47
-
48
- ### Para cada tarea del plan, en orden de oleadas:
49
-
50
- ```
51
- 1. Leer la descripción completa de la tarea
52
- 2. Verificar que las dependencias estén marcadas como COMPLETADA en ESTADO.md
53
- 3. Ejecutar la implementación
54
- 4. Ejecutar el criterio de verificación de la tarea
55
- 5. Si pasa: hacer commit atómico + actualizar ESTADO.md
56
- 6. Si falla: aplicar retry con backoff exponencial (ver abajo)
57
- 7. Si agota reintentos: marcar como BLOQUEADA y reportar al usuario
58
- ```
59
-
60
- ### Protocolo de retry con backoff exponencial
61
-
62
- Cuando una tarea falla verificacion:
63
-
64
- | Intento | Delay | Accion |
65
- |---------|-------|--------|
66
- | 1 (original) | | Ejecutar normalmente |
67
- | 2 | 0s | Leer error, diagnosticar, corregir UNA cosa, re-verificar |
68
- | 3 | 5s | Repensar enfoque, corregir, re-verificar |
69
- | 4 (final) | 15s | Ultimo intento con enfoque diferente |
70
-
71
- Reglas:
72
- - `maxRetries`: 3 (configurable por tarea en el plan)
73
- - Si el error es identico en 2 intentos: abortar (loop detectado)
74
- - Si el error es tipo STOP (Regla 4): no reintentar, reportar
75
- - Registrar en ESTADO.md: `intentos: N, ultimo_error: "desc"`
76
-
77
- ## Dev↔QA Loop formal
78
-
79
- Cuando el plan incluye tareas de implementación seguidas de tareas de verificación
80
- (patrón `T-NN impl → T-NN+1 verify`), aplicar el loop formal de calidad:
81
-
82
- ```
83
- implementador tdd-qa-swl [PASS] siguiente tarea
84
- [FAIL] implementador (intento 2)
85
- → tdd-qa-swl → [PASS]
86
- ↘ [FAIL] → implementador (intento 3)
87
- tdd-qa-swl → [PASS]
88
- ↘ [FAIL] → ESCALAR
89
- ```
90
-
91
- ### Reglas del loop
92
-
93
- - **Máximo 3 ciclos** Dev→QA por tarea. En el ciclo 3, el agente implementador
94
- DEBE cambiar de enfoque completamente, no hacer el mismo fix.
95
- - **Loop detectado** (mismo error dos veces seguidas): abortar y escalar a
96
- `arquitecto-swl` con el diagnóstico completo.
97
- - **Criterio de PASS**: todos los niveles de validación (1–4) deben pasar,
98
- no solo los tests.
99
- - **Criterio de FAIL**: cualquier nivel de validación falla o el criterio de
100
- aceptación de la tarea no se cumple.
101
-
102
- ### Cómo registrar en ESTADO.md
103
-
104
- ```markdown
105
- | T-05 | Crear endpoint /pagos | EN_PROGRESO | | Ciclo QA: 2/3 |
106
- ```
107
-
108
- ### Cuándo escalar (Regla 4 del loop)
109
-
110
- Si después de 3 ciclos la tarea sigue fallando:
111
-
112
- ```
113
- ALERTA: Loop Dev↔QA agotado — T-[NN]: [nombre de la tarea]
114
-
115
- Ciclos intentados: 3
116
- Último error: [descripción exacta]
117
- Archivos involucrados: [lista]
118
-
119
- Escalando a arquitecto-swl para revisión de enfoque.
120
- NO hacer más intentos de implementación hasta recibir dirección.
121
- ```
122
-
123
- ### Niveles de validación estructurada (después de cada tarea)
124
-
125
- Ejecutar validaciones en orden ascendente. Si un nivel falla, NO avanzar al siguiente:
126
-
127
- | Nivel | Qué valida | Ejemplo de comandos |
128
- |-------|-----------|-------------------|
129
- | 1. Sintaxis y estilo | Código compila, linter pasa | `ruff check .`, `npx tsc --noEmit`, `cargo clippy`, `go vet ./...` |
130
- | 2. Tests unitarios | Lógica de negocio correcta | `pytest -x`, `npm test`, `cargo test`, `go test ./...` |
131
- | 3. Tests de integración | Componentes conectados | `pytest tests/integration/`, `playwright test`, curl a endpoints |
132
- | 4. Validación de aceptación | Criterio del plan satisfecho | Criterio de verificación específico de la tarea en PLAN.md |
133
-
134
- Reglas:
135
- - Nivel 1 se ejecuta SIEMPRE, incluso en tareas triviales
136
- - Nivel 2 se ejecuta si existen tests en el proyecto
137
- - Nivel 3 se ejecuta si la tarea toca integración entre componentes
138
- - Nivel 4 se ejecuta siempre (es el criterio de verificación de la tarea)
139
- - Si la validación falla: corregir inmediatamente. NUNCA acumular estado roto
140
-
141
- ### Formato de commit atómico
142
-
143
- ```
144
- [T-NN] tipo(scope): descripción en imperativo
145
-
146
- - Detalle adicional si es necesario
147
- - Referencia a la tarea del plan
148
-
149
- Co-Authored-By: SWL Agent <noreply@swl.dev>
150
- ```
151
-
152
- Tipos de commit válidos: `feat`, `fix`, `test`, `refactor`, `docs`, `chore`, `migration`
153
-
154
- ---
155
-
156
- ## Modo Pipeline: acumulación de resultados entre tareas
157
-
158
- Cuando el PLAN.md tiene **7 o más tareas con dependencias encadenadas**, activar
159
- el modo pipeline para pasar contexto filtrado entre tareas en lugar del contexto
160
- completo de la conversación.
161
-
162
- ### Cómo funciona
163
-
164
- Al completar cada tarea, generar un `stepResult` compacto:
165
-
166
- ```json
167
- {
168
- "step": 3,
169
- "agentName": "backend-python-swl",
170
- "output": {
171
- "filesCreated": ["src/models/user.py", "db/migrations/001_users.sql"],
172
- "endpointsAdded": ["POST /users", "GET /users/{id}"],
173
- "keyDecisions": ["usé async SQLAlchemy con session factory"]
174
- },
175
- "status": "completed"
176
- }
177
- ```
178
-
179
- Al delegar la siguiente tarea a un agente, construir el `TaskDelegationContext`
180
- (schema en `manifiestos/handoff-context.json`) incluyendo **solo los stepResults
181
- que la tarea siguiente necesita** — no el array completo:
182
-
183
- ```
184
- TaskDelegationContext:
185
- reason: "task_delegation"
186
- parentAgent: "orquestador-swl"
187
- transferCount: [incrementar desde handoff previo]
188
- taskId: "T-04"
189
- taskDescription: "[descripción exacta del PLAN.md self-contained]"
190
- verificationCriteria: "[criterio de verificación del plan]"
191
- relevantFiles: ["src/models/user.py:1", "db/migrations/001_users.sql"]
192
- previousTaskOutputs:
193
- - { taskId: "T-03", output: { endpointsAdded: [...] } }
194
- ```
195
-
196
- ### Beneficio
197
-
198
- Un pipeline de 7 tareas pasa ~60% menos contexto a cada agente especializado
199
- versus pasar el historial completo de la conversación.
200
-
201
- ### Límite de transferCount
202
-
203
- Si `transferCount >= 10`, reportar al usuario:
204
- ```
205
- ALERTA: Cadena de delegaciones muy larga (transferCount = N).
206
- Posible loop de agentes. Revisar el PLAN.md y continuar manualmente.
207
- ```
208
-
209
- ---
210
-
211
- ## Reglas de desviación
212
-
213
- Una desviación ocurre cuando la implementación difiere del plan. Hay tres tipos:
214
-
215
- ### Desviación Menor (continuar y registrar)
216
- - Un nombre de función o archivo difiere del plan
217
- - Se añade un helper que no estaba planificado pero no cambia el alcance
218
- - El tiempo real es diferente al estimado
219
-
220
- **Acción**: Continuar. Registrar en ESTADO.md bajo `## Desviaciones`.
221
-
222
- ### Desviación Moderada (notificar y continuar)
223
- - Se descubre que una tarea requiere subdivisión en el momento de ejecutar
224
- - Se encuentra código existente que cubre parcialmente la tarea
225
- - Una dependencia no funciona como se esperaba
226
-
227
- **Acción**: Notificar al usuario en el mismo mensaje donde reportas avance.
228
- Registrar decisión tomada en ESTADO.md.
229
-
230
- ### Desviación Mayor (STOP — requiere replanificación)
231
- - La tarea no puede completarse sin cambiar el diseño de otra tarea ya completada
232
- - Se descubre un requerimiento que invalida 2+ tareas del plan
233
- - La implementación requeriría romper la compatibilidad con código existente
234
-
235
- **Acción**: PARAR. No hacer commit. Reportar al usuario con:
236
- 1. Qué se encontró
237
- 2. Qué tareas están afectadas
238
- 3. Opciones de resolución propuestas
239
-
240
- ---
241
-
242
- ## Manejo de tareas HITL
243
-
244
- Cuando el plan llega a una tarea marcada `HITL`:
245
-
246
- 1. Presentar al usuario el resultado del trabajo previo
247
- 2. Describir exactamente qué decisión o revisión se necesita
248
- 3. Esperar confirmación explícita antes de continuar
249
- 4. Registrar la respuesta del usuario en ESTADO.md
250
-
251
- Formato de presentación de checkpoint:
252
-
253
- ```
254
- CHECKPOINT HITL — T-[NN]: [Nombre]
255
-
256
- Estado actual: [descripción de lo implementado hasta aquí]
257
-
258
- Se necesita tu revisión/decisión:
259
- [descripción precisa de qué revisar o decidir]
260
-
261
- Opciones (si aplica):
262
- A) [opción A]
263
- B) [opción B]
264
-
265
- ¿Cómo procedo?
266
- ```
267
-
268
- ---
269
-
270
- ## TDD opcional (activar si el CONTEXTO.md lo requiere)
271
-
272
- Cuando el CONTEXTO.md indica que la fase requiere TDD:
273
-
274
- ### Ciclo RED GREEN → REFACTOR por tarea
275
-
276
- **RED**: Escribir el test que describe el comportamiento esperado.
277
- El test DEBE fallar. Verificar que falla por la razón correcta, no por error
278
- de sintaxis o configuración.
279
-
280
- **GREEN**: Escribir la implementación mínima que hace pasar el test.
281
- "Mínima" significa: no implementar más de lo que el test exige. Resistir la
282
- tentación de añadir casos no cubiertos por tests.
283
-
284
- **REFACTOR**: Limpiar el código sin cambiar el comportamiento.
285
- El test DEBE seguir pasando después del refactor. Hacer commit solo en este paso.
286
-
287
- ### Cobertura mínima en modo TDD
288
-
289
- - Toda función pública tiene al menos 1 test de camino feliz
290
- - Toda función con branches tiene tests de cada rama relevante
291
- - Toda función que puede lanzar excepción tiene test del caso de error
292
-
293
- ---
294
-
295
- ## Estado de ejecución serializable con execution-state.js
296
-
297
- Para planes multi-agente complejos, usar `hooks/lib/execution-state.js` para
298
- mantener el estado de ejecución serializable y recuperable entre sesiones:
299
-
300
- ### API disponible
301
-
302
- - `nuevo(dir, { planId, tareas })` inicializa estado de ejecución
303
- - `leer(dir)` → lee el estado actual (devuelve `null` si no existe)
304
- - `iniciarAgente(dir, { agente, tareaId })` → marca agente como activo
305
- - `completarAgente(dir, { agente, tareaId, resultado })` → registra completación
306
- - `establecerProximo(dir, { agente, tareaId })` → define el siguiente paso
307
- - `actualizarContexto(dir, datos)` → actualiza contexto compartido entre agentes
308
- - `formatearResumen(dir)` resumen legible del estado actual
309
- - `limpiar(dir)` elimina el archivo de estado
310
-
311
- ### Integración con el protocolo de ejecución
312
-
313
- Antes de cada tarea:
314
- ```
315
- estado = leer(dir)
316
- iniciarAgente(dir, { agente: "backend-python-swl", tareaId: "T-03" })
317
- ```
318
-
319
- Después de cada tarea completada:
320
- ```
321
- completarAgente(dir, { agente: "backend-python-swl", tareaId: "T-03", resultado: { ... } })
322
- establecerProximo(dir, { agente: "tdd-qa-swl", tareaId: "T-04" })
323
- ```
324
-
325
- ### Persistencia
326
-
327
- El estado se persiste en `.planning/execution-state.json`. Al retomar una sesión
328
- interrumpida, `leer()` recupera el estado exacto donde se detuvo.
329
-
330
- ---
331
-
332
- ## Actualización de ESTADO.md
333
-
334
- Actualizar ESTADO.md después de cada tarea (no al final de la oleada):
335
-
336
- ```markdown
337
- # ESTADO.md Fase [N]: [Nombre]
338
- **Última actualización**: [fecha y hora]
339
-
340
- ## Progreso
341
- - Tareas totales: N
342
- - Completadas: M
343
- - Bloqueadas: K
344
- - Pendientes: N-M-K
345
-
346
- ## Estado por tarea
347
- | ID | Nombre | Estado | Commit | Notas |
348
- |------|--------|--------|--------|-------|
349
- | T-01 | [nombre] | COMPLETADA | abc1234 | |
350
- | T-02 | [nombre] | COMPLETADA | def5678 | |
351
- | T-03 | [nombre] | EN_PROGRESO || |
352
- | T-04 | [nombre] | PENDIENTE | | depende T-03 |
353
- | T-05 | [nombre] | BLOQUEADA | — | [descripción del bloqueo] |
354
-
355
- ## Desviaciones registradas
356
- | Tarea | Tipo | Descripción | Resolución |
357
- |-------|------|-------------|-----------|
358
- | | | | |
359
-
360
- ## Decisiones HITL tomadas
361
- | Tarea | Pregunta | Respuesta del usuario | Fecha |
362
- |-------|---------|----------------------|-------|
363
- | | | | |
364
-
365
- ## Próxima acción
366
- [Qué se ejecuta a continuación y por qué]
367
- ```
368
-
369
- ---
370
-
371
- ## Actualización de HOJA-RUTA.md al completar la fase
372
-
373
- Al completar todas las tareas del plan:
374
-
375
- 1. Marcar la fase como completada en HOJA-RUTA.md
376
- 2. Actualizar la fecha real de completación
377
- 3. Añadir nota de desviaciones si las hubo
378
- 4. Marcar la siguiente fase como "lista para discutir"
379
-
380
- ---
381
-
382
- ## Modo Ralph: ejecución autónoma hasta completar
383
-
384
- Cuando el usuario dice "ejecuta hasta terminar", "modo autónomo" o "modo Ralph":
385
-
386
- 1. Ejecutar TODAS las tareas del plan en secuencia de oleadas
387
- 2. Después de cada tarea: ejecutar los 4 niveles de validación
388
- 3. Si una validación falla: corregir y re-validar inmediatamente
389
- 4. Si después de 3 intentos no se resuelve: marcar como BLOQUEADA y continuar con la siguiente tarea que no dependa de ella
390
- 5. Al terminar todas las tareas: ejecutar validación completa del proyecto
391
- 6. Si todo pasa: reportar éxito con resumen de lo completado
392
- 7. Si hay tareas bloqueadas: reportar cuáles y por qué
393
-
394
- Reglas del modo Ralph:
395
- - NUNCA preguntar al usuario durante la ejecución (excepto tareas HITL)
396
- - Registrar CADA decisión tomada en ESTADO.md bajo `## Decisiones autónomas`
397
- - Si se detecta loop (mismo error 2 veces): abortar esa tarea, NO el modo
398
- - Al finalizar, producir resumen: tareas completadas, bloqueadas, decisiones tomadas
399
- - El modo Ralph NO salta el protocolo de retry ni los niveles de validación
400
-
401
- ---
402
-
403
- ## Phase Gates — criterios para cambiar de fase
404
-
405
- Un Phase Gate es una verificación formal antes de declarar una fase completa
406
- y comenzar la siguiente. NO avanzar si algún criterio falla.
407
-
408
- ### Gate de Implementación → Calidad
409
-
410
- Antes de invocar al equipo de calidad (tdd-qa-swl, revisor-codigo-swl):
411
-
412
- - [ ] Todas las tareas del plan en estado COMPLETADA o BLOQUEADA documentada
413
- - [ ] Nivel 1 (linter/tipado) pasa en todo el código nuevo: `ruff`, `tsc --noEmit`, `clippy`
414
- - [ ] Tests existentes siguen pasando (no hay regresiones)
415
- - [ ] No hay secrets ni hardcodeos detectados por el hook escaneo-secretos
416
-
417
- ### Gate de Calidad Deploy
418
-
419
- Antes de invocar deploy o release:
420
-
421
- - [ ] Score de revisión de código ≥ 9.0/10 (revisor-codigo-swl)
422
- - [ ] 0 findings críticos de seguridad (revisor-seguridad-swl)
423
- - [ ] Cobertura de tests 80% en código nuevo (tdd-qa-swl)
424
- - [ ] Validación de accesibilidad si hay cambios de UI (accesibilidad-wcag-swl)
425
- - [ ] Performance sin regresión: p95 ≤ baseline + 20% (si aplica rendimiento-swl)
426
-
427
- ### Gate de Deploy → Producción
428
-
429
- Antes de declarar la fase completa en producción:
430
-
431
- - [ ] Runbook de rollback documentado
432
- - [ ] Alertas de monitoreo configuradas para la nueva funcionalidad
433
- - [ ] Feature flag listo si el cambio es de alto riesgo
434
- - [ ] Release notes actualizadas
435
-
436
- ### Cómo reportar un Gate fallido
437
-
438
- ```
439
- PHASE GATE FALLIDO — Gate: [Calidad → Deploy]
440
-
441
- Criterio no cumplido: Score de revisión 7.8/10 (mínimo 9.0)
442
- Findings pendientes:
443
- - [CRITICO] Validación de input en endpoint /usuarios/perfil
444
- - [ALTO] N+1 query en listado de facturas
445
-
446
- Acción requerida: corregir findings antes de continuar.
447
- NO proceder con el deploy hasta aprobar este gate.
448
- ```
449
-
450
- ---
451
-
452
- ## Gotchas / Errores comunes no obvios
453
-
454
- - **Dos agentes escriben al mismo archivo en paralelo**: en modo pipeline con oleadas paralelas, dos agentes distintos reciben tareas que tocan el mismo archivo (ej: `ESTADO.md` o un service compartido). Causa: las tareas no tenían dependencia explícita entre sí pero sí tenían acoplamiento de escritura. Solución: en el plan, si dos tareas modifican el mismo archivo, deben estar en oleadas distintas (secuencial), no paralelas.
455
- - **Commit acumulado al final de la oleada, no por tarea**: el agente ejecuta 3 tareas y hace un solo commit grande al terminar la oleada. Causa: interpretación laxa del protocolo. Solución: el commit se hace inmediatamente después de pasar la verificación de cada tarea individual — si la sesión se interrumpe, el trabajo de las tareas completadas está protegido.
456
- - **Loop Dev↔QA silencioso**: el mismo error aparece en el ciclo 2 y el ciclo 3 y el agente sigue intentando el mismo fix. Causa: no se detectó que el error era idéntico. Solución: comparar el mensaje de error exacto entre ciclos si coincide en 2 intentos consecutivos, declarar loop y escalar a `arquitecto-swl`.
457
- - **ESTADO.md no actualizado tras una tarea completada**: el agente completa T-03 pero no actualiza ESTADO.md antes de iniciar T-04. Causa: se omitió el paso 5 del protocolo. Solución: la actualización de ESTADO.md es parte del protocolo de cada tarea, no opcional — sin ella el estado de ejecución es inconsistente y la reanudación falla.
458
- - **`transferCount` no incrementado en delegaciones encadenadas**: el orquestador delega 10 tareas sin incrementar el contador, superando el umbral sin alerta. Causa: se olvida actualizar el campo en el `TaskDelegationContext`. Solución: verificar y actualizar `transferCount` antes de cada delegación de tarea; si supera 10, reportar al usuario antes de continuar.
459
-
460
- ## Checklist de cierre de fase
461
-
462
- - [ ] Todas las tareas en ESTADO.md con estado COMPLETADA o documentadas como BLOQUEADA
463
- - [ ] Todos los commits hechos y referenciados en ESTADO.md
464
- - [ ] HOJA-RUTA.md actualizado con la fase completada
465
- - [ ] Desviaciones documentadas
466
- - [ ] Decisiones HITL registradas con respuesta del usuario
467
- - [ ] Tests pasan en el estado final del código
468
- - [ ] No hay `console.log`, `print()` de debug ni pendientes sin ticket en el código nuevo
1
+ ---
2
+ name: ejecutar-fase
3
+ description: Ejecuta el PLAN.md de una fase con commits atómicos por tarea. Aplica reglas de desviación, maneja checkpoints HITL, ejecuta TDD por default con evidencia RED en telemetría (opt-out declarado), y mantiene ESTADO.md y HOJA-RUTA.md actualizados tras cada tarea completada.
4
+ version: "1.2.1"
5
+ herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
6
+ exclusiones:
7
+ - "No cargar si no existe PLAN.md con `estado: aprobado` — ejecutar `planear-fase` primero."
8
+ - "No cargar para ejecutar tareas ad-hoc sin plan formal; si no hay oleadas ni criterios de verificación, no hay fase que ejecutar."
9
+ - "No cargar para retomar una sesión pausada en checkpoint `decision` o `human-action` sin resolverlo primero — el agente no debe avanzar pasando por alto una decisión pendiente del usuario."
10
+ - "No cargar solo para verificar el trabajo ya hecho; en ese caso usar `verificar-trabajo`."
11
+ # Nota: este skill supera el límite estándar de 380 líneas (406 líneas en v1.1.0).
12
+ # Excepción aprobada: las secciones Phase Gates y Dev↔QA Loop formal aportan
13
+ # protocolos de calidad de alto valor que no pueden condensarse sin perder
14
+ # precisión operativa. No eliminar contenido para ajustar al límite.
15
+ evolvable: true # default para skill estandar
16
+ ---
17
+ # Habilidad: Ejecutar Fase de Desarrollo
18
+
19
+ ## Propósito
20
+
21
+ La ejecución es donde el plan se convierte en código. Esta habilidad convierte
22
+ el PLAN.md en cambios reales, verificables y atómicamente comprometidos, con
23
+ trazabilidad completa entre cada tarea y su commit correspondiente. Evita el
24
+ antipatrón de acumular cambios sin verificar y commitear "todo de golpe".
25
+
26
+ ## Cuándo activar
27
+
28
+ - Existe un PLAN.md válido en `.planning/`
29
+ - El usuario dice "ejecuta la fase" o "ejecuta el plan"
30
+ - Se retoma una fase interrumpida (ESTADO.md indica progreso parcial)
31
+
32
+ ## Cuándo NO cargar
33
+
34
+ - No hay PLAN.md o el plan no tiene `estado: aprobado` — ejecutar `planear-fase` y aprobar con `/swl:aprobar-plan N` (firma el lock G1) antes de ejecutar.
35
+ - El objetivo es solo verificar calidad del trabajo ya implementado; usar `verificar-trabajo`.
36
+ - Hay un checkpoint `decision` o `human-action` sin resolver en ESTADO.md — resolver el checkpoint antes de continuar la ejecución.
37
+ - Se quiere ejecutar solo una sub-tarea fuera de la secuencia de oleadas del plan; hacerlo rompe el grafo de dependencias y el estado en ESTADO.md.
38
+
39
+ ## Prerrequisito obligatorio
40
+
41
+ Leer `.planning/fases/0N-PLAN.md` y `.planning/ESTADO.md` (si existe) antes de
42
+ ejecutar la primera tarea.
43
+
44
+ ### Gate G1 — integridad del plan firmado
45
+
46
+ Antes de la primera tarea Y al inicio de cada slice, verificar que el PLAN no
47
+ fue mutado tras su aprobación:
48
+
49
+ ```bash
50
+ node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
51
+ ```
52
+
53
+ - `modo: "firmado"` → continuar.
54
+ - `modo: "legacy"` (plan aprobado sin lock, cláusula de gracia D-05 para planes
55
+ pre-Fase09) advertencia visible al usuario y continuar sin verificación de
56
+ integridad. Para activar el gate: `/swl:aprobar-plan N`.
57
+ - `modo: "mutado"` DETENER. El plan cambió tras la firma; reportar
58
+ `hashEsperado`/`hashActual` y remitir a `/swl:aprobar-plan N`.
59
+ - cualquier otro `ok: false` → DETENER y reportar el `motivo`.
60
+
61
+ La firma se escribe en `.planning/locks/0N-PLAN.md.lock` (versionado en git).
62
+ La única vía válida de aprobar+firmar es `/swl:aprobar-plan`.
63
+
64
+ ---
65
+
66
+ ## Protocolo de ejecución por tarea
67
+
68
+ ### Para cada tarea del plan, en orden de oleadas:
69
+
70
+ ```
71
+ 1. Leer la descripción completa de la tarea
72
+ 2. Verificar que las dependencias estén marcadas como COMPLETADA en ESTADO.md
73
+ 3. Ejecutar la implementación
74
+ 4. Ejecutar el criterio de verificación de la tarea
75
+ 5. Si pasa: hacer commit atómico + actualizar ESTADO.md
76
+ 6. Si falla: aplicar retry con backoff exponencial (ver abajo)
77
+ 7. Si agota reintentos: marcar como BLOQUEADA y reportar al usuario
78
+ 8. Al cerrar la tarea: ejecutar el propose-step sobre su diff (ver abajo)
79
+ ```
80
+
81
+ ### Propose-step al cerrar tarea/fase (Fase 13, ADR-0037)
82
+
83
+ Tras commitear una tarea (y al cerrar la fase), evaluar las adyacencias de riesgo
84
+ del diff y anexar propuestas SOLO si hay señal. Propone, nunca bloquea ni ejecuta:
85
+
86
+ ```bash
87
+ node hooks/lib/propose-step.js --rango=HEAD~1..HEAD
88
+ ```
89
+
90
+ Si imprime un anexo, agregarlo al reporte de la tarea (y al RESUMEN.md al cerrar
91
+ la fase). Si no imprime nada, silencio — no agregar sección vacía. Opt-out con
92
+ `SWL_PROPOSE=0`. Antes de una acción autónoma de clase `cambio_reversible`,
93
+ registrar el auto-checkpoint: `node hooks/lib/autonomia.js --accion "<acción>"`.
94
+ Detalle en el fragmento `agentes/_propose-step.md`.
95
+
96
+ ### Protocolo de retry con backoff exponencial
97
+
98
+ Cuando una tarea falla verificacion:
99
+
100
+ | Intento | Delay | Accion |
101
+ |---------|-------|--------|
102
+ | 1 (original) | — | Ejecutar normalmente |
103
+ | 2 | 0s | Leer error, diagnosticar, corregir UNA cosa, re-verificar |
104
+ | 3 | 5s | Repensar enfoque, corregir, re-verificar |
105
+ | 4 (final) | 15s | Ultimo intento con enfoque diferente |
106
+
107
+ Reglas:
108
+ - `maxRetries`: 3 (configurable por tarea en el plan)
109
+ - Si el error es identico en 2 intentos: abortar (loop detectado)
110
+ - Si el error es tipo STOP (Regla 4): no reintentar, reportar
111
+ - Registrar en ESTADO.md: `intentos: N, ultimo_error: "desc"`
112
+
113
+ ## Dev↔QA Loop formal
114
+
115
+ Cuando el plan incluye tareas de implementación seguidas de tareas de verificación
116
+ (patrón `T-NN impl → T-NN+1 verify`), aplicar el loop formal de calidad:
117
+
118
+ ```
119
+ implementador tdd-qa-swl [PASS] siguiente tarea
120
+ [FAIL] implementador (intento 2)
121
+ → tdd-qa-swl → [PASS]
122
+ ↘ [FAIL] → implementador (intento 3)
123
+ tdd-qa-swl [PASS]
124
+ ↘ [FAIL] → ESCALAR
125
+ ```
126
+
127
+ ### Reglas del loop
128
+
129
+ - **Máximo 3 ciclos** Dev→QA por tarea. En el ciclo 3, el agente implementador
130
+ DEBE cambiar de enfoque completamente, no hacer el mismo fix.
131
+ - **Loop detectado** (mismo error dos veces seguidas): abortar y escalar a
132
+ `arquitecto-swl` con el diagnóstico completo.
133
+ - **Criterio de PASS**: todos los niveles de validación (1–4) deben pasar,
134
+ no solo los tests.
135
+ - **Criterio de FAIL**: cualquier nivel de validación falla o el criterio de
136
+ aceptación de la tarea no se cumple.
137
+
138
+ ### Cómo registrar en ESTADO.md
139
+
140
+ ```markdown
141
+ | T-05 | Crear endpoint /pagos | EN_PROGRESO | — | Ciclo QA: 2/3 |
142
+ ```
143
+
144
+ ### Cuándo escalar (Regla 4 del loop)
145
+
146
+ Si después de 3 ciclos la tarea sigue fallando:
147
+
148
+ ```
149
+ ALERTA: Loop Dev↔QA agotado — T-[NN]: [nombre de la tarea]
150
+
151
+ Ciclos intentados: 3
152
+ Último error: [descripción exacta]
153
+ Archivos involucrados: [lista]
154
+
155
+ Escalando a arquitecto-swl para revisión de enfoque.
156
+ NO hacer más intentos de implementación hasta recibir dirección.
157
+ ```
158
+
159
+ ### Niveles de validación estructurada (después de cada tarea)
160
+
161
+ Ejecutar validaciones en orden ascendente. Si un nivel falla, NO avanzar al siguiente:
162
+
163
+ | Nivel | Qué valida | Ejemplo de comandos |
164
+ |-------|-----------|-------------------|
165
+ | 1. Sintaxis y estilo | Código compila, linter pasa | `ruff check .`, `npx tsc --noEmit`, `cargo clippy`, `go vet ./...` |
166
+ | 2. Tests unitarios | Lógica de negocio correcta | `pytest -x`, `npm test`, `cargo test`, `go test ./...` |
167
+ | 3. Tests de integración | Componentes conectados | `pytest tests/integration/`, `playwright test`, curl a endpoints |
168
+ | 4. Validación de aceptación | Criterio del plan satisfecho | Criterio de verificación específico de la tarea en PLAN.md |
169
+
170
+ Reglas:
171
+ - Nivel 1 se ejecuta SIEMPRE, incluso en tareas triviales
172
+ - Nivel 2 se ejecuta si existen tests en el proyecto
173
+ - Nivel 3 se ejecuta si la tarea toca integración entre componentes
174
+ - Nivel 4 se ejecuta siempre (es el criterio de verificación de la tarea)
175
+ - Si la validación falla: corregir inmediatamente. NUNCA acumular estado roto
176
+
177
+ ### Formato de commit atómico
178
+
179
+ ```
180
+ [F<fase>·T-NN] tipo(scope): descripción en imperativo
181
+
182
+ - Detalle adicional si es necesario
183
+ - Referencia a la tarea del plan
184
+
185
+ Refs: REQ-<fase>-NN[, REQ-<fase>-MM]
186
+ ```
187
+
188
+ Desde la Fase 12 los IDs se namespacean por fase (DT-IDS-NAMESPACE): prefijo
189
+ `[F12·T-03]` y footer `Refs: REQ-12-03`. Las fases 01-11 usan el formato plano
190
+ `[T-NN]` / `Refs: REQ-NN` (gracia legacy). `verificar-trazabilidad.js` y el
191
+ parser del changelog aceptan ambos.
192
+
193
+ Tipos de commit válidos: `feat`, `fix`, `test`, `refactor`, `docs`, `chore`, `migration`
194
+
195
+ El footer `Refs: REQ-<fase>-NN` cierra la cadena de trazabilidad REQ→T→commit (G4):
196
+ lleva los REQ que la tarea declara en su campo `**Verifica REQ**` del PLAN.
197
+ Omitirlo solo en fases legacy sin REQ-IDs. SIN co-autores ni atribuciones a IA
198
+ (regla global `git-coauthor.md` el único autor es el usuario).
199
+
200
+ ---
201
+
202
+ ## Modo Pipeline: acumulación de resultados entre tareas
203
+
204
+ Cuando el PLAN.md tiene **7 o más tareas con dependencias encadenadas**, activar
205
+ el modo pipeline para pasar contexto filtrado entre tareas en lugar del contexto
206
+ completo de la conversación.
207
+
208
+ ### Cómo funciona
209
+
210
+ Al completar cada tarea, generar un `stepResult` compacto:
211
+
212
+ ```json
213
+ {
214
+ "step": 3,
215
+ "agentName": "backend-python-swl",
216
+ "output": {
217
+ "filesCreated": ["src/models/user.py", "db/migrations/001_users.sql"],
218
+ "endpointsAdded": ["POST /users", "GET /users/{id}"],
219
+ "keyDecisions": ["usé async SQLAlchemy con session factory"]
220
+ },
221
+ "status": "completed"
222
+ }
223
+ ```
224
+
225
+ Al delegar la siguiente tarea a un agente, construir el `TaskDelegationContext`
226
+ (schema en `manifiestos/handoff-context.json`) incluyendo **solo los stepResults
227
+ que la tarea siguiente necesita** no el array completo:
228
+
229
+ ```
230
+ TaskDelegationContext:
231
+ reason: "task_delegation"
232
+ parentAgent: "orquestador-swl"
233
+ transferCount: [incrementar desde handoff previo]
234
+ taskId: "T-04"
235
+ taskDescription: "[descripción exacta del PLAN.md self-contained]"
236
+ verificationCriteria: "[criterio de verificación del plan]"
237
+ relevantFiles: ["src/models/user.py:1", "db/migrations/001_users.sql"]
238
+ previousTaskOutputs:
239
+ - { taskId: "T-03", output: { endpointsAdded: [...] } }
240
+ ```
241
+
242
+ ### Beneficio
243
+
244
+ Un pipeline de 7 tareas pasa ~60% menos contexto a cada agente especializado
245
+ versus pasar el historial completo de la conversación.
246
+
247
+ ### Límite de transferCount
248
+
249
+ Si `transferCount >= 10`, reportar al usuario:
250
+ ```
251
+ ALERTA: Cadena de delegaciones muy larga (transferCount = N).
252
+ Posible loop de agentes. Revisar el PLAN.md y continuar manualmente.
253
+ ```
254
+
255
+ ---
256
+
257
+ ## Reglas de desviación
258
+
259
+ Una desviación ocurre cuando la implementación difiere del plan. Hay tres tipos:
260
+
261
+ ### Desviación Menor (continuar y registrar)
262
+ - Un nombre de función o archivo difiere del plan
263
+ - Se añade un helper que no estaba planificado pero no cambia el alcance
264
+ - El tiempo real es diferente al estimado
265
+
266
+ **Acción**: Continuar. Registrar en ESTADO.md bajo `## Desviaciones`.
267
+
268
+ ### Desviación Moderada (notificar y continuar)
269
+ - Se descubre que una tarea requiere subdivisión en el momento de ejecutar
270
+ - Se encuentra código existente que cubre parcialmente la tarea
271
+ - Una dependencia no funciona como se esperaba
272
+
273
+ **Acción**: Notificar al usuario en el mismo mensaje donde reportas avance.
274
+ Registrar decisión tomada en ESTADO.md.
275
+
276
+ ### Desviación Mayor (STOP requiere replanificación)
277
+ - La tarea no puede completarse sin cambiar el diseño de otra tarea ya completada
278
+ - Se descubre un requerimiento que invalida 2+ tareas del plan
279
+ - La implementación requeriría romper la compatibilidad con código existente
280
+
281
+ **Acción**: PARAR. No hacer commit. Reportar al usuario con:
282
+ 1. Qué se encontró
283
+ 2. Qué tareas están afectadas
284
+ 3. Opciones de resolución propuestas
285
+
286
+ ---
287
+
288
+ ## Manejo de tareas HITL
289
+
290
+ Cuando el plan llega a una tarea marcada `HITL`:
291
+
292
+ 1. Presentar al usuario el resultado del trabajo previo
293
+ 2. Describir exactamente qué decisión o revisión se necesita
294
+ 3. Esperar confirmación explícita antes de continuar
295
+ 4. Registrar la respuesta del usuario en ESTADO.md
296
+
297
+ Formato de presentación de checkpoint:
298
+
299
+ ```
300
+ CHECKPOINT HITL — T-[NN]: [Nombre]
301
+
302
+ Estado actual: [descripción de lo implementado hasta aquí]
303
+
304
+ Se necesita tu revisión/decisión:
305
+ [descripción precisa de qué revisar o decidir]
306
+
307
+ Opciones (si aplica):
308
+ A) [opción A]
309
+ B) [opción B]
310
+
311
+ ¿Cómo procedo?
312
+ ```
313
+
314
+ ---
315
+
316
+ ## TDD por default con evidencia RED (gate G2 — opt-out declarado)
317
+
318
+ TDD es **default ON** desde la Fase 10 (vNext H2). Solo se omite cuando el
319
+ CONTEXTO.md declara `**TDD**: off — razón: [...]` (excepción registrada en
320
+ AUDITORIA.md por `discutir-fase`). Sin esa declaración, toda tarea de código
321
+ sigue el ciclo con evidencia.
322
+
323
+ ### Ciclo RED → GREEN → REFACTOR por tarea (con telemetría)
324
+
325
+ Al iniciar la primera tarea de código de la fase, abrir la corrida de evidencia:
326
+
327
+ ```bash
328
+ node -e "const lt=require('./hooks/lib/loop-telemetry');const r=lt.iniciarCorrida({tipo:'tdd',direccion:'lower_is_better',config:{fase:'0N',tarea:'T-NN'}});console.log(r.dir)"
329
+ ```
330
+
331
+ **RED**: Escribir el test que describe el comportamiento esperado.
332
+ El test DEBE fallar. Verificar que falla por la razón correcta, no por error
333
+ de sintaxis o configuración. **Registrar la evidencia** (métrica = tests fallando,
334
+ descripción = fallo exacto):
335
+
336
+ ```bash
337
+ node -e "const lt=require('./hooks/lib/loop-telemetry');lt.registrarIteracion('<dir>',{iteracion:0,metrica:<N_fallan>,delta:0,estado:'baseline',descripcion:'RED T-NN: <fallo exacto del runner>'})"
338
+ ```
339
+
340
+ **GREEN**: Escribir la implementación mínima que hace pasar el test.
341
+ "Mínima" significa: no implementar más de lo que el test exige. Registrar:
342
+
343
+ ```bash
344
+ node -e "const lt=require('./hooks/lib/loop-telemetry');lt.registrarIteracion('<dir>',{iteracion:1,metrica:0,delta:-<N>,estado:'keep',descripcion:'GREEN T-NN: suite verde'})"
345
+ ```
346
+
347
+ **REFACTOR**: Limpiar el código sin cambiar el comportamiento.
348
+ El test DEBE seguir pasando después del refactor. Hacer commit solo en este paso.
349
+
350
+ La fila RED en `.planning/loops/tdd-*/iteraciones.tsv` es la evidencia que
351
+ `hooks/tdd-gate.js` busca al commitear (warn-only, ADR-0035)cierra F-TDD-6
352
+ ("el RED no deja evidencia"). Sin registro, el gate emite nudge `tdd-red-evidence`.
353
+
354
+ ### Cobertura mínima en modo TDD
355
+
356
+ - Toda función pública tiene al menos 1 test de camino feliz
357
+ - Toda función con branches tiene tests de cada rama relevante
358
+ - Toda función que puede lanzar excepción tiene test del caso de error
359
+
360
+ ---
361
+
362
+ ## Estado de ejecución serializable con execution-state.js
363
+
364
+ Para planes multi-agente complejos, usar `hooks/lib/execution-state.js` para
365
+ mantener el estado de ejecución serializable y recuperable entre sesiones:
366
+
367
+ ### API disponible
368
+
369
+ - `nuevo(dir, { planId, tareas })` → inicializa estado de ejecución
370
+ - `leer(dir)` → lee el estado actual (devuelve `null` si no existe)
371
+ - `iniciarAgente(dir, { agente, tareaId })` marca agente como activo
372
+ - `completarAgente(dir, { agente, tareaId, resultado })` → registra completación
373
+ - `establecerProximo(dir, { agente, tareaId })` → define el siguiente paso
374
+ - `actualizarContexto(dir, datos)` → actualiza contexto compartido entre agentes
375
+ - `formatearResumen(dir)` resumen legible del estado actual
376
+ - `limpiar(dir)` elimina el archivo de estado
377
+
378
+ ### Integración con el protocolo de ejecución
379
+
380
+ Antes de cada tarea:
381
+ ```
382
+ estado = leer(dir)
383
+ iniciarAgente(dir, { agente: "backend-python-swl", tareaId: "T-03" })
384
+ ```
385
+
386
+ Después de cada tarea completada:
387
+ ```
388
+ completarAgente(dir, { agente: "backend-python-swl", tareaId: "T-03", resultado: { ... } })
389
+ establecerProximo(dir, { agente: "tdd-qa-swl", tareaId: "T-04" })
390
+ ```
391
+
392
+ ### Persistencia
393
+
394
+ El estado se persiste en `.planning/execution-state.json`. Al retomar una sesión
395
+ interrumpida, `leer()` recupera el estado exacto donde se detuvo.
396
+
397
+ ---
398
+
399
+ ## Actualización de ESTADO.md
400
+
401
+ Actualizar ESTADO.md después de cada tarea (no al final de la oleada):
402
+
403
+ ```markdown
404
+ # ESTADO.md — Fase [N]: [Nombre]
405
+ **Última actualización**: [fecha y hora]
406
+
407
+ ## Progreso
408
+ - Tareas totales: N
409
+ - Completadas: M
410
+ - Bloqueadas: K
411
+ - Pendientes: N-M-K
412
+
413
+ ## Estado por tarea
414
+ | ID | Nombre | Estado | Commit | REQ | Notas |
415
+ |------|--------|--------|--------|-----|-------|
416
+ | T-01 | [nombre] | COMPLETADA | abc1234 | REQ-01 | |
417
+ | T-02 | [nombre] | COMPLETADA | def5678 | REQ-01, REQ-02 | |
418
+ | T-03 | [nombre] | EN_PROGRESO | — | |
419
+ | T-04 | [nombre] | PENDIENTE | — | depende T-03 |
420
+ | T-05 | [nombre] | BLOQUEADA | — | [descripción del bloqueo] |
421
+
422
+ ## Desviaciones registradas
423
+ | Tarea | Tipo | Descripción | Resolución |
424
+ |-------|------|-------------|-----------|
425
+ | | | | |
426
+
427
+ ## Decisiones HITL tomadas
428
+ | Tarea | Pregunta | Respuesta del usuario | Fecha |
429
+ |-------|---------|----------------------|-------|
430
+ | | | | |
431
+
432
+ ## Próxima acción
433
+ [Qué se ejecuta a continuación y por qué]
434
+ ```
435
+
436
+ ---
437
+
438
+ ## Actualización de HOJA-RUTA.md al completar la fase
439
+
440
+ Al completar todas las tareas del plan:
441
+
442
+ 1. Marcar la fase como completada en HOJA-RUTA.md
443
+ 2. Actualizar la fecha real de completación
444
+ 3. Añadir nota de desviaciones si las hubo
445
+ 4. Marcar la siguiente fase como "lista para discutir"
446
+
447
+ ---
448
+
449
+ ## Modo Ralph: ejecución autónoma hasta completar
450
+
451
+ Cuando el usuario dice "ejecuta hasta terminar", "modo autónomo" o "modo Ralph":
452
+
453
+ 1. Ejecutar TODAS las tareas del plan en secuencia de oleadas
454
+ 2. Después de cada tarea: ejecutar los 4 niveles de validación
455
+ 3. Si una validación falla: corregir y re-validar inmediatamente
456
+ 4. Si después de 3 intentos no se resuelve: marcar como BLOQUEADA y continuar con la siguiente tarea que no dependa de ella
457
+ 5. Al terminar todas las tareas: ejecutar validación completa del proyecto
458
+ 6. Si todo pasa: reportar éxito con resumen de lo completado
459
+ 7. Si hay tareas bloqueadas: reportar cuáles y por qué
460
+
461
+ Reglas del modo Ralph:
462
+ - NUNCA preguntar al usuario durante la ejecución (excepto tareas HITL)
463
+ - Registrar CADA decisión tomada en ESTADO.md bajo `## Decisiones autónomas`
464
+ - Si se detecta loop (mismo error 2 veces): abortar esa tarea, NO el modo
465
+ - Al finalizar, producir resumen: tareas completadas, bloqueadas, decisiones tomadas
466
+ - El modo Ralph NO salta el protocolo de retry ni los niveles de validación
467
+
468
+ ---
469
+
470
+ ## Phase Gates — criterios para cambiar de fase
471
+
472
+ Un Phase Gate es una verificación formal antes de declarar una fase completa
473
+ y comenzar la siguiente. NO avanzar si algún criterio falla.
474
+
475
+ ### Gate de Implementación → Calidad
476
+
477
+ Antes de invocar al equipo de calidad (tdd-qa-swl, revisor-codigo-swl):
478
+
479
+ - [ ] Todas las tareas del plan en estado COMPLETADA o BLOQUEADA documentada
480
+ - [ ] Nivel 1 (linter/tipado) pasa en todo el código nuevo: `ruff`, `tsc --noEmit`, `clippy`
481
+ - [ ] Tests existentes siguen pasando (no hay regresiones)
482
+ - [ ] No hay secrets ni hardcodeos detectados por el hook escaneo-secretos
483
+
484
+ ### Gate de Calidad → Deploy
485
+
486
+ Antes de invocar deploy o release:
487
+
488
+ - [ ] Score de revisión de código ≥ 9.0/10 (revisor-codigo-swl)
489
+ - [ ] 0 findings críticos de seguridad (revisor-seguridad-swl)
490
+ - [ ] Cobertura de tests ≥ 80% en código nuevo (tdd-qa-swl)
491
+ - [ ] Validación de accesibilidad si hay cambios de UI (accesibilidad-wcag-swl)
492
+ - [ ] Performance sin regresión: p95 ≤ baseline + 20% (si aplica rendimiento-swl)
493
+
494
+ ### Gate de Deploy → Producción
495
+
496
+ Antes de declarar la fase completa en producción:
497
+
498
+ - [ ] Runbook de rollback documentado
499
+ - [ ] Alertas de monitoreo configuradas para la nueva funcionalidad
500
+ - [ ] Feature flag listo si el cambio es de alto riesgo
501
+ - [ ] Release notes actualizadas
502
+
503
+ ### Cómo reportar un Gate fallido
504
+
505
+ ```
506
+ PHASE GATE FALLIDO — Gate: [Calidad → Deploy]
507
+
508
+ Criterio no cumplido: Score de revisión 7.8/10 (mínimo 9.0)
509
+ Findings pendientes:
510
+ - [CRITICO] Validación de input en endpoint /usuarios/perfil
511
+ - [ALTO] N+1 query en listado de facturas
512
+
513
+ Acción requerida: corregir findings antes de continuar.
514
+ NO proceder con el deploy hasta aprobar este gate.
515
+ ```
516
+
517
+ ---
518
+
519
+ ## Gotchas / Errores comunes no obvios
520
+
521
+ - **Dos agentes escriben al mismo archivo en paralelo**: en modo pipeline con oleadas paralelas, dos agentes distintos reciben tareas que tocan el mismo archivo (ej: `ESTADO.md` o un service compartido). Causa: las tareas no tenían dependencia explícita entre sí pero sí tenían acoplamiento de escritura. Solución: en el plan, si dos tareas modifican el mismo archivo, deben estar en oleadas distintas (secuencial), no paralelas.
522
+ - **Commit acumulado al final de la oleada, no por tarea**: el agente ejecuta 3 tareas y hace un solo commit grande al terminar la oleada. Causa: interpretación laxa del protocolo. Solución: el commit se hace inmediatamente después de pasar la verificación de cada tarea individual — si la sesión se interrumpe, el trabajo de las tareas completadas está protegido.
523
+ - **Loop Dev↔QA silencioso**: el mismo error aparece en el ciclo 2 y el ciclo 3 y el agente sigue intentando el mismo fix. Causa: no se detectó que el error era idéntico. Solución: comparar el mensaje de error exacto entre ciclos — si coincide en 2 intentos consecutivos, declarar loop y escalar a `arquitecto-swl`.
524
+ - **ESTADO.md no actualizado tras una tarea completada**: el agente completa T-03 pero no actualiza ESTADO.md antes de iniciar T-04. Causa: se omitió el paso 5 del protocolo. Solución: la actualización de ESTADO.md es parte del protocolo de cada tarea, no opcional — sin ella el estado de ejecución es inconsistente y la reanudación falla.
525
+ - **`transferCount` no incrementado en delegaciones encadenadas**: el orquestador delega 10 tareas sin incrementar el contador, superando el umbral sin alerta. Causa: se olvida actualizar el campo en el `TaskDelegationContext`. Solución: verificar y actualizar `transferCount` antes de cada delegación de tarea; si supera 10, reportar al usuario antes de continuar.
526
+
527
+ ## Checklist de cierre de fase
528
+
529
+ - [ ] Todas las tareas en ESTADO.md con estado COMPLETADA o documentadas como BLOQUEADA
530
+ - [ ] Todos los commits hechos y referenciados en ESTADO.md
531
+ - [ ] HOJA-RUTA.md actualizado con la fase completada
532
+ - [ ] Desviaciones documentadas
533
+ - [ ] Decisiones HITL registradas con respuesta del usuario
534
+ - [ ] Tests pasan en el estado final del código
535
+ - [ ] No hay `console.log`, `print()` de debug ni pendientes sin ticket en el código nuevo
536
+ - [ ] `.planning/locks/fase-activa.json` eliminado (libera el gate G0 — el `.lock`
537
+ del plan NO se toca: es evidencia versionada)
538
+ - [ ] `/swl:verificar --until-converge` invocado automáticamente (gate G4) — o
539
+ desviación `--sin-verify` registrada en RESUMEN.md con razón
540
+ - [ ] Propose-step ejecutado sobre el diff de la fase; anexo propositivo agregado
541
+ al RESUMEN.md si hubo ≥1 señal, o silencio si no (Fase 13, ADR-0037)