@saulwade/swl-ses 2.5.3 → 2.6.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 (214) hide show
  1. package/CLAUDE.md +9 -9
  2. package/README.md +37 -37
  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 +932 -908
  8. package/agentes/backend-csharp-swl.md +420 -420
  9. package/agentes/backend-go-swl.md +390 -390
  10. package/agentes/backend-java-swl.md +281 -281
  11. package/agentes/backend-rust-swl.md +364 -364
  12. package/agentes/backend-workers-swl.md +482 -482
  13. package/agentes/cloud-infra-swl.md +509 -509
  14. package/agentes/consolidador-swl.md +541 -541
  15. package/agentes/depurador-swl.md +352 -352
  16. package/agentes/devops-ci-swl.md +400 -400
  17. package/agentes/disenador-ui-swl.md +569 -569
  18. package/agentes/documentador-swl.md +345 -345
  19. package/agentes/frontend-angular-swl.md +621 -621
  20. package/agentes/frontend-css-swl.md +716 -716
  21. package/agentes/frontend-react-swl.md +692 -692
  22. package/agentes/frontend-swl.md +496 -496
  23. package/agentes/frontend-tailwind-swl.md +826 -826
  24. package/agentes/investigador-swl.md +432 -432
  25. package/agentes/investigador-ux-swl.md +505 -505
  26. package/agentes/migrador-swl.md +442 -442
  27. package/agentes/mobile-android-swl.md +511 -511
  28. package/agentes/mobile-cross-swl.md +541 -541
  29. package/agentes/mobile-ios-swl.md +502 -502
  30. package/agentes/mobile-testing-swl.md +302 -302
  31. package/agentes/nemesis-auditor-swl.md +285 -285
  32. package/agentes/observabilidad-swl.md +438 -438
  33. package/agentes/pagos-swl.md +310 -310
  34. package/agentes/perfilador-usuario-swl.md +321 -321
  35. package/agentes/planificador-swl.md +399 -399
  36. package/agentes/producto-prd-swl.md +589 -589
  37. package/agentes/red-team-swl.md +218 -218
  38. package/agentes/release-manager-swl.md +590 -590
  39. package/agentes/rendimiento-swl.md +713 -713
  40. package/agentes/revisor-angular-swl.md +278 -278
  41. package/agentes/revisor-csharp-swl.md +264 -264
  42. package/agentes/revisor-go-swl.md +259 -259
  43. package/agentes/revisor-java-swl.md +257 -257
  44. package/agentes/revisor-kotlin-swl.md +273 -273
  45. package/agentes/revisor-nextjs-swl.md +281 -281
  46. package/agentes/revisor-php-swl.md +271 -271
  47. package/agentes/revisor-react-swl.md +278 -278
  48. package/agentes/revisor-rust-swl.md +346 -346
  49. package/agentes/revisor-seguridad-swl.md +399 -399
  50. package/agentes/revisor-swift-swl.md +268 -268
  51. package/agentes/revisor-typescript-swl.md +346 -346
  52. package/agentes/tdd-qa-swl.md +393 -393
  53. package/bin/swl-ses.js +32 -7
  54. package/comandos/swl/actualizar.md +3 -3
  55. package/comandos/swl/aprender.md +13 -0
  56. package/comandos/swl/deuda-codigo.md +97 -97
  57. package/comandos/swl/evaluar-skill.md +18 -3
  58. package/comandos/swl/evolucion-continua.md +73 -0
  59. package/comandos/swl/evolucionar.md +13 -0
  60. package/comandos/swl/instalar.md +4 -4
  61. package/comandos/swl/notificaciones.md +1 -1
  62. package/comandos/swl/status.md +2 -2
  63. package/gateway/cron/jobs.example.json +12 -0
  64. package/habilidades/auto-evolucion-protocolo/SKILL.md +19 -1
  65. package/habilidades/autoresearch/SKILL.md +3 -2
  66. package/habilidades/backend-async-postgres-testing/SKILL.md +2 -1
  67. package/habilidades/benchmark-memoria/SKILL.md +7 -7
  68. package/habilidades/changelog-generator/SKILL.md +1 -1
  69. package/habilidades/changelog-generator/scripts/parse-commits.js +2 -1
  70. package/habilidades/checkpoints-verificacion/SKILL.md +6 -0
  71. package/habilidades/compactacion-contexto/SKILL.md +2 -1
  72. package/habilidades/contenedores-docker/SKILL.md +4 -2
  73. package/habilidades/context-builder/SKILL.md +4 -0
  74. package/habilidades/doubt-driven-review/SKILL.md +17 -1
  75. package/habilidades/drift-detection/SKILL.md +6 -1
  76. package/habilidades/ejecutar-fase/SKILL.md +6 -6
  77. package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
  78. package/habilidades/eval-framework/SKILL.md +8 -3
  79. package/habilidades/extractor-de-aprendizajes/SKILL.md +8 -2
  80. package/habilidades/git-worktrees-paralelo/SKILL.md +19 -1
  81. package/habilidades/harness-claude-code/SKILL.md +7 -3
  82. package/habilidades/infra-github-actions/SKILL.md +4 -3
  83. package/habilidades/instalar-sistema/SKILL.md +5 -1
  84. package/habilidades/memoria-busqueda/SKILL.md +31 -39
  85. package/habilidades/planear-fase/SKILL.md +9 -1
  86. package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
  87. package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
  88. package/habilidades/proceso-ddia-fundamentos/SKILL.md +3 -2
  89. package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -147
  90. package/habilidades/release-semver/SKILL.md +2 -2
  91. package/habilidades/swl-claudemd/SKILL.md +6 -7
  92. package/habilidades/swl-dashboard/SKILL.md +11 -43
  93. package/habilidades/tdd-workflow/SKILL.md +12 -7
  94. package/habilidades/validacion-ci-sistema/SKILL.md +1 -1
  95. package/hooks/agente-lifecycle.js +2 -1
  96. package/hooks/aiisms-detector.js +13 -4
  97. package/hooks/audit-trail.js +2 -1
  98. package/hooks/auto-consolidacion.js +2 -1
  99. package/hooks/captura-acciones-post.js +2 -1
  100. package/hooks/captura-acciones-session.js +2 -1
  101. package/hooks/captura-feedback-usuario.js +3 -2
  102. package/hooks/claudemd-bloat-detector.js +12 -3
  103. package/hooks/claudemd-duplicacion-detector.js +13 -3
  104. package/hooks/contexto-iteracion.js +2 -1
  105. package/hooks/contexto-subagente.js +68 -68
  106. package/hooks/degradacion-instintos.js +2 -1
  107. package/hooks/extraccion-aprendizajes.js +109 -15
  108. package/hooks/grafo-contexto.js +2 -1
  109. package/hooks/guardrail-modelo.js +2 -1
  110. package/hooks/inbox-aviso.js +2 -1
  111. package/hooks/inyeccion-contexto.js +2 -1
  112. package/hooks/lib/agent-matcher.js +2 -1
  113. package/hooks/lib/agent-routing.js +2 -1
  114. package/hooks/lib/autonomia.js +5 -3
  115. package/hooks/lib/captura-acciones.js +2 -1
  116. package/hooks/lib/consolidation-lock.js +21 -10
  117. package/hooks/lib/etapa-auto-evolucion.js +10 -4
  118. package/hooks/lib/etapa-metricas.js +2 -1
  119. package/hooks/lib/etapa-perfil-usuario.js +20 -4
  120. package/hooks/lib/evolution-tracker.js +2 -1
  121. package/hooks/lib/gateway-notify.js +17 -3
  122. package/hooks/lib/loop-telemetry.js +5 -4
  123. package/hooks/lib/mcp-health.js +2 -1
  124. package/hooks/lib/memory-search.js +4 -0
  125. package/hooks/lib/merkle-audit.js +58 -6
  126. package/hooks/lib/notificacion-formato.js +58 -0
  127. package/hooks/lib/nudge-tracker.js +2 -1
  128. package/hooks/lib/otlp-exporter.js +2 -1
  129. package/hooks/lib/propose-step.js +3 -2
  130. package/hooks/lib/raiz-proyecto.js +127 -0
  131. package/hooks/lib/run-log.js +2 -1
  132. package/hooks/lib/singleton-guard.js +225 -27
  133. package/hooks/lib/telegram-cliente.js +28 -11
  134. package/hooks/notificacion-telegram.js +13 -3
  135. package/hooks/preservar-estado-pre-compact.js +2 -1
  136. package/hooks/proteccion-rutas.js +59 -3
  137. package/hooks/registro-turnos.js +2 -1
  138. package/hooks/resumen-sesion.js +2 -1
  139. package/hooks/risk-scoring.js +2 -1
  140. package/hooks/rotar-audit-auto.js +46 -20
  141. package/hooks/session-briefing.js +127 -1
  142. package/hooks/spec-gate.js +2 -1
  143. package/hooks/sugerir-contribuir.js +6 -3
  144. package/hooks/sugerir-regenerar-inventario.js +3 -2
  145. package/hooks/tdd-gate.js +2 -1
  146. package/hooks/telemetria-agentes.js +2 -1
  147. package/hooks/telemetria-skill-routing.js +2 -1
  148. package/hooks/tracking-costos.js +4 -3
  149. package/hooks/validar-formato-post-subagente.js +2 -1
  150. package/hooks/validar-intent-spec.js +2 -1
  151. package/hooks/validar-memoria-hook.js +13 -3
  152. package/hooks/validar-planning-paths.js +2 -1
  153. package/instintos/perfil-usuario.yaml +506 -3
  154. package/instintos/proyecto.yaml +78 -0
  155. package/llms.txt +29 -29
  156. package/manifiestos/canonical-hashes.json +5588 -4925
  157. package/manifiestos/hooks-config.json +469 -469
  158. package/manifiestos/invariantes-criticos.json +30 -30
  159. package/manifiestos/modulos.json +1429 -1423
  160. package/manifiestos/planning-paths.json +1 -0
  161. package/manifiestos/skills-lock.json +1275 -1275
  162. package/package.json +94 -95
  163. package/plugin.json +369 -369
  164. package/scripts/actualizar.js +3 -0
  165. package/scripts/auditar-clases-conocidas.js +134 -106
  166. package/scripts/benchmark-memoria.js +1 -0
  167. package/scripts/bootstrap-instintos.js +85 -14
  168. package/scripts/canario-hooks.js +166 -166
  169. package/scripts/cli/autonomia.js +23 -0
  170. package/scripts/cli/benchmark-memoria.js +37 -0
  171. package/scripts/cli/ciclo-autonomo.js +73 -0
  172. package/scripts/cli/ciclo-fase-b.js +102 -0
  173. package/scripts/cli/guardrail-metrics.js +39 -0
  174. package/scripts/cli/loop-telemetry.js +4 -2
  175. package/scripts/cli/memoria-search.js +69 -0
  176. package/scripts/cli/nudge-accionar.js +39 -0
  177. package/scripts/cli/run-eval.js +38 -0
  178. package/scripts/cli/run-skill-evals.js +13 -2
  179. package/scripts/derivar-feature-list.js +15 -14
  180. package/scripts/desinstalar.js +11 -0
  181. package/scripts/doctor.js +50 -13
  182. package/scripts/evidencia-valor.js +101 -101
  183. package/scripts/field-report.js +16 -16
  184. package/scripts/instalador.js +98 -7
  185. package/scripts/lib/activar-hooks-proyecto.js +116 -104
  186. package/scripts/lib/auditar-invocaciones-comandos.js +96 -6
  187. package/scripts/lib/ciclo-autonomo/candidatos.js +174 -0
  188. package/scripts/lib/ciclo-autonomo/config.js +165 -0
  189. package/scripts/lib/ciclo-autonomo/drenador-feedback.js +174 -0
  190. package/scripts/lib/ciclo-autonomo/fallback.js +77 -0
  191. package/scripts/lib/ciclo-autonomo/guard-convivencia.js +139 -0
  192. package/scripts/lib/ciclo-autonomo/higiene-nudges.js +112 -0
  193. package/scripts/lib/ciclo-autonomo/index.js +301 -0
  194. package/scripts/lib/ciclo-autonomo/lock.js +124 -0
  195. package/scripts/lib/ciclo-autonomo/presupuesto.js +122 -0
  196. package/scripts/lib/ciclo-autonomo/puente-degradacion.js +240 -0
  197. package/scripts/lib/ciclo-autonomo/runner-fase-b.js +248 -0
  198. package/scripts/lib/ciclo-autonomo/writer-instintos.js +190 -0
  199. package/scripts/lib/ciclo-autonomo/yaml-instintos.js +535 -0
  200. package/scripts/lib/estado.js +9 -0
  201. package/scripts/lib/evidencia-valor.js +228 -228
  202. package/scripts/lib/expandir-targets.js +71 -71
  203. package/scripts/lib/gitignore-manifest.js +8 -1
  204. package/scripts/lib/hooks-settings.js +45 -0
  205. package/scripts/lib/limpiar-basura-global.js +161 -0
  206. package/scripts/lib/toml-merge.js +204 -204
  207. package/scripts/mcp-server/auth.js +105 -105
  208. package/scripts/mcp-server/cache.js +106 -106
  209. package/scripts/rotar-audit-logs.js +48 -2
  210. package/scripts/run-eval.js +1 -0
  211. package/scripts/run-skill-evals.js +287 -8
  212. package/scripts/smoke-test.js +16 -8
  213. package/scripts/tui/pantallas/install-wizard.js +69 -13
  214. package/scripts/validar.js +40 -1
