@saulwade/swl-ses 1.7.4 → 1.9.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/auto-evolucion-swl.md +7 -7
  4. package/agentes/disenador-ui-swl.md +12 -0
  5. package/agentes/investigador-ux-swl.md +9 -0
  6. package/agentes/orquestador-swl.md +89 -1
  7. package/agentes/perfilador-usuario-swl.md +2 -2
  8. package/agentes/revisor-codigo-swl.md +34 -10
  9. package/agentes/revisor-seguridad-swl.md +7 -0
  10. package/agentes/tdd-qa-swl.md +23 -2
  11. package/agentes/ux-disenador-swl.md +6 -0
  12. package/comandos/swl/autoresearch.md +102 -6
  13. package/comandos/swl/evaluar-skill.md +1 -1
  14. package/comandos/swl/evolucion-estado.md +5 -5
  15. package/comandos/swl/evolucionar.md +2 -2
  16. package/comandos/swl/inbox.md +1 -1
  17. package/comandos/swl/metricas.md +34 -0
  18. package/comandos/swl/nemesis.md +42 -1
  19. package/comandos/swl/planear-fase.md +8 -0
  20. package/comandos/swl/predecir.md +139 -0
  21. package/comandos/swl/reflect-skills.md +2 -2
  22. package/comandos/swl/salud.md +1 -1
  23. package/comandos/swl/verificar.md +50 -7
  24. package/habilidades/ai-runtime-security/SKILL.md +2 -2
  25. package/habilidades/angular-moderno/SKILL.md +44 -1
  26. package/habilidades/auto-evolucion-protocolo/SKILL.md +2 -2
  27. package/habilidades/autoresearch/SKILL.md +15 -1
  28. package/habilidades/benchmark-memoria/SKILL.md +2 -2
  29. package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
  30. package/habilidades/changelog-generator/scripts/parse-commits.js +2 -1
  31. package/habilidades/checklist-seguridad/SKILL.md +29 -1
  32. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -0
  33. package/habilidades/css-moderno/SKILL.md +3 -1
  34. package/habilidades/drift-detection/SKILL.md +3 -3
  35. package/habilidades/eval-framework/SKILL.md +1 -1
  36. package/habilidades/fastapi-experto/SKILL.md +56 -5
  37. package/habilidades/guardrail-semantico/SKILL.md +4 -4
  38. package/habilidades/patrones-python/SKILL.md +8 -5
  39. package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
  40. package/habilidades/proceso-debate-adversarial/SKILL.md +164 -0
  41. package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -0
  42. package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -0
  43. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -0
  44. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -0
  45. package/habilidades/swl-claudemd/SKILL.md +2 -2
  46. package/habilidades/tdd-workflow/SKILL.md +14 -1
  47. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
  48. package/habilidades/testing-python/SKILL.md +1 -1
  49. package/habilidades/tracing-processor/SKILL.md +1 -1
  50. package/hooks/actualizar-perfil-usuario.js +2 -2
  51. package/hooks/aiisms-detector.js +2 -2
  52. package/hooks/auto-evolucion.js +1 -1
  53. package/hooks/captura-feedback-usuario.js +2 -2
  54. package/hooks/claudemd-bloat-detector.js +2 -2
  55. package/hooks/claudemd-duplicacion-detector.js +1 -1
  56. package/hooks/contexto-iteracion.js +144 -0
  57. package/hooks/guardrail-modelo.js +2 -2
  58. package/hooks/lib/loop-telemetry.js +321 -0
  59. package/hooks/lib/memory-search.js +1 -1
  60. package/hooks/lib/nudge-tracker.js +1 -1
  61. package/hooks/metricas-evolucion.js +3 -3
  62. package/hooks/notificacion-telegram.js +11 -3
  63. package/hooks/rotar-audit-auto.js +2 -2
  64. package/hooks/validar-formato-post-subagente.js +2 -2
  65. package/hooks/validar-intent-spec.js +1 -1
  66. package/hooks/validar-planning-paths.js +134 -0
  67. package/llms.txt +29 -0
  68. package/manifiestos/hooks-config.json +30 -12
  69. package/manifiestos/modulos.json +1358 -1351
  70. package/manifiestos/planning-paths.json +44 -0
  71. package/manifiestos/skills-lock.json +1275 -1254
  72. package/package.json +93 -92
  73. package/plugin.json +375 -372
  74. package/reglas/arquitectura.evolved.json +7 -0
  75. package/reglas/arquitectura.md +65 -0
  76. package/reglas/gobernanza.md +1 -1
  77. package/reglas/memoria-consolidada.md +7 -7
  78. package/reglas/seguridad.evolved.json +7 -0
  79. package/reglas/seguridad.md +144 -0
  80. package/reglas/sin-duplicacion-reglas-globales.md +1 -1
  81. package/scripts/auditar-agentes-gaps.js +1 -1
  82. package/scripts/auditar-cobertura-frameworks.js +2 -2
  83. package/scripts/auditar-skills-gaps.js +2 -2
  84. package/scripts/benchmark-memoria.js +3 -3
  85. package/scripts/generar-inventario.js +64 -1
  86. package/scripts/inferir-herramientas-permitidas.js +1 -1
  87. package/scripts/instalador.js +80 -2
  88. package/scripts/lib/dashboard-widgets.js +3 -3
  89. package/scripts/lib/drift-detector.js +3 -3
  90. package/scripts/lib/eval-metrics-store.js +3 -3
  91. package/scripts/lib/gitignore-manifest.js +3 -3
  92. package/scripts/mcp-server/README.md +1 -1
  93. package/scripts/mcp-server/telemetry.js +2 -2
  94. package/scripts/reflect-skills.js +4 -4
  95. package/scripts/rotar-audit-logs.js +2 -2
  96. package/scripts/run-skill-evals.js +2 -2
  97. package/scripts/smoke-test.js +24 -2
@@ -50,7 +50,7 @@ hardGuardrails:
50
50
  - "Agentes 'evolvable: false' requieren ADR humano explícito antes de cualquier cambio."
51
51
  - "@reglas/gobernanza.md § Gate G8 — skills nuevos pasan por _userland/ + score >=70 antes de promover."
52
52
  - "Gates G1-G8 son veto: fallo en cualquier gate aborta la evolución, sin override."
53
- - "@hooks/audit-trail.js — toda evolución registrada en .planning/evolucion/evoluciones.jsonl."
53
+ - "@hooks/audit-trail.js — toda evolución registrada en .planning/evolution/evoluciones.jsonl."
54
54
  - "Modificaciones a hooks bloqueantes (calidad-pre-commit, escaneo-secretos) requieren HITL."
55
55
  fragmentos:
56
56
  - _intent-spec
@@ -91,7 +91,7 @@ ANTES de modificar cualquier agente o skill:
91
91
  o está en la lista bloqueada (auto-evolucion-swl, red-team-swl, orquestador-swl,
92
92
  revisor-seguridad-swl), detente y reporta al usuario. La política completa
93
93
  (qué está bloqueado, por qué, y cuándo re-evaluarla) vive en
94
- `.planning/evolucion/politica-evolvable.md`.
94
+ `.planning/evolution/politica-evolvable.md`.
95
95
 
96
96
  **1a. Normalizar el frontmatter** usando `scripts/lib/skill-normalizer.js`:
97
97
  ```bash
@@ -149,19 +149,19 @@ campo `data.diagnosis` con la clasificación del fallo dominante:
149
149
  | `timeout` | Excedió presupuesto de turnos/tiempo | `toolBudget.complex`, `maxTurnos` |
150
150
  | `schema_violation` | Output violó schema declarado | `schemas/agent-output-*.schema.json` + template de output |
151
151
  | `task_incomplete` | Terminó con scope parcial | Protocolo de cierre, definición de "done" |
152
- | `unknown` | No clasificable | Leer últimas 3 trazas de `.planning/auto-evolucion/agentes.jsonl` |
152
+ | `unknown` | No clasificable | Leer últimas 3 trazas de `.planning/auto-evolution/agentes.jsonl` |
153
153
 
154
154
  ### Cómo leer el diagnosis de la sesión actual
155
155
 
156
156
  ```bash
157
157
  # Últimos nudges con su diagnosis
158
- tail -20 .planning/evolucion/nudges.jsonl | node -e "process.stdin.on('data',b=>b.toString().split(/\r?\n/).filter(Boolean).forEach(l=>{try{const j=JSON.parse(l);if(j.kind==='auto-evolucion')console.log(j.target,'->',j.data?.diagnosis?.tipo_fallo);}catch{}}))"
158
+ tail -20 .planning/evolution/nudges.jsonl | node -e "process.stdin.on('data',b=>b.toString().split(/\r?\n/).filter(Boolean).forEach(l=>{try{const j=JSON.parse(l);if(j.kind==='auto-evolucion')console.log(j.target,'->',j.data?.diagnosis?.tipo_fallo);}catch{}}))"
159
159
 
160
160
  # Trazas raw del agente objetivo en los últimos 14 días
161
161
  node -e "
162
162
  const fs=require('fs');
163
163
  const ventana=Date.now()-14*24*3600*1000;
164
- const lines=fs.readFileSync('.planning/auto-evolucion/agentes.jsonl','utf8').split(/\r?\n/).filter(Boolean);
164
+ const lines=fs.readFileSync('.planning/auto-evolution/agentes.jsonl','utf8').split(/\r?\n/).filter(Boolean);
165
165
  for(const l of lines){try{const j=JSON.parse(l);if(j.agente==='TU_TARGET' && Date.parse(j.ts)>=ventana)console.log(j.ts,j.status,j.tipo_fallo||'');}catch{}}"
166
166
  ```
167
167
 
@@ -672,7 +672,7 @@ como período de prueba (regla `gobernanza.md` línea 30). La promoción al core
672
672
  - Oro (≥80) → promover sin más
673
673
  - Plata (≥70) → promover, dejar nota en CHANGELOG: "promovido con badge Plata, mejorar en próxima evolución"
674
674
  - Bronce (≥60) → NO promover. Devolver a _userland/ con feedback de qué dimensiones bajan el score.
675
- - Sin badge (<60)→ NO promover. Documentar en .planning/evolucion/promociones-rechazadas.jsonl
675
+ - Sin badge (<60)→ NO promover. Documentar en .planning/evolution/promociones-rechazadas.jsonl
676
676
  4. Si badge ≥ Plata: mover archivo a habilidades/<nombre>/SKILL.md, registrar
677
677
  en manifiestos/modulos.json, actualizar INVENTARIO.md.
678
678
  5. Registrar evento en evoluciones.jsonl con tipo: "promocion-skill" y score.
@@ -702,7 +702,7 @@ Independientemente de los gates:
702
702
 
703
703
  ### Registro de evoluciones autónomas
704
704
 
705
- Cada evolución autónoma escribe a `.planning/evolucion/evoluciones.jsonl`:
705
+ Cada evolución autónoma escribe a `.planning/evolution/evoluciones.jsonl`:
706
706
 
707
707
  ```json
708
708
  {"ts":"2026-04-19T...","tipo":"aplicada","target":"skill-x","score":85,"modo":"autonomo"}
@@ -61,6 +61,18 @@ Responsabilidades concretas:
61
61
  - Adaptar o extender design systems existentes (Material, Ant, shadcn, Radix)
62
62
  - Producir UI-SPEC.md que el implementador pueda seguir sin consultar al diseñador
63
63
 
64
+ ## Path de output canónico (OBLIGATORIO)
65
+
66
+ Escribe TODOS tus artefactos en `.planning/design/` — NUNCA en la raíz del
67
+ proyecto ni en directorios ad-hoc (`ux/`, `diseno/`, `diseno-visual/`):
68
+
69
+ - `.planning/design/UI-SPEC.md` — la especificación visual principal.
70
+ - `.planning/design/tokens.md`, `component-inventory.md`, etc. — artefactos de apoyo.
71
+
72
+ El path está pineado (ADR-0031, `manifiestos/planning-paths.json`): no es elección
73
+ del orquestador. Si ya existe `.planning/design/UI-SPEC.md`, léelo antes de
74
+ sobreescribir. Cierra DT-PLANNING-OUTPUT-PATHS.
75
+
64
76
  ## Protocolo obligatorio al iniciar
65
77
 
66
78
  ANTES de definir cualquier valor visual:
@@ -59,6 +59,15 @@ Responsabilidades concretas:
59
59
  - Analizar datos de uso: heatmaps, funnels, tasas de conversión, bounce rates
60
60
  - Producir reportes de investigación accionables con hallazgos y recomendaciones
61
61
 
62
+ ## Path de output canónico (OBLIGATORIO)
63
+
64
+ Escribe TODOS tus artefactos de investigación en `.planning/design/` (reportes,
65
+ personas, customer journeys, análisis heurístico) — NUNCA en la raíz ni en
66
+ `ux/`/`investigacion/`/`research/`. Path pineado (ADR-0031,
67
+ `manifiestos/planning-paths.json`): compartes directorio con `disenador-ui-swl`
68
+ y `ux-disenador-swl` para que el conocimiento de usuario y la spec visual vivan
69
+ juntos. Cierra DT-PLANNING-OUTPUT-PATHS.
70
+
62
71
  ## Protocolo obligatorio al iniciar
63
72
 
64
73
  ANTES de comenzar cualquier investigación:
@@ -15,7 +15,12 @@ modeloAlterno: claude-haiku-4-5-20251001
15
15
  ventanaContexto: 200k
16
16
  permissionMode: plan
17
17
  color: white
18
- version: 1.2.0
18
+ version: 1.3.0
19
+ evolved: true
20
+ evolved-from: "1.2.0"
21
+ evolved-at: "2026-06-04"
22
+ evolved-by: "evolucionar"
23
+ evolved-note: "PE-005 sección 5 'Sub-agente background falla con API Error: Usage credits required for 1M context — verificar filesystem antes de re-intentar' + PE-006 sección 6 'Cuándo NO delegar a sub-agentes Opus 4.7 1M context'. Aprobación humana explícita pese a evolvable=false (función sistémica) — patrones de recovery operativos validados en OIC v1.5 2026-06-04 (2 sub-agentes background fallaron al cerrar pero dejaron ~700 LOC en disco)."
19
24
  nivelRiesgo: BAJO
20
25
  skillsInvocables: [compactacion-contexto, checkpoints-verificacion, aprendizaje-continuo, discutir-fase, ejecutar-fase, planear-fase, nuevo-proyecto, brainstorming, control-profundidad, prevencion-racionalizacion, estructura-proyecto-claude, workflow-claude-code, git-worktrees-paralelo, swl-dashboard, instalar-sistema, mapear-codebase, orquestacion-async, context-builder]
21
26
  skillsRestringidos: [fastapi-python, angular-component, angular-forms, postgresql-table-design]
@@ -160,6 +165,89 @@ Origen del patrón: documentado en skill global `harness-claude-code`
160
165
  gotcha "Sub-agente entra en autocompact thrashing con prompts >30k tokens"
161
166
  (SIGAF 2026-05-22).
162
167
 
168
+ ### 5. Sub-agente background falla con "API Error: Usage credits required for 1M context" — verificar filesystem antes de re-intentar
169
+
170
+ Síntoma típico (caso real OIC v1.5 2026-06-04): un sub-agente lanzado con
171
+ `run_in_background: true` (típicamente `implementador-swl` para un slice
172
+ grande) notifica `status: completed` con `result: "API Error: Usage credits
173
+ required for 1M context · run /usage-credits to turn them on, or /model to
174
+ switch to standard context"`. El `total_tokens` del result es muy bajo
175
+ (1k-2k) pese a `tool_uses` alto (29-35).
176
+
177
+ **El error es al FINAL, no al inicio**: el sub-agente trabajó normalmente,
178
+ escribió archivos en disco, e intentó procesar la respuesta JSON
179
+ estructurada (o hacer el commit final) y excedió el contexto 1M en ese
180
+ último step. Todo el trabajo real quedó en disco.
181
+
182
+ **Protocolo OBLIGATORIO de recuperación** antes de re-implementar:
183
+
184
+ ```bash
185
+ # 1. Verificar archivos staged/untracked relacionados con la tarea del agente
186
+ git status --porcelain
187
+ git diff --stat HEAD
188
+
189
+ # 2. Si hay archivos del scope del slice/tarea: inspeccionar calidad
190
+ git diff <archivo>
191
+ ruff check <archivo> # o equivalente del lenguaje
192
+ pytest <tests_del_slice> # validar funcionalidad
193
+
194
+ # 3. Completar SOLO lo que falte (típicamente: el commit final + tests faltantes
195
+ # + integración como router.py, __init__.py, etc.)
196
+ git add <archivos_validados>
197
+ git commit -m "feat(...): retomado tras fallo de billing del sub-agente"
198
+ ```
199
+
200
+ **NUNCA** asumir "fallo total" y re-implementar desde cero. Eso descarta
201
+ horas de trabajo que está completo en disco.
202
+
203
+ **Heurística de detección**:
204
+ - `result` contiene "Usage credits", "1M context", "context limit exceeded"
205
+ - `total_tokens` < 5000 con `tool_uses` >= 15 (≠ proporcional)
206
+ - `duration_ms` > 60s (el agente trabajó tiempo real)
207
+
208
+ **Mejora del prompt al sub-agente** cuando hay riesgo de 1M context:
209
+ agregar al final del prompt `"si te quedas sin contexto al final, deja los
210
+ archivos commitleables en disco para que el orquestador retome desde git
211
+ status"`. Esto refuerza el comportamiento ya natural pero hace explícito el
212
+ contrato.
213
+
214
+ **Origen**: OIC Milestone v1.5 Slices 1 y 5 (2026-06-04). Los 2 sub-agentes
215
+ background fallaron al cerrar pero dejaron ~700 LOC funcionales en disco.
216
+ Detectado por `git status` antes de re-implementar.
217
+
218
+ ### 6. Cuándo NO delegar a sub-agentes Opus 4.7 [1M context]
219
+
220
+ El modelo Opus 4.7 con 1M context (`claude-opus-4-7[1m]`) requiere créditos
221
+ 1M activos en la cuenta. En proyectos donde `/usage-credits` reporta que NO
222
+ están activos, los sub-agentes 1M fallan al cerrar (ver sección 5 arriba)
223
+ incluso si el trabajo real cabía en 200k.
224
+
225
+ **Heurística de decisión**:
226
+
227
+ | Situación | Acción |
228
+ |---|---|
229
+ | Proyecto con créditos 1M confirmados (`/usage-credits` muestra activo) | Delegar normalmente |
230
+ | Proyecto sin créditos 1M y slice de < 500 LOC | Trabajo directo en main loop (mejor ROI que delegar) |
231
+ | Proyecto sin créditos 1M y slice de 500-1500 LOC | Delegar con `model: 'sonnet'` override en el Agent tool call, o dividir en sub-slices |
232
+ | Proyecto sin créditos 1M y slice de > 1500 LOC | Dividir en sub-slices < 500 LOC y trabajar directo |
233
+
234
+ **Anti-patrón**: asumir que "el padre tiene 1M context entonces el sub-agente
235
+ también". El sub-agente hereda el modelo, no los créditos. Los créditos son
236
+ por-cuenta, no por-sesión.
237
+
238
+ **Override seguro** cuando se delega y no hay créditos 1M:
239
+
240
+ ```typescript
241
+ Agent({
242
+ subagent_type: "implementador-swl",
243
+ model: "sonnet", // ← override explícito
244
+ prompt: "...",
245
+ })
246
+ ```
247
+
248
+ **Origen**: OIC Milestone v1.5 2026-06-04. 2 invocaciones background fallaron
249
+ en cadena con el mismo error de billing antes de aplicar el override.
250
+
163
251
  ## Routing por fase + dominio (lookup tabular determinístico)
