@saulwade/swl-ses 2.0.0 → 2.2.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 (97) 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/implementador-swl.md +2 -0
  5. package/agentes/orquestador-swl.md +2 -0
  6. package/agentes/perfilador-usuario-swl.md +14 -1
  7. package/bin/swl-ses.js +64 -1
  8. package/comandos/swl/adoptar-proyecto.md +258 -255
  9. package/comandos/swl/aprender.md +828 -840
  10. package/comandos/swl/aprobar-plan.md +26 -37
  11. package/comandos/swl/autoresearch.md +12 -14
  12. package/comandos/swl/briefing.md +119 -0
  13. package/comandos/swl/checkpoint.md +10 -15
  14. package/comandos/swl/claudemd.md +239 -234
  15. package/comandos/swl/compactar.md +29 -2
  16. package/comandos/swl/configurar-ci.md +20 -19
  17. package/comandos/swl/cron.md +10 -12
  18. package/comandos/swl/discutir-fase.md +8 -5
  19. package/comandos/swl/ejecutar-fase.md +15 -2
  20. package/comandos/swl/evolucionar.md +6 -11
  21. package/comandos/swl/inbox.md +10 -10
  22. package/comandos/swl/modelo.md +7 -9
  23. package/comandos/swl/notificaciones.md +19 -116
  24. package/comandos/swl/nuevo-proyecto.md +205 -205
  25. package/comandos/swl/planear-fase.md +5 -3
  26. package/comandos/swl/release.md +46 -0
  27. package/comandos/swl/status.md +333 -279
  28. package/comandos/swl/verificar.md +817 -812
  29. package/habilidades/changelog-generator/scripts/parse-commits.js +6 -4
  30. package/habilidades/ejecutar-fase/SKILL.md +541 -518
  31. package/habilidades/planear-fase/SKILL.md +3 -2
  32. package/habilidades/swl-claudemd/SKILL.md +10 -6
  33. package/habilidades/tdd-workflow/SKILL.md +715 -713
  34. package/habilidades/validacion-ci-sistema/SKILL.md +17 -1
  35. package/hooks/calidad-pre-commit.js +5 -1
  36. package/hooks/check-update.js +39 -1
  37. package/hooks/lib/autonomia.js +208 -0
  38. package/hooks/lib/briefing.js +474 -0
  39. package/hooks/lib/propose-step.js +358 -0
  40. package/hooks/session-briefing.js +98 -0
  41. package/hooks/telemetria-skill-routing.js +100 -0
  42. package/instintos/autonomia.yaml +27 -0
  43. package/llms.txt +4 -4
  44. package/manifiestos/hooks-config.json +18 -0
  45. package/manifiestos/modulos.json +25 -3
  46. package/manifiestos/skills-lock.json +17 -17
  47. package/package.json +93 -93
  48. package/plugin.json +371 -371
  49. package/reglas/analizar-directorios-antes-de-escribir.md +228 -0
  50. package/reglas/consultar-vault-primero.md +195 -0
  51. package/reglas/debatir-antes-de-aceptar.md +158 -0
  52. package/reglas/git-coauthor.md +100 -0
  53. package/reglas/monitor-ci.md +309 -0
  54. package/reglas/registro-componentes-nuevos.md +38 -10
  55. package/reglas/sesiones-paralelas.md +180 -0
  56. package/reglas/usar-code-review-graph.md +155 -0
  57. package/reglas/verificar-citas-normativas.md +548 -0
  58. package/scripts/auditar-claudemd.js +38 -0
  59. package/scripts/cli/aprobar-plan.js +73 -0
  60. package/scripts/cli/briefing.js +23 -0
  61. package/scripts/cli/ciclo-evolucion.js +26 -0
  62. package/scripts/cli/configurar-ci.js +40 -0
  63. package/scripts/cli/derivar-feature-list.js +25 -0
  64. package/scripts/cli/detectar-host.js +27 -0
  65. package/scripts/cli/diary-entry.js +69 -0
  66. package/scripts/cli/execution-state.js +18 -0
  67. package/scripts/cli/gateway-notify.js +41 -0
  68. package/scripts/cli/liberar-fase.js +42 -0
  69. package/scripts/cli/loop-telemetry.js +125 -0
  70. package/scripts/cli/mark-evolved.js +56 -0
  71. package/scripts/cli/metricas-dora.js +26 -0
  72. package/scripts/cli/near-duplicate.js +55 -0
  73. package/scripts/cli/notificaciones.js +123 -0
  74. package/scripts/cli/propose-step.js +29 -0
  75. package/scripts/cli/schedule-parse.js +19 -0
  76. package/scripts/cli/sugerir-modelo.js +20 -0
  77. package/scripts/cli/verificar-plan.js +36 -0
  78. package/scripts/cli/verificar-trazabilidad.js +35 -0
  79. package/scripts/derivar-feature-list.js +1 -0
  80. package/scripts/instalador.js +52 -6
  81. package/scripts/lib/auditar-invocaciones-comandos.js +104 -0
  82. package/scripts/lib/ci-reader.js +193 -0
  83. package/scripts/lib/detectar-host-swl.js +175 -0
  84. package/scripts/lib/evidencia-release.js +322 -0
  85. package/scripts/lib/gate-hooks-requires.js +249 -0
  86. package/scripts/lib/gate-licencias.js +212 -0
  87. package/scripts/lib/git-metricas.js +257 -0
  88. package/scripts/lib/metricas-dora.js +204 -0
  89. package/scripts/lib/resolver-plan-fase.js +37 -0
  90. package/scripts/tui/ejecutores.js +1 -1
  91. package/scripts/validar-manifest.js +92 -1
  92. package/scripts/validar.js +13 -0
  93. package/scripts/verificar-evolucion.js +54 -4
  94. package/scripts/verificar-release.js +102 -0
  95. package/scripts/verificar-trazabilidad.js +12 -6
  96. package/reglas/arquitectura.evolved.json +0 -7
  97. package/reglas/seguridad.evolved.json +0 -7
@@ -1,518 +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, 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.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 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
- ```
79
-
80
- ### Protocolo de retry con backoff exponencial
81
-
82
- Cuando una tarea falla verificacion:
83
-
84
- | Intento | Delay | Accion |
85
- |---------|-------|--------|
86
- | 1 (original) | — | Ejecutar normalmente |
87
- | 2 | 0s | Leer error, diagnosticar, corregir UNA cosa, re-verificar |
88
- | 3 | 5s | Repensar enfoque, corregir, re-verificar |
89
- | 4 (final) | 15s | Ultimo intento con enfoque diferente |
90
-
91
- Reglas:
92
- - `maxRetries`: 3 (configurable por tarea en el plan)
93
- - Si el error es identico en 2 intentos: abortar (loop detectado)
94
- - Si el error es tipo STOP (Regla 4): no reintentar, reportar
95
- - Registrar en ESTADO.md: `intentos: N, ultimo_error: "desc"`
96
-
97
- ## Dev↔QA Loop formal
98
-
99
- Cuando el plan incluye tareas de implementación seguidas de tareas de verificación
100
- (patrón `T-NN impl T-NN+1 verify`), aplicar el loop formal de calidad:
101
-
102
- ```
103
- implementador tdd-qa-swl [PASS] siguiente tarea
104
- [FAIL] implementador (intento 2)
105
- tdd-qa-swl [PASS]
106
- ↘ [FAIL] → implementador (intento 3)
107
- → tdd-qa-swl → [PASS]
108
- [FAIL] ESCALAR
109
- ```
110
-
111
- ### Reglas del loop
112
-
113
- - **Máximo 3 ciclos** DevQA por tarea. En el ciclo 3, el agente implementador
114
- DEBE cambiar de enfoque completamente, no hacer el mismo fix.
115
- - **Loop detectado** (mismo error dos veces seguidas): abortar y escalar a
116
- `arquitecto-swl` con el diagnóstico completo.
117
- - **Criterio de PASS**: todos los niveles de validación (1–4) deben pasar,
118
- no solo los tests.
119
- - **Criterio de FAIL**: cualquier nivel de validación falla o el criterio de
120
- aceptación de la tarea no se cumple.
121
-
122
- ### Cómo registrar en ESTADO.md
123
-
124
- ```markdown
125
- | T-05 | Crear endpoint /pagos | EN_PROGRESO | — | Ciclo QA: 2/3 |
126
- ```
127
-
128
- ### Cuándo escalar (Regla 4 del loop)
129
-
130
- Si después de 3 ciclos la tarea sigue fallando:
131
-
132
- ```
133
- ALERTA: Loop Dev↔QA agotado T-[NN]: [nombre de la tarea]
134
-
135
- Ciclos intentados: 3
136
- Último error: [descripción exacta]
137
- Archivos involucrados: [lista]
138
-
139
- Escalando a arquitecto-swl para revisión de enfoque.
140
- NO hacer más intentos de implementación hasta recibir dirección.
141
- ```
142
-
143
- ### Niveles de validación estructurada (después de cada tarea)
144
-
145
- Ejecutar validaciones en orden ascendente. Si un nivel falla, NO avanzar al siguiente:
146
-
147
- | Nivel | Qué valida | Ejemplo de comandos |
148
- |-------|-----------|-------------------|
149
- | 1. Sintaxis y estilo | Código compila, linter pasa | `ruff check .`, `npx tsc --noEmit`, `cargo clippy`, `go vet ./...` |
150
- | 2. Tests unitarios | Lógica de negocio correcta | `pytest -x`, `npm test`, `cargo test`, `go test ./...` |
151
- | 3. Tests de integración | Componentes conectados | `pytest tests/integration/`, `playwright test`, curl a endpoints |
152
- | 4. Validación de aceptación | Criterio del plan satisfecho | Criterio de verificación específico de la tarea en PLAN.md |
153
-
154
- Reglas:
155
- - Nivel 1 se ejecuta SIEMPRE, incluso en tareas triviales
156
- - Nivel 2 se ejecuta si existen tests en el proyecto
157
- - Nivel 3 se ejecuta si la tarea toca integración entre componentes
158
- - Nivel 4 se ejecuta siempre (es el criterio de verificación de la tarea)
159
- - Si la validación falla: corregir inmediatamente. NUNCA acumular estado roto
160
-
161
- ### Formato de commit atómico
162
-
163
- ```
164
- [T-NN] tipo(scope): descripción en imperativo
165
-
166
- - Detalle adicional si es necesario
167
- - Referencia a la tarea del plan
168
-
169
- Refs: REQ-NN[, REQ-MM]
170
- ```
171
-
172
- Tipos de commit válidos: `feat`, `fix`, `test`, `refactor`, `docs`, `chore`, `migration`
173
-
174
- El footer `Refs: REQ-NN` cierra la cadena de trazabilidad REQ→T→commit (G4):
175
- lleva los REQ que la tarea declara en su campo `**Verifica REQ**` del PLAN.
176
- Omitirlo solo en fases legacy sin REQ-IDs. SIN co-autores ni atribuciones a IA
177
- (regla global `git-coauthor.md` el único autor es el usuario).
178
-
179
- ---
180
-
181
- ## Modo Pipeline: acumulación de resultados entre tareas
182
-
183
- Cuando el PLAN.md tiene **7 o más tareas con dependencias encadenadas**, activar
184
- el modo pipeline para pasar contexto filtrado entre tareas en lugar del contexto
185
- completo de la conversación.
186
-
187
- ### Cómo funciona
188
-
189
- Al completar cada tarea, generar un `stepResult` compacto:
190
-
191
- ```json
192
- {
193
- "step": 3,
194
- "agentName": "backend-python-swl",
195
- "output": {
196
- "filesCreated": ["src/models/user.py", "db/migrations/001_users.sql"],
197
- "endpointsAdded": ["POST /users", "GET /users/{id}"],
198
- "keyDecisions": ["usé async SQLAlchemy con session factory"]
199
- },
200
- "status": "completed"
201
- }
202
- ```
203
-
204
- Al delegar la siguiente tarea a un agente, construir el `TaskDelegationContext`
205
- (schema en `manifiestos/handoff-context.json`) incluyendo **solo los stepResults
206
- que la tarea siguiente necesita** — no el array completo:
207
-
208
- ```
209
- TaskDelegationContext:
210
- reason: "task_delegation"
211
- parentAgent: "orquestador-swl"
212
- transferCount: [incrementar desde handoff previo]
213
- taskId: "T-04"
214
- taskDescription: "[descripción exacta del PLAN.md — self-contained]"
215
- verificationCriteria: "[criterio de verificación del plan]"
216
- relevantFiles: ["src/models/user.py:1", "db/migrations/001_users.sql"]
217
- previousTaskOutputs:
218
- - { taskId: "T-03", output: { endpointsAdded: [...] } }
219
- ```
220
-
221
- ### Beneficio
222
-
223
- Un pipeline de 7 tareas pasa ~60% menos contexto a cada agente especializado
224
- versus pasar el historial completo de la conversación.
225
-
226
- ### Límite de transferCount
227
-
228
- Si `transferCount >= 10`, reportar al usuario:
229
- ```
230
- ALERTA: Cadena de delegaciones muy larga (transferCount = N).
231
- Posible loop de agentes. Revisar el PLAN.md y continuar manualmente.
232
- ```
233
-
234
- ---
235
-
236
- ## Reglas de desviación
237
-
238
- Una desviación ocurre cuando la implementación difiere del plan. Hay tres tipos:
239
-
240
- ### Desviación Menor (continuar y registrar)
241
- - Un nombre de función o archivo difiere del plan
242
- - Se añade un helper que no estaba planificado pero no cambia el alcance
243
- - El tiempo real es diferente al estimado
244
-
245
- **Acción**: Continuar. Registrar en ESTADO.md bajo `## Desviaciones`.
246
-
247
- ### Desviación Moderada (notificar y continuar)
248
- - Se descubre que una tarea requiere subdivisión en el momento de ejecutar
249
- - Se encuentra código existente que cubre parcialmente la tarea
250
- - Una dependencia no funciona como se esperaba
251
-
252
- **Acción**: Notificar al usuario en el mismo mensaje donde reportas avance.
253
- Registrar decisión tomada en ESTADO.md.
254
-
255
- ### Desviación Mayor (STOP — requiere replanificación)
256
- - La tarea no puede completarse sin cambiar el diseño de otra tarea ya completada
257
- - Se descubre un requerimiento que invalida 2+ tareas del plan
258
- - La implementación requeriría romper la compatibilidad con código existente
259
-
260
- **Acción**: PARAR. No hacer commit. Reportar al usuario con:
261
- 1. Qué se encontró
262
- 2. Qué tareas están afectadas
263
- 3. Opciones de resolución propuestas
264
-
265
- ---
266
-
267
- ## Manejo de tareas HITL
268
-
269
- Cuando el plan llega a una tarea marcada `HITL`:
270
-
271
- 1. Presentar al usuario el resultado del trabajo previo
272
- 2. Describir exactamente qué decisión o revisión se necesita
273
- 3. Esperar confirmación explícita antes de continuar
274
- 4. Registrar la respuesta del usuario en ESTADO.md
275
-
276
- Formato de presentación de checkpoint:
277
-
278
- ```
279
- CHECKPOINT HITL T-[NN]: [Nombre]
280
-
281
- Estado actual: [descripción de lo implementado hasta aquí]
282
-
283
- Se necesita tu revisión/decisión:
284
- [descripción precisa de qué revisar o decidir]
285
-
286
- Opciones (si aplica):
287
- A) [opción A]
288
- B) [opción B]
289
-
290
- ¿Cómo procedo?
291
- ```
292
-
293
- ---
294
-
295
- ## TDD por default con evidencia RED (gate G2 — opt-out declarado)
296
-
297
- TDD es **default ON** desde la Fase 10 (vNext H2). Solo se omite cuando el
298
- CONTEXTO.md declara `**TDD**: off — razón: [...]` (excepción registrada en
299
- AUDITORIA.md por `discutir-fase`). Sin esa declaración, toda tarea de código
300
- sigue el ciclo con evidencia.
301
-
302
- ### Ciclo RED GREEN REFACTOR por tarea (con telemetría)
303
-
304
- Al iniciar la primera tarea de código de la fase, abrir la corrida de evidencia:
305
-
306
- ```bash
307
- 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)"
308
- ```
309
-
310
- **RED**: Escribir el test que describe el comportamiento esperado.
311
- El test DEBE fallar. Verificar que falla por la razón correcta, no por error
312
- de sintaxis o configuración. **Registrar la evidencia** (métrica = tests fallando,
313
- descripción = fallo exacto):
314
-
315
- ```bash
316
- 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>'})"
317
- ```
318
-
319
- **GREEN**: Escribir la implementación mínima que hace pasar el test.
320
- "Mínima" significa: no implementar más de lo que el test exige. Registrar:
321
-
322
- ```bash
323
- 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'})"
324
- ```
325
-
326
- **REFACTOR**: Limpiar el código sin cambiar el comportamiento.
327
- El test DEBE seguir pasando después del refactor. Hacer commit solo en este paso.
328
-
329
- La fila RED en `.planning/loops/tdd-*/iteraciones.tsv` es la evidencia que
330
- `hooks/tdd-gate.js` busca al commitear (warn-only, ADR-0035) — cierra F-TDD-6
331
- ("el RED no deja evidencia"). Sin registro, el gate emite nudge `tdd-red-evidence`.
332
-
333
- ### Cobertura mínima en modo TDD
334
-
335
- - Toda función pública tiene al menos 1 test de camino feliz
336
- - Toda función con branches tiene tests de cada rama relevante
337
- - Toda función que puede lanzar excepción tiene test del caso de error
338
-
339
- ---
340
-
341
- ## Estado de ejecución serializable con execution-state.js
342
-
343
- Para planes multi-agente complejos, usar `hooks/lib/execution-state.js` para
344
- mantener el estado de ejecución serializable y recuperable entre sesiones:
345
-
346
- ### API disponible
347
-
348
- - `nuevo(dir, { planId, tareas })` inicializa estado de ejecución
349
- - `leer(dir)` → lee el estado actual (devuelve `null` si no existe)
350
- - `iniciarAgente(dir, { agente, tareaId })` marca agente como activo
351
- - `completarAgente(dir, { agente, tareaId, resultado })` registra completación
352
- - `establecerProximo(dir, { agente, tareaId })` define el siguiente paso
353
- - `actualizarContexto(dir, datos)` → actualiza contexto compartido entre agentes
354
- - `formatearResumen(dir)` resumen legible del estado actual
355
- - `limpiar(dir)` → elimina el archivo de estado
356
-
357
- ### Integración con el protocolo de ejecución
358
-
359
- Antes de cada tarea:
360
- ```
361
- estado = leer(dir)
362
- iniciarAgente(dir, { agente: "backend-python-swl", tareaId: "T-03" })
363
- ```
364
-
365
- Después de cada tarea completada:
366
- ```
367
- completarAgente(dir, { agente: "backend-python-swl", tareaId: "T-03", resultado: { ... } })
368
- establecerProximo(dir, { agente: "tdd-qa-swl", tareaId: "T-04" })
369
- ```
370
-
371
- ### Persistencia
372
-
373
- El estado se persiste en `.planning/execution-state.json`. Al retomar una sesión
374
- interrumpida, `leer()` recupera el estado exacto donde se detuvo.
375
-
376
- ---
377
-
378
- ## Actualización de ESTADO.md
379
-
380
- Actualizar ESTADO.md después de cada tarea (no al final de la oleada):
381
-
382
- ```markdown
383
- # ESTADO.md Fase [N]: [Nombre]
384
- **Última actualización**: [fecha y hora]
385
-
386
- ## Progreso
387
- - Tareas totales: N
388
- - Completadas: M
389
- - Bloqueadas: K
390
- - Pendientes: N-M-K
391
-
392
- ## Estado por tarea
393
- | ID | Nombre | Estado | Commit | REQ | Notas |
394
- |------|--------|--------|--------|-----|-------|
395
- | T-01 | [nombre] | COMPLETADA | abc1234 | REQ-01 | |
396
- | T-02 | [nombre] | COMPLETADA | def5678 | REQ-01, REQ-02 | |
397
- | T-03 | [nombre] | EN_PROGRESO | — | |
398
- | T-04 | [nombre] | PENDIENTE | — | depende T-03 |
399
- | T-05 | [nombre] | BLOQUEADA | — | [descripción del bloqueo] |
400
-
401
- ## Desviaciones registradas
402
- | Tarea | Tipo | Descripción | Resolución |
403
- |-------|------|-------------|-----------|
404
- | | | | |
405
-
406
- ## Decisiones HITL tomadas
407
- | Tarea | Pregunta | Respuesta del usuario | Fecha |
408
- |-------|---------|----------------------|-------|
409
- | | | | |
410
-
411
- ## Próxima acción
412
- [Qué se ejecuta a continuación y por qué]
413
- ```
414
-
415
- ---
416
-
417
- ## Actualización de HOJA-RUTA.md al completar la fase
418
-
419
- Al completar todas las tareas del plan:
420
-
421
- 1. Marcar la fase como completada en HOJA-RUTA.md
422
- 2. Actualizar la fecha real de completación
423
- 3. Añadir nota de desviaciones si las hubo
424
- 4. Marcar la siguiente fase como "lista para discutir"
425
-
426
- ---
427
-
428
- ## Modo Ralph: ejecución autónoma hasta completar
429
-
430
- Cuando el usuario dice "ejecuta hasta terminar", "modo autónomo" o "modo Ralph":
431
-
432
- 1. Ejecutar TODAS las tareas del plan en secuencia de oleadas
433
- 2. Después de cada tarea: ejecutar los 4 niveles de validación
434
- 3. Si una validación falla: corregir y re-validar inmediatamente
435
- 4. Si después de 3 intentos no se resuelve: marcar como BLOQUEADA y continuar con la siguiente tarea que no dependa de ella
436
- 5. Al terminar todas las tareas: ejecutar validación completa del proyecto
437
- 6. Si todo pasa: reportar éxito con resumen de lo completado
438
- 7. Si hay tareas bloqueadas: reportar cuáles y por qué
439
-
440
- Reglas del modo Ralph:
441
- - NUNCA preguntar al usuario durante la ejecución (excepto tareas HITL)
442
- - Registrar CADA decisión tomada en ESTADO.md bajo `## Decisiones autónomas`
443
- - Si se detecta loop (mismo error 2 veces): abortar esa tarea, NO el modo
444
- - Al finalizar, producir resumen: tareas completadas, bloqueadas, decisiones tomadas
445
- - El modo Ralph NO salta el protocolo de retry ni los niveles de validación
446
-
447
- ---
448
-
449
- ## Phase Gates criterios para cambiar de fase
450
-
451
- Un Phase Gate es una verificación formal antes de declarar una fase completa
452
- y comenzar la siguiente. NO avanzar si algún criterio falla.
453
-
454
- ### Gate de Implementación Calidad
455
-
456
- Antes de invocar al equipo de calidad (tdd-qa-swl, revisor-codigo-swl):
457
-
458
- - [ ] Todas las tareas del plan en estado COMPLETADA o BLOQUEADA documentada
459
- - [ ] Nivel 1 (linter/tipado) pasa en todo el código nuevo: `ruff`, `tsc --noEmit`, `clippy`
460
- - [ ] Tests existentes siguen pasando (no hay regresiones)
461
- - [ ] No hay secrets ni hardcodeos detectados por el hook escaneo-secretos
462
-
463
- ### Gate de Calidad Deploy
464
-
465
- Antes de invocar deploy o release:
466
-
467
- - [ ] Score de revisión de código ≥ 9.0/10 (revisor-codigo-swl)
468
- - [ ] 0 findings críticos de seguridad (revisor-seguridad-swl)
469
- - [ ] Cobertura de tests ≥ 80% en código nuevo (tdd-qa-swl)
470
- - [ ] Validación de accesibilidad si hay cambios de UI (accesibilidad-wcag-swl)
471
- - [ ] Performance sin regresión: p95 ≤ baseline + 20% (si aplica rendimiento-swl)
472
-
473
- ### Gate de Deploy Producción
474
-
475
- Antes de declarar la fase completa en producción:
476
-
477
- - [ ] Runbook de rollback documentado
478
- - [ ] Alertas de monitoreo configuradas para la nueva funcionalidad
479
- - [ ] Feature flag listo si el cambio es de alto riesgo
480
- - [ ] Release notes actualizadas
481
-
482
- ### Cómo reportar un Gate fallido
483
-
484
- ```
485
- PHASE GATE FALLIDO — Gate: [Calidad → Deploy]
486
-
487
- Criterio no cumplido: Score de revisión 7.8/10 (mínimo 9.0)
488
- Findings pendientes:
489
- - [CRITICO] Validación de input en endpoint /usuarios/perfil
490
- - [ALTO] N+1 query en listado de facturas
491
-
492
- Acción requerida: corregir findings antes de continuar.
493
- NO proceder con el deploy hasta aprobar este gate.
494
- ```
495
-
496
- ---
497
-
498
- ## Gotchas / Errores comunes no obvios
499
-
500
- - **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.
501
- - **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.
502
- - **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`.
503
- - **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.
504
- - **`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.
505
-
506
- ## Checklist de cierre de fase
507
-
508
- - [ ] Todas las tareas en ESTADO.md con estado COMPLETADA o documentadas como BLOQUEADA
509
- - [ ] Todos los commits hechos y referenciados en ESTADO.md
510
- - [ ] HOJA-RUTA.md actualizado con la fase completada
511
- - [ ] Desviaciones documentadas
512
- - [ ] Decisiones HITL registradas con respuesta del usuario
513
- - [ ] Tests pasan en el estado final del código
514
- - [ ] No hay `console.log`, `print()` de debug ni pendientes sin ticket en el código nuevo
515
- - [ ] `.planning/locks/fase-activa.json` eliminado (libera el gate G0 — el `.lock`
516
- del plan NO se toca: es evidencia versionada)
517
- - [ ] `/swl:verificar --until-converge` invocado automáticamente (gate G4) — o
518
- desviación `--sin-verify` registrada en RESUMEN.md con razón
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
+ ## DevQA 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)