package/bin/swl-ses.js CHANGED
@@ -106,8 +106,8 @@ const COMANDOS = {
106
106
  doctor: '../scripts/doctor.js',
107
107
  update: '../scripts/actualizar.js',
108
108
  uninstall: '../scripts/desinstalar.js',
109
- prune: '../scripts/prune.js',
110
- valor: '../scripts/evidencia-valor.js',
109
+ prune: '../scripts/prune.js',
110
+ valor: '../scripts/evidencia-valor.js',
111
111
  'field-report': '../scripts/field-report.js',
112
112
  'check-update': '../scripts/check-update.js',
113
113
  'install-git-hook': '../scripts/instalar-git-hook.js',
@@ -141,7 +141,14 @@ const COMANDOS = {
141
141
  'loop-telemetry': '../scripts/cli/loop-telemetry.js',
142
142
  'configurar-ci': '../scripts/cli/configurar-ci.js',
143
143
  'ciclo-evolucion': '../scripts/cli/ciclo-evolucion.js',
144
+ 'ciclo-autonomo': '../scripts/cli/ciclo-autonomo.js',
145
+ 'ciclo-fase-b': '../scripts/cli/ciclo-fase-b.js',
144
146
  notificaciones: '../scripts/cli/notificaciones.js',
147
+ autonomia: '../scripts/cli/autonomia.js',
148
+ 'memoria-search': '../scripts/cli/memoria-search.js',
149
+ 'guardrail-metrics': '../scripts/cli/guardrail-metrics.js',
150
+ 'run-eval': '../scripts/cli/run-eval.js',
151
+ 'benchmark-memoria': '../scripts/cli/benchmark-memoria.js',
145
152
  };
146
153
 
147
154
  // Comandos con subcomandos (nivel 2)
@@ -164,9 +171,9 @@ COMANDOS PRINCIPALES:
164
171
  doctor Diagnóstica problemas de instalación
165
172
  update Actualiza componentes instalados
166
173
  uninstall Desinstala componentes del runtime
167
- prune Purga componentes retirados del paquete (dry-run; --confirmar ejecuta)
168
- valor Panel de evidencia de valor del harness (intercepciones, defectos, DORA/CI, uso; --json, --dias N)
169
- install --solo-hooks Activa hooks (telemetría) a nivel proyecto apuntando al scope global — sin duplicar componentes en la UI
174
+ prune Purga componentes retirados del paquete (dry-run; --confirmar ejecuta)
175
+ valor Panel de evidencia de valor del harness (intercepciones, defectos, DORA/CI, uso; --json, --dias N)
176
+ install --solo-hooks Activa hooks (telemetría) a nivel proyecto apuntando al scope global — sin duplicar componentes en la UI
170
177
  field-report Reporte de agregados anónimos para compartir con el autor (opt-in, revisión manual)
171
178
  check-update Fuerza consulta inmediata de nueva versión en npm (sin throttle)
172
179
  install-git-hook [--force] Instala pre-commit hook que avisa de nuevas versiones.
@@ -244,9 +251,26 @@ COMANDOS PRINCIPALES:
244
251
  Usado por /swl:configurar-ci.
245
252
  ciclo-evolucion Regenera .planning/evolution/metricas.json.
246
253
  Usado por /swl:status.
254
+ ciclo-autonomo [on|off|status] Motor determinista de aprendizaje (Fase A,
255
+ ADR-0041). Nace encendido; off = kill-switch.
256
+ Usado por /swl:evolucion-continua.
257
+ ciclo-fase-b [--dry-run|status] Runner headless de Fase B (ADR-0042 gate
258
+ G-B). En esta versión siempre dry-run.
259
+ nudge-accionar <id> [--por X] Marca un nudge como accionado (cierra el
260
+ ciclo). Usado por /swl:aprender y /swl:evolucionar.
247
261
  notificaciones <op> Telegram: init|status|disable|repair|bot-start|
248
262
  bot-stop|bot-status|bot-restart|bot-enable-autostart|
249
263
  bot-disable-autostart. Usado por /swl:notificaciones.
264
+ autonomia --accion="..." Registra auto-checkpoint según el dial de
265
+ autonomía. Usado por ejecutar-fase.
266
+ memoria-search <op> Búsqueda en memoria del proyecto: search|timeline|
267
+ fetch (JSON). Usado por memoria-busqueda.
268
+ guardrail-metrics [--json] Métricas + diagnóstico de guardrails de la sesión.
269
+ Usado por /swl:status (dashboard).
270
+ run-eval <eval.json> Ejecuta un eval del framework de validación de
271
+ outputs. --rebuild-aggregate reconstruye métricas.
272
+ benchmark-memoria [--json] Benchmark de retrieval de memoria (--dataset,
273
+ --limit, --verbose).
250
274
  info [--target <runtime>] Muestra información del sistema instalado
251
275
  help Muestra esta ayuda (alias de --help)
252
276
  list [--target <runtime>] Lista todos los agentes y skills instalados
@@ -263,8 +287,9 @@ OPCIONES DE INSTALL:
263
287
  --target <runtime> Runtime destino: claude|openclaude|copilot|opencode|codex|gemini|cursor (default: claude)
264
288
  --profile <perfil> Perfil: core|backend-python|backend-node|frontend-react|frontend-angular|
265
289
  fullstack-python-angular|fullstack-node-react|mobile|devops|completo (default: completo)
266
- --with <componentes> Incluir componentes adicionales (separados por coma)
267
- --without <comps> Excluir componentes (separados por coma)
290
+ --with <modulos> Incluir módulos adicionales, incluidos los opt-in fuera de todo perfil
291
+ (p. ej. reglas-personales). Quedan en el install-state y update los preserva
292
+ --without <modulos> Excluir módulos (separados por coma; también quita extras preservados)
268
293
  --global Instalar en directorio global del runtime (~/.claude, etc.)
269
294
  --local Instalar en directorio local del proyecto (.claude/, etc.)
270
295
  --dry-run Mostrar plan sin aplicar cambios
@@ -128,7 +128,7 @@ Espera confirmación del usuario.
128
128
  ## Paso 3 — Ejecutar actualización
129
129
 
130
130
  ```bash
131
- npx @saulwade/swl-ses@latest install --target claude --profile <PERFIL> [--global] --force
131
+ npx -y @saulwade/swl-ses@latest install --target claude --profile <PERFIL> [--global] --force
132
132
  ```
133
133
 
134
134
  Usa el mismo perfil y ubicación de la instalación original.
@@ -136,7 +136,7 @@ Usa el mismo perfil y ubicación de la instalación original.
136
136
  ## Paso 4 — Ejecutar doctor
137
137
 
138
138
  ```bash
139
- npx @saulwade/swl-ses@latest doctor
139
+ npx -y @saulwade/swl-ses@latest doctor
140
140
  ```
141
141
 
142
142
  ## Paso 5 — Reportar resultado
@@ -157,7 +157,7 @@ Doctor: <resultado>
157
157
  Si el usuario dice algo como "actualiza y cambia a perfil completo", ejecuta:
158
158
 
159
159
  ```bash
160
- npx @saulwade/swl-ses@latest install --target claude --profile <NUEVO_PERFIL> [--global] --force
160
+ npx -y @saulwade/swl-ses@latest install --target claude --profile <NUEVO_PERFIL> [--global] --force
161
161
  ```
162
162
 
163
163
  Informa que el cambio de perfil puede agregar componentes nuevos pero no elimina los del perfil anterior. Si quiere una instalación limpia con otro perfil, sugiere:
@@ -542,6 +542,19 @@ Archivos actualizados:
542
542
  [lista con rutas]
543
543
  ```
544
544
 
545
+ ### Cierre del ciclo de nudges (obligatorio si este comando fue disparado por un nudge)
546
+
547
+ Si esta ejecución atendió un nudge (de `auto-consolidacion.js` o cualquier
548
+ otro visible en el briefing o en `evolution/nudges.jsonl`), márcalo como
549
+ accionado — sin este cierre los nudges se acumulan sin consumidor:
550
+
551
+ ```bash
552
+ swl-ses nudge-accionar <id-del-nudge> --por aprender
553
+ ```
554
+
555
+ El `<id>` viene en el propio nudge (campo `id` del JSONL o del mensaje del
556
+ hook). Si la sesión fue manual (sin nudge), omite este cierre.
557
+
545
558
  ## Paso 7.3 — Diary estructurado de la sesión (opcional)
546
559
 
547
560
  Si la sesión generó al menos 3 aprendizajes aprobados (cualquier categoría),
@@ -1,97 +1,97 @@
1
- ---
2
- name: swl:deuda-codigo
3
- description: Cosecha los marcadores `simplificado:` del código (simplificaciones deliberadas con techo y trigger de upgrade) hacia un ledger visible, detecta marcadores sin trigger (riesgo de rot) y sincroniza opcionalmente con .planning/DEUDA-TECNICA.md. Cargar cuando el usuario pida "qué simplificamos", "deuda de código", "cosecha los marcadores", o tras una fase que dejó marcadores simplificado:.
4
- allowed_tools: ["Grep", "Read", "Edit", "Bash"]
5
- ---
6
-
7
- # /swl:deuda-codigo — Cosecha de simplificaciones deliberadas
8
-
9
- Todo atajo intencional marcado con `simplificado: <techo>, <trigger>` (convención
10
- de `Skill("prevencion-sobreingenieria")`, adaptada del patrón `ponytail:` de
11
- ponytail, MIT) se cosecha aquí en un ledger — para que un "después" no se
12
- convierta en "nunca" (regla `arreglar-al-detectar.md`).
13
-
14
- ## Uso
15
-
16
- ```
17
- /swl:deuda-codigo — Reporte en pantalla (no escribe nada)
18
- /swl:deuda-codigo --sync — Además sincroniza a .planning/DEUDA-TECNICA.md
19
- /swl:deuda-codigo --owners — Agrega autor por marcador (git blame)
20
- /swl:deuda-codigo <directorio> — Limita la cosecha a un subárbol
21
- ```
22
-
23
- ## Paso 1 — Cosechar los marcadores
24
-
25
- Buscar con Grep (herramienta, no shell) el patrón sobre el árbol del proyecto,
26
- excluyendo `node_modules`, `.git`, `dist`, `build`, `temp`, `respositorios-git`:
27
-
28
- ```
29
- Grep(pattern: "(#|//|--|<!--|/\\*)\\s?simplificado:", output_mode: "content", -n: true)
30
- ```
31
-
32
- Cada hit es una fila del ledger. El prefijo de comentario evita capturar prosa
33
- que solo menciona la convención (como este archivo o el SKILL.md).
34
-
35
- ## Paso 2 — Parsear techo y trigger
36
-
37
- La convención es `simplificado: <techo>, <trigger de upgrade>`:
38
-
39
- - **techo**: el límite conocido del atajo (lock global, O(n²), heurística naive).
40
- - **trigger**: la condición observable que obliga el upgrade ("si throughput > X",
41
- "cuando haya un segundo consumidor", "antes del primer deploy productivo").
42
-
43
- Si el texto tras `simplificado:` no contiene una condición observable,
44
- etiquetar la fila `sin-trigger` — esos son los que rotan en silencio.
45
-
46
- ## Paso 3 — Reporte
47
-
48
- Una fila por marcador, agrupado por archivo:
49
-
50
- ```
51
- ## Ledger de simplificaciones — [fecha]
52
-
53
- | Ubicación | Qué se simplificó | Techo | Trigger de upgrade | Estado |
54
- |---|---|---|---|---|
55
- | src/locks.py:42 | lock global | contención con N workers | throughput > 500 rps | ok |
56
- | api/cache.js:17 | TTL fijo 5 min | staleness | (ninguno) | sin-trigger |
57
-
58
- Total: N marcadores, M sin trigger.
59
- ```
60
-
61
- Con `--owners`: agregar columna con `git blame -L<línea>,<línea> --porcelain <archivo>`
62
- (solo el autor, una llamada por fila).
63
-
64
- Si no hay marcadores: `Sin deuda simplificado:. Ledger limpio.` — y terminar.
65
-
66
- ## Paso 4 — Sincronizar al ledger formal (solo con --sync)
67
-
68
- Para cada marcador `sin-trigger` o de techo relevante que no exista ya en
69
- `.planning/DEUDA-TECNICA.md`:
70
-
71
- 1. Leer el ledger actual y verificar duplicados por ubicación (`archivo:línea`).
72
- 2. Agregar entrada `### DT-SIMPLIFICADO-<n>` con: ubicación, techo, trigger
73
- (o `PENDIENTE DE TRIGGER` marcado como acción requerida), fecha de cosecha.
74
- 3. Los `sin-trigger` NO se sincronizan como DT válidas hasta tener trigger:
75
- reportarlos al usuario como acción inmediata — una DT sin trigger verificable
76
- viola `arreglar-al-detectar.md § DT formal`.
77
-
78
- NUNCA borrar ni editar los marcadores del código durante la cosecha: el
79
- comando lee y reporta; el código solo cambia cuando el trigger se cumple y
80
- el upgrade se implementa.
81
-
82
- ## Cuándo usarlo
83
-
84
- - Cierre de fase (`/swl:verificar` lo puede invocar como pasada complementaria).
85
- - Antes de un release: los `sin-trigger` son bloqueo blando (reportar en el gate).
86
- - Auditorías de deuda: junto con la sección "Sobre-ingeniería" de `/swl:revisar`.
87
-
88
- ## Gotchas
89
-
90
- - **Marcadores en fixtures o docs**: los hits dentro de `tests/fixtures/`,
91
- ejemplos de skills o este propio comando son material de referencia, no deuda
92
- — excluirlos del conteo y decir cuántos se excluyeron (sin caps silenciosos).
93
- - **Prefijos de comentario por stack**: el patrón cubre `#` (Python/shell),
94
- `//` (JS/TS/Go/Rust/C#/Java), `--` (SQL/Lua), `<!--` (HTML/MD) y `/*` (CSS/C).
95
- Si el proyecto usa otro prefijo, agregarlo al patrón y decirlo en el reporte.
96
- - **`git blame` sobre archivos renombrados**: usar `git blame -M -C` si el
97
- autor aparece como el commit del rename.
1
+ ---
2
+ name: swl:deuda-codigo
3
+ description: Cosecha los marcadores `simplificado:` del código (simplificaciones deliberadas con techo y trigger de upgrade) hacia un ledger visible, detecta marcadores sin trigger (riesgo de rot) y sincroniza opcionalmente con .planning/DEUDA-TECNICA.md. Cargar cuando el usuario pida "qué simplificamos", "deuda de código", "cosecha los marcadores", o tras una fase que dejó marcadores simplificado:.
4
+ allowed_tools: ["Grep", "Read", "Edit", "Bash"]
5
+ ---
6
+
7
+ # /swl:deuda-codigo — Cosecha de simplificaciones deliberadas
8
+
9
+ Todo atajo intencional marcado con `simplificado: <techo>, <trigger>` (convención
10
+ de `Skill("prevencion-sobreingenieria")`, adaptada del patrón `ponytail:` de
11
+ ponytail, MIT) se cosecha aquí en un ledger — para que un "después" no se
12
+ convierta en "nunca" (regla `arreglar-al-detectar.md`).
13
+
14
+ ## Uso
15
+
16
+ ```
17
+ /swl:deuda-codigo — Reporte en pantalla (no escribe nada)
18
+ /swl:deuda-codigo --sync — Además sincroniza a .planning/DEUDA-TECNICA.md
19
+ /swl:deuda-codigo --owners — Agrega autor por marcador (git blame)
20
+ /swl:deuda-codigo <directorio> — Limita la cosecha a un subárbol
21
+ ```
22
+
23
+ ## Paso 1 — Cosechar los marcadores
24
+
25
+ Buscar con Grep (herramienta, no shell) el patrón sobre el árbol del proyecto,
26
+ excluyendo `node_modules`, `.git`, `dist`, `build`, `temp`, `respositorios-git`:
27
+
28
+ ```
29
+ Grep(pattern: "(#|//|--|<!--|/\\*)\\s?simplificado:", output_mode: "content", -n: true)
30
+ ```
31
+
32
+ Cada hit es una fila del ledger. El prefijo de comentario evita capturar prosa
33
+ que solo menciona la convención (como este archivo o el SKILL.md).
34
+
35
+ ## Paso 2 — Parsear techo y trigger
36
+
37
+ La convención es `simplificado: <techo>, <trigger de upgrade>`:
38
+
39
+ - **techo**: el límite conocido del atajo (lock global, O(n²), heurística naive).
40
+ - **trigger**: la condición observable que obliga el upgrade ("si throughput > X",
41
+ "cuando haya un segundo consumidor", "antes del primer deploy productivo").
42
+
43
+ Si el texto tras `simplificado:` no contiene una condición observable,
44
+ etiquetar la fila `sin-trigger` — esos son los que rotan en silencio.
45
+
46
+ ## Paso 3 — Reporte
47
+
48
+ Una fila por marcador, agrupado por archivo:
49
+
50
+ ```
51
+ ## Ledger de simplificaciones — [fecha]
52
+
53
+ | Ubicación | Qué se simplificó | Techo | Trigger de upgrade | Estado |
54
+ |---|---|---|---|---|
55
+ | src/locks.py:42 | lock global | contención con N workers | throughput > 500 rps | ok |
56
+ | api/cache.js:17 | TTL fijo 5 min | staleness | (ninguno) | sin-trigger |
57
+
58
+ Total: N marcadores, M sin trigger.
59
+ ```
60
+
61
+ Con `--owners`: agregar columna con `git blame -L<línea>,<línea> --porcelain <archivo>`
62
+ (solo el autor, una llamada por fila).
63
+
64
+ Si no hay marcadores: `Sin deuda simplificado:. Ledger limpio.` — y terminar.
65
+
66
+ ## Paso 4 — Sincronizar al ledger formal (solo con --sync)
67
+
68
+ Para cada marcador `sin-trigger` o de techo relevante que no exista ya en
69
+ `.planning/DEUDA-TECNICA.md`:
70
+
71
+ 1. Leer el ledger actual y verificar duplicados por ubicación (`archivo:línea`).
72
+ 2. Agregar entrada `### DT-SIMPLIFICADO-<n>` con: ubicación, techo, trigger
73
+ (o `PENDIENTE DE TRIGGER` marcado como acción requerida), fecha de cosecha.
74
+ 3. Los `sin-trigger` NO se sincronizan como DT válidas hasta tener trigger:
75
+ reportarlos al usuario como acción inmediata — una DT sin trigger verificable
76
+ viola `arreglar-al-detectar.md § DT formal`.
77
+
78
+ NUNCA borrar ni editar los marcadores del código durante la cosecha: el
79
+ comando lee y reporta; el código solo cambia cuando el trigger se cumple y
80
+ el upgrade se implementa.
81
+
82
+ ## Cuándo usarlo
83
+
84
+ - Cierre de fase (`/swl:verificar` lo puede invocar como pasada complementaria).
85
+ - Antes de un release: los `sin-trigger` son bloqueo blando (reportar en el gate).
86
+ - Auditorías de deuda: junto con la sección "Sobre-ingeniería" de `/swl:revisar`.
87
+
88
+ ## Gotchas
89
+
90
+ - **Marcadores en fixtures o docs**: los hits dentro de `tests/fixtures/`,
91
+ ejemplos de skills o este propio comando son material de referencia, no deuda
92
+ — excluirlos del conteo y decir cuántos se excluyeron (sin caps silenciosos).
93
+ - **Prefijos de comentario por stack**: el patrón cubre `#` (Python/shell),
94
+ `//` (JS/TS/Go/Rust/C#/Java), `--` (SQL/Lua), `<!--` (HTML/MD) y `/*` (CSS/C).
95
+ Si el proyecto usa otro prefijo, agregarlo al patrón y decirlo en el reporte.
96
+ - **`git blame` sobre archivos renombrados**: usar `git blame -M -C` si el
97
+ autor aparece como el commit del rename.
@@ -374,9 +374,22 @@ Umbral de promoción:
374
374
  Si un skill es rechazado ≥3 veces consecutivas, el agente escala al usuario
375
375
  con análisis de qué dimensiones bajan el score. Origen: ADR 0013 sección 3C.
376
376
 
377
- ## Paso 4 — Emitir reporte
377
+ ## Paso 4 — Emitir reporte y artefacto de procedencia
378
378
 
379
- Generar el siguiente reporte directamente en la conversación:
379
+ Tras calcular el score final y el badge, persiste el **artefacto de
380
+ evaluación con procedencia** (única fuente que `run-skill-evals.js
381
+ --record-after` acepta para aprobar una evolución — anti-gaming,
382
+ DT-AGP-SCORE-AUTODECLARADO):
383
+
384
+ ```bash
385
+ swl-ses run-skill-evals <nombre> --emitir-evaluacion \
386
+ --score=<score-final> --badge=<badge> --producido-por=evaluar-skill
387
+ # → escribe .planning/evolution/evaluaciones/<nombre>.json (fechado)
388
+ # y registra el evento tipo:evaluacion en evoluciones.jsonl
389
+ ```
390
+
391
+ Es el ÚNICO archivo que este comando crea. Luego generar el siguiente
392
+ reporte directamente en la conversación:
380
393
 
381
394
  ```markdown
382
395
  ## Evaluación de skill: [nombre]
@@ -498,7 +511,9 @@ Score evals: 82.4/100 (peso 30% del final)
498
511
  - Los evals NUNCA se inventan en este comando — solo se ejecutan los declarados por el autor del skill. Crear evals nuevos es tarea de `/swl:aprender` o del autor del skill directamente, siguiendo `plantillas/skill-evals-template.json`.
499
512
  - Si el archivo no existe, informar al usuario con el path exacto y terminar.
500
513
  - Si `--agente` se pasa sin nombre, listar los agentes disponibles y terminar.
501
- - El reporte siempre se emite en la conversación. No crear archivos.
514
+ - El reporte siempre se emite en la conversación. El único archivo que se
515
+ crea es el artefacto de procedencia del Paso 4 (`.planning/evolution/
516
+ evaluaciones/<nombre>.json`) — nunca reportes sueltos.
502
517
  - Las "Fortalezas" deben ser específicas del contenido leído, no genéricas.
503
518
  - Las "Áreas de mejora" deben incluir la sección o línea aproximada donde se detectó el problema.
504
519
  - Si la Capa 1 genera errores E001–E010, reflejar el impacto en el score de la dimensión afectada antes de sumar las contribuciones ponderadas.
@@ -0,0 +1,73 @@
1
+ ---
2
+ name: swl:evolucion-continua
3
+ description: Enciende, apaga o consulta el motor determinista de aprendizaje del ciclo autónomo (ADR-0041). Con on, el proyecto aprende solo — decay y promoción de instintos, drenaje de feedback al perfil, puente de degradación e higiene de nudges — vía cron nocturno o fallback de session-briefing (cada ≥24h). Subcomandos on | off | status. Nace encendido (opt-out): off/SWL_CICLO_AUTONOMO=0 son el kill-switch sagrado.
4
+ allowed_tools: ["Bash", "Read"]
5
+ ---
6
+
7
+ # /swl:evolucion-continua — Motor determinista de aprendizaje (on|off|status)
8
+
9
+ Eres el operador del motor determinista del ciclo autónomo (Nivel 0,
10
+ ADR-0041). Este comando es la cara de usuario del subcomando CLI
11
+ `swl-ses ciclo-autonomo`: NO implementa lógica propia — delega en el CLI
12
+ (invocación cross-scope, regla `validar.js §7b`).
13
+
14
+ ## Qué hace el motor cuando está encendido
15
+
16
+ Cada corrida de la Fase A (Node puro, sin LLM, <2s, $0):
17
+
18
+ 1. **Writer de instintos** — aplica decay, promueve drafts maduros
19
+ (confidence ≥0.5 + evidencia ≥3), degrada por feedback dañino y archiva
20
+ instintos muertos en `instintos/proyecto.yaml` (con backup previo).
21
+ 2. **Puente de degradación** — un aprendizaje `[DEGRADADO]` en
22
+ APRENDIZAJES.md baja la confidence del instinto derivado.
23
+ 3. **Drenador de feedback** — consolida las señales de
24
+ `evolution/feedback-queue.jsonl` (≤90 días) como drafts en
25
+ `instintos/perfil-usuario.yaml`; lo más viejo se archiva sin procesar.
26
+ 4. **Higiene de nudges** — marca atendidos los que el ciclo consume y
27
+ archiva los >90 días sin accionar.
28
+
29
+ Todo queda registrado en `evolution/ciclo-autonomo.jsonl` con
30
+ `origen: ciclo-autonomo`. Corridas sin señales son no-op sin escrituras.
31
+
32
+ ## Uso
33
+
34
+ ```
35
+ /swl:evolucion-continua on # habilita el motor en este proyecto
36
+ /swl:evolucion-continua off # lo apaga (kill-switch)
37
+ /swl:evolucion-continua status # last_run + conteos de la última corrida
38
+ ```
39
+
40
+ ## Ejecución
41
+
42
+ Resuelve el CLI con el patrón cross-scope (repo madre → bin en PATH → npx):
43
+
44
+ ```bash
45
+ # on | off | status según el argumento recibido
46
+ swl-ses ciclo-autonomo <accion>
47
+ ```
48
+
49
+ Sin binario en PATH: `npx -y @saulwade/swl-ses@latest ciclo-autonomo <accion>`.
50
+
51
+ Tras `on`, informa al usuario los dos disparadores disponibles:
52
+
53
+ 1. **Cron del gateway** (si usa `/swl:cron`): job de ejemplo en
54
+ `gateway/cron/jobs.example.json` (nocturno, `0 3 * * *`).
55
+ 2. **Fallback automático de session-briefing**: sin cron, la Fase A se
56
+ dispara sola al iniciar sesión cuando pasaron ≥24h de la última corrida
57
+ (fire-and-forget; el lock evita corridas dobles).
58
+
59
+ Una corrida manual siempre es posible: `swl-ses ciclo-autonomo`.
60
+
61
+ ## Reglas de comportamiento
62
+
63
+ - El motor **nace ENCENDIDO** (opt-out estricto, decisión del usuario
64
+ 2026-07-10): en proyectos sin señales la corrida es no-op inofensiva.
65
+ `off` y `SWL_CICLO_AUTONOMO=0` (docs/variables-entorno.md) son el
66
+ kill-switch — el off es sagrado: cero corridas, cero escrituras.
67
+ - Este comando NO corre la Fase B con LLM (Fases 22+ del ADR-0042) — el
68
+ campo `credencial` del config existe pero aquí no se consume.
69
+ - Si `status` reporta corridas con `errores`, sugiere revisar
70
+ `evolution/ciclo-autonomo.jsonl` y los backups en `instintos/.backups/`.
71
+ - La primera corrida sobre un proyecto con señales acumuladas puede mover
72
+ mucho (bootstrap con ventana de 90 días): recomienda revisar el diff de
73
+ `instintos/*.yaml` antes de commitear.
@@ -244,6 +244,19 @@ Versión: [anterior] → [nueva]
244
244
  Próxima evolución recomendada: después de [N] proyectos o [fecha]
245
245
  ```
246
246
 
247
+ ### Cierre del ciclo de nudges (obligatorio si este comando fue disparado por un nudge)
248
+
249
+ Si esta evolución atendió un nudge de `etapa-auto-evolucion.js` / drift
250
+ (visible en el briefing o en `evolution/nudges.jsonl`), márcalo como
251
+ accionado — es lo que permite al sistema distinguir sugerencias atendidas
252
+ de ruido acumulado:
253
+
254
+ ```bash
255
+ swl-ses nudge-accionar <id-del-nudge> --por evolucionar
256
+ ```
257
+
258
+ Si la evolución fue manual (sin nudge), omite este cierre.
259
+
247
260
  ## Reglas de comportamiento
248
261
 
249
262
  - NUNCA apliques cambios sin evidencia concreta. "Parece que sería mejor" no es evidencia.
@@ -121,7 +121,7 @@ Espera confirmación explícita del usuario.
121
121
  ## Paso 5 — Ejecutar init
122
122
 
123
123
  ```bash
124
- npx @saulwade/swl-ses@latest init
124
+ npx -y @saulwade/swl-ses@latest init
125
125
  ```
126
126
 
127
127
  Esto crea:
@@ -136,7 +136,7 @@ Si reporta archivos omitidos (ya existen), eso es normal.
136
136
  Construye el comando según las respuestas del usuario:
137
137
 
138
138
  ```bash
139
- npx @saulwade/swl-ses@latest install --target claude --profile <PERFIL> [--global] [--force]
139
+ npx -y @saulwade/swl-ses@latest install --target claude --profile <PERFIL> [--global] [--force]
140
140
  ```
141
141
 
142
142
  - `<PERFIL>`: el perfil que eligió el usuario
@@ -155,7 +155,7 @@ Este paso:
155
155
  ## Paso 7 — Ejecutar doctor
156
156
 
157
157
  ```bash
158
- npx @saulwade/swl-ses@latest doctor
158
+ npx -y @saulwade/swl-ses@latest doctor
159
159
  ```
160
160
 
161
161
  Verifica que todo quedó correctamente instalado:
@@ -217,4 +217,4 @@ Solo pregunta lo que NO se especificó en los argumentos.
217
217
  - Si el usuario no tiene el registry configurado, NO intentes instalar — solo guíalo.
218
218
  - Si el usuario pide un perfil que no existe, muestra la tabla de perfiles disponibles.
219
219
  - Este comando NO modifica código del proyecto — solo instala componentes SWL en `.claude/` y `.planning/`.
220
- - Para actualización: `npx @saulwade/swl-ses@latest update` detecta automáticamente el perfil instalado y actualiza sin preguntar perfil.
220
+ - Para actualización: `npx -y @saulwade/swl-ses@latest update` detecta automáticamente el perfil instalado y actualiza sin preguntar perfil.
@@ -51,7 +51,7 @@ o quiere reconfigurar.
51
51
  **Modo headless** (sin TTY):
52
52
  ```bash
53
53
  # Usar el instalador directamente con flag
54
- npx @saulwade/swl-ses@latest install --with-notificaciones=<TOKEN>,<CHAT_ID>
54
+ npx -y @saulwade/swl-ses@latest install --with-notificaciones=<TOKEN>,<CHAT_ID>
55
55
  ```
56
56
 
57
57
  **Criterio de éxito**: al terminar, el hook `notificacion-telegram.js` está
@@ -17,7 +17,7 @@ funcionalidad ni de flags.
17
17
  /swl:status salud — Diagnóstico de salud del sistema SWL (genera SALUD.md)
18
18
  /swl:status metricas — Métricas de la sesión actual (tokens, costo, herramientas)
19
19
  /swl:status metricas detalle — Desglose completo por herramienta, agente y timeline
20
- /swl:status metricas fases — Progreso de fases del proyecto (desde feature-list.json)
20
+ /swl:status metricas fases — Progreso de fases del proyecto (desde feature-list.json)
21
21
  /swl:status valor — Evidencia de valor del harness en ESTE proyecto (intercepciones, defectos/escapes, DORA/CI, uso — con procedencia por métrica)
22
22
  /swl:status loops — Trayectorias de loops iterativos (.planning/loops/)
23
23
  /swl:status evolucion — Estado del ciclo de auto-evolución (health_score, nudges…)
@@ -45,7 +45,7 @@ como vista por defecto si el contexto lo sugiere.
45
45
  | `metricas` (+ `detalle`, `fases`) | scripts de métricas de sesión + `derivar-feature-list.js` | `/swl:metricas` |
46
46
  | `loops` | `hooks/lib/loop-telemetry.js` | `/swl:metricas loops` |
47
47
  | `evolucion` | `hooks/ciclo-evolucion.js` (etapa métricas) + `.planning/evolution/metricas.json` | `/swl:evolucion-estado` |
48
- | `dora` | `scripts/lib/metricas-dora.js` + `.planning/evolution/metricas-dora.json` | nuevo (Fase 15, ADR-0039) |
48
+ | `dora` | `scripts/lib/metricas-dora.js` + `.planning/evolution/metricas-dora.json` | nuevo (Fase 15, ADR-0039) |
49
49
  | `valor` | CLI cross-scope `swl-ses valor` (`scripts/evidencia-valor.js`) — datos 100% locales; frontera y reglas anti-gaming en `docs/evidencia-valor.md` | nuevo (v2.5.1) |
50
50
  | `historico` / `dashboard` | `Skill("swl-dashboard")` | `/swl:dashboard` |
51
51
 
@@ -0,0 +1,12 @@
1
+ {
2
+ "_comentario": "Plantilla de referencia — NO se carga automáticamente por el scheduler. Crear el job real con `/swl:cron add` o `store.addJob(cwd, {...})` (ver comandos/swl/cron.md). Campos que store.addJob acepta: name, schedule, command, deliver (opcional, default 'local'), enabled (opcional, default true).",
3
+ "jobs": [
4
+ {
5
+ "name": "Ciclo autónomo nocturno",
6
+ "schedule": "0 3 * * *",
7
+ "command": "npx -y @saulwade/swl-ses@latest ciclo-autonomo",
8
+ "deliver": "local",
9
+ "descripcion": "Fase A del motor determinista de aprendizaje (ADR-0041); requiere /swl:evolucion-continua on"
10
+ }
11
+ ]
12
+ }
@@ -4,7 +4,7 @@ description: >
4
4
  Protocolo de auto-evolución del sistema SWL. Cómo los agentes aprenden y se mejoran,
5
5
  proponen cambios, versionado semántico de agentes, changelog, métricas de evolución,
6
6
  governance de cambios, parser de señales de fricción y safety checks.
7
- version: "1.1.1"
7
+ version: "1.1.2"
8
8
  herramientasPermitidas: [Read, Bash, Grep]
9
9
  evolvable: false # bloqueado por lista (skill de seguridad/privacidad)
10
10
  exclusiones:
@@ -148,6 +148,24 @@ Todo agente que proponga modificar un artefacto del sistema DEBE verificar:
148
148
  4. **Reversibilidad**: Todo cambio tiene un plan de rollback documentado
149
149
  5. **No contradicciones**: El cambio no contradice otros skills o reglas
150
150
 
151
+ ### Default de features autónomas: opt-out con kill-switch sagrado, no opt-in
152
+
153
+ [Decisión validada 2026-07-10, motor determinista Fase 21/ADR-0041] Un ciclo
154
+ autónomo que exige encendido explícito es un ciclo muerto en downstream —
155
+ nadie lo opera. El diseño correcto es **nacer encendido** SOLO si se cumplen
156
+ las 4 precondiciones que lo hacen inofensivo:
157
+
158
+ 1. **No-op sin señales**: en un proyecto sin datos, la corrida no escribe nada.
159
+ 2. **Backup pre-mutación**: toda escritura sobre memoria/estado tiene respaldo previo.
160
+ 3. **Kill-switch doble y sagrado**: config persistente (`off`) + variable por
161
+ sesión (`=0`); apagado = cero corridas, cero escrituras, sin excepción.
162
+ 4. **Visibilidad**: cada corrida deja digest/telemetría que el usuario ve sin pedirla.
163
+
164
+ Sin las 4, el default sigue siendo opt-in. La autonomía de MUTACIÓN (cambiar
165
+ skills/agentes) queda además detrás de sus propios gates (checklist
166
+ humano-validado, canary con quórum) — el default-on aplica al ciclo
167
+ determinista, no a la aplicación de cambios.
168
+
151
169
  ---
152
170
 
153
171
  ## Formato de Commit Evolutivo
@@ -87,10 +87,11 @@ Ejecutar el skill con un **caso de prueba representativo** y evaluar:
87
87
  score = Σ(items_cumplidos × peso) / Σ(todos_pesos) × 100
88
88
  ```
89
89
 
90
- Usar el script de scoring para cálculo determinista:
90
+ Usar el script de scoring para cálculo determinista (viaja DENTRO de este
91
+ skill — invocarlo con la ruta del directorio del skill, no relativa al cwd):
91
92
 
92
93
  ```bash
93
- node scripts/calcular-score.js '{"items":[{"peso":5,"cumple":true},{"peso":3,"cumple":false}]}'
94
+ node "<dir-de-este-skill>/scripts/calcular-score.js" '{"items":[{"peso":5,"cumple":true},{"peso":3,"cumple":false}]}'
94
95
  ```
95
96
 
96
97
  **Formato de reporte baseline:**
@@ -10,7 +10,7 @@ description: >
10
10
  `async with conn.transaction():`, cuando un test "deba pasar" pero falla
11
11
  con `TypeError: object MagicMock is not async iterable`, o cuando se
12
12
  agregue transaction wrapping a un service que tenía tests previos rotos.
13
- version: "1.0.0"
13
+ version: "1.0.1"
14
14
  herramientasPermitidas: [Read, Grep]
15
15
  exclusiones:
16
16
  - "No cargar para testing de SQLAlchemy async (AsyncSession) — esos usan `async with session.begin()` con un patrón distinto; cargar `fastapi-experto` que cubre el patrón con sessionmaker."
@@ -205,6 +205,7 @@ Si el código olvida envolver en transaction, `conn.transaction.assert_called_on
205
205
  - **`fetchrow.side_effect = [row, row]` se agota tras 2 llamadas**: en la 3ra llamada lanza `StopIteration`. Si el código real hace 3 fetchrows en distintas ramas, el test falla con error críptico. Fix: usar lista con suficientes elementos o `side_effect` callable que retorna según args (`lambda *args: row if args[0] == "SELECT..." else None`).
206
206
  - **`MagicMock` (no `AsyncMock`) en `conn.transaction` permite `assert_called_with(*args)` natural** — `AsyncMock` también lo soporta, pero produce warnings de "coroutine never awaited" si el mock se invoca incorrectamente. La distinción importa para diagnóstico, no para corrección.
207
207
  - **`pytest-asyncio` con `mode="auto"` puede no marcar el test como async si no detecta `async def`**: si el fixture es async pero el test es sync, el fixture nunca se await. Fix: explícito `@pytest.mark.asyncio` en el test, o usar `asyncio_mode = "auto"` en `pyproject.toml` y verificar que el test es `async def`.
208
+ - **Un test que simula transacciones concurrentes abriendo un `asyncpg.connect()` NUEVO (no el mock ni la conexión de la fixture) contra una BD con RLS DENY-by-default (`FORCE ROW LEVEL SECURITY`) ve CERO filas silenciosamente si esa conexión no setea `app.tenant_id`** [CONFIRMADO]: el GUC de tenant NUNCA se hereda entre conexiones distintas — ni siquiera si la conexión que sembró los datos ya seteó `app.tenant_id` y sigue abierta en otra variable. Este patrón aparece en tests de integración E2E (no en los mocks de este skill) que abren 2+ `asyncpg.connect()` para simular procesos concurrentes reales (ej. probar un `SELECT ... FOR SHARE`/TOCTOU). El síntoma es engañoso: no hay excepción de permisos, la query simplemente devuelve `None`/lista vacía, y el código que asume una fila (`row["estatus"]`) revienta con `TypeError: 'NoneType' object is not subscriptable` — fácil de confundir con un bug de lógica. Solo se manifiesta contra un rol que SÍ enforcea RLS (ej. el rol de aplicación en CI); un rol superusuario (usado en desarrollo local) bypasea RLS y el test pasa igual, ocultando el bug hasta CI. Fix: en CADA conexión nueva que abra el test (no solo la primera), `await conn.execute("SELECT set_config('app.tenant_id', $1, false)", str(tenant_id))` antes de cualquier query sobre una tabla con RLS.
208
209
 
209
210
  ## Referencias
210
211
 
@@ -71,7 +71,7 @@ significativas**.
71
71
  QUERY="qué hicimos sobre force push a main protegida"
72
72
 
73
73
  # 2. Ejecuta búsqueda y anota top-5 IDs
74
- node -e "console.log(require('./hooks/lib/memory-search').search('.', '$QUERY').slice(0, 5).map(r => r.id + ' / ' + r.titulo).join('\n'))"
74
+ swl-ses memoria-search search --query="$QUERY" --limit=5
75
75
 
76
76
  # 3. Verifica manualmente qué IDs son CORRECTOS (revisión humana,
77
77
  # no se inventa). Solo esos van en gold_ids.
@@ -93,7 +93,7 @@ benchmark es gate de release.
93
93
 
94
94
  ```bash
95
95
  # Ejecutar benchmark con dataset por defecto
96
- node scripts/benchmark-memoria.js
96
+ swl-ses benchmark-memoria
97
97
 
98
98
  # Output esperado:
99
99
  # Recall @ 5: 85.0%
@@ -107,16 +107,16 @@ node scripts/benchmark-memoria.js
107
107
 
108
108
  ```bash
109
109
  # Dataset alternativo
110
- node scripts/benchmark-memoria.js --dataset .planning/benchmark/custom.jsonl
110
+ swl-ses benchmark-memoria --dataset=.planning/benchmark/custom.jsonl
111
111
 
112
112
  # Top-k personalizado (default 20)
113
- node scripts/benchmark-memoria.js --limit 30
113
+ swl-ses benchmark-memoria --limit=30
114
114
 
115
115
  # Output JSON (para scripts)
116
- node scripts/benchmark-memoria.js --json
116
+ swl-ses benchmark-memoria --json
117
117
 
118
118
  # Detalle por query (útil para debugging)
119
- node scripts/benchmark-memoria.js --verbose
119
+ swl-ses benchmark-memoria --verbose
120
120
  ```
121
121
 
122
122
  ### Tracking histórico opcional
@@ -126,7 +126,7 @@ agregado a `.planning/evolution/benchmark-memoria.jsonl` (append-only)
126
126
  para detectar regresión entre releases:
127
127
 
128
128
  ```bash
129
- SWL_BENCHMARK_PERSIST=1 node scripts/benchmark-memoria.js
129
+ SWL_BENCHMARK_PERSIST=1 swl-ses benchmark-memoria
130
130
  ```
131
131
 
132
132
  Comparar entre releases: