@saulwade/swl-ses 2.3.1 → 2.4.1

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 (112) hide show
  1. package/CLAUDE.md +241 -240
  2. package/README.md +597 -597
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/agentes/accesibilidad-wcag-swl.md +690 -690
  6. package/agentes/arquitecto-swl.md +267 -267
  7. package/agentes/auto-evolucion-swl.md +908 -908
  8. package/agentes/backend-api-swl.md +472 -472
  9. package/agentes/backend-csharp-swl.md +420 -420
  10. package/agentes/backend-go-swl.md +390 -390
  11. package/agentes/backend-java-swl.md +281 -281
  12. package/agentes/backend-node-swl.md +479 -479
  13. package/agentes/backend-python-swl.md +605 -605
  14. package/agentes/backend-rust-swl.md +364 -364
  15. package/agentes/backend-workers-swl.md +482 -482
  16. package/agentes/cloud-infra-swl.md +509 -509
  17. package/agentes/consolidador-swl.md +541 -541
  18. package/agentes/datos-swl.md +605 -605
  19. package/agentes/depurador-swl.md +352 -352
  20. package/agentes/devops-ci-swl.md +400 -400
  21. package/agentes/disenador-ui-swl.md +569 -569
  22. package/agentes/documentador-swl.md +345 -345
  23. package/agentes/frontend-angular-swl.md +621 -621
  24. package/agentes/frontend-css-swl.md +716 -716
  25. package/agentes/frontend-react-swl.md +692 -692
  26. package/agentes/frontend-swl.md +496 -496
  27. package/agentes/frontend-tailwind-swl.md +826 -826
  28. package/agentes/gh-fix-ci-swl.md +275 -275
  29. package/agentes/implementador-swl.md +328 -328
  30. package/agentes/investigador-swl.md +432 -432
  31. package/agentes/investigador-ux-swl.md +505 -505
  32. package/agentes/llm-apps-swl.md +278 -278
  33. package/agentes/migrador-swl.md +442 -442
  34. package/agentes/mobile-android-swl.md +511 -511
  35. package/agentes/mobile-cross-swl.md +541 -541
  36. package/agentes/mobile-ios-swl.md +502 -502
  37. package/agentes/mobile-testing-swl.md +302 -302
  38. package/agentes/nemesis-auditor-swl.md +285 -285
  39. package/agentes/notificador-swl.md +918 -918
  40. package/agentes/observabilidad-swl.md +438 -438
  41. package/agentes/orquestador-swl.md +1053 -1026
  42. package/agentes/pagos-swl.md +310 -310
  43. package/agentes/perfilador-usuario-swl.md +321 -321
  44. package/agentes/planificador-swl.md +399 -399
  45. package/agentes/producto-prd-swl.md +589 -589
  46. package/agentes/red-team-swl.md +218 -218
  47. package/agentes/release-manager-swl.md +590 -590
  48. package/agentes/rendimiento-swl.md +713 -713
  49. package/agentes/resolutor-build-swl.md +245 -245
  50. package/agentes/revisor-angular-swl.md +278 -278
  51. package/agentes/revisor-codigo-swl.md +538 -505
  52. package/agentes/revisor-csharp-swl.md +264 -264
  53. package/agentes/revisor-go-swl.md +259 -259
  54. package/agentes/revisor-java-swl.md +257 -257
  55. package/agentes/revisor-kotlin-swl.md +273 -273
  56. package/agentes/revisor-nextjs-swl.md +281 -281
  57. package/agentes/revisor-php-swl.md +271 -271
  58. package/agentes/revisor-react-swl.md +278 -278
  59. package/agentes/revisor-rust-swl.md +346 -346
  60. package/agentes/revisor-seguridad-swl.md +399 -399
  61. package/agentes/revisor-swift-swl.md +268 -268
  62. package/agentes/revisor-typescript-swl.md +346 -346
  63. package/agentes/sre-swl.md +291 -291
  64. package/agentes/tdd-qa-swl.md +393 -393
  65. package/comandos/swl/contexto.md +0 -2
  66. package/comandos/swl/deuda-codigo.md +97 -0
  67. package/habilidades/angular-moderno/SKILL.md +5 -1
  68. package/habilidades/contenedores-docker/SKILL.md +3 -1
  69. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  70. package/habilidades/harness-claude-code/SKILL.md +4 -4
  71. package/habilidades/harness-claude-code/recursos/disciplina-harness-regla.md +6 -5
  72. package/habilidades/legacy-code-rescue/SKILL.md +2 -1
  73. package/habilidades/meta-skills-estandar/SKILL.md +1 -1
  74. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +2 -2
  75. package/habilidades/postgresql-experto/SKILL.md +3 -1
  76. package/habilidades/prevencion-sobreingenieria/SKILL.md +70 -92
  77. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -0
  78. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -0
  79. package/hooks/audit-trail.js +4 -4
  80. package/hooks/calidad-pre-commit.js +15 -11
  81. package/hooks/captura-acciones-post.js +3 -2
  82. package/hooks/captura-acciones-session.js +3 -2
  83. package/hooks/contexto-iteracion.js +2 -1
  84. package/hooks/contexto-subagente.js +68 -0
  85. package/hooks/guardrail-modelo.js +13 -3
  86. package/hooks/inyeccion-contexto.js +12 -12
  87. package/hooks/registro-turnos.js +5 -4
  88. package/hooks/spec-gate.js +2 -1
  89. package/hooks/sugerir-contribuir.js +2 -1
  90. package/hooks/sugerir-regenerar-inventario.js +3 -2
  91. package/hooks/tdd-gate.js +2 -1
  92. package/llms.txt +3 -3
  93. package/manifiestos/canonical-hashes.json +667 -10
  94. package/manifiestos/hook-profiles.json +0 -2
  95. package/manifiestos/hooks-config.json +469 -477
  96. package/manifiestos/invariantes-criticos.json +30 -0
  97. package/manifiestos/modulos.json +1390 -1390
  98. package/manifiestos/skills-lock.json +24 -24
  99. package/package.json +93 -93
  100. package/plugin.json +369 -371
  101. package/schemas/agent-frontmatter.schema.json +3 -1
  102. package/scripts/instalador.js +4 -1
  103. package/scripts/lib/expandir-targets.js +71 -71
  104. package/scripts/lib/preservar-usuario.js +39 -5
  105. package/scripts/lib/toml-merge.js +204 -204
  106. package/scripts/mcp-server/auth.js +105 -105
  107. package/scripts/mcp-server/cache.js +106 -106
  108. package/scripts/validar.js +1 -1
  109. package/scripts/verificar-release.js +51 -0
  110. package/hooks/lib/context-compressor.js +0 -657
  111. package/hooks/linea-estado.js +0 -328
  112. package/hooks/monitor-contexto.js +0 -373
@@ -1,477 +1,469 @@
1
- {
2
- "descripcion": "Configuración centralizada de hooks SWL. Define el evento, matcher y metadata de cada hook para registro automático en settings.json del runtime destino.",
3
- "prioridad_hooks": {
4
- "descripcion": "Orden de precedencia cuando múltiples hooks coinciden. Mayor prioridad gana.",
5
- "orden": [
6
- "settings.local.json (proyecto, no versionado — máxima prioridad)",
7
- "settings.json (proyecto, versionado — hooks SWL se registran aquí)",
8
- "~/.claude/settings.json (global del usuario — menor prioridad)"
9
- ],
10
- "regla": "Los hooks SWL SOLO se registran a nivel proyecto. Si existen a nivel global, el doctor los elimina para evitar ejecución duplicada."
11
- },
12
- "opciones_avanzadas_hooks": {
13
- "descripcion": "Campos opcionales soportados por Claude Code en cada hook entry.",
14
- "timeout": "Tiempo máximo en segundos antes de abortar el hook (default: 60)",
15
- "async": "Si true, el hook no bloquea la ejecución — corre en background (default: false)",
16
- "once": "Si true, el hook se ejecuta solo una vez por sesión (default: false)"
17
- },
18
- "riskThresholds": {
19
- "allow": 0.35,
20
- "review": 0.6,
21
- "confirm": 0.85
22
- },
23
- "costBudget": {
24
- "maxUsd": 10.0,
25
- "maxTokens": 500000,
26
- "alertAt": 0.8
27
- },
28
- "circuitBreaker": {
29
- "maxConsecutiveFailures": 3,
30
- "halfOpenCooldownMs": 300000,
31
- "auditThreshold": 10
32
- },
33
- "hooks": {
34
- "escaneo-secretos.js": {
35
- "event": "PreToolUse",
36
- "matcher": "Write|Edit",
37
- "description": "Bloquea escritura de archivos con secretos hardcodeados",
38
- "blocking": true,
39
- "maxConsecutiveFailures": 3,
40
- "degradeOnFailure": "block"
41
- },
42
- "proteccion-rutas.js": {
43
- "event": "PreToolUse",
44
- "matcher": "Write|Edit",
45
- "description": "Previene path traversal y escritura fuera del proyecto",
46
- "blocking": true,
47
- "maxConsecutiveFailures": 3,
48
- "degradeOnFailure": "block"
49
- },
50
- "calidad-pre-commit.js": {
51
- "event": "PreToolUse",
52
- "matcher": "Bash",
53
- "description": "Gate de calidad pre-commit (debug stmts, type hints, TODOs)",
54
- "blocking": true,
55
- "maxConsecutiveFailures": 3,
56
- "degradeOnFailure": "warn"
57
- },
58
- "linea-estado.js": {
59
- "event": "PostToolUse",
60
- "matcher": "",
61
- "description": "Muestra linea de estado con modelo, tarea y porcentaje de contexto",
62
- "blocking": false,
63
- "async": true,
64
- "maxConsecutiveFailures": 5,
65
- "degradeOnFailure": "skip"
66
- },
67
- "monitor-contexto.js": {
68
- "event": "PostToolUse",
69
- "matcher": "",
70
- "description": "Alerta cuando el contexto supera umbrales de saturacion (65% warning, 75% critical)",
71
- "blocking": false,
72
- "maxConsecutiveFailures": 3,
73
- "degradeOnFailure": "warn"
74
- },
75
- "extraccion-aprendizajes.js": {
76
- "event": "PostToolUse",
77
- "matcher": "Bash|Write|Edit",
78
- "description": "Captura aprendizajes automaticamente de la actividad de la sesion",
79
- "blocking": false,
80
- "async": true,
81
- "maxConsecutiveFailures": 3,
82
- "degradeOnFailure": "skip"
83
- },
84
- "validar-memoria-hook.js": {
85
- "event": "PostToolUse",
86
- "matcher": "Write|Edit|MultiEdit",
87
- "description": "Ejecuta scripts/validar-memoria.js cuando se modifica APRENDIZAJES.md, perfil-usuario.yaml o instintos/{proyecto,global}.yaml. Emite nudge si detecta canal incorrecto, duplicación cross-canal, secretos o PII. Opt-out con SWL_VALIDAR_MEMORIA=0.",
88
- "blocking": false,
89
- "async": true,
90
- "maxConsecutiveFailures": 3,
91
- "degradeOnFailure": "skip"
92
- },
93
- "sugerir-regenerar-inventario.js": {
94
- "event": "PostToolUse",
95
- "matcher": "Write|Edit|MultiEdit",
96
- "description": "Sugiere regenerar INVENTARIO.md cuando el agente toca agentes/, habilidades/, comandos/swl/, hooks/ o reglas/. Cooldown 30 min para evitar spam.",
97
- "blocking": false,
98
- "async": true,
99
- "maxConsecutiveFailures": 5,
100
- "degradeOnFailure": "skip"
101
- },
102
- "sugerir-contribuir.js": {
103
- "event": "PostToolUse",
104
- "matcher": "Write|Edit|MultiEdit",
105
- "description": "Cuando el usuario edita un componente con frontmatter `evolved: true` en su instalación (no en el repo fuente), sugiere abrir /swl:contribuir para subir la mejora al core. Cooldown 24h por archivo. Activo por defecto; silenciar con SWL_SUGERIR_CONTRIBUIR=0.",
106
- "blocking": false,
107
- "async": true,
108
- "maxConsecutiveFailures": 5,
109
- "degradeOnFailure": "skip"
110
- },
111
- "degradacion-instintos.js": {
112
- "event": "PostToolUse",
113
- "matcher": "Bash|Write|Edit",
114
- "description": "Degrada instintos contradichos por evidencia negativa en la sesion",
115
- "blocking": false,
116
- "async": true,
117
- "maxConsecutiveFailures": 3,
118
- "degradeOnFailure": "skip"
119
- },
120
- "risk-scoring.js": {
121
- "event": "PreToolUse",
122
- "matcher": "",
123
- "description": "Scoring de riesgo compuesto para operaciones bloquea operaciones peligrosas",
124
- "blocking": true,
125
- "maxConsecutiveFailures": 5,
126
- "degradeOnFailure": "warn"
127
- },
128
- "tracking-costos.js": {
129
- "event": "PostToolUse",
130
- "matcher": "",
131
- "description": "Registra tokens estimados y costo por sesion en .planning/METRICAS.md",
132
- "blocking": false,
133
- "async": true,
134
- "maxConsecutiveFailures": 5,
135
- "degradeOnFailure": "skip"
136
- },
137
- "inyeccion-contexto.js": {
138
- "event": "PostToolUse",
139
- "matcher": "",
140
- "description": "Inyecta contexto de sesion anterior automaticamente al inicio de nueva sesion",
141
- "blocking": false,
142
- "maxConsecutiveFailures": 3,
143
- "degradeOnFailure": "skip"
144
- },
145
- "auto-consolidacion.js": {
146
- "event": "PostToolUse",
147
- "matcher": "",
148
- "description": "Sugiere /swl:aprender cuando hay >= 24h y >= 5 sesiones nuevas sin consolidar (patrón autoDream)",
149
- "blocking": false,
150
- "async": true,
151
- "maxConsecutiveFailures": 3,
152
- "degradeOnFailure": "skip"
153
- },
154
- "auto-background.js": {
155
- "event": "PreToolUse",
156
- "matcher": "Bash",
157
- "description": "Sugiere run_in_background para comandos lentos (npm install, cargo build, docker build, etc.)",
158
- "blocking": false,
159
- "maxConsecutiveFailures": 5,
160
- "degradeOnFailure": "skip"
161
- },
162
- "resumen-sesion.js": {
163
- "event": "Stop",
164
- "matcher": "",
165
- "description": "Imprime resumen de sesión SWL al terminar: agentes, skills, comandos, tokens y costo",
166
- "blocking": false,
167
- "async": true,
168
- "maxConsecutiveFailures": 5,
169
- "degradeOnFailure": "skip"
170
- },
171
- "ciclo-evolucion.js": {
172
- "event": "Stop",
173
- "matcher": "",
174
- "description": "Ciclo de evolución (evento Stop): en un solo proceso ejecuta las sub-etapas de métricas (consolida .planning/evolution/metricas.json con health_score; escala alertas persistentes si >=5 nudges del mismo tipo ignorados en 14d) y perfil de usuario (acumula dirty-bit en .planning/user-profile/; nudge a perfilador-usuario-swl al cruzar umbral). Fusión de metricas-evolucion.js + actualizar-perfil-usuario.js (Fase 11, D-12). Lógica en hooks/lib/etapa-{metricas,perfil-usuario}.js.",
175
- "blocking": false,
176
- "async": true,
177
- "maxConsecutiveFailures": 5,
178
- "degradeOnFailure": "skip"
179
- },
180
- "rotar-audit-auto.js": {
181
- "event": "Stop",
182
- "matcher": "",
183
- "description": "Rotación automática de logs de auditoría (.planning/audit.jsonl y audit-merkle.jsonl) cuando superan 5 MB. Invoca scripts/rotar-audit-logs.js con retención de 30 días, comprime a .gz mensual y preserva cadena Merkle. Desactivable con SWL_AUDIT_ROTATE_OFF=1. Configurable con SWL_AUDIT_ROTATE_UMBRAL_MB y SWL_AUDIT_ROTATE_DIAS. Cooldown de 6 horas para evitar ejecución repetida.",
184
- "blocking": false,
185
- "async": true,
186
- "maxConsecutiveFailures": 5,
187
- "degradeOnFailure": "skip"
188
- },
189
- "ciclo-evolucion-subagente.js": {
190
- "event": "SubagentStop",
191
- "matcher": "",
192
- "description": "Ciclo de evolución (evento SubagentStop): registra cada terminación de subagente SWL en .planning/auto-evolution/agentes.jsonl y emite nudge a /swl:evolucionar cuando un agente acumula fallos, volumen de runs, loop o drift (ventana 14 días, throttle 24h). Renombrado de auto-evolucion.js (Fase 11, D-12). Lógica en hooks/lib/etapa-auto-evolucion.js.",
193
- "blocking": false,
194
- "async": true,
195
- "maxConsecutiveFailures": 5,
196
- "degradeOnFailure": "skip"
197
- },
198
- "validar-formato-post-subagente.js": {
199
- "event": "SubagentStop",
200
- "matcher": "",
201
- "description": "Valida output de subagentes con schema declarado en manifiestos/agent-output-schemas.json (revisor-* y tdd-qa). Registra violaciones en .planning/evolution/formato-violaciones.jsonl. Opt-out: SWL_FORMATO_VALIDACION=0.",
202
- "blocking": false,
203
- "async": true,
204
- "maxConsecutiveFailures": 3,
205
- "degradeOnFailure": "skip"
206
- },
207
- "telemetria-agentes.js": {
208
- "event": "PostToolUse",
209
- "matcher": "Agent",
210
- "description": "Registra traza OTLP-lite por cada invocación de agente SWL en .planning/traces/",
211
- "blocking": false,
212
- "async": true,
213
- "maxConsecutiveFailures": 5,
214
- "degradeOnFailure": "skip"
215
- },
216
- "telemetria-skill-routing.js": {
217
- "event": "PostToolUse",
218
- "matcher": "Skill",
219
- "description": "Registra frecuencia/estado de cada invocación de skill en .planning/skill-metrics.json (alimenta auditoría de bloat, P-2). Opt-out SWL_SKILL_TELEMETRIA=0",
220
- "blocking": false,
221
- "async": true,
222
- "maxConsecutiveFailures": 5,
223
- "degradeOnFailure": "skip"
224
- },
225
- "audit-trail.js": {
226
- "event": "PostToolUse",
227
- "matcher": "",
228
- "description": "Registra cada tool call en .planning/audit.jsonl para auditoría y cumplimiento",
229
- "blocking": false,
230
- "async": true,
231
- "maxConsecutiveFailures": 5,
232
- "degradeOnFailure": "skip"
233
- },
234
- "registro-turnos.js": {
235
- "event": "PostToolUse",
236
- "matcher": "",
237
- "description": "Persiste cada turn en .planning/sessions/{id}/turns.jsonl con sanitización PII (OPT-IN: SWL_REGISTRO_TURNOS=1)",
238
- "blocking": false,
239
- "async": true,
240
- "maxConsecutiveFailures": 5,
241
- "degradeOnFailure": "skip"
242
- },
243
- "agente-lifecycle.js": {
244
- "event": "SubagentStop",
245
- "matcher": "",
246
- "description": "Emite eventos de ciclo de vida al event-bus y actualiza execution-state al finalizar cada agente SWL",
247
- "blocking": false,
248
- "async": true,
249
- "maxConsecutiveFailures": 5,
250
- "degradeOnFailure": "skip"
251
- },
252
- "grafo-contexto.js": {
253
- "event": "PreToolUse",
254
- "matcher": "Glob|Grep|Read",
255
- "description": "Inyecta resumen del grafo de dependencias SWL antes de búsquedas de archivos reduce tool calls ~71x. Opt-in: silencioso si .planning/graph.json no existe.",
256
- "blocking": false,
257
- "async": false,
258
- "maxConsecutiveFailures": 5,
259
- "degradeOnFailure": "skip"
260
- },
261
- "calidad-typescript.js": {
262
- "event": "PreToolUse",
263
- "matcher": "Bash",
264
- "description": "Verifica calidad TypeScript en archivos staged antes de git commit: any explícito, @ts-ignore sin justificación, double cast, tsc --noEmit",
265
- "blocking": true,
266
- "maxConsecutiveFailures": 3,
267
- "degradeOnFailure": "warn"
268
- },
269
- "clasificador-mensajes.js": {
270
- "event": "UserPromptSubmit",
271
- "matcher": "",
272
- "description": "Clasifica intención del mensaje del usuario e inyecta hints de routing para el orquestador (decisión, bug, requisito, arquitectura, etc.)",
273
- "blocking": false,
274
- "async": true,
275
- "maxConsecutiveFailures": 5,
276
- "degradeOnFailure": "skip"
277
- },
278
- "graph-update.js": {
279
- "event": "PostToolUse",
280
- "matcher": "Write|Edit",
281
- "description": "Actualiza el grafo de code-review-graph automáticamente después de cada modificación de archivo",
282
- "blocking": false,
283
- "async": true,
284
- "maxConsecutiveFailures": 5,
285
- "degradeOnFailure": "skip"
286
- },
287
- "preservar-estado-pre-compact.js": {
288
- "event": "PreCompact",
289
- "matcher": "",
290
- "description": "Preserva execution-state.json y task-queue.json antes de compactación de contexto para asegurar continuidad del plan",
291
- "blocking": false,
292
- "maxConsecutiveFailures": 3,
293
- "degradeOnFailure": "skip"
294
- },
295
- "check-update.js": {
296
- "event": "UserPromptSubmit",
297
- "matcher": "",
298
- "description": "Detecta actualizaciones disponibles de swl-ses comparando versión local vs npm registry (throttled 24h)",
299
- "blocking": false,
300
- "async": true,
301
- "maxConsecutiveFailures": 5,
302
- "degradeOnFailure": "skip"
303
- },
304
- "contexto-iteracion.js": {
305
- "event": "UserPromptSubmit",
306
- "matcher": "",
307
- "description": "Anti-context-rot para loops iterativos: inyecta el estado de la corrida activa en .planning/loops/ (iteración, últimas filas del TSV, plateau/recomendación de trayectoria). Throttled a 1 inyección cada 4 min por corrida. Opt-out: SWL_CONTEXTO_ITERACION=0.",
308
- "blocking": false,
309
- "async": true,
310
- "maxConsecutiveFailures": 5,
311
- "degradeOnFailure": "skip"
312
- },
313
- "guardrail-modelo.js": {
314
- "event": "PreToolUse",
315
- "matcher": "Task|Agent",
316
- "description": "Guardrail semántico observacional: registra subagentes que podrían ejecutarse con un modelo menos costoso. Opt-in: SWL_GUARDRAIL_MODELO=1. Modo observacional — nunca bloquea.",
317
- "blocking": false,
318
- "async": false,
319
- "optIn": "SWL_GUARDRAIL_MODELO",
320
- "maxConsecutiveFailures": 5,
321
- "degradeOnFailure": "skip"
322
- },
323
- "notificacion-sesion-stop.js": {
324
- "event": "Stop",
325
- "matcher": "",
326
- "description": "Al terminar un turno con >=10 tool calls envía al gateway una notificación con contexto: modelo, llamadas, tokens, costo, archivos modificados y último tramo del transcript. Opt-in: requiere gateway habilitado en manifiestos/gateway-config.json. Opt-out: SWL_NOTIFICAR_STOP=0.",
327
- "blocking": false,
328
- "async": true,
329
- "maxConsecutiveFailures": 5,
330
- "degradeOnFailure": "skip"
331
- },
332
- "captura-feedback-usuario.js": {
333
- "event": "UserPromptSubmit",
334
- "matcher": "",
335
- "description": "Detecta correcciones explícitas del usuario (no hagas X, prefiero Y, recuerda Z, nunca W) y las encola en .planning/evolution/feedback-queue.jsonl para consumo por perfilador-usuario-swl y el ciclo AGP. Patrones regex en español e inglés. Opt-out: SWL_CAPTURAR_FEEDBACK=0.",
336
- "blocking": false,
337
- "async": true,
338
- "maxConsecutiveFailures": 5,
339
- "degradeOnFailure": "skip"
340
- },
341
- "inbox-aviso.js": {
342
- "event": "UserPromptSubmit",
343
- "matcher": "",
344
- "description": "Avisa cuando hay comandos pendientes en .planning/inbox/ enviados desde canales externos (Telegram vía gateway con relay). Inyecta additionalContext para que Claude sugiera ejecutar /swl:inbox. Opt-out: SWL_INBOX_AVISO=0.",
345
- "blocking": false,
346
- "async": true,
347
- "maxConsecutiveFailures": 5,
348
- "degradeOnFailure": "skip"
349
- },
350
- "aiisms-detector.js": {
351
- "event": "PostToolUse",
352
- "matcher": "Write|Edit|MultiEdit",
353
- "description": "Ejecuta detector portable Python contra archivos .md recién modificados y emite nudge a .planning/evolution/nudges.jsonl si encuentra al menos un AI-ism P0. No bloquea. Requiere Python 3.10+. Respeta auto-referencia (habilidades/estilo-sin-ai-isms/), .planning/, temp/, node_modules/. Opt-out: SWL_AIISMS_HOOK=0.",
354
- "blocking": false,
355
- "async": true,
356
- "maxConsecutiveFailures": 5,
357
- "degradeOnFailure": "skip"
358
- },
359
- "claudemd-bloat-detector.js": {
360
- "event": "PostToolUse",
361
- "matcher": "Write|Edit|MultiEdit",
362
- "description": "Ejecuta scripts/auditar-claudemd.js contra archivos CLAUDE.md recién modificados (basename exacto, no cualquier .md). Emite nudge a .planning/evolution/nudges.jsonl si veredicto != OK (líneas excesivas, bullets gigantes, secciones canónicas ausentes, sin @references, placeholders). Aplica ADR-0016 (best practices Anthropic 'The CLAUDE.md file'). No bloquea. Excluye temp/, node_modules/, respositorios-git/, .planning/. Opt-out: SWL_CLAUDEMD_BLOAT=0.",
363
- "blocking": false,
364
- "async": true,
365
- "maxConsecutiveFailures": 5,
366
- "degradeOnFailure": "skip"
367
- },
368
- "claudemd-duplicacion-detector.js": {
369
- "event": "PostToolUse",
370
- "matcher": "Write|Edit|MultiEdit",
371
- "description": "Detecta duplicación de reglas globales (~/.claude/rules/) inline en CLAUDE.md de proyecto. Consume scripts/lib/detector-reglas-duplicadas.js + catálogo scripts/lib/reglas-globales-conocidas.json. Aplica regla reglas/sin-duplicacion-reglas-globales.md. Emite nudge a .planning/evolution/nudges.jsonl si hay duplicaciones detectadas. No bloquea — kind: claudemd-duplicacion-reglas. Excluye temp/, node_modules/, respositorios-git/, .planning/, ~/.claude/ (user-level). Opt-out: SWL_CLAUDEMD_DUPLICACION=0.",
372
- "blocking": false,
373
- "async": true,
374
- "maxConsecutiveFailures": 5,
375
- "degradeOnFailure": "skip"
376
- },
377
- "tdd-gate.js": {
378
- "event": "PreToolUse",
379
- "matcher": "Bash",
380
- "description": "Gate G2 (TDD): ante git commit de feature (fuente+tests staged) verifica evidencia de ciclo RED en .planning/loops/tdd-* (telemetria escrita por ejecutar-fase/tdd-workflow). Sin evidencia emite nudge kind:tdd-red-evidence (warn-only, NUNCA exit 2 en este modo). Solo aplica con fase activa (ciclo GSD); 'fuente sin tests' es dominio de G3 (sin doble nudge). Respeta opt-out declarado del CONTEXTO (**TDD**: off) y prefijos docs:/chore:/style:. Ventana de evidencia: 24h (SWL_TDD_GATE_VENTANA_H). Opt-out: SWL_TDD_GATE=0. Promocion a blocking via ADR-0035 (D-07).",
381
- "blocking": false,
382
- "async": false,
383
- "maxConsecutiveFailures": 5,
384
- "degradeOnFailure": "warn"
385
- },
386
- "spec-gate.js": {
387
- "event": "PreToolUse",
388
- "matcher": "Write|Edit|MultiEdit",
389
- "description": "Gate G0 (SDD): detecta Write/Edit a codigo fuente sin fase activa con PLAN aprobado. Lee .planning/locks/fase-activa.json (escrito por /swl:aprobar-plan) y re-computa SHA256 del plan referenciado; sin fase activa o plan mutado emite nudge kind:spec-gate (warn-only, NUNCA exit 2 en este modo). Zero-config: sin .planning/ sale silencioso. Excluye tests/generados/docs (clasificador esArchivoFuente de calidad-pre-commit) y temp/, node_modules/, _userland/, respositorios-git/. Opt-out: SWL_SPEC_GATE=0. Promocion a blocking via ADR-0034 tras ~2 semanas de calibracion (D-07).",
390
- "blocking": false,
391
- "async": false,
392
- "maxConsecutiveFailures": 5,
393
- "degradeOnFailure": "warn"
394
- },
395
- "validar-intent-spec.js": {
396
- "event": "PostToolUse",
397
- "matcher": "Write|Edit|MultiEdit",
398
- "description": "Verifica que agentes nivelRiesgo:ALTO declaren las 6 partes del framework Intent Engineering (strategy, healthMetrics, steering, hardGuardrails, maxTurnos, fragmentos:[_intent-spec]) segun reglas/intent-engineering.md. Solo aplica a agentes/*.md no fragmentos. Emite nudge a .planning/evolution/nudges.jsonl y BLOQUEA (exit 2) si faltan campos. Excluye temp/, node_modules/, respositorios-git/, _userland/, .planning/. Opt-out: SWL_INTENT_SPEC=0. ADR-0027 (warn-only) -> ADR-0033 (blocking, 2026-06-11).",
399
- "blocking": true,
400
- "async": false,
401
- "maxConsecutiveFailures": 5,
402
- "degradeOnFailure": "warn"
403
- },
404
- "notificacion-telegram.js": {
405
- "event": "Stop",
406
- "matcher": "",
407
- "description": "Envía notificación Telegram al terminar un turno. Muestra último mensaje del asistente, proyecto y estado. Best-effort: siempre exit 0. Requiere ~/.claude/notifications/.env con TELEGRAM_BOT_TOKEN y TELEGRAM_CHAT_ID. Opt-out: SWL_NOTIFICACIONES_TELEGRAM=0.",
408
- "blocking": false,
409
- "async": true,
410
- "maxConsecutiveFailures": 5,
411
- "degradeOnFailure": "skip"
412
- },
413
- "notificacion-telegram-notification.js": {
414
- "event": "Notification",
415
- "matcher": "",
416
- "description": "Envía notificación Telegram cuando Claude espera respuesta del usuario (permisos, idle, atención requerida). Best-effort: siempre exit 0. Comparte implementación con notificacion-telegram.js. Opt-out: SWL_NOTIFICACIONES_TELEGRAM=0.",
417
- "blocking": false,
418
- "async": true,
419
- "maxConsecutiveFailures": 5,
420
- "degradeOnFailure": "skip"
421
- },
422
- "notificacion-telegram-subagent.js": {
423
- "event": "SubagentStop",
424
- "matcher": "",
425
- "description": "Envía notificación Telegram cuando un subagente termina su turno. INERTE por default: SubagentStop no está en los eventos default del script compartido porque duplica la notificación del Stop final (mismo cuerpo, dos mensajes). Activar con CLAUDE_NOTIFY_EVENTS=Stop,Notification,SubagentStop. Best-effort: siempre exit 0. Opt-out global: SWL_NOTIFICACIONES_TELEGRAM=0.",
426
- "blocking": false,
427
- "async": true,
428
- "maxConsecutiveFailures": 5,
429
- "degradeOnFailure": "skip"
430
- },
431
- "auto-restaurar-settings.js": {
432
- "event": "SessionStart",
433
- "matcher": "",
434
- "description": "Al inicio de cada sesión verifica que ~/.claude/settings.json contiene los hooks SWL registrados en ~/.claude/notifications/baseline-hooks.json. Si falta alguno, los restaura preservando todos los hooks ajenos al baseline. Backup obligatorio antes de cada modificación. Opt-out: SWL_NOTIFICACIONES_TELEGRAM=0.",
435
- "blocking": false,
436
- "async": false,
437
- "maxConsecutiveFailures": 5,
438
- "degradeOnFailure": "skip"
439
- },
440
- "session-briefing.js": {
441
- "event": "SessionStart",
442
- "matcher": "",
443
- "description": "Briefing proactivo de inicio de sesión (Fase 12, ADR-0036): digest no solicitado de señales accionables del proyecto destino — ADRs Propuestos con reevaluación vencida, deuda con trigger por fecha cumplido, nudges sin accionar, gates en calibración con ventana cumplida, y trabajo de retoma pendiente. Máximo 5 ítems con acción ejecutable; silencio total sin señales nuevas; dedupe diario. Solo filesystem, presupuesto <200ms. Opt-out: SWL_BRIEFING=0.",
444
- "blocking": false,
445
- "async": false,
446
- "maxConsecutiveFailures": 5,
447
- "degradeOnFailure": "skip"
448
- },
449
- "captura-acciones-post.js": {
450
- "event": "PostToolUse",
451
- "matcher": "",
452
- "description": "Captura señales de ACCIÓN del usuario (Fase 17): registra SHAs de commits del agente y hashes de escrituras (Write/Edit/MultiEdit), y detecta edición manual en caliente al re-leer un archivo modificado fuera de sesión. Encola en feedback-queue.jsonl con tipo:\"accion\" (esquema extendido backward-compatible). Sanitización PII obligatoria de evidencia. Opt-out: SWL_CAPTURAR_FEEDBACK=0.",
453
- "blocking": false,
454
- "async": true,
455
- "maxConsecutiveFailures": 5,
456
- "degradeOnFailure": "skip"
457
- },
458
- "captura-acciones-session.js": {
459
- "event": "SessionStart",
460
- "matcher": "",
461
- "description": "Detecta señales de ACCIÓN del usuario ocurridas fuera de sesión (Fase 17): revert/reset de commits del agente, edición neta de archivos escritos por el agente, rechazo de plan y override de veredicto. Encola en feedback-queue.jsonl con tipo:\"accion\"; NO muestra al modelo (solo persiste). Skip si no hay repo git; presupuesto p95<400ms. Opt-out: SWL_CAPTURAR_FEEDBACK=0.",
462
- "blocking": false,
463
- "async": false,
464
- "maxConsecutiveFailures": 5,
465
- "degradeOnFailure": "skip"
466
- },
467
- "validar-planning-paths.js": {
468
- "event": "PostToolUse",
469
- "matcher": "Write|Edit|MultiEdit",
470
- "description": "Advierte cuando una sesion crea un directorio top-level NUEVO en .planning/ fuera de la allowlist canonica (manifiestos/planning-paths.json). Atrapa divergencias es/en (auditoria/ vs audit/, ux/ vs design/) antes de que proliferen. Aplica reglas/analizar-directorios-antes-de-escribir.md, cierra DT-PLANNING-OUTPUT-PATHS (ADR-0031). Emite nudge kind: planning-path-divergente a .planning/evolution/nudges.jsonl. No bloquea (warn-only). Opt-out: SWL_PLANNING_PATHS=0.",
471
- "blocking": false,
472
- "async": true,
473
- "maxConsecutiveFailures": 5,
474
- "degradeOnFailure": "skip"
475
- }
476
- }
477
- }
1
+ {
2
+ "descripcion": "Configuración centralizada de hooks SWL. Define el evento, matcher y metadata de cada hook para registro automático en settings.json del runtime destino.",
3
+ "prioridad_hooks": {
4
+ "descripcion": "Orden de precedencia cuando múltiples hooks coinciden. Mayor prioridad gana.",
5
+ "orden": [
6
+ "settings.local.json (proyecto, no versionado — máxima prioridad)",
7
+ "settings.json (proyecto, versionado — hooks SWL se registran aquí)",
8
+ "~/.claude/settings.json (global del usuario — menor prioridad)"
9
+ ],
10
+ "regla": "Los hooks SWL SOLO se registran a nivel proyecto. Si existen a nivel global, el doctor los elimina para evitar ejecución duplicada."
11
+ },
12
+ "opciones_avanzadas_hooks": {
13
+ "descripcion": "Campos opcionales soportados por Claude Code en cada hook entry.",
14
+ "timeout": "Tiempo máximo en segundos antes de abortar el hook (default: 60)",
15
+ "async": "Si true, el hook no bloquea la ejecución — corre en background (default: false)",
16
+ "once": "Si true, el hook se ejecuta solo una vez por sesión (default: false)"
17
+ },
18
+ "riskThresholds": {
19
+ "allow": 0.35,
20
+ "review": 0.6,
21
+ "confirm": 0.85
22
+ },
23
+ "costBudget": {
24
+ "maxUsd": 10.0,
25
+ "maxTokens": 500000,
26
+ "alertAt": 0.8
27
+ },
28
+ "circuitBreaker": {
29
+ "maxConsecutiveFailures": 3,
30
+ "halfOpenCooldownMs": 300000,
31
+ "auditThreshold": 10
32
+ },
33
+ "hooks": {
34
+ "escaneo-secretos.js": {
35
+ "event": "PreToolUse",
36
+ "matcher": "Write|Edit",
37
+ "description": "Bloquea escritura de archivos con secretos hardcodeados",
38
+ "blocking": true,
39
+ "maxConsecutiveFailures": 3,
40
+ "degradeOnFailure": "block"
41
+ },
42
+ "proteccion-rutas.js": {
43
+ "event": "PreToolUse",
44
+ "matcher": "Write|Edit",
45
+ "description": "Previene path traversal y escritura fuera del proyecto",
46
+ "blocking": true,
47
+ "maxConsecutiveFailures": 3,
48
+ "degradeOnFailure": "block"
49
+ },
50
+ "calidad-pre-commit.js": {
51
+ "event": "PreToolUse",
52
+ "matcher": "Bash",
53
+ "description": "Gate de calidad pre-commit (debug stmts, type hints, TODOs)",
54
+ "blocking": true,
55
+ "maxConsecutiveFailures": 3,
56
+ "degradeOnFailure": "warn"
57
+ },
58
+ "extraccion-aprendizajes.js": {
59
+ "event": "PostToolUse",
60
+ "matcher": "Bash|Write|Edit",
61
+ "description": "Captura aprendizajes automaticamente de la actividad de la sesion",
62
+ "blocking": false,
63
+ "async": true,
64
+ "maxConsecutiveFailures": 3,
65
+ "degradeOnFailure": "skip"
66
+ },
67
+ "validar-memoria-hook.js": {
68
+ "event": "PostToolUse",
69
+ "matcher": "Write|Edit|MultiEdit",
70
+ "description": "Ejecuta scripts/validar-memoria.js cuando se modifica APRENDIZAJES.md, perfil-usuario.yaml o instintos/{proyecto,global}.yaml. Emite nudge si detecta canal incorrecto, duplicación cross-canal, secretos o PII. Opt-out con SWL_VALIDAR_MEMORIA=0.",
71
+ "blocking": false,
72
+ "async": true,
73
+ "maxConsecutiveFailures": 3,
74
+ "degradeOnFailure": "skip"
75
+ },
76
+ "sugerir-regenerar-inventario.js": {
77
+ "event": "PostToolUse",
78
+ "matcher": "Write|Edit|MultiEdit",
79
+ "description": "Sugiere regenerar INVENTARIO.md cuando el agente toca agentes/, habilidades/, comandos/swl/, hooks/ o reglas/. Cooldown 30 min para evitar spam.",
80
+ "blocking": false,
81
+ "async": true,
82
+ "maxConsecutiveFailures": 5,
83
+ "degradeOnFailure": "skip"
84
+ },
85
+ "sugerir-contribuir.js": {
86
+ "event": "PostToolUse",
87
+ "matcher": "Write|Edit|MultiEdit",
88
+ "description": "Cuando el usuario edita un componente con frontmatter `evolved: true` en su instalación (no en el repo fuente), sugiere abrir /swl:contribuir para subir la mejora al core. Cooldown 24h por archivo. Activo por defecto; silenciar con SWL_SUGERIR_CONTRIBUIR=0.",
89
+ "blocking": false,
90
+ "async": true,
91
+ "maxConsecutiveFailures": 5,
92
+ "degradeOnFailure": "skip"
93
+ },
94
+ "degradacion-instintos.js": {
95
+ "event": "PostToolUse",
96
+ "matcher": "Bash|Write|Edit",
97
+ "description": "Degrada instintos contradichos por evidencia negativa en la sesion",
98
+ "blocking": false,
99
+ "async": true,
100
+ "maxConsecutiveFailures": 3,
101
+ "degradeOnFailure": "skip"
102
+ },
103
+ "risk-scoring.js": {
104
+ "event": "PreToolUse",
105
+ "matcher": "",
106
+ "description": "Scoring de riesgo compuesto para operaciones — bloquea operaciones peligrosas",
107
+ "blocking": true,
108
+ "maxConsecutiveFailures": 5,
109
+ "degradeOnFailure": "warn"
110
+ },
111
+ "tracking-costos.js": {
112
+ "event": "PostToolUse",
113
+ "matcher": "",
114
+ "description": "Registra tokens estimados y costo por sesion en .planning/METRICAS.md",
115
+ "blocking": false,
116
+ "async": true,
117
+ "maxConsecutiveFailures": 5,
118
+ "degradeOnFailure": "skip"
119
+ },
120
+ "inyeccion-contexto.js": {
121
+ "event": "PostToolUse",
122
+ "matcher": "",
123
+ "description": "Inyecta contexto de sesion anterior automaticamente al inicio de nueva sesion",
124
+ "blocking": false,
125
+ "maxConsecutiveFailures": 3,
126
+ "degradeOnFailure": "skip"
127
+ },
128
+ "auto-consolidacion.js": {
129
+ "event": "PostToolUse",
130
+ "matcher": "",
131
+ "description": "Sugiere /swl:aprender cuando hay >= 24h y >= 5 sesiones nuevas sin consolidar (patrón autoDream)",
132
+ "blocking": false,
133
+ "async": true,
134
+ "maxConsecutiveFailures": 3,
135
+ "degradeOnFailure": "skip"
136
+ },
137
+ "auto-background.js": {
138
+ "event": "PreToolUse",
139
+ "matcher": "Bash",
140
+ "description": "Sugiere run_in_background para comandos lentos (npm install, cargo build, docker build, etc.)",
141
+ "blocking": false,
142
+ "maxConsecutiveFailures": 5,
143
+ "degradeOnFailure": "skip"
144
+ },
145
+ "resumen-sesion.js": {
146
+ "event": "Stop",
147
+ "matcher": "",
148
+ "description": "Imprime resumen de sesión SWL al terminar: agentes, skills, comandos, tokens y costo",
149
+ "blocking": false,
150
+ "async": true,
151
+ "maxConsecutiveFailures": 5,
152
+ "degradeOnFailure": "skip"
153
+ },
154
+ "ciclo-evolucion.js": {
155
+ "event": "Stop",
156
+ "matcher": "",
157
+ "description": "Ciclo de evolución (evento Stop): en un solo proceso ejecuta las sub-etapas de métricas (consolida .planning/evolution/metricas.json con health_score; escala alertas persistentes si >=5 nudges del mismo tipo ignorados en 14d) y perfil de usuario (acumula dirty-bit en .planning/user-profile/; nudge a perfilador-usuario-swl al cruzar umbral). Fusión de metricas-evolucion.js + actualizar-perfil-usuario.js (Fase 11, D-12). Lógica en hooks/lib/etapa-{metricas,perfil-usuario}.js.",
158
+ "blocking": false,
159
+ "async": true,
160
+ "maxConsecutiveFailures": 5,
161
+ "degradeOnFailure": "skip"
162
+ },
163
+ "rotar-audit-auto.js": {
164
+ "event": "Stop",
165
+ "matcher": "",
166
+ "description": "Rotación automática de logs de auditoría (.planning/audit.jsonl y audit-merkle.jsonl) cuando superan 5 MB. Invoca scripts/rotar-audit-logs.js con retención de 30 días, comprime a .gz mensual y preserva cadena Merkle. Desactivable con SWL_AUDIT_ROTATE_OFF=1. Configurable con SWL_AUDIT_ROTATE_UMBRAL_MB y SWL_AUDIT_ROTATE_DIAS. Cooldown de 6 horas para evitar ejecución repetida.",
167
+ "blocking": false,
168
+ "async": true,
169
+ "maxConsecutiveFailures": 5,
170
+ "degradeOnFailure": "skip"
171
+ },
172
+ "ciclo-evolucion-subagente.js": {
173
+ "event": "SubagentStop",
174
+ "matcher": "",
175
+ "description": "Ciclo de evolución (evento SubagentStop): registra cada terminación de subagente SWL en .planning/auto-evolution/agentes.jsonl y emite nudge a /swl:evolucionar cuando un agente acumula fallos, volumen de runs, loop o drift (ventana 14 días, throttle 24h). Renombrado de auto-evolucion.js (Fase 11, D-12). Lógica en hooks/lib/etapa-auto-evolucion.js.",
176
+ "blocking": false,
177
+ "async": true,
178
+ "maxConsecutiveFailures": 5,
179
+ "degradeOnFailure": "skip"
180
+ },
181
+ "validar-formato-post-subagente.js": {
182
+ "event": "SubagentStop",
183
+ "matcher": "",
184
+ "description": "Valida output de subagentes con schema declarado en manifiestos/agent-output-schemas.json (revisor-* y tdd-qa). Registra violaciones en .planning/evolution/formato-violaciones.jsonl. Opt-out: SWL_FORMATO_VALIDACION=0.",
185
+ "blocking": false,
186
+ "async": true,
187
+ "maxConsecutiveFailures": 3,
188
+ "degradeOnFailure": "skip"
189
+ },
190
+ "telemetria-agentes.js": {
191
+ "event": "PostToolUse",
192
+ "matcher": "Agent",
193
+ "description": "Registra traza OTLP-lite por cada invocación de agente SWL en .planning/traces/",
194
+ "blocking": false,
195
+ "async": true,
196
+ "maxConsecutiveFailures": 5,
197
+ "degradeOnFailure": "skip"
198
+ },
199
+ "telemetria-skill-routing.js": {
200
+ "event": "PostToolUse",
201
+ "matcher": "Skill",
202
+ "description": "Registra frecuencia/estado de cada invocación de skill en .planning/skill-metrics.json (alimenta auditoría de bloat, P-2). Opt-out SWL_SKILL_TELEMETRIA=0",
203
+ "blocking": false,
204
+ "async": true,
205
+ "maxConsecutiveFailures": 5,
206
+ "degradeOnFailure": "skip"
207
+ },
208
+ "audit-trail.js": {
209
+ "event": "PostToolUse",
210
+ "matcher": "",
211
+ "description": "Registra cada tool call en .planning/audit.jsonl para auditoría y cumplimiento",
212
+ "blocking": false,
213
+ "async": true,
214
+ "maxConsecutiveFailures": 5,
215
+ "degradeOnFailure": "skip"
216
+ },
217
+ "registro-turnos.js": {
218
+ "event": "PostToolUse",
219
+ "matcher": "",
220
+ "description": "Persiste cada turn en .planning/sessions/{id}/turns.jsonl con sanitización PII (OPT-IN: SWL_REGISTRO_TURNOS=1)",
221
+ "blocking": false,
222
+ "async": true,
223
+ "maxConsecutiveFailures": 5,
224
+ "degradeOnFailure": "skip"
225
+ },
226
+ "agente-lifecycle.js": {
227
+ "event": "SubagentStop",
228
+ "matcher": "",
229
+ "description": "Emite eventos de ciclo de vida al event-bus y actualiza execution-state al finalizar cada agente SWL",
230
+ "blocking": false,
231
+ "async": true,
232
+ "maxConsecutiveFailures": 5,
233
+ "degradeOnFailure": "skip"
234
+ },
235
+ "grafo-contexto.js": {
236
+ "event": "PreToolUse",
237
+ "matcher": "Glob|Grep|Read",
238
+ "description": "Inyecta resumen del grafo de dependencias SWL antes de búsquedas de archivos — reduce tool calls ~71x. Opt-in: silencioso si .planning/graph.json no existe.",
239
+ "blocking": false,
240
+ "async": false,
241
+ "maxConsecutiveFailures": 5,
242
+ "degradeOnFailure": "skip"
243
+ },
244
+ "calidad-typescript.js": {
245
+ "event": "PreToolUse",
246
+ "matcher": "Bash",
247
+ "description": "Verifica calidad TypeScript en archivos staged antes de git commit: any explícito, @ts-ignore sin justificación, double cast, tsc --noEmit",
248
+ "blocking": true,
249
+ "maxConsecutiveFailures": 3,
250
+ "degradeOnFailure": "warn"
251
+ },
252
+ "clasificador-mensajes.js": {
253
+ "event": "UserPromptSubmit",
254
+ "matcher": "",
255
+ "description": "Clasifica intención del mensaje del usuario e inyecta hints de routing para el orquestador (decisión, bug, requisito, arquitectura, etc.)",
256
+ "blocking": false,
257
+ "async": true,
258
+ "maxConsecutiveFailures": 5,
259
+ "degradeOnFailure": "skip"
260
+ },
261
+ "graph-update.js": {
262
+ "event": "PostToolUse",
263
+ "matcher": "Write|Edit",
264
+ "description": "Actualiza el grafo de code-review-graph automáticamente después de cada modificación de archivo",
265
+ "blocking": false,
266
+ "async": true,
267
+ "maxConsecutiveFailures": 5,
268
+ "degradeOnFailure": "skip"
269
+ },
270
+ "preservar-estado-pre-compact.js": {
271
+ "event": "PreCompact",
272
+ "matcher": "",
273
+ "description": "Preserva execution-state.json y task-queue.json antes de compactación de contexto para asegurar continuidad del plan",
274
+ "blocking": false,
275
+ "maxConsecutiveFailures": 3,
276
+ "degradeOnFailure": "skip"
277
+ },
278
+ "check-update.js": {
279
+ "event": "UserPromptSubmit",
280
+ "matcher": "",
281
+ "description": "Detecta actualizaciones disponibles de swl-ses comparando versión local vs npm registry (throttled 24h)",
282
+ "blocking": false,
283
+ "async": true,
284
+ "maxConsecutiveFailures": 5,
285
+ "degradeOnFailure": "skip"
286
+ },
287
+ "contexto-iteracion.js": {
288
+ "event": "UserPromptSubmit",
289
+ "matcher": "",
290
+ "description": "Anti-context-rot para loops iterativos: inyecta el estado de la corrida activa en .planning/loops/ (iteración, últimas filas del TSV, plateau/recomendación de trayectoria). Throttled a 1 inyección cada 4 min por corrida. Opt-out: SWL_CONTEXTO_ITERACION=0.",
291
+ "blocking": false,
292
+ "async": true,
293
+ "maxConsecutiveFailures": 5,
294
+ "degradeOnFailure": "skip"
295
+ },
296
+ "contexto-subagente.js": {
297
+ "event": "SubagentStart",
298
+ "matcher": "",
299
+ "description": "Re-inyecta a cada subagente las disciplinas transversales de la sesión (idioma es-MX, escalera de código mínimo con guardas, marcador simplificado:) — el contexto de SessionStart nunca llega a subagentes. Opt-out: SWL_CONTEXTO_SUBAGENTE=0.",
300
+ "blocking": false,
301
+ "async": false,
302
+ "maxConsecutiveFailures": 5,
303
+ "degradeOnFailure": "skip"
304
+ },
305
+ "guardrail-modelo.js": {
306
+ "event": "PreToolUse",
307
+ "matcher": "Task|Agent",
308
+ "description": "Guardrail semántico observacional: registra subagentes que podrían ejecutarse con un modelo menos costoso. Opt-in: SWL_GUARDRAIL_MODELO=1. Modo observacional — nunca bloquea.",
309
+ "blocking": false,
310
+ "async": false,
311
+ "optIn": "SWL_GUARDRAIL_MODELO",
312
+ "maxConsecutiveFailures": 5,
313
+ "degradeOnFailure": "skip"
314
+ },
315
+ "notificacion-sesion-stop.js": {
316
+ "event": "Stop",
317
+ "matcher": "",
318
+ "description": "Al terminar un turno con >=10 tool calls envía al gateway una notificación con contexto: modelo, llamadas, tokens, costo, archivos modificados y último tramo del transcript. Opt-in: requiere gateway habilitado en manifiestos/gateway-config.json. Opt-out: SWL_NOTIFICAR_STOP=0.",
319
+ "blocking": false,
320
+ "async": true,
321
+ "maxConsecutiveFailures": 5,
322
+ "degradeOnFailure": "skip"
323
+ },
324
+ "captura-feedback-usuario.js": {
325
+ "event": "UserPromptSubmit",
326
+ "matcher": "",
327
+ "description": "Detecta correcciones explícitas del usuario (no hagas X, prefiero Y, recuerda Z, nunca W) y las encola en .planning/evolution/feedback-queue.jsonl para consumo por perfilador-usuario-swl y el ciclo AGP. Patrones regex en español e inglés. Opt-out: SWL_CAPTURAR_FEEDBACK=0.",
328
+ "blocking": false,
329
+ "async": true,
330
+ "maxConsecutiveFailures": 5,
331
+ "degradeOnFailure": "skip"
332
+ },
333
+ "inbox-aviso.js": {
334
+ "event": "UserPromptSubmit",
335
+ "matcher": "",
336
+ "description": "Avisa cuando hay comandos pendientes en .planning/inbox/ enviados desde canales externos (Telegram vía gateway con relay). Inyecta additionalContext para que Claude sugiera ejecutar /swl:inbox. Opt-out: SWL_INBOX_AVISO=0.",
337
+ "blocking": false,
338
+ "async": true,
339
+ "maxConsecutiveFailures": 5,
340
+ "degradeOnFailure": "skip"
341
+ },
342
+ "aiisms-detector.js": {
343
+ "event": "PostToolUse",
344
+ "matcher": "Write|Edit|MultiEdit",
345
+ "description": "Ejecuta detector portable Python contra archivos .md recién modificados y emite nudge a .planning/evolution/nudges.jsonl si encuentra al menos un AI-ism P0. No bloquea. Requiere Python 3.10+. Respeta auto-referencia (habilidades/estilo-sin-ai-isms/), .planning/, temp/, node_modules/. Opt-out: SWL_AIISMS_HOOK=0.",
346
+ "blocking": false,
347
+ "async": true,
348
+ "maxConsecutiveFailures": 5,
349
+ "degradeOnFailure": "skip"
350
+ },
351
+ "claudemd-bloat-detector.js": {
352
+ "event": "PostToolUse",
353
+ "matcher": "Write|Edit|MultiEdit",
354
+ "description": "Ejecuta scripts/auditar-claudemd.js contra archivos CLAUDE.md recién modificados (basename exacto, no cualquier .md). Emite nudge a .planning/evolution/nudges.jsonl si veredicto != OK (líneas excesivas, bullets gigantes, secciones canónicas ausentes, sin @references, placeholders). Aplica ADR-0016 (best practices Anthropic 'The CLAUDE.md file'). No bloquea. Excluye temp/, node_modules/, respositorios-git/, .planning/. Opt-out: SWL_CLAUDEMD_BLOAT=0.",
355
+ "blocking": false,
356
+ "async": true,
357
+ "maxConsecutiveFailures": 5,
358
+ "degradeOnFailure": "skip"
359
+ },
360
+ "claudemd-duplicacion-detector.js": {
361
+ "event": "PostToolUse",
362
+ "matcher": "Write|Edit|MultiEdit",
363
+ "description": "Detecta duplicación de reglas globales (~/.claude/rules/) inline en CLAUDE.md de proyecto. Consume scripts/lib/detector-reglas-duplicadas.js + catálogo scripts/lib/reglas-globales-conocidas.json. Aplica regla reglas/sin-duplicacion-reglas-globales.md. Emite nudge a .planning/evolution/nudges.jsonl si hay duplicaciones detectadas. No bloquea — kind: claudemd-duplicacion-reglas. Excluye temp/, node_modules/, respositorios-git/, .planning/, ~/.claude/ (user-level). Opt-out: SWL_CLAUDEMD_DUPLICACION=0.",
364
+ "blocking": false,
365
+ "async": true,
366
+ "maxConsecutiveFailures": 5,
367
+ "degradeOnFailure": "skip"
368
+ },
369
+ "tdd-gate.js": {
370
+ "event": "PreToolUse",
371
+ "matcher": "Bash",
372
+ "description": "Gate G2 (TDD): ante git commit de feature (fuente+tests staged) verifica evidencia de ciclo RED en .planning/loops/tdd-* (telemetria escrita por ejecutar-fase/tdd-workflow). Sin evidencia emite nudge kind:tdd-red-evidence (warn-only, NUNCA exit 2 en este modo). Solo aplica con fase activa (ciclo GSD); 'fuente sin tests' es dominio de G3 (sin doble nudge). Respeta opt-out declarado del CONTEXTO (**TDD**: off) y prefijos docs:/chore:/style:. Ventana de evidencia: 24h (SWL_TDD_GATE_VENTANA_H). Opt-out: SWL_TDD_GATE=0. Promocion a blocking via ADR-0035 (D-07).",
373
+ "blocking": false,
374
+ "async": false,
375
+ "maxConsecutiveFailures": 5,
376
+ "degradeOnFailure": "warn"
377
+ },
378
+ "spec-gate.js": {
379
+ "event": "PreToolUse",
380
+ "matcher": "Write|Edit|MultiEdit",
381
+ "description": "Gate G0 (SDD): detecta Write/Edit a codigo fuente sin fase activa con PLAN aprobado. Lee .planning/locks/fase-activa.json (escrito por /swl:aprobar-plan) y re-computa SHA256 del plan referenciado; sin fase activa o plan mutado emite nudge kind:spec-gate (warn-only, NUNCA exit 2 en este modo). Zero-config: sin .planning/ sale silencioso. Excluye tests/generados/docs (clasificador esArchivoFuente de calidad-pre-commit) y temp/, node_modules/, _userland/, respositorios-git/. Opt-out: SWL_SPEC_GATE=0. Promocion a blocking via ADR-0034 tras ~2 semanas de calibracion (D-07).",
382
+ "blocking": false,
383
+ "async": false,
384
+ "maxConsecutiveFailures": 5,
385
+ "degradeOnFailure": "warn"
386
+ },
387
+ "validar-intent-spec.js": {
388
+ "event": "PostToolUse",
389
+ "matcher": "Write|Edit|MultiEdit",
390
+ "description": "Verifica que agentes nivelRiesgo:ALTO declaren las 6 partes del framework Intent Engineering (strategy, healthMetrics, steering, hardGuardrails, maxTurnos, fragmentos:[_intent-spec]) segun reglas/intent-engineering.md. Solo aplica a agentes/*.md no fragmentos. Emite nudge a .planning/evolution/nudges.jsonl y BLOQUEA (exit 2) si faltan campos. Excluye temp/, node_modules/, respositorios-git/, _userland/, .planning/. Opt-out: SWL_INTENT_SPEC=0. ADR-0027 (warn-only) -> ADR-0033 (blocking, 2026-06-11).",
391
+ "blocking": true,
392
+ "async": false,
393
+ "maxConsecutiveFailures": 5,
394
+ "degradeOnFailure": "warn"
395
+ },
396
+ "notificacion-telegram.js": {
397
+ "event": "Stop",
398
+ "matcher": "",
399
+ "description": "Envía notificación Telegram al terminar un turno. Muestra último mensaje del asistente, proyecto y estado. Best-effort: siempre exit 0. Requiere ~/.claude/notifications/.env con TELEGRAM_BOT_TOKEN y TELEGRAM_CHAT_ID. Opt-out: SWL_NOTIFICACIONES_TELEGRAM=0.",
400
+ "blocking": false,
401
+ "async": true,
402
+ "maxConsecutiveFailures": 5,
403
+ "degradeOnFailure": "skip"
404
+ },
405
+ "notificacion-telegram-notification.js": {
406
+ "event": "Notification",
407
+ "matcher": "",
408
+ "description": "Envía notificación Telegram cuando Claude espera respuesta del usuario (permisos, idle, atención requerida). Best-effort: siempre exit 0. Comparte implementación con notificacion-telegram.js. Opt-out: SWL_NOTIFICACIONES_TELEGRAM=0.",
409
+ "blocking": false,
410
+ "async": true,
411
+ "maxConsecutiveFailures": 5,
412
+ "degradeOnFailure": "skip"
413
+ },
414
+ "notificacion-telegram-subagent.js": {
415
+ "event": "SubagentStop",
416
+ "matcher": "",
417
+ "description": "Envía notificación Telegram cuando un subagente termina su turno. INERTE por default: SubagentStop no está en los eventos default del script compartido porque duplica la notificación del Stop final (mismo cuerpo, dos mensajes). Activar con CLAUDE_NOTIFY_EVENTS=Stop,Notification,SubagentStop. Best-effort: siempre exit 0. Opt-out global: SWL_NOTIFICACIONES_TELEGRAM=0.",
418
+ "blocking": false,
419
+ "async": true,
420
+ "maxConsecutiveFailures": 5,
421
+ "degradeOnFailure": "skip"
422
+ },
423
+ "auto-restaurar-settings.js": {
424
+ "event": "SessionStart",
425
+ "matcher": "",
426
+ "description": "Al inicio de cada sesión verifica que ~/.claude/settings.json contiene los hooks SWL registrados en ~/.claude/notifications/baseline-hooks.json. Si falta alguno, los restaura preservando todos los hooks ajenos al baseline. Backup obligatorio antes de cada modificación. Opt-out: SWL_NOTIFICACIONES_TELEGRAM=0.",
427
+ "blocking": false,
428
+ "async": false,
429
+ "maxConsecutiveFailures": 5,
430
+ "degradeOnFailure": "skip"
431
+ },
432
+ "session-briefing.js": {
433
+ "event": "SessionStart",
434
+ "matcher": "",
435
+ "description": "Briefing proactivo de inicio de sesión (Fase 12, ADR-0036): digest no solicitado de señales accionables del proyecto destino — ADRs Propuestos con reevaluación vencida, deuda con trigger por fecha cumplido, nudges sin accionar, gates en calibración con ventana cumplida, y trabajo de retoma pendiente. Máximo 5 ítems con acción ejecutable; silencio total sin señales nuevas; dedupe diario. Solo filesystem, presupuesto <200ms. Opt-out: SWL_BRIEFING=0.",
436
+ "blocking": false,
437
+ "async": false,
438
+ "maxConsecutiveFailures": 5,
439
+ "degradeOnFailure": "skip"
440
+ },
441
+ "captura-acciones-post.js": {
442
+ "event": "PostToolUse",
443
+ "matcher": "",
444
+ "description": "Captura señales de ACCIÓN del usuario (Fase 17): registra SHAs de commits del agente y hashes de escrituras (Write/Edit/MultiEdit), y detecta edición manual en caliente al re-leer un archivo modificado fuera de sesión. Encola en feedback-queue.jsonl con tipo:\"accion\" (esquema extendido backward-compatible). Sanitización PII obligatoria de evidencia. Opt-out: SWL_CAPTURAR_FEEDBACK=0.",
445
+ "blocking": false,
446
+ "async": true,
447
+ "maxConsecutiveFailures": 5,
448
+ "degradeOnFailure": "skip"
449
+ },
450
+ "captura-acciones-session.js": {
451
+ "event": "SessionStart",
452
+ "matcher": "",
453
+ "description": "Detecta señales de ACCIÓN del usuario ocurridas fuera de sesión (Fase 17): revert/reset de commits del agente, edición neta de archivos escritos por el agente, rechazo de plan y override de veredicto. Encola en feedback-queue.jsonl con tipo:\"accion\"; NO muestra al modelo (solo persiste). Skip si no hay repo git; presupuesto p95<400ms. Opt-out: SWL_CAPTURAR_FEEDBACK=0.",
454
+ "blocking": false,
455
+ "async": false,
456
+ "maxConsecutiveFailures": 5,
457
+ "degradeOnFailure": "skip"
458
+ },
459
+ "validar-planning-paths.js": {
460
+ "event": "PostToolUse",
461
+ "matcher": "Write|Edit|MultiEdit",
462
+ "description": "Advierte cuando una sesion crea un directorio top-level NUEVO en .planning/ fuera de la allowlist canonica (manifiestos/planning-paths.json). Atrapa divergencias es/en (auditoria/ vs audit/, ux/ vs design/) antes de que proliferen. Aplica reglas/analizar-directorios-antes-de-escribir.md, cierra DT-PLANNING-OUTPUT-PATHS (ADR-0031). Emite nudge kind: planning-path-divergente a .planning/evolution/nudges.jsonl. No bloquea (warn-only). Opt-out: SWL_PLANNING_PATHS=0.",
463
+ "blocking": false,
464
+ "async": true,
465
+ "maxConsecutiveFailures": 5,
466
+ "degradeOnFailure": "skip"
467
+ }
468
+ }
469
+ }