@saulwade/swl-ses 2.5.2 → 2.6.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 (183) hide show
  1. package/CLAUDE.md +194 -192
  2. package/README.md +600 -600
  3. package/agentes/auto-evolucion-swl.md +27 -3
  4. package/bin/swl-ses.js +32 -6
  5. package/comandos/swl/actualizar.md +174 -174
  6. package/comandos/swl/adoptar-proyecto.md +265 -265
  7. package/comandos/swl/aprender.md +836 -823
  8. package/comandos/swl/aprobar-plan.md +146 -146
  9. package/comandos/swl/auditar-deps.md +134 -134
  10. package/comandos/swl/autoresearch.md +264 -264
  11. package/comandos/swl/ayuda.md +224 -224
  12. package/comandos/swl/brainstorm.md +51 -51
  13. package/comandos/swl/briefing.md +119 -119
  14. package/comandos/swl/checkpoint.md +325 -325
  15. package/comandos/swl/claudemd.md +234 -234
  16. package/comandos/swl/compactar.md +310 -310
  17. package/comandos/swl/configurar-ci.md +235 -235
  18. package/comandos/swl/contexto.md +110 -110
  19. package/comandos/swl/contribuir.md +233 -233
  20. package/comandos/swl/crear-skill.md +292 -292
  21. package/comandos/swl/cron.md +194 -194
  22. package/comandos/swl/deuda-codigo.md +97 -97
  23. package/comandos/swl/discutir-fase.md +169 -169
  24. package/comandos/swl/ejecutar-fase.md +233 -233
  25. package/comandos/swl/evaluar-skill.md +520 -505
  26. package/comandos/swl/evolucion-continua.md +73 -0
  27. package/comandos/swl/evolucionar.md +267 -254
  28. package/comandos/swl/exportar-vault.md +583 -583
  29. package/comandos/swl/fix.md +118 -118
  30. package/comandos/swl/gateway.md +158 -158
  31. package/comandos/swl/inbox.md +116 -116
  32. package/comandos/swl/instalar.md +220 -220
  33. package/comandos/swl/instintos.md +86 -86
  34. package/comandos/swl/mapear-codebase.md +312 -312
  35. package/comandos/swl/mcp-status.md +175 -175
  36. package/comandos/swl/modelo.md +100 -100
  37. package/comandos/swl/nemesis.md +433 -433
  38. package/comandos/swl/notificaciones.md +299 -299
  39. package/comandos/swl/nuevo-proyecto.md +251 -251
  40. package/comandos/swl/planear-fase.md +263 -263
  41. package/comandos/swl/plugins.md +256 -256
  42. package/comandos/swl/predecir.md +169 -169
  43. package/comandos/swl/reflect-skills.md +125 -125
  44. package/comandos/swl/release.md +450 -450
  45. package/comandos/swl/revisar-impacto.md +201 -201
  46. package/comandos/swl/revisar.md +330 -330
  47. package/comandos/swl/seguridad.md +189 -189
  48. package/comandos/swl/sesiones.md +200 -200
  49. package/comandos/swl/skill-search.md +113 -113
  50. package/comandos/swl/status.md +343 -343
  51. package/comandos/swl/verificar.md +817 -817
  52. package/comandos/swl/wiki.md +620 -620
  53. package/gateway/cron/jobs.example.json +12 -0
  54. package/habilidades/auto-evolucion-protocolo/SKILL.md +294 -276
  55. package/habilidades/autoresearch/SKILL.md +3 -2
  56. package/habilidades/benchmark-memoria/SKILL.md +7 -7
  57. package/habilidades/changelog-generator/SKILL.md +174 -174
  58. package/habilidades/changelog-generator/scripts/parse-commits.js +2 -1
  59. package/habilidades/checkpoints-verificacion/SKILL.md +6 -0
  60. package/habilidades/context-builder/SKILL.md +4 -0
  61. package/habilidades/doubt-driven-review/SKILL.md +207 -191
  62. package/habilidades/drift-detection/SKILL.md +6 -1
  63. package/habilidades/ejecutar-fase/SKILL.md +6 -6
  64. package/habilidades/eval-framework/SKILL.md +8 -3
  65. package/habilidades/harness-claude-code/SKILL.md +314 -308
  66. package/habilidades/infra-github-actions/SKILL.md +4 -3
  67. package/habilidades/instalar-sistema/SKILL.md +227 -223
  68. package/habilidades/memoria-busqueda/SKILL.md +31 -39
  69. package/habilidades/planear-fase/SKILL.md +358 -350
  70. package/habilidades/proceso-ddia-fundamentos/SKILL.md +3 -2
  71. package/habilidades/release-semver/SKILL.md +4 -2
  72. package/habilidades/swl-claudemd/SKILL.md +6 -7
  73. package/habilidades/swl-dashboard/SKILL.md +11 -43
  74. package/habilidades/tdd-workflow/SKILL.md +749 -744
  75. package/habilidades/validacion-ci-sistema/SKILL.md +1 -1
  76. package/hooks/agente-lifecycle.js +2 -1
  77. package/hooks/aiisms-detector.js +13 -4
  78. package/hooks/audit-trail.js +2 -1
  79. package/hooks/auto-consolidacion.js +2 -1
  80. package/hooks/captura-acciones-post.js +2 -1
  81. package/hooks/captura-acciones-session.js +2 -1
  82. package/hooks/captura-feedback-usuario.js +3 -2
  83. package/hooks/claudemd-bloat-detector.js +12 -3
  84. package/hooks/claudemd-duplicacion-detector.js +13 -3
  85. package/hooks/contexto-iteracion.js +2 -1
  86. package/hooks/degradacion-instintos.js +2 -1
  87. package/hooks/extraccion-aprendizajes.js +109 -15
  88. package/hooks/grafo-contexto.js +2 -1
  89. package/hooks/guardrail-modelo.js +2 -1
  90. package/hooks/inbox-aviso.js +2 -1
  91. package/hooks/inyeccion-contexto.js +2 -1
  92. package/hooks/lib/agent-matcher.js +2 -1
  93. package/hooks/lib/agent-routing.js +2 -1
  94. package/hooks/lib/autonomia.js +5 -3
  95. package/hooks/lib/captura-acciones.js +2 -1
  96. package/hooks/lib/consolidation-lock.js +21 -10
  97. package/hooks/lib/etapa-auto-evolucion.js +10 -4
  98. package/hooks/lib/etapa-metricas.js +2 -1
  99. package/hooks/lib/etapa-perfil-usuario.js +20 -4
  100. package/hooks/lib/evolution-tracker.js +2 -1
  101. package/hooks/lib/gateway-notify.js +193 -179
  102. package/hooks/lib/loop-telemetry.js +5 -4
  103. package/hooks/lib/mcp-health.js +2 -1
  104. package/hooks/lib/memory-search.js +4 -0
  105. package/hooks/lib/merkle-audit.js +58 -6
  106. package/hooks/lib/nudge-tracker.js +2 -1
  107. package/hooks/lib/otlp-exporter.js +2 -1
  108. package/hooks/lib/propose-step.js +3 -2
  109. package/hooks/lib/raiz-proyecto.js +102 -0
  110. package/hooks/lib/run-log.js +2 -1
  111. package/hooks/lib/singleton-guard.js +218 -27
  112. package/hooks/lib/telegram-cliente.js +17 -8
  113. package/hooks/preservar-estado-pre-compact.js +2 -1
  114. package/hooks/proteccion-rutas.js +59 -3
  115. package/hooks/registro-turnos.js +2 -1
  116. package/hooks/resumen-sesion.js +2 -1
  117. package/hooks/risk-scoring.js +2 -1
  118. package/hooks/rotar-audit-auto.js +46 -20
  119. package/hooks/session-briefing.js +127 -1
  120. package/hooks/spec-gate.js +2 -1
  121. package/hooks/sugerir-contribuir.js +6 -3
  122. package/hooks/sugerir-regenerar-inventario.js +3 -2
  123. package/hooks/tdd-gate.js +2 -1
  124. package/hooks/telemetria-agentes.js +2 -1
  125. package/hooks/telemetria-skill-routing.js +2 -1
  126. package/hooks/tracking-costos.js +4 -3
  127. package/hooks/validar-formato-post-subagente.js +2 -1
  128. package/hooks/validar-intent-spec.js +2 -1
  129. package/hooks/validar-memoria-hook.js +13 -3
  130. package/hooks/validar-planning-paths.js +2 -1
  131. package/instintos/.backups/perfil-usuario.yaml.2026-07-10-165128.bak +53 -0
  132. package/instintos/.backups/proyecto.yaml.2026-07-10-165128.bak +372 -0
  133. package/instintos/perfil-usuario.yaml +506 -3
  134. package/instintos/proyecto.yaml +78 -0
  135. package/llms.txt +2 -2
  136. package/manifiestos/canonical-hashes.json +664 -2
  137. package/manifiestos/modulos.json +19 -14
  138. package/manifiestos/planning-paths.json +1 -0
  139. package/manifiestos/skills-lock.json +53 -53
  140. package/package.json +2 -3
  141. package/plugin.json +2 -2
  142. package/scripts/actualizar.js +3 -0
  143. package/scripts/auditar-clases-conocidas.js +32 -4
  144. package/scripts/benchmark-memoria.js +1 -0
  145. package/scripts/cli/autonomia.js +23 -0
  146. package/scripts/cli/benchmark-memoria.js +37 -0
  147. package/scripts/cli/ciclo-autonomo.js +73 -0
  148. package/scripts/cli/ciclo-fase-b.js +102 -0
  149. package/scripts/cli/guardrail-metrics.js +39 -0
  150. package/scripts/cli/loop-telemetry.js +4 -2
  151. package/scripts/cli/memoria-search.js +69 -0
  152. package/scripts/cli/nudge-accionar.js +39 -0
  153. package/scripts/cli/run-eval.js +38 -0
  154. package/scripts/cli/run-skill-evals.js +13 -2
  155. package/scripts/derivar-feature-list.js +15 -14
  156. package/scripts/desinstalar.js +11 -0
  157. package/scripts/doctor.js +24 -10
  158. package/scripts/instalador.js +106 -7
  159. package/scripts/lib/activar-hooks-proyecto.js +116 -0
  160. package/scripts/lib/auditar-invocaciones-comandos.js +96 -6
  161. package/scripts/lib/ciclo-autonomo/candidatos.js +174 -0
  162. package/scripts/lib/ciclo-autonomo/config.js +165 -0
  163. package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -0
  164. package/scripts/lib/ciclo-autonomo/fallback.js +77 -0
  165. package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -0
  166. package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -0
  167. package/scripts/lib/ciclo-autonomo/index.js +301 -0
  168. package/scripts/lib/ciclo-autonomo/lock.js +124 -0
  169. package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -0
  170. package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -0
  171. package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -0
  172. package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -0
  173. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -0
  174. package/scripts/lib/estado.js +9 -0
  175. package/scripts/lib/evidencia-valor.js +1 -1
  176. package/scripts/lib/gitignore-manifest.js +8 -1
  177. package/scripts/lib/hooks-settings.js +45 -0
  178. package/scripts/rotar-audit-logs.js +48 -2
  179. package/scripts/run-eval.js +1 -0
  180. package/scripts/run-skill-evals.js +287 -8
  181. package/scripts/smoke-test.js +16 -8
  182. package/scripts/tui/pantallas/install-wizard.js +403 -347
  183. package/scripts/validar.js +40 -1
@@ -1,433 +1,433 @@
1
- ---
2
- name: swl:nemesis
3
- description: >
4
- Auditoría iterativa Feynman + State Inconsistency con loop evaluator-optimizer
5
- opcional. Sin flag --remediar: solo audita (comportamiento clásico de
6
- v1.5.x). Con --remediar: ciclo audit→fix→re-audit hasta convergencia
7
- (max 3 iteraciones, Recovery Catalog si no converge). Modo redistribuido
8
- automático para scope > 1500 LOC o > 5 archivos en módulos distintos.
9
- Persiste hallazgos en .planning/audit/findings/iter-N/.
10
- allowed-tools: [Read, Grep, Glob, Bash, Write, Agent, Skill]
11
- argument-hint: "[--remediar] [--pass1 | --pass2 | --continue] [--modulo <ruta>] [--redistribuir] [--reset-plan] [--cross-model]"
12
- ---
13
-
14
- # /swl:nemesis — Auditoría iterativa con remediación opt-in
15
-
16
- Dos auditores en loop interno (Feynman + State Inconsistency) detectan bugs de
17
- profundidad que el código superficialmente correcto esconde. Con el flag
18
- `--remediar` el comando entra en modo **evaluator-optimizer** (patrón oficial
19
- de Anthropic, ADR-0021): el agente nemesis evalúa, el orquestador-swl remedia,
20
- y el ciclo continúa hasta convergencia o agotar el guardrail de 3 iteraciones.
21
-
22
- ## Cuándo invocar
23
-
24
- - El módulo pasó `/swl:revisar` con score ≥ 9.0 pero hay sospechas de bugs
25
- de lógica profunda que el revisor de código no captura (suposiciones
26
- incorrectas, invariantes rotos, condiciones de carrera sutiles).
27
- - Antes de un release de componente crítico: auth, pagos, contratos, permisos.
28
- - Cuando un bug en producción se atribuye a lógica aparentemente correcta —
29
- usar Nemesis para encontrar el patrón de fallo subyacente.
30
- - Para módulos legacy con alta deuda técnica donde los tests no cubren los
31
- caminos de estado.
32
- - **Para cerrar el loop audit→fix→re-audit en una sola invocación**: usar
33
- `/swl:nemesis --remediar`. La autonomía es opt-in.
34
-
35
- ## Cuándo NO invocar
36
-
37
- - El módulo tiene menos de 200 LOC y es CRUD simple sin lógica de negocio.
38
- - Se necesita revisión de estilo, naming o cobertura de tests — usar
39
- `/swl:revisar` en su lugar.
40
- - El proyecto no tiene `agentes/nemesis-auditor-swl.md` instalado — verificar
41
- con `ls agentes/ | grep nemesis` antes de invocar.
42
- - La tarea urgente es un hotfix en producción — Nemesis con `--remediar` es
43
- deliberado (8-30 turnos); en incidente activo, usar `/swl:verificar` acotado.
44
-
45
- ## Modos disponibles
46
-
47
- | Modo | Flag | Descripción |
48
- |---|---|---|
49
- | **Solo auditar** (default) | (sin flag) | Pasada 1 (Feynman) + Pasada 2 (State) + N alternadas hasta convergencia interna, máximo 6 pasadas. Entrega reporte. NO remedia. Retrocompatible con v1.5.x. |
50
- | **Loop completo** | `--remediar` | Evaluator-optimizer: audita → invoca `orquestador-swl` con hallazgos → re-audita. Max 3 iteraciones. Convergencia cuando status=PASS. Recovery Catalog si no converge. |
51
- | Solo Feynman | `--pass1` | Una pasada Feynman exhaustiva; no ejecuta State. Ortogonal a `--remediar`. |
52
- | Solo State | `--pass2` | Una pasada State Inconsistency; puede alimentarse con findings previos. |
53
- | Retomar | `--continue` | Continúa desde la última iteración registrada en `.planning/audit/findings/`. |
54
- | Acotar módulo | `--modulo <ruta>` | Limita el scope a un archivo o subdirectorio específico. Se combina con cualquier otro flag. |
55
- | Forzar redistribución | `--redistribuir` | Activa `Skill("nemesis-redistribuir")` aunque scope sea menor al umbral. |
56
- | Reset del plan | `--reset-plan` | Regenera `nemesis-plan.json` desde cero (descarta plan previo). |
57
- | **Revisión cross-modelo** | `--cross-model` | Opt-in: rutea la evaluación a un reviewer en OTRO modelo (vía MCP, p.ej. `gemini-review`/`codex-review`) para combatir *self-preferential bias*. Degrada al reviewer same-model si no hay MCP configurado (anuncia la degradación). Combina con `--remediar`. Ver `Skill("proceso-dynamic-workflows") § Revisión cross-modelo`. |
58
-
59
- ## Revisión cross-modelo (`--cross-model`)
60
-
61
- El reviewer adversarial en el MISMO modelo aún arrastra *self-preferential bias*
62
- (uno de los 3 modos de falla nombrados en el blog oficial de dynamic workflows).
63
- `--cross-model` hace que la evaluación la emita un modelo DISTINTO al ejecutor:
64
-
65
- - **Wiring (opt-in, ligero)**: si hay un MCP reviewer configurado (patrón ARIS
66
- `gemini-review`/`codex-review`: expone `review`/`review_reply`, devuelve JSON con
67
- `threadId` + `response`), el paso de evaluación se rutea a ese MCP. swl-ses NO
68
- embebe el servidor — lo provee el usuario con su API key del otro modelo.
69
- - **Degradación explícita** (regla `arreglar-al-detectar.md` / no-fallback-silencioso):
70
- si el MCP no está disponible, NO falla — usa el reviewer same-model y **anuncia**
71
- "cross-model solicitado pero MCP ausente → degradado a same-model".
72
- - **Reviewer memory + debate** (de ARIS `auto-review-loop`): el reviewer externo
73
- arrastra sospechas entre iteraciones (un `threadId`); el ejecutor puede rebatir,
74
- el reviewer falla el veredicto final — *"it can drive, never acquit"*.
75
- - **Trazabilidad**: el JSON del reviewer (`threadId`, `response`, score) se persiste
76
- junto a `evaluacion.json` en `.planning/audit/findings/iter-N/` → veredicto
77
- independiente auditable.
78
-
79
- Detalle del patrón: `Skill("proceso-dynamic-workflows") § Revisión cross-modelo`.
80
-
81
- ## Flujo completo con `--remediar`
82
-
83
- ```
84
- # iter usa indexing 1-based para alinear con el agente y los output paths
85
- # (.planning/audit/findings/iter-1/, iter-2/, iter-3/). Max 3 iteraciones.
86
- iter = 1
87
- MAX_ITER = 3
88
- evaluacion = null
89
-
90
- # Fase 0 del comando: análisis del scope
91
- loc_total, modulos = analizar_scope(modulo_arg or "directorio actual")
92
-
93
- # Decisión de redistribuir:
94
- # 1. --redistribuir explícito siempre activa redistribución (override del usuario).
95
- # 2. --modulo respeta el scope acotado por el usuario y NO redistribuye, aunque
96
- # excede umbrales. El usuario ya delimitó intencionalmente.
97
- # 3. Sin --modulo: umbrales automáticos (> 1500 LOC ó > 5 módulos distintos).
98
- redistribuir = flag_redistribuir or (
99
- not flag_modulo and (loc_total > 1500 or modulos > 5)
100
- )
101
-
102
- if redistribuir:
103
- cargar Skill("nemesis-redistribuir")
104
- plan = generar_plan_redistribuido(scope)
105
- persistir plan en .planning/audit/nemesis-plan.json
106
- sub_scopes = plan.sub_scopes
107
- else:
108
- sub_scopes = [scope_unico]
109
-
110
- # Fase 1+: loop evaluator-optimizer (iter ∈ {1, 2, 3})
111
- while iter <= MAX_ITER:
112
- # Evaluator: invocar nemesis-auditor-swl una vez por sub-scope.
113
- # En modo redistribuido cada sub_scope tiene un `id` (declarado en
114
- # nemesis-plan.json) que el agente USA para construir la ruta de output
115
- # `.planning/audit/findings/iter-N/<sub_id>/`. Sin sub_id, los reportes
116
- # se sobrescribirían entre sub-scopes. En modo monolítico sub_id queda
117
- # `null` y el agente escribe a `iter-N/` (sin subdirectorio).
118
- for sub_scope in sub_scopes:
119
- sub_id = sub_scope.id if redistribuir else null
120
- invocar(nemesis-auditor-swl, sub_scope, iter=iter, sub_id=sub_id)
121
- # Produce:
122
- # redistribuido → .planning/audit/findings/iter-N/<sub_id>/evaluacion.json + .md
123
- # monolítico → .planning/audit/findings/iter-N/evaluacion.json + .md
124
-
125
- # Consolidar (si modo redistribuido)
126
- evaluacion = consolidar_evaluaciones(iter)
127
- # Produce: .planning/audit/findings/iter-N/evaluacion.json consolidado
128
- # (en modo monolítico no hay consolidación: el archivo ya está en iter-N/)
129
-
130
- # Decisión sobre el JSON consolidado
131
- if evaluacion.veredicto.status == "PASS":
132
- emitir_reporte_final(evaluacion)
133
- return { exito: True, iters: iter, evaluacion } # convergencia
134
-
135
- if not flag_remediar:
136
- emitir_reporte(evaluacion)
137
- return { exito: False, iters: iter, evaluacion } # solo audita
138
-
139
- if evaluacion.veredicto.status == "FAIL":
140
- return activar_recovery_catalog("escalate", evaluacion.veredicto.razon_si_fail)
141
-
142
- if not evaluacion.veredicto.puede_remediar_automaticamente:
143
- return activar_recovery_catalog("escalate", "Hallazgos no auto-remediables")
144
-
145
- # Generator: invocar orquestador-swl con hallazgos como input
146
- invocar(
147
- orquestador-swl,
148
- hallazgos=evaluacion.hallazgos,
149
- feedback=evaluacion,
150
- intentos_previos=hallazgos_de_iters_anteriores(iter),
151
- iter=iter,
152
- )
153
- iter += 1
154
-
155
- # max-iter agotado sin PASS
156
- return activar_recovery_catalog_secuencial(evaluacion)
157
- # orden: reprompt(1ª) → reduce-autonomy(2ª) → escalate(3ª)
158
- ```
159
-
160
- Los `return` son explícitos. Sin `--remediar`, el `return` del bloque
161
- `if not flag_remediar` impide que el flujo alcance la invocación del
162
- orquestador. La retrocompatibilidad es por construcción.
163
-
164
- ## Activación de redistribución (Fase 0)
165
-
166
- | Condición | Acción |
167
- |---|---|
168
- | `loc_total > 1500` | Cargar `Skill("nemesis-redistribuir")` |
169
- | `archivos_modulos_distintos > 5` | Cargar `Skill("nemesis-redistribuir")` |
170
- | `--redistribuir` explícito | Cargar `Skill("nemesis-redistribuir")` |
171
- | `--modulo <ruta>` con scope acotado | NO redistribuir (respetar decisión explícita del usuario) |
172
-
173
- Cuando se activa, el comando registra un nudge en `.planning/nudges.jsonl`:
174
-
175
- ```json
176
- {
177
- "timestamp": "<ISO 8601>",
178
- "tipo": "nemesis-redistribuido",
179
- "mutation_category": "scope-adaptation",
180
- "risk_level": "low",
181
- "razon": "loc_total=3170 (>1500)",
182
- "sub_scopes": 3,
183
- "archivo_plan": ".planning/audit/nemesis-plan.json"
184
- }
185
- ```
186
-
187
- ## Recovery Catalog cuando max-iter sin PASS
188
-
189
- Tras 3 iteraciones del loop sin alcanzar `status=PASS`, el comando aplica en
190
- orden estricto el catálogo de `reglas/seguridad-agentes.md § Recovery Catalog`:
191
-
192
- 1. **reprompt** (excedencia 1): re-invoca al orquestador con feedback reforzado
193
- (qué hallazgos quedaron sin resolver, constraints adicionales). Una sola vez.
194
- 2. **reduce-autonomy** (excedencia 2 consecutiva): baja `nivelRiesgo` efectivo,
195
- pide confirmación al usuario antes de cada acción del generator.
196
- 3. **escalate** (excedencia 3): pausa la cadena, invoca `notificador-swl`,
197
- espera decisión humana del usuario.
198
- 4. **terminate**: solo si el evaluator detecta violación de regla de seguridad
199
- explícita (no por simple no-convergencia).
200
-
201
- Cada activación se registra en `.planning/nudges.jsonl` con
202
- `mutation_category: repair` y `risk_level` proporcional.
203
-
204
- ## Qué produce
205
-
206
- Estructura de salida bajo `.planning/audit/findings/`:
207
-
208
- ```
209
- .planning/audit/findings/
210
- ├── nemesis-plan.json # solo si modo redistribuido
211
- ├── iter-1/
212
- │ ├── feynman-pass1.md # output crudo Feynman
213
- │ ├── feynman-pass2.md # si hubo segunda pasada Feynman
214
- │ ├── state-pass1.md # output crudo State
215
- │ ├── state-pass2.md # si hubo segunda pasada State
216
- │ ├── nemesis-verified.md # reporte legible consolidado
217
- │ ├── evaluacion.json # veredicto estructurado
218
- │ ├── sub-1/ # solo en modo redistribuido
219
- │ │ ├── feynman-pass1.md
220
- │ │ ├── state-pass1.md
221
- │ │ ├── nemesis-verified.md
222
- │ │ └── evaluacion.json
223
- │ ├── sub-2/
224
- │ └── sub-3/
225
- ├── iter-2/ # solo si --remediar y no convergió en iter 1
226
- │ └── (mismo formato)
227
- └── iter-3/ # último intento si --remediar y no convergió
228
- └── (mismo formato)
229
- ```
230
-
231
- Cada `evaluacion.json` sigue el schema `nemesis-evaluacion-json` v1.0.0.
232
-
233
- ### Telemetría de loop (obligatoria con `--remediar`)
234
-
235
- En modo `--remediar`, además de los `iter-N/` el comando registra la
236
- trayectoria en el formato estándar de telemetría de loops
237
- (`hooks/lib/loop-telemetry.js`). Esto habilita: inyección de estado por el
238
- hook `contexto-iteracion.js` durante las ejecuciones largas (8-30 turnos),
239
- detección de plateau, y lectura de la corrida por `/swl:status metricas`.
240
-
241
- - Al iniciar iter-1: `iniciarCorrida({tipo: 'nemesis', direccion: 'lower_is_better', config: {modulo, maxIter: 3}})`.
242
- - Tras cada iteración: `registrarIteracion(dir, {iteracion: N, metrica: criticos+altos, delta, estado: 'keep', descripcion: 'iter N: status=<status>, X criticos, Y altos'})`.
243
- - Al cerrar (PASS, FAIL o Recovery Catalog): `escribirHandoff(dir, {source: 'swl:nemesis', status, findings: <hallazgos residuales con archivo_linea>, config})`.
244
- Mapeo de status: PASS → `COMPLETO`, max iteraciones → `ACOTADO`, Recovery
245
- Catalog/escalada → `INTERRUMPIDO`.
246
-
247
- El `handoff.json` resultante es consumible por una corrida posterior de
248
- `/swl:verificar --until-converge` o por el orquestador (los `findings`
249
- traen `archivo_linea` verificable según `verificar-citas-normativas.md § Familia 2`).
250
-
251
- ## Cómo interpretar el reporte
252
-
253
- ### Severidades
254
-
255
- | Nivel | Criterio |
256
- |---|---|
257
- | CRÍTICO | Explotable sin precondiciones; pérdida de datos o control total |
258
- | ALTO | Explotable bajo condiciones razonables; impacto severo |
259
- | MEDIO | Requiere condiciones específicas; impacto moderado |
260
- | BAJO | Impacto menor o difícil de explotar; documentar para trazabilidad |
261
-
262
- ### Discovery path
263
-
264
- - `Feynman-only`: Feynman lo detectó; State no lo confirmó ni refutó.
265
- - `State-only`: State Inconsistency lo encontró analizando mutaciones.
266
- - `Cross-feed Pass N → Pass M`: Feynman marcó un sospechoso en la pasada N;
267
- State lo confirmó como bug real en la pasada M (o viceversa). Estos
268
- hallazgos son los más confiables.
269
-
270
- ### Veredicto JSON
271
-
272
- Los tres status del JSON estructurado del evaluator (definidos canónicamente
273
- en `agentes/nemesis-auditor-swl.md § Veredicto status`):
274
-
275
- - **`status: "PASS"`** — convergencia. 0 críticos + 0 altos. Pueden quedar
276
- hallazgos MEDIOS/BAJOS/informativos. El loop termina con éxito.
277
-
278
- - **`status: "NEEDS_IMPROVEMENT"`** — hay críticos o altos pero **todos** tienen
279
- `accion_sugerida` concreta + `agente_recomendado` válido. El comando con
280
- `--remediar` invoca al `orquestador-swl` automáticamente. Sin `--remediar`,
281
- el reporte queda como acción pendiente para el usuario.
282
-
283
- - **`status: "FAIL"`** — hay al menos un hallazgo que cumple cualquiera de:
284
- - Veto items según `reglas/gobernanza.md § Veto items`.
285
- - Cambio arquitectural ambiguo (requiere ADR / decisión del usuario).
286
- - Decisión de producto (comportamiento esperado no definido).
287
- - Datos de entrada inválidos en el alcance auditado.
288
-
289
- El loop se detiene de inmediato y escala a Recovery Catalog. Origen del
290
- refuerzo: SIGAF sesión 2026-05-21 (alineación L2 — el comando y el agente
291
- deben tener idéntico criterio de FAIL para evitar loops vacíos).
292
-
293
- **Regla de consistencia**: si esta sección del comando y la del agente
294
- diverge en wording, el agente es la fuente de verdad operacional (lo
295
- implementa). Actualizar el comando para alinear, NO al revés.
296
-
297
- ## Costo estimado
298
-
299
- | Modo | Turnos aproximados |
300
- |---|---|
301
- | Solo auditar, módulo pequeño (< 500 LOC) | 8-12 |
302
- | Solo auditar, módulo mediano (500-1500 LOC) | 12-18 |
303
- | Solo auditar, módulo grande (> 1500 LOC, modo redistribuido) | 18-30 |
304
- | `--remediar`, módulo pequeño, converge en 1 iter | 12-18 |
305
- | `--remediar`, módulo mediano, 2-3 iters | 20-40 |
306
- | `--remediar`, módulo grande con redistribución, 3 iters | 40-70 |
307
- | Solo `--pass1` o `--pass2` | 4-8 |
308
-
309
- El costo del modo `--remediar` es 3-5× el del modo solo auditar. Es opt-in
310
- deliberado del usuario, no default.
311
-
312
- ### Calibración para módulos pequeños con alta densidad de control de flujo
313
-
314
- Aunque la tabla estima 12-18 turnos para `--remediar` sobre módulo pequeño
315
- (< 500 LOC), el valor agregado es desproporcionadamente alto cuando el
316
- módulo concentra **lógica de control de flujo** (event handlers,
317
- callbacks, `setTimeout`/`setInterval`, readline, promises, race conditions).
318
- La densidad de bugs latentes en este tipo de código es alta, y nemesis los
319
- detecta donde la revisión one-shot no.
320
-
321
- **Patrón confirmado en swl-ses v1.6.0** (sesión 2026-05-16): `--remediar`
322
- sobre `scripts/lib/ui.js` (~300 LOC con spinner + readline + prompts)
323
- convergió en iter-2 con 15 turnos totales. Iter-1 detectó dos hallazgos
324
- adicionales que el fix manual no había detectado:
325
-
326
- - **F-1 (ALTO)**: listener leak de `process.once('exit')` acumulándose
327
- en loops que crean N spinners secuenciales → MaxListenersExceededWarning.
328
- - **F-2 (MEDIO)**: `preguntarOpcion` llamaba `_pausarSpinnersActivos()`
329
- DESPUÉS del primer `console.log` del menú, dejando una ventana donde
330
- el tick del spinner sobrescribía la primera línea.
331
-
332
- Iter-2 confirmó PASS tras aplicar ambos fixes. Ninguno habría sido
333
- detectado por `/swl:revisar` o `revisor-codigo-swl` solos — ambos
334
- requirieron el reasoning iterativo Feynman+State.
335
-
336
- **Regla operativa**: tras commits de fix-only en módulos con alta densidad
337
- de control de flujo (no en módulos CRUD puros), correr `--remediar`
338
- acotado al módulo. La inversión de 15 turnos típicamente detecta 1-2
339
- bugs adyacentes que el fix original no cubrió.
340
-
341
- ## Ejemplos de invocación
342
-
343
- ```bash
344
- # Modo clásico (retrocompatibilidad v1.5.x): solo audita
345
- /swl:nemesis
346
- /swl:nemesis --modulo backend/app/auth
347
-
348
- # Solo una pasada específica
349
- /swl:nemesis --pass1 --modulo backend/app/auth
350
- /swl:nemesis --pass2
351
-
352
- # Retomar auditoría interrumpida
353
- /swl:nemesis --continue
354
-
355
- # Modo evaluator-optimizer completo (nuevo en v1.5.2)
356
- /swl:nemesis --remediar --modulo backend/app/auth
357
- /swl:nemesis --remediar # scope = directorio actual
358
- /swl:nemesis --remediar --modulo database/schemas # módulo grande → activa redistribución
359
-
360
- # Forzar redistribución aunque scope sea pequeño
361
- /swl:nemesis --redistribuir --modulo backend/app/auth
362
- ```
363
-
364
- ## Inyectar foco adicional durante el loop con `SendMessage`
365
-
366
- Durante una ejecución `--remediar` larga (8-30 turnos en módulos grandes), el
367
- usuario humano puede observar que el evaluator está siguiendo una pista débil
368
- o ignorando una sospecha concreta. **No es necesario abortar el comando** —
369
- usar `SendMessage` para inyectar foco adicional al agente en curso sin perder
370
- el progreso del loop.
371
-
372
- Patrón validado (origen: SIGAF sesión 2026-05-21, mejora D1):
373
-
374
- ```
375
- # El usuario ve en el chat que la iteración 2 está auditando solo
376
- # permisos y olvida revisar el invariante de auditoría.
377
- # SendMessage al agente activo:
378
-
379
- SendMessage({
380
- to: "nemesis-auditor-swl", // o el nombre asignado del agente activo
381
- message: "Antes de cerrar iteración 2: revisa también el invariante de
382
- auditoría inmutable en module/audit/handlers.py. Sospecho que
383
- handle_revoke() escribe a la tabla aprobaciones_historial sin
384
- verificar que el VBO original siga vigente."
385
- });
386
- ```
387
-
388
- El agente recibe el mensaje en su próximo turno y lo trata como instrucción
389
- adicional sin reiniciar el loop. El registro `audit/findings/iter-N/` queda
390
- intacto.
391
-
392
- **Cuándo aplicar**:
393
-
394
- - El loop lleva ≥2 iteraciones y el reporte sugiere que olvida un patrón obvio
395
- para el contexto del módulo.
396
- - Se detecta que el evaluator está dando vueltas sobre el mismo hallazgo de
397
- baja severidad y conviene priorizar otra zona del código.
398
- - El usuario tiene contexto adicional (incidente reciente, decisión de ADR
399
- no documentado en CLAUDE.md) que el agente no puede inferir solo.
400
-
401
- **Cuándo NO aplicar**:
402
-
403
- - La iteración actual está progresando bien — no interrumpir loops que
404
- convergen.
405
- - El cambio que se quiere inyectar es de scope (cambiar `--modulo`): ahí sí
406
- abortar con Ctrl+C, reset con `--reset-plan` y re-invocar.
407
- - Inyectar instrucciones contradictorias con el plan congelado del loop —
408
- viola regla `seguridad-agentes.md § Anti-proxy-goal-drift`.
409
-
410
- ## Regla obligatoria sobre las citas archivo:línea del reporte
411
-
412
- Cuando se actúe sobre un hallazgo `archivo:linea` reportado por el evaluator,
413
- **verificar la cita** con `Read` antes de aplicar el fix. Esto es directiva de
414
- la regla global `verificar-citas-normativas.md` Familia 2 — citas
415
- archivo:línea en reportes de auditoría DEBEN re-verificarse contra el código
416
- actual antes de tomar acción. El loop de remediación NO sustituye esta
417
- verificación — el generator (orquestador-swl + agentes de stack) debe leer el
418
- archivo en su HEAD actual antes de modificar.
419
-
420
- ## Referencias
421
-
422
- - ADR-0021: `nemesis-evaluator-optimizer` — diseño completo del patrón.
423
- - ADR-0018: introducción del agente nemesis-auditor-swl.
424
- - `agentes/nemesis-auditor-swl.md`: agente evaluator.
425
- - `agentes/orquestador-swl.md`: agente generator (delega a depurador, backend-*, frontend-*, etc.).
426
- - `habilidades/nemesis-evaluacion-json/SKILL.md`: schema del JSON estructurado.
427
- - `habilidades/nemesis-redistribuir/SKILL.md`: modo redistribuido para scope grande.
428
- - `reglas/seguridad-agentes.md § Recovery Catalog`: manejo de no-convergencia.
429
- - Cookbook Anthropic, patrón evaluator-optimizer:
430
- https://github.com/anthropics/anthropic-cookbook/blob/main/patterns/agents/evaluator_optimizer.ipynb
431
-
432
- <!-- Adaptado de nemesis-auditor-main bajo MIT License (transmissions11/nemesis-auditor) -->
433
- <!-- Loop evaluator-optimizer agregado en v1.6.0 (ADR-0021), 2026-05-16 -->
1
+ ---
2
+ name: swl:nemesis
3
+ description: >
4
+ Auditoría iterativa Feynman + State Inconsistency con loop evaluator-optimizer
5
+ opcional. Sin flag --remediar: solo audita (comportamiento clásico de
6
+ v1.5.x). Con --remediar: ciclo audit→fix→re-audit hasta convergencia
7
+ (max 3 iteraciones, Recovery Catalog si no converge). Modo redistribuido
8
+ automático para scope > 1500 LOC o > 5 archivos en módulos distintos.
9
+ Persiste hallazgos en .planning/audit/findings/iter-N/.
10
+ allowed-tools: [Read, Grep, Glob, Bash, Write, Agent, Skill]
11
+ argument-hint: "[--remediar] [--pass1 | --pass2 | --continue] [--modulo <ruta>] [--redistribuir] [--reset-plan] [--cross-model]"
12
+ ---
13
+
14
+ # /swl:nemesis — Auditoría iterativa con remediación opt-in
15
+
16
+ Dos auditores en loop interno (Feynman + State Inconsistency) detectan bugs de
17
+ profundidad que el código superficialmente correcto esconde. Con el flag
18
+ `--remediar` el comando entra en modo **evaluator-optimizer** (patrón oficial
19
+ de Anthropic, ADR-0021): el agente nemesis evalúa, el orquestador-swl remedia,
20
+ y el ciclo continúa hasta convergencia o agotar el guardrail de 3 iteraciones.
21
+
22
+ ## Cuándo invocar
23
+
24
+ - El módulo pasó `/swl:revisar` con score ≥ 9.0 pero hay sospechas de bugs
25
+ de lógica profunda que el revisor de código no captura (suposiciones
26
+ incorrectas, invariantes rotos, condiciones de carrera sutiles).
27
+ - Antes de un release de componente crítico: auth, pagos, contratos, permisos.
28
+ - Cuando un bug en producción se atribuye a lógica aparentemente correcta —
29
+ usar Nemesis para encontrar el patrón de fallo subyacente.
30
+ - Para módulos legacy con alta deuda técnica donde los tests no cubren los
31
+ caminos de estado.
32
+ - **Para cerrar el loop audit→fix→re-audit en una sola invocación**: usar
33
+ `/swl:nemesis --remediar`. La autonomía es opt-in.
34
+
35
+ ## Cuándo NO invocar
36
+
37
+ - El módulo tiene menos de 200 LOC y es CRUD simple sin lógica de negocio.
38
+ - Se necesita revisión de estilo, naming o cobertura de tests — usar
39
+ `/swl:revisar` en su lugar.
40
+ - El proyecto no tiene `agentes/nemesis-auditor-swl.md` instalado — verificar
41
+ con `ls agentes/ | grep nemesis` antes de invocar.
42
+ - La tarea urgente es un hotfix en producción — Nemesis con `--remediar` es
43
+ deliberado (8-30 turnos); en incidente activo, usar `/swl:verificar` acotado.
44
+
45
+ ## Modos disponibles
46
+
47
+ | Modo | Flag | Descripción |
48
+ |---|---|---|
49
+ | **Solo auditar** (default) | (sin flag) | Pasada 1 (Feynman) + Pasada 2 (State) + N alternadas hasta convergencia interna, máximo 6 pasadas. Entrega reporte. NO remedia. Retrocompatible con v1.5.x. |
50
+ | **Loop completo** | `--remediar` | Evaluator-optimizer: audita → invoca `orquestador-swl` con hallazgos → re-audita. Max 3 iteraciones. Convergencia cuando status=PASS. Recovery Catalog si no converge. |
51
+ | Solo Feynman | `--pass1` | Una pasada Feynman exhaustiva; no ejecuta State. Ortogonal a `--remediar`. |
52
+ | Solo State | `--pass2` | Una pasada State Inconsistency; puede alimentarse con findings previos. |
53
+ | Retomar | `--continue` | Continúa desde la última iteración registrada en `.planning/audit/findings/`. |
54
+ | Acotar módulo | `--modulo <ruta>` | Limita el scope a un archivo o subdirectorio específico. Se combina con cualquier otro flag. |
55
+ | Forzar redistribución | `--redistribuir` | Activa `Skill("nemesis-redistribuir")` aunque scope sea menor al umbral. |
56
+ | Reset del plan | `--reset-plan` | Regenera `nemesis-plan.json` desde cero (descarta plan previo). |
57
+ | **Revisión cross-modelo** | `--cross-model` | Opt-in: rutea la evaluación a un reviewer en OTRO modelo (vía MCP, p.ej. `gemini-review`/`codex-review`) para combatir *self-preferential bias*. Degrada al reviewer same-model si no hay MCP configurado (anuncia la degradación). Combina con `--remediar`. Ver `Skill("proceso-dynamic-workflows") § Revisión cross-modelo`. |
58
+
59
+ ## Revisión cross-modelo (`--cross-model`)
60
+
61
+ El reviewer adversarial en el MISMO modelo aún arrastra *self-preferential bias*
62
+ (uno de los 3 modos de falla nombrados en el blog oficial de dynamic workflows).
63
+ `--cross-model` hace que la evaluación la emita un modelo DISTINTO al ejecutor:
64
+
65
+ - **Wiring (opt-in, ligero)**: si hay un MCP reviewer configurado (patrón ARIS
66
+ `gemini-review`/`codex-review`: expone `review`/`review_reply`, devuelve JSON con
67
+ `threadId` + `response`), el paso de evaluación se rutea a ese MCP. swl-ses NO
68
+ embebe el servidor — lo provee el usuario con su API key del otro modelo.
69
+ - **Degradación explícita** (regla `arreglar-al-detectar.md` / no-fallback-silencioso):
70
+ si el MCP no está disponible, NO falla — usa el reviewer same-model y **anuncia**
71
+ "cross-model solicitado pero MCP ausente → degradado a same-model".
72
+ - **Reviewer memory + debate** (de ARIS `auto-review-loop`): el reviewer externo
73
+ arrastra sospechas entre iteraciones (un `threadId`); el ejecutor puede rebatir,
74
+ el reviewer falla el veredicto final — *"it can drive, never acquit"*.
75
+ - **Trazabilidad**: el JSON del reviewer (`threadId`, `response`, score) se persiste
76
+ junto a `evaluacion.json` en `.planning/audit/findings/iter-N/` → veredicto
77
+ independiente auditable.
78
+
79
+ Detalle del patrón: `Skill("proceso-dynamic-workflows") § Revisión cross-modelo`.
80
+
81
+ ## Flujo completo con `--remediar`
82
+
83
+ ```
84
+ # iter usa indexing 1-based para alinear con el agente y los output paths
85
+ # (.planning/audit/findings/iter-1/, iter-2/, iter-3/). Max 3 iteraciones.
86
+ iter = 1
87
+ MAX_ITER = 3
88
+ evaluacion = null
89
+
90
+ # Fase 0 del comando: análisis del scope
91
+ loc_total, modulos = analizar_scope(modulo_arg or "directorio actual")
92
+
93
+ # Decisión de redistribuir:
94
+ # 1. --redistribuir explícito siempre activa redistribución (override del usuario).
95
+ # 2. --modulo respeta el scope acotado por el usuario y NO redistribuye, aunque
96
+ # excede umbrales. El usuario ya delimitó intencionalmente.
97
+ # 3. Sin --modulo: umbrales automáticos (> 1500 LOC ó > 5 módulos distintos).
98
+ redistribuir = flag_redistribuir or (
99
+ not flag_modulo and (loc_total > 1500 or modulos > 5)
100
+ )
101
+
102
+ if redistribuir:
103
+ cargar Skill("nemesis-redistribuir")
104
+ plan = generar_plan_redistribuido(scope)
105
+ persistir plan en .planning/audit/nemesis-plan.json
106
+ sub_scopes = plan.sub_scopes
107
+ else:
108
+ sub_scopes = [scope_unico]
109
+
110
+ # Fase 1+: loop evaluator-optimizer (iter ∈ {1, 2, 3})
111
+ while iter <= MAX_ITER:
112
+ # Evaluator: invocar nemesis-auditor-swl una vez por sub-scope.
113
+ # En modo redistribuido cada sub_scope tiene un `id` (declarado en
114
+ # nemesis-plan.json) que el agente USA para construir la ruta de output
115
+ # `.planning/audit/findings/iter-N/<sub_id>/`. Sin sub_id, los reportes
116
+ # se sobrescribirían entre sub-scopes. En modo monolítico sub_id queda
117
+ # `null` y el agente escribe a `iter-N/` (sin subdirectorio).
118
+ for sub_scope in sub_scopes:
119
+ sub_id = sub_scope.id if redistribuir else null
120
+ invocar(nemesis-auditor-swl, sub_scope, iter=iter, sub_id=sub_id)
121
+ # Produce:
122
+ # redistribuido → .planning/audit/findings/iter-N/<sub_id>/evaluacion.json + .md
123
+ # monolítico → .planning/audit/findings/iter-N/evaluacion.json + .md
124
+
125
+ # Consolidar (si modo redistribuido)
126
+ evaluacion = consolidar_evaluaciones(iter)
127
+ # Produce: .planning/audit/findings/iter-N/evaluacion.json consolidado
128
+ # (en modo monolítico no hay consolidación: el archivo ya está en iter-N/)
129
+
130
+ # Decisión sobre el JSON consolidado
131
+ if evaluacion.veredicto.status == "PASS":
132
+ emitir_reporte_final(evaluacion)
133
+ return { exito: True, iters: iter, evaluacion } # convergencia
134
+
135
+ if not flag_remediar:
136
+ emitir_reporte(evaluacion)
137
+ return { exito: False, iters: iter, evaluacion } # solo audita
138
+
139
+ if evaluacion.veredicto.status == "FAIL":
140
+ return activar_recovery_catalog("escalate", evaluacion.veredicto.razon_si_fail)
141
+
142
+ if not evaluacion.veredicto.puede_remediar_automaticamente:
143
+ return activar_recovery_catalog("escalate", "Hallazgos no auto-remediables")
144
+
145
+ # Generator: invocar orquestador-swl con hallazgos como input
146
+ invocar(
147
+ orquestador-swl,
148
+ hallazgos=evaluacion.hallazgos,
149
+ feedback=evaluacion,
150
+ intentos_previos=hallazgos_de_iters_anteriores(iter),
151
+ iter=iter,
152
+ )
153
+ iter += 1
154
+
155
+ # max-iter agotado sin PASS
156
+ return activar_recovery_catalog_secuencial(evaluacion)
157
+ # orden: reprompt(1ª) → reduce-autonomy(2ª) → escalate(3ª)
158
+ ```
159
+
160
+ Los `return` son explícitos. Sin `--remediar`, el `return` del bloque
161
+ `if not flag_remediar` impide que el flujo alcance la invocación del
162
+ orquestador. La retrocompatibilidad es por construcción.
163
+
164
+ ## Activación de redistribución (Fase 0)
165
+
166
+ | Condición | Acción |
167
+ |---|---|
168
+ | `loc_total > 1500` | Cargar `Skill("nemesis-redistribuir")` |
169
+ | `archivos_modulos_distintos > 5` | Cargar `Skill("nemesis-redistribuir")` |
170
+ | `--redistribuir` explícito | Cargar `Skill("nemesis-redistribuir")` |
171
+ | `--modulo <ruta>` con scope acotado | NO redistribuir (respetar decisión explícita del usuario) |
172
+
173
+ Cuando se activa, el comando registra un nudge en `.planning/nudges.jsonl`:
174
+
175
+ ```json
176
+ {
177
+ "timestamp": "<ISO 8601>",
178
+ "tipo": "nemesis-redistribuido",
179
+ "mutation_category": "scope-adaptation",
180
+ "risk_level": "low",
181
+ "razon": "loc_total=3170 (>1500)",
182
+ "sub_scopes": 3,
183
+ "archivo_plan": ".planning/audit/nemesis-plan.json"
184
+ }
185
+ ```
186
+
187
+ ## Recovery Catalog cuando max-iter sin PASS
188
+
189
+ Tras 3 iteraciones del loop sin alcanzar `status=PASS`, el comando aplica en
190
+ orden estricto el catálogo de `reglas/seguridad-agentes.md § Recovery Catalog`:
191
+
192
+ 1. **reprompt** (excedencia 1): re-invoca al orquestador con feedback reforzado
193
+ (qué hallazgos quedaron sin resolver, constraints adicionales). Una sola vez.
194
+ 2. **reduce-autonomy** (excedencia 2 consecutiva): baja `nivelRiesgo` efectivo,
195
+ pide confirmación al usuario antes de cada acción del generator.
196
+ 3. **escalate** (excedencia 3): pausa la cadena, invoca `notificador-swl`,
197
+ espera decisión humana del usuario.
198
+ 4. **terminate**: solo si el evaluator detecta violación de regla de seguridad
199
+ explícita (no por simple no-convergencia).
200
+
201
+ Cada activación se registra en `.planning/nudges.jsonl` con
202
+ `mutation_category: repair` y `risk_level` proporcional.
203
+
204
+ ## Qué produce
205
+
206
+ Estructura de salida bajo `.planning/audit/findings/`:
207
+
208
+ ```
209
+ .planning/audit/findings/
210
+ ├── nemesis-plan.json # solo si modo redistribuido
211
+ ├── iter-1/
212
+ │ ├── feynman-pass1.md # output crudo Feynman
213
+ │ ├── feynman-pass2.md # si hubo segunda pasada Feynman
214
+ │ ├── state-pass1.md # output crudo State
215
+ │ ├── state-pass2.md # si hubo segunda pasada State
216
+ │ ├── nemesis-verified.md # reporte legible consolidado
217
+ │ ├── evaluacion.json # veredicto estructurado
218
+ │ ├── sub-1/ # solo en modo redistribuido
219
+ │ │ ├── feynman-pass1.md
220
+ │ │ ├── state-pass1.md
221
+ │ │ ├── nemesis-verified.md
222
+ │ │ └── evaluacion.json
223
+ │ ├── sub-2/
224
+ │ └── sub-3/
225
+ ├── iter-2/ # solo si --remediar y no convergió en iter 1
226
+ │ └── (mismo formato)
227
+ └── iter-3/ # último intento si --remediar y no convergió
228
+ └── (mismo formato)
229
+ ```
230
+
231
+ Cada `evaluacion.json` sigue el schema `nemesis-evaluacion-json` v1.0.0.
232
+
233
+ ### Telemetría de loop (obligatoria con `--remediar`)
234
+
235
+ En modo `--remediar`, además de los `iter-N/` el comando registra la
236
+ trayectoria en el formato estándar de telemetría de loops
237
+ (`hooks/lib/loop-telemetry.js`). Esto habilita: inyección de estado por el
238
+ hook `contexto-iteracion.js` durante las ejecuciones largas (8-30 turnos),
239
+ detección de plateau, y lectura de la corrida por `/swl:status metricas`.
240
+
241
+ - Al iniciar iter-1: `iniciarCorrida({tipo: 'nemesis', direccion: 'lower_is_better', config: {modulo, maxIter: 3}})`.
242
+ - Tras cada iteración: `registrarIteracion(dir, {iteracion: N, metrica: criticos+altos, delta, estado: 'keep', descripcion: 'iter N: status=<status>, X criticos, Y altos'})`.
243
+ - Al cerrar (PASS, FAIL o Recovery Catalog): `escribirHandoff(dir, {source: 'swl:nemesis', status, findings: <hallazgos residuales con archivo_linea>, config})`.
244
+ Mapeo de status: PASS → `COMPLETO`, max iteraciones → `ACOTADO`, Recovery
245
+ Catalog/escalada → `INTERRUMPIDO`.
246
+
247
+ El `handoff.json` resultante es consumible por una corrida posterior de
248
+ `/swl:verificar --until-converge` o por el orquestador (los `findings`
249
+ traen `archivo_linea` verificable según `verificar-citas-normativas.md § Familia 2`).
250
+
251
+ ## Cómo interpretar el reporte
252
+
253
+ ### Severidades
254
+
255
+ | Nivel | Criterio |
256
+ |---|---|
257
+ | CRÍTICO | Explotable sin precondiciones; pérdida de datos o control total |
258
+ | ALTO | Explotable bajo condiciones razonables; impacto severo |
259
+ | MEDIO | Requiere condiciones específicas; impacto moderado |
260
+ | BAJO | Impacto menor o difícil de explotar; documentar para trazabilidad |
261
+
262
+ ### Discovery path
263
+
264
+ - `Feynman-only`: Feynman lo detectó; State no lo confirmó ni refutó.
265
+ - `State-only`: State Inconsistency lo encontró analizando mutaciones.
266
+ - `Cross-feed Pass N → Pass M`: Feynman marcó un sospechoso en la pasada N;
267
+ State lo confirmó como bug real en la pasada M (o viceversa). Estos
268
+ hallazgos son los más confiables.
269
+
270
+ ### Veredicto JSON
271
+
272
+ Los tres status del JSON estructurado del evaluator (definidos canónicamente
273
+ en `agentes/nemesis-auditor-swl.md § Veredicto status`):
274
+
275
+ - **`status: "PASS"`** — convergencia. 0 críticos + 0 altos. Pueden quedar
276
+ hallazgos MEDIOS/BAJOS/informativos. El loop termina con éxito.
277
+
278
+ - **`status: "NEEDS_IMPROVEMENT"`** — hay críticos o altos pero **todos** tienen
279
+ `accion_sugerida` concreta + `agente_recomendado` válido. El comando con
280
+ `--remediar` invoca al `orquestador-swl` automáticamente. Sin `--remediar`,
281
+ el reporte queda como acción pendiente para el usuario.
282
+
283
+ - **`status: "FAIL"`** — hay al menos un hallazgo que cumple cualquiera de:
284
+ - Veto items según `reglas/gobernanza.md § Veto items`.
285
+ - Cambio arquitectural ambiguo (requiere ADR / decisión del usuario).
286
+ - Decisión de producto (comportamiento esperado no definido).
287
+ - Datos de entrada inválidos en el alcance auditado.
288
+
289
+ El loop se detiene de inmediato y escala a Recovery Catalog. Origen del
290
+ refuerzo: SIGAF sesión 2026-05-21 (alineación L2 — el comando y el agente
291
+ deben tener idéntico criterio de FAIL para evitar loops vacíos).
292
+
293
+ **Regla de consistencia**: si esta sección del comando y la del agente
294
+ diverge en wording, el agente es la fuente de verdad operacional (lo
295
+ implementa). Actualizar el comando para alinear, NO al revés.
296
+
297
+ ## Costo estimado
298
+
299
+ | Modo | Turnos aproximados |
300
+ |---|---|
301
+ | Solo auditar, módulo pequeño (< 500 LOC) | 8-12 |
302
+ | Solo auditar, módulo mediano (500-1500 LOC) | 12-18 |
303
+ | Solo auditar, módulo grande (> 1500 LOC, modo redistribuido) | 18-30 |
304
+ | `--remediar`, módulo pequeño, converge en 1 iter | 12-18 |
305
+ | `--remediar`, módulo mediano, 2-3 iters | 20-40 |
306
+ | `--remediar`, módulo grande con redistribución, 3 iters | 40-70 |
307
+ | Solo `--pass1` o `--pass2` | 4-8 |
308
+
309
+ El costo del modo `--remediar` es 3-5× el del modo solo auditar. Es opt-in
310
+ deliberado del usuario, no default.
311
+
312
+ ### Calibración para módulos pequeños con alta densidad de control de flujo
313
+
314
+ Aunque la tabla estima 12-18 turnos para `--remediar` sobre módulo pequeño
315
+ (< 500 LOC), el valor agregado es desproporcionadamente alto cuando el
316
+ módulo concentra **lógica de control de flujo** (event handlers,
317
+ callbacks, `setTimeout`/`setInterval`, readline, promises, race conditions).
318
+ La densidad de bugs latentes en este tipo de código es alta, y nemesis los
319
+ detecta donde la revisión one-shot no.
320
+
321
+ **Patrón confirmado en swl-ses v1.6.0** (sesión 2026-05-16): `--remediar`
322
+ sobre `scripts/lib/ui.js` (~300 LOC con spinner + readline + prompts)
323
+ convergió en iter-2 con 15 turnos totales. Iter-1 detectó dos hallazgos
324
+ adicionales que el fix manual no había detectado:
325
+
326
+ - **F-1 (ALTO)**: listener leak de `process.once('exit')` acumulándose
327
+ en loops que crean N spinners secuenciales → MaxListenersExceededWarning.
328
+ - **F-2 (MEDIO)**: `preguntarOpcion` llamaba `_pausarSpinnersActivos()`
329
+ DESPUÉS del primer `console.log` del menú, dejando una ventana donde
330
+ el tick del spinner sobrescribía la primera línea.
331
+
332
+ Iter-2 confirmó PASS tras aplicar ambos fixes. Ninguno habría sido
333
+ detectado por `/swl:revisar` o `revisor-codigo-swl` solos — ambos
334
+ requirieron el reasoning iterativo Feynman+State.
335
+
336
+ **Regla operativa**: tras commits de fix-only en módulos con alta densidad
337
+ de control de flujo (no en módulos CRUD puros), correr `--remediar`
338
+ acotado al módulo. La inversión de 15 turnos típicamente detecta 1-2
339
+ bugs adyacentes que el fix original no cubrió.
340
+
341
+ ## Ejemplos de invocación
342
+
343
+ ```bash
344
+ # Modo clásico (retrocompatibilidad v1.5.x): solo audita
345
+ /swl:nemesis
346
+ /swl:nemesis --modulo backend/app/auth
347
+
348
+ # Solo una pasada específica
349
+ /swl:nemesis --pass1 --modulo backend/app/auth
350
+ /swl:nemesis --pass2
351
+
352
+ # Retomar auditoría interrumpida
353
+ /swl:nemesis --continue
354
+
355
+ # Modo evaluator-optimizer completo (nuevo en v1.5.2)
356
+ /swl:nemesis --remediar --modulo backend/app/auth
357
+ /swl:nemesis --remediar # scope = directorio actual
358
+ /swl:nemesis --remediar --modulo database/schemas # módulo grande → activa redistribución
359
+
360
+ # Forzar redistribución aunque scope sea pequeño
361
+ /swl:nemesis --redistribuir --modulo backend/app/auth
362
+ ```
363
+
364
+ ## Inyectar foco adicional durante el loop con `SendMessage`
365
+
366
+ Durante una ejecución `--remediar` larga (8-30 turnos en módulos grandes), el
367
+ usuario humano puede observar que el evaluator está siguiendo una pista débil
368
+ o ignorando una sospecha concreta. **No es necesario abortar el comando** —
369
+ usar `SendMessage` para inyectar foco adicional al agente en curso sin perder
370
+ el progreso del loop.
371
+
372
+ Patrón validado (origen: SIGAF sesión 2026-05-21, mejora D1):
373
+
374
+ ```
375
+ # El usuario ve en el chat que la iteración 2 está auditando solo
376
+ # permisos y olvida revisar el invariante de auditoría.
377
+ # SendMessage al agente activo:
378
+
379
+ SendMessage({
380
+ to: "nemesis-auditor-swl", // o el nombre asignado del agente activo
381
+ message: "Antes de cerrar iteración 2: revisa también el invariante de
382
+ auditoría inmutable en module/audit/handlers.py. Sospecho que
383
+ handle_revoke() escribe a la tabla aprobaciones_historial sin
384
+ verificar que el VBO original siga vigente."
385
+ });
386
+ ```
387
+
388
+ El agente recibe el mensaje en su próximo turno y lo trata como instrucción
389
+ adicional sin reiniciar el loop. El registro `audit/findings/iter-N/` queda
390
+ intacto.
391
+
392
+ **Cuándo aplicar**:
393
+
394
+ - El loop lleva ≥2 iteraciones y el reporte sugiere que olvida un patrón obvio
395
+ para el contexto del módulo.
396
+ - Se detecta que el evaluator está dando vueltas sobre el mismo hallazgo de
397
+ baja severidad y conviene priorizar otra zona del código.
398
+ - El usuario tiene contexto adicional (incidente reciente, decisión de ADR
399
+ no documentado en CLAUDE.md) que el agente no puede inferir solo.
400
+
401
+ **Cuándo NO aplicar**:
402
+
403
+ - La iteración actual está progresando bien — no interrumpir loops que
404
+ convergen.
405
+ - El cambio que se quiere inyectar es de scope (cambiar `--modulo`): ahí sí
406
+ abortar con Ctrl+C, reset con `--reset-plan` y re-invocar.
407
+ - Inyectar instrucciones contradictorias con el plan congelado del loop —
408
+ viola regla `seguridad-agentes.md § Anti-proxy-goal-drift`.
409
+
410
+ ## Regla obligatoria sobre las citas archivo:línea del reporte
411
+
412
+ Cuando se actúe sobre un hallazgo `archivo:linea` reportado por el evaluator,
413
+ **verificar la cita** con `Read` antes de aplicar el fix. Esto es directiva de
414
+ la regla global `verificar-citas-normativas.md` Familia 2 — citas
415
+ archivo:línea en reportes de auditoría DEBEN re-verificarse contra el código
416
+ actual antes de tomar acción. El loop de remediación NO sustituye esta
417
+ verificación — el generator (orquestador-swl + agentes de stack) debe leer el
418
+ archivo en su HEAD actual antes de modificar.
419
+
420
+ ## Referencias
421
+
422
+ - ADR-0021: `nemesis-evaluator-optimizer` — diseño completo del patrón.
423
+ - ADR-0018: introducción del agente nemesis-auditor-swl.
424
+ - `agentes/nemesis-auditor-swl.md`: agente evaluator.
425
+ - `agentes/orquestador-swl.md`: agente generator (delega a depurador, backend-*, frontend-*, etc.).
426
+ - `habilidades/nemesis-evaluacion-json/SKILL.md`: schema del JSON estructurado.
427
+ - `habilidades/nemesis-redistribuir/SKILL.md`: modo redistribuido para scope grande.
428
+ - `reglas/seguridad-agentes.md § Recovery Catalog`: manejo de no-convergencia.
429
+ - Cookbook Anthropic, patrón evaluator-optimizer:
430
+ https://github.com/anthropics/anthropic-cookbook/blob/main/patterns/agents/evaluator_optimizer.ipynb
431
+
432
+ <!-- Adaptado de nemesis-auditor-main bajo MIT License (transmissions11/nemesis-auditor) -->
433
+ <!-- Loop evaluator-optimizer agregado en v1.6.0 (ADR-0021), 2026-05-16 -->