164
252
 
165
253
  Antes de delegar, **clasifica la petición** por dos ejes mecánicos en lugar de
@@ -94,7 +94,7 @@ tercero (perfil del usuario). **No cruces los carriles:**
94
94
 
95
95
  3. **Verificar el dirty-bit del hook:**
96
96
  ```
97
- Read(".planning/perfil-usuario/dirty.json")
97
+ Read(".planning/user-profile/dirty.json")
98
98
  ```
99
99
  Este archivo lista las señales acumuladas desde la última consolidación.
100
100
  Si no existe: no hay trabajo pendiente; termina con "perfil al día".
@@ -254,7 +254,7 @@ atomicWriteSync('instintos/perfil-usuario.yaml', yamlContent);
254
254
  ### Paso 6 — Limpiar dirty-bit
255
255
 
256
256
  ```bash
257
- rm -f .planning/perfil-usuario/dirty.json
257
+ rm -f .planning/user-profile/dirty.json
258
258
  ```
259
259
 
260
260
  ### Paso 7 — Reportar al usuario
@@ -15,12 +15,12 @@ model: claude-sonnet-4-6
15
15
  modeloAlterno: claude-haiku-4-5-20251001
16
16
  ventanaContexto: 200k
17
17
  color: orange
18
- version: 1.2.0
18
+ version: 1.2.2
19
19
  evolved: true
20
- evolved-from: "1.1.2"
21
- evolved-at: "2026-05-09"
22
- evolved-by: "aprender"
23
- evolved-note: "Reorganización de scoring con vocabulario 5-axis Addy Osmani sin duplicar capacidades existentes. Mapeo: Capa 1 (existente) = Correctness, Legibilidad = Readability, SOLID+DRY+Consistencia consolidan a Architecture (mismo análisis, dimensión unificada), Security/Performance se documentan como handoff explícito a revisor-seguridad-swl y rendimiento-swl (no se duplica análisis), Mantenibilidad/Complejidad permanecen en Métricas objetivas Fase 1 (ya existían). Score promedio sobre 3 dimensiones de scoring (Readability, Architecture, Consistencia) + booleano de handoff por axis externo. Veto items y formato de reporte preservados, retrocompatible. Origen: filtro de repos externos (temp/agent-skills-main 2026-05-09) — opción B sin duplicar."
20
+ evolved-from: "1.2.1"
21
+ evolved-at: "2026-06-05"
22
+ evolved-by: "evolucionar"
23
+ evolved-note: "+gating por versión de lenguaje antes de marcar sintaxis como SyntaxError CRÍTICO: leer requires-python/target-version/tsconfig/edition y refutar con import+linter del stack (aplicación de verificar-citas Familia 2 a claims de sintaxis). Generalizable a cualquier lenguaje version-dependent. Origen: falso positivo PEP 758 (except A,B: en Python 3.14) en sistema-verificacion-oic."
24
24
  nivelRiesgo: BAJO
25
25
  skillsInvocables: [checklist-calidad, patrones-python, api-rest-diseno, tdd-workflow, verificar-trabajo, verificacion-evidencia, swl-revisar-impacto, prevencion-sobreingenieria]
26
26
  skillsRestringidos: []
@@ -68,13 +68,22 @@ Responsabilidades concretas:
68
68
 
69
69
  ## Protocolo obligatorio al iniciar
70
70
 
71
+ **Presupuesto de contexto (anti-thrashing):** tu ventana hereda el `CLAUDE.md`
72
+ del proyecto + las reglas globales del usuario. En proyectos rule-heavy eso
73
+ consume buena parte de la ventana antes de leer código — si además exploras el
74
+ codebase completo, saturas y entras en autocompact thrashing (0 tokens útiles,
75
+ observado 2026-06-05). Por eso: NO releas `CLAUDE.md` (ya está en tu contexto),
76
+ lee SOLO los archivos del alcance recibido, y carga `skillsInvocables` bajo
77
+ demanda — solo cuando el alcance concreto lo amerite, nunca al inicio "por si acaso".
78
+
71
79
  Antes de revisar cualquier código:
72
80
 
73
- 1. **Leer CLAUDE.md** del proyecto convenciones, anti-patrones conocidos.
74
- 2. **Obtener el diff** del cambio a revisar: `git diff main..HEAD` o leer
75
- los archivos indicados.
76
- 3. **Leer el contexto** archivos relacionados para entender el módulo completo,
77
- no solo el cambio aislado.
81
+ 1. **Obtener el diff / alcance**: usar los archivos indicados por quien delega;
82
+ si no se indicaron, `git diff main..HEAD --name-only`. NO releer CLAUDE.md
83
+ (ya está en tu contexto heredado).
84
+ 2. **Leer los archivos del alcance PRIMERO**, antes de cargar cualquier skill.
85
+ 3. **Leer contexto adicional solo si es necesario** para entender el cambio
86
+ acotado; no el módulo completo si el alcance es pequeño.
78
87
  4. **Verificar métricas base** con herramientas estáticas antes de hacer juicios.
79
88
 
80
89
  ## Revision en dos capas (obligatorio)
@@ -370,6 +379,19 @@ Solo los problemas CRÍTICOS bloquean el avance. MAYOR debe documentarse como de
370
379
  - Si el código es bueno, dilo explícitamente — los reportes vacíos de problemas
371
380
  son tan valiosos como los reportes con 10 problemas
372
381
  - No revises código que no puedes ejecutar ni compilar — pide el contexto necesario
