@saulwade/swl-ses 2.6.1 → 2.8.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 (268) hide show
  1. package/CLAUDE.md +14 -2
  2. package/README.md +65 -18
  3. package/agentes/_intent-spec.md +73 -73
  4. package/agentes/_propose-step.md +90 -90
  5. package/bin/swl-ses.js +10 -0
  6. package/comandos/swl/brainstorm.md +1 -0
  7. package/comandos/swl/briefing.md +119 -119
  8. package/comandos/swl/contribuir.md +233 -233
  9. package/comandos/swl/deuda-codigo.md +97 -97
  10. package/comandos/swl/mcp-status.md +1 -0
  11. package/gateway/lib/event-channel.js +191 -191
  12. package/habilidades/agent-deep-links/SKILL.md +148 -148
  13. package/habilidades/backend-async-postgres-testing/SKILL.md +216 -216
  14. package/habilidades/backend-error-design/SKILL.md +221 -221
  15. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  16. package/habilidades/calidad-anti-patrones-universales/SKILL.md +105 -1
  17. package/habilidades/calidad-contract-testing/SKILL.md +165 -165
  18. package/habilidades/calidad-mutation-testing/SKILL.md +25 -1
  19. package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -60
  20. package/habilidades/ci-cd-pipelines/SKILL.md +5 -1
  21. package/habilidades/css-moderno/SKILL.md +7 -1
  22. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  23. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  24. package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -57
  25. package/habilidades/extractor-de-aprendizajes/SKILL.md +5 -1
  26. package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
  27. package/habilidades/harness-claude-code/SKILL.md +3 -2
  28. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  29. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  30. package/habilidades/perfil-usuario/SKILL.md +200 -200
  31. package/habilidades/prevencion-sobreingenieria/recursos/EXAMPLES.md +580 -580
  32. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
  33. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
  34. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -231
  35. package/habilidades/proceso-discovery-machote/SKILL.md +157 -157
  36. package/habilidades/proceso-dynamic-workflows/SKILL.md +60 -0
  37. package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -65
  38. package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -65
  39. package/habilidades/proceso-intent-engineering/SKILL.md +269 -269
  40. package/habilidades/proceso-modular-split/SKILL.md +256 -256
  41. package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
  42. package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -83
  43. package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -85
  44. package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -94
  45. package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -111
  46. package/hooks/calidad-pre-commit.js +159 -10
  47. package/hooks/ciclo-evolucion-subagente.js +26 -26
  48. package/hooks/ciclo-evolucion.js +26 -26
  49. package/hooks/contexto-subagente.js +68 -68
  50. package/hooks/lib/auto-consolidator.js +335 -335
  51. package/hooks/lib/ciclo-evolucion.js +47 -47
  52. package/hooks/lib/deep-links.js +185 -185
  53. package/hooks/lib/error-classifier.js +308 -308
  54. package/hooks/lib/notificacion-formato.js +45 -11
  55. package/hooks/lib/provenance-tracker.js +191 -191
  56. package/hooks/lib/raiz-proyecto.js +35 -4
  57. package/hooks/lib/resource-quota.js +122 -122
  58. package/hooks/lib/retry-jitter.js +165 -165
  59. package/hooks/lib/security-net.js +201 -201
  60. package/hooks/lib/skill-auditor.js +588 -588
  61. package/hooks/lib/sync-status.js +228 -228
  62. package/hooks/lib/taint-tracker.js +107 -107
  63. package/hooks/lib/text-similarity.js +241 -241
  64. package/hooks/lib/toon-compressor.js +245 -245
  65. package/hooks/notificacion-telegram.js +5 -11
  66. package/hooks/session-briefing.js +12 -4
  67. package/instintos/autonomia.yaml +27 -27
  68. package/instintos/prompt-appendices.yaml +57 -57
  69. package/llms.txt +1 -1
  70. package/manifiestos/agent-output-schemas.json +57 -57
  71. package/manifiestos/canonical-hashes.json +662 -0
  72. package/manifiestos/harness-ir.json +47536 -0
  73. package/manifiestos/hooks-config.json +469 -469
  74. package/manifiestos/invariantes-criticos.json +30 -30
  75. package/manifiestos/policy-bundle.json +2065 -0
  76. package/manifiestos/policy-corpus-w2.json +3926 -0
  77. package/manifiestos/runtime-adapters-core3.json +208 -0
  78. package/manifiestos/runtime-conformance.json +139 -0
  79. package/manifiestos/skills-lock.json +43 -43
  80. package/package.json +2 -2
  81. package/plantillas/auditor-veto-template.md +105 -105
  82. package/plantillas/github-workflows/release-please.yml +44 -44
  83. package/plantillas/github-workflows/swl-ci.yml +107 -107
  84. package/plantillas/github-workflows/swl-security.yml +51 -51
  85. package/plugin.json +2 -2
  86. package/reglas/accesibilidad.md +10 -10
  87. package/reglas/auditorias-documentales-estructurales.md +7 -7
  88. package/reglas/cloud-infra.md +8 -8
  89. package/reglas/consultar-vault-primero.md +195 -195
  90. package/reglas/git-workflow.md +1 -0
  91. package/reglas/hooks.md +6 -6
  92. package/reglas/intent-engineering.md +218 -218
  93. package/reglas/markitdown.md +8 -8
  94. package/reglas/monitor-ci.md +12 -0
  95. package/reglas/patrones.md +6 -6
  96. package/reglas/testing.md +7 -7
  97. package/reglas/tests-cleanup.md +224 -224
  98. package/schemas/agent-message.schema.json +73 -73
  99. package/schemas/agent-output-implementacion.schema.json +114 -114
  100. package/schemas/agent-output-planificacion.schema.json +150 -150
  101. package/schemas/agent-output-review.schema.json +98 -98
  102. package/schemas/diary-entry.schema.json +112 -112
  103. package/schemas/gate-state.schema.json +76 -0
  104. package/schemas/harness-ir.schema.json +369 -0
  105. package/schemas/hook-profiles.schema.json +54 -54
  106. package/schemas/hooks-config.schema.json +89 -89
  107. package/schemas/legacy-gates.schema.json +45 -0
  108. package/schemas/modulos.schema.json +38 -38
  109. package/schemas/perfiles.schema.json +36 -36
  110. package/schemas/plugin.schema.json +77 -77
  111. package/schemas/policy-bundle.schema.json +140 -0
  112. package/schemas/policy-enforcement.schema.json +117 -0
  113. package/schemas/policy-operation.schema.json +261 -0
  114. package/schemas/runtime-adapter.schema.json +176 -0
  115. package/schemas/runtime-build-attestation.schema.json +100 -0
  116. package/schemas/runtime-conformance.schema.json +239 -0
  117. package/schemas/runtime-diagnostic.schema.json +395 -0
  118. package/schemas/skill-evals.schema.json +119 -119
  119. package/schemas/skill-frontmatter.schema.json +245 -245
  120. package/schemas/w4-certification-request.schema.json +72 -0
  121. package/schemas/w4-certification-verdict.schema.json +224 -0
  122. package/schemas/w4-corpus.schema.json +172 -0
  123. package/schemas/w4-mutation-report.schema.json +116 -0
  124. package/schemas/w4-replay-result.schema.json +164 -0
  125. package/schemas/w4-scoring-report.schema.json +89 -0
  126. package/scripts/audit-tools/audit-history.js +330 -330
  127. package/scripts/audit-tools/bundle-tracker.js +290 -290
  128. package/scripts/audit-tools/canary-monitor.js +352 -352
  129. package/scripts/audit-tools/code-profiler.js +605 -605
  130. package/scripts/audit-tools/dep-doctor.js +320 -320
  131. package/scripts/audit-tools/env-validator.js +206 -206
  132. package/scripts/audit-tools/lib/fs-walk.js +48 -48
  133. package/scripts/audit-tools/lib/output.js +23 -23
  134. package/scripts/audit-tools/migration-checker.js +392 -392
  135. package/scripts/audit-tools/pentest-scanner.js +1436 -1436
  136. package/scripts/bootstrap-instintos.js +3 -0
  137. package/scripts/cli/aprobar-plan.js +73 -73
  138. package/scripts/cli/briefing.js +23 -23
  139. package/scripts/cli/ciclo-evolucion.js +26 -26
  140. package/scripts/cli/derivar-feature-list.js +25 -25
  141. package/scripts/cli/detectar-host.js +27 -27
  142. package/scripts/cli/diary-entry.js +69 -69
  143. package/scripts/cli/execution-state.js +18 -18
  144. package/scripts/cli/gateway-notify.js +41 -41
  145. package/scripts/cli/liberar-fase.js +42 -42
  146. package/scripts/cli/mark-evolved.js +56 -56
  147. package/scripts/cli/metricas-dora.js +26 -26
  148. package/scripts/cli/near-duplicate.js +55 -55
  149. package/scripts/cli/notificaciones.js +123 -123
  150. package/scripts/cli/propose-step.js +29 -29
  151. package/scripts/cli/schedule-parse.js +19 -19
  152. package/scripts/cli/sugerir-modelo.js +20 -20
  153. package/scripts/cli/verificar-plan.js +36 -36
  154. package/scripts/cli/verificar-trazabilidad.js +35 -35
  155. package/scripts/comandos/install-asistido.js +8 -7
  156. package/scripts/configurar-branch-protection.js +418 -418
  157. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  158. package/scripts/doctor.js +61 -36
  159. package/scripts/generar-checklists-consolidados.js +273 -273
  160. package/scripts/generar-claims-runtime.js +1342 -0
  161. package/scripts/generar-harness-ir.js +257 -0
  162. package/scripts/generar-inventario.js +52 -54
  163. package/scripts/generar-policy-bundle.js +202 -0
  164. package/scripts/instalador.js +26 -7
  165. package/scripts/lib/approval-receipts.js +190 -0
  166. package/scripts/lib/artefactos-python.js +43 -43
  167. package/scripts/lib/benchmark-metrics.js +160 -160
  168. package/scripts/lib/budget-enforcer.js +252 -252
  169. package/scripts/lib/certificacion-loop-state.js +421 -0
  170. package/scripts/lib/ci-reader.js +193 -193
  171. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +56 -0
  172. package/scripts/lib/clasificar-directorio.js +92 -0
  173. package/scripts/lib/contadores-inventario.js +217 -217
  174. package/scripts/lib/detectar-host-swl.js +175 -175
  175. package/scripts/lib/detectar-runtime.js +29 -20
  176. package/scripts/lib/detectar-stack-detallado.js +307 -307
  177. package/scripts/lib/detector-autoduplicacion-intra-archivo.js +234 -234
  178. package/scripts/lib/detector-reglas-duplicadas.js +220 -220
  179. package/scripts/lib/eval-metrics-store.js +218 -218
  180. package/scripts/lib/eval-quality.js +171 -171
  181. package/scripts/lib/eval-schemas.js +144 -144
  182. package/scripts/lib/eval-self-correct.js +106 -106
  183. package/scripts/lib/eval-validator.js +185 -185
  184. package/scripts/lib/evidence-verifier.js +192 -0
  185. package/scripts/lib/evidencia-release.js +322 -322
  186. package/scripts/lib/frontmatter-canonico.js +509 -0
  187. package/scripts/lib/gate-engine.js +871 -0
  188. package/scripts/lib/gate-hooks-requires.js +249 -249
  189. package/scripts/lib/gate-licencias.js +212 -212
  190. package/scripts/lib/git-config-preflight.js +48 -0
  191. package/scripts/lib/git-metricas.js +257 -257
  192. package/scripts/lib/harness-ir.js +778 -0
  193. package/scripts/lib/harness-source-snapshot.js +309 -0
  194. package/scripts/lib/integrity-ledger.js +1147 -0
  195. package/scripts/lib/jaccard-similarity.js +98 -98
  196. package/scripts/lib/legacy-gate-migration.js +324 -0
  197. package/scripts/lib/limpiar-basura-global.js +45 -2
  198. package/scripts/lib/longmemeval-runner.js +125 -125
  199. package/scripts/lib/metricas-dora.js +204 -204
  200. package/scripts/lib/notificaciones-telegram.js +1 -0
  201. package/scripts/lib/npm-version.js +1 -0
  202. package/scripts/lib/paquetes-conocidos.js +50 -50
  203. package/scripts/lib/plan-lock.js +61 -13
  204. package/scripts/lib/policy-broker.js +338 -0
  205. package/scripts/lib/policy-bundle.js +342 -0
  206. package/scripts/lib/policy-context-provider.js +310 -0
  207. package/scripts/lib/policy-contract.js +479 -0
  208. package/scripts/lib/policy-verifier-utils.js +65 -0
  209. package/scripts/lib/pr-analyzer.js +399 -399
  210. package/scripts/lib/principal-verifier.js +178 -0
  211. package/scripts/lib/prompt-builder.js +264 -264
  212. package/scripts/lib/resolver-plan-fase.js +37 -37
  213. package/scripts/lib/rrf-fusion.js +175 -175
  214. package/scripts/lib/runtime-adapter-contract.js +267 -0
  215. package/scripts/lib/runtime-artifact-verifier.js +426 -0
  216. package/scripts/lib/runtime-build-attestation.js +127 -0
  217. package/scripts/lib/runtime-bundle-installer.js +586 -0
  218. package/scripts/lib/runtime-compiler.js +327 -0
  219. package/scripts/lib/runtime-conformance.js +202 -0
  220. package/scripts/lib/runtime-doctor-core3.js +567 -0
  221. package/scripts/lib/runtime-doctor-input.js +59 -0
  222. package/scripts/lib/runtime-operation-adapter.js +267 -0
  223. package/scripts/lib/schema-version.js +164 -164
  224. package/scripts/lib/semantic-search.js +252 -252
  225. package/scripts/lib/signed-envelope.js +545 -0
  226. package/scripts/lib/single-use-store.js +359 -0
  227. package/scripts/lib/skills-externas.js +31 -0
  228. package/scripts/lib/transformadores/codex.js +15 -8
  229. package/scripts/lib/transformadores/gemini.js +79 -5
  230. package/scripts/lib/w4-attestation-adapter.js +158 -0
  231. package/scripts/lib/w4-canario.js +337 -0
  232. package/scripts/lib/w4-claims.js +182 -0
  233. package/scripts/lib/w4-corpus-generador.js +542 -0
  234. package/scripts/lib/w4-gate-c5.js +115 -0
  235. package/scripts/lib/w4-harness-bajo-prueba.js +155 -0
  236. package/scripts/lib/w4-matriz-combos.js +55 -0
  237. package/scripts/lib/w4-motor-mutacion.js +1348 -0
  238. package/scripts/lib/w4-motor-replay.js +735 -0
  239. package/scripts/lib/w4-pin-origen.js +54 -0
  240. package/scripts/lib/w4-publicar-request.js +132 -0
  241. package/scripts/lib/w4-revocacion.js +62 -0
  242. package/scripts/lib/w4-runtimes-core3.js +38 -0
  243. package/scripts/lib/w4-scorer-certificacion.js +692 -0
  244. package/scripts/lib/w4-superficie-candidato.js +49 -0
  245. package/scripts/lib/w4-veredicto.js +452 -0
  246. package/scripts/lib/w4-verificar-veredicto.js +302 -0
  247. package/scripts/limpiar-artefactos-python.js +131 -131
  248. package/scripts/migrar-csv-a-array.js +168 -168
  249. package/scripts/migrar-fase-dominio.js +200 -200
  250. package/scripts/migrar-gates-legacy.js +108 -0
  251. package/scripts/publicar-certification-request.js +115 -0
  252. package/scripts/runtime-doctor.js +107 -0
  253. package/scripts/tui/componentes/selector-multi.js +189 -189
  254. package/scripts/tui/componentes/selector-unico.js +158 -158
  255. package/scripts/tui/ejecutores.js +375 -375
  256. package/scripts/tui/lib/colores.js +129 -129
  257. package/scripts/tui/lib/render.js +264 -264
  258. package/scripts/tui/lib/teclas.js +113 -113
  259. package/scripts/tui/pantallas/install-wizard.js +12 -7
  260. package/scripts/tui/pantallas/menu-principal.js +52 -52
  261. package/scripts/tui/pantallas/progreso.js +274 -274
  262. package/scripts/tui/pantallas/resumen.js +132 -132
  263. package/scripts/validar-userland-vacio.js +110 -110
  264. package/scripts/verificar-aislamiento-swl-eval.js +87 -0
  265. package/scripts/verificar-empaquetado-downstream.js +375 -0
  266. package/scripts/verificar-loop-constructor.js +215 -0
  267. package/scripts/verificar-trazabilidad.js +13 -6
  268. package/scripts/verificar-veredicto-real.js +84 -0
@@ -1,469 +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
- "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
- }
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
+ }