382
+ - NUNCA marques una construcción sintáctica como SyntaxError CRÍTICO sin verificar
383
+ primero la **versión objetivo del lenguaje** del proyecto. Mucha sintaxis es
384
+ válida solo a partir de cierta versión (Python: `requires-python` /
385
+ `tool.ruff.target-version` en `pyproject.toml`; TypeScript: `target`/`lib` en
386
+ `tsconfig.json`; Java: `--release`; C#: `<LangVersion>`; Rust: edition). Antes
387
+ de emitir el veredicto bloqueante, lee la versión objetivo y **refuta el presunto
388
+ error con evidencia ejecutable** del stack (`python -c "import <módulo>"`,
389
+ `ruff check`, `tsc --noEmit`, el compilador correspondiente). Evidencia >
390
+ afirmación: si la construcción importa/compila bajo la versión objetivo, NO es
391
+ un hallazgo — degrádalo o elimínalo. Esta es la aplicación de
392
+ `verificar-citas Familia 2` a claims de sintaxis: un revisor que afirma
393
+ "SyntaxError" sin verificar contra el target propaga un falso positivo
394
+ bloqueante.
373
395
 
374
396
  ## Gotchas / Errores comunes no obvios
375
397
 
@@ -381,6 +403,8 @@ Solo los problemas CRÍTICOS bloquean el avance. MAYOR debe documentarse como de
381
403
 
382
404
  **Hallazgos sin ejemplo de corrección**: un hallazgo que solo señala el problema sin mostrar cómo arreglarlo no es accionable. Causa: el revisor describe el anti-patrón pero no la alternativa correcta. Solución: todo hallazgo CRÍTICO o MAYOR incluye el código incorrecto y el código correcto esperado.
383
405
 
406
+ **Marcar sintaxis version-dependent como SyntaxError sin verificar el target**: una construcción válida en la versión objetivo del proyecto se lee como error de sintaxis cuando el revisor la juzga contra su conocimiento general del lenguaje en vez de leer la versión objetivo. Causa: la validez sintáctica depende de la versión (`requires-python`/`target-version`, `tsconfig target`, `--release`, edition) y no es absoluta. Caso real (2026-06-05, `sistema-verificacion-oic`): `except A, B:` sin paréntesis — válido en Python ≥3.14 por PEP 758 — fue marcado como SyntaxError CRÍTICO/RECHAZADO en un proyecto con `requires-python >=3.14`; refutado con `python -c "import …"` + `ruff check` + CI verde. Solución: antes de un veredicto bloqueante por sintaxis, leer la versión objetivo del proyecto y refutar el presunto error con import/compilación real del stack (ver Reglas estrictas).
407
+
384
408
  ## Veto items — cap enforcement a 60/100
385
409
 
386
410
  Ciertos hallazgos son **no negociables** y violan reglas globales del sistema.
@@ -63,6 +63,13 @@ Antes de comenzar la auditoría:
63
63
  de archivos, autenticación, autorización, dependencias externas.
64
64
  3. **Obtener el diff** o la lista de archivos a auditar.
65
65
  4. **Mapear el flujo de datos**: de dónde viene el input, cómo se procesa, dónde se almacena.
66
+ 5. **Elegir el modo**: revisión de PR/diff (flujo estándar de abajo) o
67
+ **auditoría en profundidad** — en ese caso cargar
68
+ `Skill("checklist-seguridad")` y aplicar su *modo cobertura* (STRIDE +
69
+ OWASP con score compuesto, iterando con rotación de personas red-team y
70
+ registro en `hooks/lib/loop-telemetry.js`). Cada hallazgo se etiqueta con
71
+ ambas taxonomías y el reporte incluye la línea de cobertura
72
+ `OWASP: N/10 | STRIDE: M/6 | Score: X`.
66
73
 
67
74
  ## Flujo de trabajo paso a paso
68
75
 
@@ -11,9 +11,9 @@ model: claude-sonnet-4-6
11
11
  modeloAlterno: claude-haiku-4-5-20251001
12
12
  ventanaContexto: 200k
13
13
  color: purple
14
- version: 1.0.0
14
+ version: 1.1.0
15
15
  nivelRiesgo: BAJO
16
- skillsInvocables: [tdd-workflow, testing-python, checklist-calidad, manejo-errores, webapp-testing, php-testing, nextjs-testing]
16
+ skillsInvocables: [tdd-workflow, testing-python, checklist-calidad, manejo-errores, webapp-testing, php-testing, nextjs-testing, calidad-mutation-testing]
17
17
  skillsRestringidos: []
18
18
  permisosRed: false
19
19
  permisosEscritura: true
@@ -213,6 +213,27 @@ diff /tmp/baseline.txt /tmp/current.txt
213
213
  Toda regresión (test que antes pasaba y ahora falla) es un bloqueante.
214
214
  Reporta: qué test, qué falló, qué cambio lo causó.
215
215
 
216
+ ### Fase 6 — Gate de mutación (opt-in, módulos críticos)
217
+
218
+ La cobertura mide ejecución, no calidad de asserts. Cuando el módulo es
219
+ crítico (dinero, auth, cálculo regulatorio) Y hay runner de mutación
220
+ instalado Y la suite corre en <2 min, cerrar la auditoría con mutación
221
+ incremental sobre el diff:
222
+
223
+ 1. Cargar `Skill("calidad-mutation-testing")` — herramientas por stack,
224
+ modo incremental, umbrales por contexto.
225
+ 2. Correr la mutación SOLO sobre los archivos del diff de la fase
226
+ (`--since` / `--in-diff`), nunca el repo completo.
227
+ 3. Diagnosticar cada mutante sobreviviente: assert débil → endurecer el
228
+ assert; test faltante → escribir test de frontera dirigido; mutante
229
+ equivalente → excluir con anotación (NUNCA test artificial para matarlo).
230
+ 4. Reportar el mutation score junto a la cobertura. Umbral de referencia:
231
+ ≥85% en módulo crítico, ≥70% en lógica de negocio estándar.
232
+
233
+ Si las precondiciones no se cumplen (sin runner, suite lenta, suite roja),
234
+ omitir la fase y decirlo en el reporte — no es deuda silenciosa, es opt-in
235
+ documentado.
236
+
216
237
  ## Convenciones de escritura de tests
217
238
 
218
239
  ### Python (pytest)
@@ -43,6 +43,12 @@ realmente pueden usar — no solo interfaces que se ven bien en un mockup.
43
43
  Tu output es la UI-SPEC.md: el contrato de diseño que el frontend-swl implementará.
44
44
  No escribes código. Diseñas con palabras, estructuras y especificaciones precisas.
45
45
 
46
+ **Path de output canónico (OBLIGATORIO):** escribe TODOS tus artefactos en
47
+ `.planning/design/` (`UI-SPEC.md`, wireframes, flujos) — NUNCA en la raíz ni en
48
+ `ux/`/`diseno/`/`diseno-visual/`. Path pineado (ADR-0031,
49
+ `manifiestos/planning-paths.json`); si ya existe `.planning/design/UI-SPEC.md`,
50
+ léelo antes de sobreescribir. Cierra DT-PLANNING-OUTPUT-PATHS.
51
+
46
52
  ## Rol y responsabilidad
47
53
 
48
54
  Responsabilidades concretas:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: swl:autoresearch
3
- description: Ejecuta el loop de auto-mejora iterativa Autoresearch sobre un skill o agente. Crea o usa un checklist de evaluación (3-6 items binarios ponderados), obtiene baseline score, ejecuta mutaciones atómicas (una a la vez) evaluando contra el checklist, y decide keep/revert por round hasta alcanzar 95%+ x3. Flags disponibles: --skill=[nombre], --agente=[nombre], --max-rounds=[N], --target=[N], --dry-run, --checklist=[path].
3
+ description: Ejecuta el loop de auto-mejora iterativa Autoresearch sobre un skill, un agente, o (modo --codigo) sobre código del proyecto contra una métrica arbitraria. Modo skill/agente — crea o usa un checklist de evaluación (3-6 items binarios ponderados), obtiene baseline score, ejecuta mutaciones atómicas (una a la vez) y decide keep/revert por round hasta 95%+ x3. Modo --codigo — itera mutaciones sobre un Scope acotado contra un comando Verify numérico (cobertura, mutation score, errores, latencia) con Guard de regresión y telemetría en .planning/loops/. Flags: --skill=[nombre], --agente=[nombre], --codigo, --goal, --scope, --metric, --direction, --verify, --guard, --max-rounds=[N], --target=[N], --dry-run, --checklist=[path].
4
4
  allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
5
5
  ---
6
6
 
@@ -22,13 +22,20 @@ Este comando es distinto a `/swl:evolucionar`: donde evolucionar analiza evidenc
22
22
  ```
23
23
  --skill=[nombre] Skill a mejorar (busca en habilidades/[nombre]/SKILL.md)
24
24
  --agente=[nombre] Agente a mejorar (busca en agentes/[nombre].md)
25
- --max-rounds=[N] Máximo de iteraciones del loop (default: 10)
26
- --target=[N] Score objetivo en % (default: 95)
27
- --dry-run Analizar y crear checklist sin ejecutar mutaciones
28
- --checklist=[path] Ruta a checklist existente
25
+ --codigo Modo código: itera sobre código del proyecto contra una métrica (ver sección "Modo --codigo")
26
+ --goal="..." (--codigo) Meta textual del loop
27
+ --scope="glob" (--codigo) Archivos que el loop PUEDE modificar (glob acotado)
28
+ --metric="..." (--codigo) Qué mide la métrica (ej: "mutation score de src/pagos")
29
+ --direction=[dir] (--codigo) higher_is_better | lower_is_better
30
+ --verify="cmd" (--codigo) Comando shell cuya salida contiene el número de la métrica
31
+ --guard="cmd" (--codigo) Comando que debe pasar (exit 0) para aceptar una mutación
32
+ --max-rounds=[N] Máximo de iteraciones del loop (default: 10 skill/agente, 15 código)
33
+ --target=[N] Score objetivo (default: 95% en skills; en código lo define el usuario)
34
+ --dry-run Analizar y derivar configuración sin ejecutar mutaciones
35
+ --checklist=[path] Ruta a checklist existente (solo modo skill/agente)
29
36
  ```
30
37
 
31
- **Nota**: Se debe pasar `--skill` o `--agente`, no ambos. Si no se pasa ninguno, preguntar al usuario.
38
+ **Nota**: Se debe pasar `--skill`, `--agente` o `--codigo` (excluyentes). Si no se pasa ninguno, preguntar al usuario.
32
39
 
33
40
  ## Paso 0 — Parseo de flags y carga de habilidades
34
41
 
@@ -168,3 +175,92 @@ Si el score mejoró respecto al baseline:
168
175
  - Si después de 3 rounds sin mejora, preguntar al usuario si continuar o parar
169
176
  - El caso de prueba NO cambia durante el loop
170
177
  - Mantener log completo del loop para auditoría
178
+
179
+ ---
180
+
181
+ ## Modo `--codigo` — Loop métrico sobre código del proyecto
182
+
183
+ Generaliza el loop a **código del usuario**: la misma disciplina (mutación
184
+ atómica → medir → keep/revert) pero la evaluación es un **comando Verify
185
+ numérico** en lugar de un checklist. Patrón adoptado del análisis de
186
+ autoresearch v2.1 (loop core), adaptado a las reglas SWL (HITL, git-workflow,
187
+ telemetría en `.planning/loops/`).
188
+
189
+ Métricas típicas: mutation score (cargar `Skill("calidad-mutation-testing")`),
190
+ cobertura de tests, conteo de errores de tsc/lint (lower_is_better), latencia
191
+ p95 de un benchmark, bundle size, tiempo de suite.
192
+
193
+ ### Paso C0 — Derivar y aprobar la configuración (HITL obligatorio)
194
+
195
+ Completar con el usuario los campos faltantes y presentar el bloque para
196
+ aprobación explícita ANTES de la primera mutación:
197
+
198
+ ```
199
+ === Autoresearch --codigo — Configuración ===
200
+ Goal: [meta textual]
201
+ Scope: [glob de archivos que el loop PUEDE tocar]
202
+ Metric: [qué mide] | Direction: [higher|lower]_is_better
203
+ Verify: [comando shell]
204
+ Guard: [comando shell o "(ninguno)"]
205
+ Target: [valor objetivo o "(mejora máxima en N rounds)"]
206
+ Rounds: [N, default 15]
207
+ ```
208
+
209
+ **Safety screen del Verify/Guard (bloqueante)**: rechazar comandos que
210
+ contengan `rm -rf`, `curl|sh`/`wget|sh`, `sudo`, `git push`, `--force`,
211
+ redirecciones a archivos fuera del repo, o credenciales inline. El Verify se
212
+ ejecuta una vez en dry-run para confirmar que produce un número parseable —
213
+ si no, corregir el comando antes de iterar.
214
+
215
+ **Guard por default**: si el proyecto tiene suite de tests, el Guard es la
216
+ suite (`npm test` / `pytest`). Iterar sin Guard solo si el usuario lo aprueba
217
+ explícitamente — una métrica que sube con la suite rota no es mejora.
218
+
219
+ Si `--dry-run`: terminar aquí mostrando la configuración derivada.
220
+
221
+ ### Paso C1 — Baseline y telemetría
222
+
223
+ ```bash
224
+ node -e "const lt=require('./hooks/lib/loop-telemetry');const r=lt.iniciarCorrida({tipo:'autoresearch',direccion:'[direction]',config:{goal:'[goal]',scope:'[scope]',verify:'[verify]',guard:'[guard]'}});console.log(r.dir)"
225
+ ```
226
+
227
+ Correr Verify, extraer la métrica, registrar la iteración 0 (`estado:
228
+ baseline`). Si el baseline ya cumple el target, terminar: no hay loop que correr.
229
+
230
+ ### Paso C2 — El loop
231
+
232
+ Por cada round (hasta `--max-rounds`, default 15):
233
+
234
+ 1. **Revisar memoria**: últimas filas del TSV + `git log --oneline -10` — qué
235
+ funcionó, qué se revirtió. No repetir mutaciones ya revertidas.
236
+ 2. **UNA mutación atómica** dentro del Scope. Archivos fuera del Scope son
237
+ intocables — si la mejora "necesita" tocar otro archivo, pausar y
238
+ preguntar al usuario (anti-proxy-goal-drift).
239
+ 3. **Medir**: correr Verify → métrica nueva; correr Guard.
240
+ 4. **Decidir**:
241
+ - Métrica mejora Y Guard pasa → **keep**: commit `experiment(autoresearch): [descripción]`.
242
+ - Métrica no mejora O Guard falla → **revert**: descartar los cambios del
243
+ working tree (`git checkout -- [archivos tocados]`). NUNCA reescribir
244
+ historia para revertir — solo se commitea lo que se conserva.
245
+ - Verify truena → estado `crash`: descartar cambios, registrar, continuar.
246
+ 5. **Registrar** la iteración con `registrarIteracion` (métrica, delta, estado, descripción).
247
+ 6. **Condiciones de salida**: target alcanzado → ÉXITO; `detectarPlateau`
248
+ sobre las últimas 3 filas → PLATEAU (parar, no quemar rounds sin mejora);
249
+ 3 reverts consecutivos → ESTANCAMIENTO (preguntar al usuario);
250
+ max rounds → ACOTADO.
251
+
252
+ ### Paso C3 — Cierre
253
+
254
+ 1. Escribir handoff: `escribirHandoff(dir, {source: 'swl:autoresearch', status: [COMPLETO|PLATEAU|ACOTADO|INTERRUMPIDO], config})`.
255
+ 2. Reporte final con trayectoria (`analizarTrayectoria`): rounds, keep/revert,
256
+ métrica inicial → final, mayor salto, y los commits `experiment(...)` generados.
257
+ 3. Ofrecer al usuario squash de los commits experimentales en un commit
258
+ semántico final (`git-workflow.md § Squash antes de merge`).
259
+
260
+ ### Reglas adicionales del modo `--codigo`
261
+
262
+ - NUNCA `git push` desde el loop — los commits experimentales son locales.
263
+ - NUNCA tocar archivos fuera del Scope aprobado.
264
+ - NUNCA continuar tras plateau "por si acaso" — el plateau ES la señal de salida.
265
+ - El hook `contexto-iteracion.js` inyecta el estado del loop en sesiones
266
+ largas; no releer el TSV completo en cada round (las últimas 3 filas bastan).
@@ -369,7 +369,7 @@ Umbral de promoción:
369
369
  |-------|-------------------------|
370
370
  | Platino, Oro, Plata | Promover a `habilidades/`, registrar en manifiestos |
371
371
  | Bronce | NO promover, devolver a `_userland/` con feedback |
372
- | Sin badge | NO promover, registrar rechazo en `.planning/evolucion/promociones-rechazadas.jsonl` |
372
+ | Sin badge | NO promover, registrar rechazo en `.planning/evolution/promociones-rechazadas.jsonl` |
373
373
 
374
374
  Si un skill es rechazado ≥3 veces consecutivas, el agente escala al usuario
375
375
  con análisis de qué dimensiones bajan el score. Origen: ADR 0013 sección 3C.
@@ -31,7 +31,7 @@ PATH="/c/Program Files/nodejs:/c/Program Files (x86)/nodejs:$PATH" echo '{}' | n
31
31
  ## Paso 1 — Cargar métricas
32
32
 
33
33
  ```bash
34
- cat .planning/evolucion/metricas.json
34
+ cat .planning/evolution/metricas.json
35
35
  ```
36
36
 
37
37
  Si el archivo no existe: ejecutar el regenerado del Paso 0. Si sigue sin
@@ -58,7 +58,7 @@ echo "RATIO=\"$EVOL_FALSE/$TOTAL\""
58
58
 
59
59
  Estos valores alimentan la sección KERNEL del template.
60
60
 
61
- Si `.planning/evolucion/politica-evolvable.md` no existe, reportar como
61
+ Si `.planning/evolution/politica-evolvable.md` no existe, reportar como
62
62
  hallazgo crítico: el kernel SIN política documentada es violación de
63
63
  `reglas/gobernanza.md`.
64
64
 
@@ -127,7 +127,7 @@ Template de salida:
127
127
  ...
128
128
 
129
129
  KERNEL (gobernanza)
130
- Política evolvable .... .planning/evolucion/politica-evolvable.md
130
+ Política evolvable .... .planning/evolution/politica-evolvable.md
131
131
  Último ADR kernel ..... <ADR-NNNN — título — fecha>
132
132
  Agentes evolvable=false <n>/<total>
133
133
 
@@ -152,7 +152,7 @@ Al final del dashboard, sugerir acciones según las métricas:
152
152
  → `npx -y @saulwade/swl-ses@latest bootstrap-instincts` (pobla desde APRENDIZAJES.md)
153
153
 
154
154
  - Si `nudges.tasaAccion < 0.3` y `nudges.total > 5`:
155
- → "Muchos nudges ignorados. Revisa `.planning/evolucion/alertas-persistentes.json`"
155
+ → "Muchos nudges ignorados. Revisa `.planning/evolution/alertas-persistentes.json`"
156
156
 
157
157
  - Si `alertasActivas.length > 0`:
158
158
  → listar cada alerta con `/swl:evolucionar <target>` o cmd correspondiente
@@ -178,7 +178,7 @@ Al final del dashboard, sugerir acciones según las métricas:
178
178
 
179
179
  ## Anti-substitution guardrails
180
180
 
181
- - Archivo de métricas: **siempre** `.planning/evolucion/metricas.json` (nunca `.planning/metricas.json`, `evolucion.json`, `estado-evolucion.json`).
181
+ - Archivo de métricas: **siempre** `.planning/evolution/metricas.json` (nunca `.planning/metricas.json`, `evolucion.json`, `estado-evolucion.json`).
182
182
  - Hook que regenera: **siempre** `hooks/metricas-evolucion.js` (nunca `metrics.js`, `evolucion-metricas.js`, `evolution-metrics.js`).
183
183
  - Para forzar regen: pipe `echo '{}' | node ...`, nunca invocar `require()` directo.
184
184
 
@@ -23,7 +23,7 @@ SWL tiene **tres canales independientes** de aprendizaje. Son complementarios, n
23
23
  ### Cómo se coordinan
24
24
 
25
25
  - **Evolución + perfil**: el parser de fricción (`auto-evolucion-protocolo` v1.1) cruza el log
26
- `.planning/auto-evolucion/agentes.jsonl` con las señales de corrección del usuario
26
+ `.planning/auto-evolution/agentes.jsonl` con las señales de corrección del usuario
27
27
  para priorizar agentes cuyos runs coincidieron con correcciones. Ver tabla
28
28
  "Categorías de fricción" en el skill.
29
29
  - **Evolución + aprendizajes**: antes de modificar un skill, leer `APRENDIZAJES.md`
@@ -214,7 +214,7 @@ score_after = (evals_pass / evals_total) * 100 × factor_peso
214
214
  | `score_after < score_baseline - 5` | **Revertir** — restaurar el archivo anterior + `--record-revert --score=<N>` |
215
215
  | `score_baseline - 5 <= score_after < score_baseline` | **Requiere revisión humana** — reportar diferencia; usuario decide si acepta la regresión menor o revierte |
216
216
 
217
- Los 3 casos registran evento en `.planning/evolucion/evoluciones.jsonl` para el
217
+ Los 3 casos registran evento en `.planning/evolution/evoluciones.jsonl` para el
218
218
  dashboard `/swl:evolucion-estado`.
219
219
 
220
220
  ### Regla de oro
@@ -45,7 +45,7 @@ Por cada comando en la cola, decidir:
45
45
  | Instrucción de trabajo clara ("arregla el bug X", "ejecuta pruebas") | Procesar como prompt del usuario. Ejecutar la tarea siguiendo el flujo normal SWL. |
46
46
  | Slash command (`/swl:salud`, `/swl:metricas`, etc.) | Invocar ese comando directamente. |
47
47
  | Pregunta/consulta ("¿cómo va X?", "estado del release") | Responder con la información solicitada. Enviar respuesta al gateway si aplica. |
48
- | Feedback/corrección ("no uses Y", "prefiero Z") | Escribir a `.planning/evolucion/feedback-queue.jsonl` con tipo correspondiente y marcar como procesado. |
48
+ | Feedback/corrección ("no uses Y", "prefiero Z") | Escribir a `.planning/evolution/feedback-queue.jsonl` con tipo correspondiente y marcar como procesado. |
49
49
  | Contenido ambiguo o sospechoso | Marcar como descartado con razón registrada. |
50
50
 
51
51
  ### Paso 3 — Procesar y marcar
@@ -22,6 +22,7 @@ costo estimado, herramientas más usadas y estado del presupuesto configurado.
22
22
  /swl:metricas — Resumen de métricas de la sesión
23
23
  /swl:metricas detalle — Desglose completo por herramienta y timeline
24
24
  /swl:metricas fases — Progreso de fases del proyecto desde feature-list.json
25
+ /swl:metricas loops — Trayectorias de loops iterativos desde .planning/loops/
25
26
  /swl:metricas historico — Abre el dashboard histórico multi-sesión (alias de /swl:dashboard)
26
27
  ```
27
28
 
@@ -318,6 +319,39 @@ node scripts/derivar-feature-list.js --check
318
319
 
319
320
  ---
320
321
 
322
+ ## Subcomando: `loops` — Trayectorias de loops iterativos
323
+
324
+ Si el usuario invoca `/swl:metricas loops`, leer las corridas registradas por
325
+ `hooks/lib/loop-telemetry.js` en `.planning/loops/`:
326
+
327
+ ```bash
328
+ node -e "
329
+ const fs = require('fs'), path = require('path');
330
+ const lt = require('./hooks/lib/loop-telemetry');
331
+ const base = path.join(process.cwd(), lt.DIR_LOOPS);
332
+ let dirs = [];
333
+ try { dirs = fs.readdirSync(base).map(d => path.join(base, d)).filter(d => fs.statSync(d).isDirectory()); } catch {}
334
+ if (dirs.length === 0) { console.log('(sin corridas de loops registradas)'); process.exit(0); }
335
+ for (const dir of dirs.sort().slice(-10)) {
336
+ try {
337
+ const t = lt.analizarTrayectoria(dir);
338
+ const h = lt.leerHandoff(dir);
339
+ console.log(path.basename(dir) + ' | iters: ' + t.totalIteraciones +
340
+ ' | keep/revert: ' + t.keeps + '/' + t.reverts +
341
+ ' | métrica: ' + t.metricaInicial + ' → ' + t.metricaFinal +
342
+ ' | plateau: ' + (t.plateau ? 'SÍ' : 'no') +
343
+ ' | status: ' + (h ? h.status : 'en curso'));
344
+ } catch (e) { console.log(path.basename(dir) + ' | (ilegible: ' + e.message + ')'); }
345
+ }
346
+ "
347
+ ```
348
+
349
+ Reportar al usuario en tabla: corrida, iteraciones, keep/revert rate, métrica
350
+ inicial → final, plateau y status del handoff. Si alguna corrida activa muestra
351
+ plateau, sugerir cerrarla — seguir iterando sin mejora quema tokens.
352
+
353
+ ---
354
+
321
355
  ## Subcomando: `historico`
322
356
 
323
357
  Si el usuario invoca `/swl:metricas historico`, redirigir inmediatamente a: