@saulwade/swl-ses 1.6.0 → 1.6.3

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 (82) hide show
  1. package/CLAUDE.md +32 -61
  2. package/README.md +4 -4
  3. package/agentes/_intent-spec.md +73 -0
  4. package/agentes/auto-evolucion-swl.md +24 -0
  5. package/agentes/cloud-infra-swl.md +25 -0
  6. package/agentes/datos-swl.md +24 -1
  7. package/agentes/devops-ci-swl.md +24 -0
  8. package/agentes/frontend-angular-swl.md +7 -7
  9. package/agentes/frontend-css-swl.md +4 -4
  10. package/agentes/frontend-react-swl.md +7 -7
  11. package/agentes/frontend-swl.md +9 -9
  12. package/agentes/frontend-tailwind-swl.md +4 -4
  13. package/agentes/migrador-swl.md +22 -0
  14. package/agentes/pagos-swl.md +25 -0
  15. package/agentes/release-manager-swl.md +24 -0
  16. package/agentes/rendimiento-swl.md +2 -2
  17. package/agentes/sre-swl.md +24 -0
  18. package/comandos/swl/brainstorm.md +1 -0
  19. package/comandos/swl/compactar.md +1 -1
  20. package/comandos/swl/discutir-fase.md +15 -1
  21. package/comandos/swl/mapear-codebase.md +1 -1
  22. package/comandos/swl/nemesis.md +29 -0
  23. package/comandos/swl/planear-fase.md +18 -2
  24. package/comandos/swl/verificar.md +4 -4
  25. package/habilidades/aprender-de-git-diff/SKILL.md +288 -0
  26. package/habilidades/aprendizaje-continuo/SKILL.md +7 -1
  27. package/habilidades/diseno-herramientas-agente/SKILL.md +17 -0
  28. package/habilidades/doc-sync/SKILL.md +441 -1
  29. package/habilidades/doubt-driven-review/SKILL.md +177 -171
  30. package/habilidades/feynman-auditor-swl/SKILL.md +129 -123
  31. package/habilidades/infra-github-actions/SKILL.md +172 -166
  32. package/habilidades/meta-skills-estandar/SKILL.md +6 -0
  33. package/habilidades/meta-skills-estandar/recursos/skill-judge-rubrica.md +281 -0
  34. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
  35. package/habilidades/nemesis-evaluacion-json/SKILL.md +5 -0
  36. package/habilidades/nemesis-redistribuir/SKILL.md +5 -0
  37. package/habilidades/node-experto/SKILL.md +197 -3
  38. package/habilidades/prevencion-racionalizacion/SKILL.md +1 -0
  39. package/habilidades/privacy-memoria/SKILL.md +1 -0
  40. package/habilidades/proceso-autoverificacion-evidencias/SKILL.md +258 -0
  41. package/habilidades/proceso-confianza-pre-implementacion/SKILL.md +246 -0
  42. package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -0
  43. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -0
  44. package/habilidades/proceso-intent-engineering/SKILL.md +269 -0
  45. package/habilidades/reducir-entropia/SKILL.md +219 -0
  46. package/habilidades/sre-patrones/SKILL.md +1 -1
  47. package/habilidades/state-inconsistency-auditor-swl/SKILL.md +172 -166
  48. package/habilidades/tdd-workflow/SKILL.md +178 -3
  49. package/habilidades/verificacion-evidencia/SKILL.md +1 -0
  50. package/habilidades/web-fetcher-routing/SKILL.md +81 -75
  51. package/habilidades/workflow-claude-code/SKILL.md +2 -2
  52. package/hooks/lib/task-budget.js +218 -0
  53. package/hooks/validar-intent-spec.js +222 -0
  54. package/manifiestos/hooks-config.json +9 -0
  55. package/manifiestos/modulos.json +12 -2
  56. package/manifiestos/skills-lock.json +1191 -1142
  57. package/package.json +5 -3
  58. package/plugin.json +9 -2
  59. package/reglas/auditorias-documentales-estructurales.md +205 -0
  60. package/reglas/fragmentos-compartidos.md +26 -0
  61. package/reglas/intent-engineering.md +214 -0
  62. package/reglas/registro-componentes-nuevos.md +38 -0
  63. package/schemas/agent-frontmatter.schema.json +294 -167
  64. package/schemas/agent-message.schema.json +73 -53
  65. package/schemas/agent-output-implementacion.schema.json +114 -85
  66. package/schemas/agent-output-planificacion.schema.json +150 -113
  67. package/schemas/agent-output-review.schema.json +98 -78
  68. package/schemas/diary-entry.schema.json +42 -10
  69. package/schemas/hook-profiles.schema.json +54 -39
  70. package/schemas/hooks-config.schema.json +89 -74
  71. package/schemas/instinct.schema.json +152 -115
  72. package/schemas/modulos.schema.json +38 -29
  73. package/schemas/perfiles.schema.json +36 -28
  74. package/schemas/plugin.schema.json +77 -64
  75. package/schemas/skill-evals.schema.json +119 -95
  76. package/schemas/skill-frontmatter.schema.json +245 -170
  77. package/scripts/generar-inventario.js +452 -420
  78. package/scripts/lib/schema-version.js +164 -0
  79. package/scripts/validar-manifest.js +1 -1
  80. package/scripts/validar.js +3 -2
  81. package/scripts/verificar-docs-vs-codigo.js +654 -425
  82. package/scripts/verificar-evolucion.js +19 -3
@@ -15,6 +15,7 @@ permissionMode: acceptEdits
15
15
  color: red
16
16
  version: 1.0.0
17
17
  nivelRiesgo: ALTO
18
+ maxTurnos: 18 # incident response (diagnose → mitigate → verify) + post-mortem + runbooks
18
19
  skillsInvocables: [sre-patrones, performance-baseline, monitoring-alertas, checklist-seguridad]
19
20
  skillsRestringidos: [frontend-css-swl, mobile-flutter]
20
21
  permisosRed: false
@@ -31,6 +32,29 @@ exclusiones:
31
32
  - "No invocar para implementar features de aplicación — este agente trabaja en confiabilidad y operaciones, no en lógica de negocio."
32
33
  - "No invocar para configurar pipelines CI/CD — ese trabajo corresponde a devops-ci-swl."
33
34
  - "No invocar para implementar la capa de observabilidad (logs, métricas, trazas) — ese trabajo corresponde a observabilidad-swl."
35
+ strategy: >
36
+ Confiabilidad como producto, no como overhead. Error budgets sobre 100% uptime
37
+ imposible. Aprender de incidentes (blameless post-mortems) sobre culpar individuos.
38
+ Toil ≤50% del trabajo SRE; el resto es ingeniería que elimina toil.
39
+ healthMetrics:
40
+ - Error budget remanente del trimestre ≥0% (no consumido completo)
41
+ - Mean Time To Acknowledge (MTTA) de pages ≤5 min en horas críticas
42
+ - Cobertura de runbooks ≥80% para alertas que paginan
43
+ - Tasa de incidentes repetidos (mismo root cause en <30 días) <10%
44
+ - Toil documentado y medido ≤50% del tiempo del equipo SRE
45
+ steering:
46
+ - "Skill('sre-patrones') antes de definir SLO/SLI nuevos."
47
+ - "@reglas/observabilidad.md — los SLOs requieren SLIs medibles, no inventados."
48
+ - "Post-mortems blameless con timeline factual y action items con dueño + fecha."
49
+ - "Cargar Skill('proceso-ddia-fundamentos') al evaluar tradeoffs Reliability/Scalability/Maintainability."
50
+ hardGuardrails:
51
+ - "@reglas/seguridad-agentes.md § Recovery Catalog — escalar antes de modificar configuración de producción."
52
+ - "Chaos experiments en producción requieren plan de aborto y aprobación humana."
53
+ - "Cambios en alertas que paginan requieren on-call lead notificado."
54
+ - "Post-mortem de incidente SEV1/SEV2 obligatorio ≤72h del incidente."
55
+ - "@hooks/audit-trail.js — toda acción SRE sobre producción registrada en audit log."
56
+ fragmentos:
57
+ - _intent-spec
34
58
  ---
35
59
  ## Cuándo NO invocarme
36
60
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ name: swl:brainstorm
2
3
  description: Inicia una sesión de brainstorming estructurado para diseñar una feature o solución
3
4
  ---
4
5
 
@@ -24,7 +24,7 @@ Este comando es diferente de `/swl:checkpoint`: mientras checkpoint guarda estad
24
24
  Skill("compactacion-contexto")
25
25
  ```
26
26
 
27
- Si no existe, busca alternativas: `Skill("systematic-debugging")` para razonamiento estructurado. Documenta lo que cargaste.
27
+ Si no existe, busca alternativas en `~/.claude/skills/` (skills oficiales de Anthropic) o procede sin skill auxiliar — el algoritmo de 5 fases es zero-deps. Documenta lo que cargaste o que procediste sin skill.
28
28
 
29
29
  ## Paso 1 — Auditoría del contexto activo
30
30
 
@@ -17,13 +17,27 @@ Eres un analista funcional y técnico experto. Tu trabajo es convertir los objet
17
17
 
18
18
  El argumento `<n>` es el número de la fase a discutir.
19
19
 
20
+ ## Discovery routing (5 paths) — primer paso antes del cuestionario
21
+
22
+ Antes del cuestionario adaptativo completo, el agente clasifica la petición en uno de **5 rutas posibles** y ejecuta solo lo relevante. Origen: ADR-0020 sub-fase 1.
23
+
24
+ | Ruta | Cuándo aplica | Acción |
25
+ |------|--------------|--------|
26
+ | **RUTA_A** — Extender fase existente | La petición agrega tareas a una fase ya planeada. | Saltar cuestionario; cargar el CONTEXTO.md existente y agregar tareas. |
27
+ | **RUTA_B** — Sin fase formal | Fix trivial o tarea de <2 horas sin impacto cross-módulo. | Saltar cuestionario; proceder con `/swl:ejecutar-fase` directamente. |
28
+ | **RUTA_C** — Nueva fase single-scope | Petición nueva, no encaja en fases existentes, single-domain. | Ejecutar cuestionario completo (Bloques 1-4). |
29
+ | **RUTA_D** — Nueva fase multi-domain | Petición nueva, requiere decomposición en sub-tareas paralelas. | Cuestionario completo + planificación de paralelización. |
30
+ | **RUTA_E** — Mixto | La petición combina: extensión + nueva fase + posiblemente fix trivial. | Presentar decomposición propuesta y confirmar antes de proceder. |
31
+
32
+ El agente identifica la ruta en la primera respuesta al cargar `Skill("discutir-fase")` analizando: la petición textual, el estado de `.planning/HOJA-RUTA.md` y el último `RESUMEN.md`. Solo si la ruta es C o D se ejecuta el cuestionario completo descrito a continuación.
33
+
20
34
  ## Paso 0 — Carga de habilidades
21
35
 
22
36
  ```
23
37
  Skill("discutir-fase")
24
38
  ```
25
39
 
26
- Si no existe, intenta `Skill("planificador")` o `Skill("api-design-principles")`. Documenta qué cargaste.
40
+ Si no existe, intenta `Skill("planear-fase")` o `Skill("api-rest-diseno")`. Documenta qué cargaste.
27
41
 
28
42
  ## Paso 1 — Lectura de contexto previo
29
43
 
@@ -16,7 +16,7 @@ Carga la habilidad de análisis antes de comenzar:
16
16
  Skill("mapear-codebase")
17
17
  ```
18
18
 
19
- Si no existe en el proyecto, busca alternativas como `Skill("codebase-mapper")` o `Skill("systematic-debugging")`. Documenta qué habilidad cargaste.
19
+ Si no existe en el proyecto, procede sin skill auxiliar la lógica de mapeo del comando es zero-deps. Documenta que procediste sin skill.
20
20
 
21
21
  ## Paso 1 — Verificación del entorno
22
22
 
@@ -247,6 +247,35 @@ Cada `evaluacion.json` sigue el schema `nemesis-evaluacion-json` v1.0.0.
247
247
  El costo del modo `--remediar` es 3-5× el del modo solo auditar. Es opt-in
248
248
  deliberado del usuario, no default.
249
249
 
250
+ ### Calibración para módulos pequeños con alta densidad de control de flujo
251
+
252
+ Aunque la tabla estima 12-18 turnos para `--remediar` sobre módulo pequeño
253
+ (< 500 LOC), el valor agregado es desproporcionadamente alto cuando el
254
+ módulo concentra **lógica de control de flujo** (event handlers,
255
+ callbacks, `setTimeout`/`setInterval`, readline, promises, race conditions).
256
+ La densidad de bugs latentes en este tipo de código es alta, y nemesis los
257
+ detecta donde la revisión one-shot no.
258
+
259
+ **Patrón confirmado en swl-ses v1.6.0** (sesión 2026-05-16): `--remediar`
260
+ sobre `scripts/lib/ui.js` (~300 LOC con spinner + readline + prompts)
261
+ convergió en iter-2 con 15 turnos totales. Iter-1 detectó dos hallazgos
262
+ adicionales que el fix manual no había detectado:
263
+
264
+ - **F-1 (ALTO)**: listener leak de `process.once('exit')` acumulándose
265
+ en loops que crean N spinners secuenciales → MaxListenersExceededWarning.
266
+ - **F-2 (MEDIO)**: `preguntarOpcion` llamaba `_pausarSpinnersActivos()`
267
+ DESPUÉS del primer `console.log` del menú, dejando una ventana donde
268
+ el tick del spinner sobrescribía la primera línea.
269
+
270
+ Iter-2 confirmó PASS tras aplicar ambos fixes. Ninguno habría sido
271
+ detectado por `/swl:revisar` o `revisor-codigo-swl` solos — ambos
272
+ requirieron el reasoning iterativo Feynman+State.
273
+
274
+ **Regla operativa**: tras commits de fix-only en módulos con alta densidad
275
+ de control de flujo (no en módulos CRUD puros), correr `--remediar`
276
+ acotado al módulo. La inversión de 15 turnos típicamente detecta 1-2
277
+ bugs adyacentes que el fix original no cubrió.
278
+
250
279
  ## Ejemplos de invocación
251
280
 
252
281
  ```bash
@@ -21,10 +21,10 @@ Eres el coordinador de planeación SWL. Tu trabajo es orquestar la generación d
21
21
  Skill("planear-fase")
22
22
  ```
23
23
 
24
- Si no existe, carga `Skill("python-patterns")` si el stack es Python, o `Skill("angular-component")` si el stack es Angular/TS. Siempre carga también:
24
+ Si no existe, carga `Skill("patrones-python")` si el stack es Python, o `Skill("angular-moderno")` si el stack es Angular/TS. Siempre carga también:
25
25
 
26
26
  ```
27
- Skill("api-design-principles")
27
+ Skill("api-rest-diseno")
28
28
  ```
29
29
 
30
30
  ## Paso 1 — Verificación de prerrequisitos
@@ -42,6 +42,22 @@ Verifica también:
42
42
  - Lee `CLAUDE.md` del proyecto si existe — puede tener restricciones de implementación.
43
43
  - Si hay fases anteriores con PLAN.md o RESUMEN.md, léelas para entender patrones establecidos.
44
44
 
45
+ ### Reglas obligatorias sobre paths y listas en PLAN.md
46
+
47
+ **Ubicación del PLAN.md** (aprendizaje HIGH 2026-05-18):
48
+
49
+ - Iniciativas que califican como fase (cualquier trabajo cross-módulo, >50 LOC, multi-archivo, o que produce un release) van a `.planning/fases/0N-PLAN.md` donde N es el siguiente número libre.
50
+ - `.planning/PLAN.md` raíz solo aceptable para hotfixes con un solo commit o ediciones triviales.
51
+ - Al delegar al `planificador-swl`, instruir explícitamente: *"produce `.planning/fases/0N-PLAN.md` donde N es el siguiente número libre visible en `ls .planning/fases/`"*. NUNCA dejar la decisión de path al sub-agente sin esta instrucción.
52
+ - Si la sesión arrancó libre (sin `/swl:discutir-fase`), crear retrospectivamente `0N-CONTEXTO.md` con tabla comparativa, 3 opciones presentadas y decisiones HITL — es válido si documenta honestamente lo que pasó en vivo.
53
+
54
+ **Listas de agentes/componentes por campo de frontmatter** (aprendizaje HIGH 2026-05-18):
55
+
56
+ - Cuando un PLAN.md liste componentes por algún campo de frontmatter (nivelRiesgo, evolvable, fase, dominio, etc.), DEBE generarse con `grep -l "^<campo>: <valor>" <dir>/*.md` con **ancla `^` al inicio de línea**.
57
+ - Sin ancla, el grep matchea menciones en el cuerpo (ej: comentarios, secciones de revisión) y devuelve falsos positivos.
58
+ - Si el CONTEXTO recibe la lista en el prompt del usuario, el planificador DEBE verificarla con grep anclado antes de incluirla en PLAN.md.
59
+ - Precedente documentado: PR Opción B (2026-05-18) — CONTEXTO listaba 6 agentes ALTO; verificación real reveló 8 distintos (solo 1 solapamiento). Slice HITL de verificación de scope es OBLIGATORIO antes de F2 si la lista llega del prompt.
60
+
45
61
  ## Paso 2 — Análisis del contexto
46
62
 
47
63
  Antes de delegar, analiza el CONTEXTO.md de la fase y extrae:
@@ -51,12 +51,12 @@ Skill("verificar-trabajo")
51
51
 
52
52
  Carga también:
53
53
  ```
54
- Skill("error-handling-patterns")
55
- Skill("code-review-excellence")
54
+ Skill("manejo-errores")
55
+ Skill("checklist-calidad")
56
56
  ```
57
57
 
58
- Si el stack tiene Python: `Skill("python-testing-patterns")`
59
- Si el stack tiene Angular: `Skill("javascript-testing-patterns")`
58
+ Si el stack tiene Python: `Skill("testing-python")`
59
+ Si el stack tiene Angular: usar `@angular/core/testing` directo (sin skill dedicado)
60
60
 
61
61
  ## Paso 1 — Determinación del alcance de verificación
62
62
 
@@ -0,0 +1,288 @@
1
+ ---
2
+ name: aprender-de-git-diff
3
+ description: >
4
+ Extrae una lección dominante (máximo 2-3) desde git history — branch diff
5
+ contra main, últimos N commits, o un commit específico. Mapea los cambios
6
+ observados a principios de ingeniería catalogados en `~/.claude/rules/` y
7
+ `reglas/`. Cargar cuando el usuario pide "qué aprendimos aquí", "reflexión
8
+ sobre el código", "engineering takeaway", o tras un cierre de sesión
9
+ productiva donde valga capturar el patrón validado. Adaptación de
10
+ `lesson-learned` de agent-toolkit. NO escribe APRENDIZAJES.md por sí solo
11
+ — propone la entrada para que el usuario apruebe vía `/swl:aprender`.
12
+ version: "1.0.0"
13
+ herramientasPermitidas: [Read, Grep, Glob, Bash]
14
+ exclusiones:
15
+ - "No cargar si el rango de análisis son <5 LOC o un solo commit de typo/rename/formato — no hay lección que extraer."
16
+ - "No cargar para extraer aprendizaje de feedback verbal del usuario; ese flujo es `/swl:aprender` (triggered por feedback, no por git)."
17
+ - "No cargar para análisis de codebase completo o auditoría — usar `mapear-codebase` o `revisor-codigo-swl`."
18
+ - "No cargar para sesiones sin commits realizados todavía; primero realizar el trabajo, luego analizarlo."
19
+ evolvable: true
20
+ ---
21
+
22
+ # Habilidad: Aprender desde git diff
23
+
24
+ ## Propósito
25
+
26
+ Convertir el código que el usuario acaba de escribir en un espejo de los
27
+ principios de ingeniería que ya está aplicando (o que omite). No es una
28
+ lección abstracta — es la lectura del propio diff con vocabulario de
29
+ principios. El skill triggered por git complementa `/swl:aprender`
30
+ (triggered por feedback) cubriendo el vector "el código habla por sí
31
+ mismo".
32
+
33
+ ## Cuándo cargar
34
+
35
+ - Usuario pregunta "¿qué lección hay aquí?", "¿qué aprendimos?",
36
+ "engineering takeaway".
37
+ - Tras un cierre de sesión con commits sustantivos donde valga reforzar el
38
+ patrón validado.
39
+ - Al final de una rama de feature, antes del merge, para capturar el
40
+ principio dominante.
41
+ - Para revisar el propio trabajo del agente al cierre de un PR.
42
+
43
+ ## Cuándo NO cargar
44
+
45
+ Listado en `exclusiones` del frontmatter — incluye rangos triviales,
46
+ feedback verbal sin código (esa es `/swl:aprender`), auditoría de codebase
47
+ completo y sesiones sin commits.
48
+
49
+ ---
50
+
51
+ ## Fases del análisis
52
+
53
+ ### Fase 1 — Determinar scope
54
+
55
+ Preguntar al usuario o inferir del contexto:
56
+
57
+ | Scope | Comandos git | Cuándo aplicar |
58
+ |---|---|---|
59
+ | Branch feature | `git log main..HEAD --oneline` + `git diff main...HEAD` | Rama no-main (default) |
60
+ | Últimos N commits | `git log --oneline -N` + `git diff HEAD~N..HEAD` | Usuario da rango, o estamos en main (N=5 default) |
61
+ | Commit específico | `git show <sha>` | Usuario referencia commit |
62
+ | Working changes | `git diff` + `git diff --cached` | Usuario dice "estos cambios" antes de commit |
63
+
64
+ **Default**: si estamos en rama feature, analizar branch vs main. Si en
65
+ main, últimos 5 commits.
66
+
67
+ ### Fase 2 — Recolectar cambios
68
+
69
+ - `git log` para mensajes de commit (los mensajes contienen intent que el
70
+ diff puro pierde).
71
+ - `git diff` para los cambios.
72
+ - Si el diff supera 500 líneas: `git diff --stat` primero, luego leer
73
+ selectivamente los 3-5 archivos con más cambios.
74
+ - **Solo leer archivos cambiados**. No expandir a todo el repo.
75
+
76
+ ### Fase 3 — Analizar y mapear a principios
77
+
78
+ Identificar el **patrón dominante** — la cosa más instructiva sobre estos
79
+ cambios. Buscar:
80
+
81
+ - **Decisiones estructurales**: ¿cómo se organizó? ¿por qué esas
82
+ fronteras?
83
+ - **Trade-offs hechos**: ¿qué se ganó vs sacrificó? (legibilidad vs
84
+ rendimiento, DRY vs claridad, velocidad vs corrección).
85
+ - **Problemas resueltos**: ¿qué cambió del antes al después?
86
+ - **Oportunidades perdidas**: ¿dónde podría mejorar? (presentar como
87
+ "la próxima vez, considera...").
88
+
89
+ **Mapeo a catálogo de SWL** — usar como referencia:
90
+
91
+ 1. `~/.claude/rules/estilo-codigo.md` — DRY, KISS, funciones cortas,
92
+ early return, sin código muerto.
93
+ 2. `~/.claude/rules/arquitectura.md` — SOLID, módulos profundos, DI,
94
+ separación de concerns, patrones reconocidos.
95
+ 3. `~/.claude/rules/pruebas.md` — AAA, factories sobre fixtures, tests
96
+ deterministas, edge cases.
97
+ 4. `~/.claude/rules/seguridad.md`, `seguridad-agentes.md` — OWASP,
98
+ privilegio mínimo, anti-fallback.
99
+ 5. `~/.claude/rules/arreglar-al-detectar.md` — detectar→informar→
100
+ arreglar, anti-deuda silenciosa.
101
+ 6. `reglas/` del proyecto — convenciones locales.
102
+ 7. `.planning/APRENDIZAJES.md` — patrones ya validados (no repetir).
103
+
104
+ Ser **específico**: citar archivo:línea concreto, no afirmaciones vagas.
105
+
106
+ ### Fase 4 — Presentar la lección
107
+
108
+ Plantilla obligatoria:
109
+
110
+ ```markdown
111
+ ## Lección: [Nombre del principio]
112
+
113
+ **Qué pasó en el código:**
114
+ [2-3 oraciones describiendo el cambio específico, con archivos y commits]
115
+
116
+ **El principio en acción:**
117
+ [1-2 oraciones explicando el principio de ingeniería, citando la regla
118
+ SWL si aplica: `reglas/X.md § sección`]
119
+
120
+ **Por qué importa:**
121
+ [1-2 oraciones sobre la consecuencia práctica — qué saldría mal sin esto,
122
+ qué sale bien gracias a esto]
123
+
124
+ **Para próxima vez:**
125
+ [Una oración accionable y concreta]
126
+ ```
127
+
128
+ Si hay una segunda lección que vale la pena (máximo 2 adicionales):
129
+
130
+ ```markdown
131
+ ---
132
+
133
+ ### También digno de mención: [Principio]
134
+
135
+ **En el código:** [1 oración]
136
+ **El principio:** [1 oración]
137
+ **Para próxima vez:** [1 oración]
138
+ ```
139
+
140
+ ### Fase 5 — Propuesta de entrada en APRENDIZAJES.md
141
+
142
+ Tras presentar la lección al usuario, ofrecer la entrada que se podría
143
+ agregar a `.planning/APRENDIZAJES.md`:
144
+
145
+ ```markdown
146
+ ### [YYYY-MM-DD] <Título corto>
147
+
148
+ **rating**: HIGH / MEDIUM / LOW
149
+ **fuente**: git commits <sha-corto>..<sha-corto>
150
+ **principio**: <referencia a regla SWL>
151
+
152
+ **Contexto**: <qué hacíamos>
153
+ **Lección aplicada**: <lo extraído>
154
+ **Evidencia**: <archivo:línea principal>
155
+ ```
156
+
157
+ El usuario decide si la entrada se añade vía `/swl:aprender`. Este skill
158
+ **NO escribe directamente APRENDIZAJES.md** — propone, el usuario aprueba.
159
+
160
+ ---
161
+
162
+ ## Qué NO hacer
163
+
164
+ | Evitar | Por qué | En su lugar |
165
+ |---|---|---|
166
+ | Listar cada principio que vagamente aplica | Abrumador y genérico | Elegir 1-2 más relevantes |
167
+ | Analizar archivos no cambiados | Scope creep | Stick al diff |
168
+ | Ignorar commit messages | Tienen intent que el diff pierde | Leerlos como contexto primario |
169
+ | Consejo abstracto desconectado del código | No accionable | Siempre referenciar archivo:línea |
170
+ | Feedback solo negativo | Desmoralizante | Liderar con qué funciona, luego sugerir |
171
+ | Más de 3 lecciones | Diluye el insight | Una bien fundada vence siete vagas |
172
+
173
+ ---
174
+
175
+ ## Reglas obligatorias
176
+
177
+ 1. **Reflexivo, no prescriptivo**: usar el código del usuario como
178
+ evidencia primaria. **Por qué**: si el agente da consejo abstracto,
179
+ no usa el material que ya tiene a la vista — desperdicia la
180
+ especificidad del diff.
181
+
182
+ 2. **Nunca decir "deberías haber..."**: usar "el enfoque aquí muestra..."
183
+ o "la próxima vez que enfrentes esto, considera...". **Por qué**:
184
+ tono de auditor erosiona la conversación; el skill es espejo, no juez.
185
+
186
+ 3. **Si el código es bueno, decirlo**: no toda lección es sobre lo que
187
+ salió mal. Reconocer patrones buenos los refuerza. **Por qué**:
188
+ feedback solo negativo desmoraliza y oculta el valor del trabajo
189
+ completado.
190
+
191
+ 4. **Si los cambios son triviales, decirlo**: "Estos cambios son
192
+ directos — no hay lección profunda aquí, solo buen mantenimiento".
193
+ **Por qué**: forzar una lección donde no la hay es ruido.
194
+
195
+ 5. **Específico, no genérico**: cada claim apunta a un cambio concreto
196
+ de código con archivo:línea o sha. **Por qué**: consejo genérico ya
197
+ está en las reglas — el valor de este skill es la conexión con el
198
+ diff concreto.
199
+
200
+ 6. **Una lección dominante, máximo 3**: priorizar. **Por qué**: 7
201
+ lecciones tibias no equivalen a 1 lección con peso.
202
+
203
+ 7. **No escribir APRENDIZAJES.md directamente**: proponer la entrada,
204
+ el usuario aprueba vía `/swl:aprender`. **Por qué**: APRENDIZAJES.md
205
+ es memoria curada del usuario — escritura automática diluye su
206
+ calidad.
207
+
208
+ ---
209
+
210
+ ## Relación con otras herramientas SWL
211
+
212
+ - **`/swl:aprender`**: triggered por feedback verbal del usuario.
213
+ Este skill es triggered por git history. Vectores complementarios.
214
+ - **`revisor-codigo-swl`**: emite veredicto de calidad con score y
215
+ hallazgos. Este skill extrae **principios**, no hallazgos. Pueden
216
+ ejecutarse en secuencia.
217
+ - **`/swl:compactar`** + **`/swl:checkpoint`**: cierran sesión preservando
218
+ estado. Este skill puede invocarse durante el cierre para capturar
219
+ el aprendizaje antes de compactar.
220
+ - **Skill `meta-skills-estandar`**: catálogo de principios para crear
221
+ skills. Este skill consume principios para reportar; meta-skills los
222
+ define para producir.
223
+
224
+ ---
225
+
226
+ ## Ejemplo de uso
227
+
228
+ Usuario tras una sesión con 4 commits: *"¿qué aprendimos aquí?"*.
229
+
230
+ Agente carga este skill:
231
+
232
+ ```
233
+ ## Lección: Detección y prevención coordinadas
234
+
235
+ **Qué pasó en el código:**
236
+ Los 4 commits añadieron `tests/_helpers/sandbox.js` con auto-cleanup
237
+ vía `node:test after()` y refactorizaron 16 tests existentes para
238
+ usarlo (PR #35). El bug original — 5,800+ carpetas huérfanas en %TEMP%
239
+ — era acumulación de `fs.mkdtempSync` sin `rmSync`.
240
+
241
+ **El principio en acción:**
242
+ Fix sistemático en lugar de fix por archivo, alineado con
243
+ `reglas/arquitectura.md § Módulos profundos` (interfaz pequeña,
244
+ implementación rica). El helper expone 3 funciones (`create`, `list`,
245
+ `cleanup`) que ocultan la mecánica de `mkdtempSync`/`rmSync` y el
246
+ registro automático de `after()`.
247
+
248
+ **Por qué importa:**
249
+ Sin el helper, el patrón se hubiera "olvidado" en el siguiente test
250
+ nuevo — la misma causa raíz se hubiera reintroducido. Con el helper,
251
+ el nuevo test simplemente llama `sandboxes.create()`; el cleanup es
252
+ automático y no negociable.
253
+
254
+ **Para próxima vez:**
255
+ Al detectar un patrón roto en >3 archivos, pausar el fix por archivo
256
+ y diseñar el helper que lo previene estructuralmente.
257
+
258
+ ---
259
+
260
+ ### También digno de mención: separación FIFO de teardowns
261
+
262
+ **En el código:** `singleton-guard.test.js` y `nudge-tracker.test.js`
263
+ añadieron `after(() => process.chdir(repoRoot))` ANTES de
264
+ `setupSandboxes()` para que el restore de CWD ocurra antes del
265
+ cleanup, evitando EBUSY en Windows.
266
+ **El principio:** ordering explícito de teardowns donde el cleanup
267
+ depende de estado externo. `node:test` ejecuta los `after()` en FIFO,
268
+ así que el orden de declaración importa.
269
+ **Para próxima vez:** cuando un test cambia CWD, restaurar CWD ANTES
270
+ de cualquier cleanup de filesystem que dependa de ese CWD.
271
+
272
+ ---
273
+
274
+ **Entrada propuesta para APRENDIZAJES.md** (aprueba con `/swl:aprender` o ignora):
275
+
276
+ ### [2026-05-17] Helper estructural para prevenir patrón roto
277
+
278
+ **rating**: HIGH
279
+ **fuente**: commits bff27bb..b431360 (PR #35-#36)
280
+ **principio**: `reglas/arquitectura.md § Módulos profundos`
281
+
282
+ **Contexto**: 16 tests usaban mkdtempSync sin cleanup, acumulando 5,800
283
+ carpetas en %TEMP% tras ~76 corridas.
284
+ **Lección aplicada**: cuando >3 archivos repiten un patrón roto,
285
+ diseñar helper que lo prevenga estructuralmente en lugar de fix por archivo.
286
+ **Evidencia**: `tests/_helpers/sandbox.js:14-30` (3 funciones públicas
287
+ encapsulando 1 cleanup automático).
288
+ ```
@@ -6,7 +6,12 @@ description: >
6
6
  tres scopes (proyecto/dominio/global), degradacion automatica por contradiccion,
7
7
  promocion a skills/comandos/agentes, evolucion (merge, split, deprecate) y
8
8
  proteccion contra contaminacion cross-proyecto.
9
- version: "1.0.0"
9
+ version: "1.0.1"
10
+ evolved: true
11
+ evolved-from: "1.0.0"
12
+ evolved-at: "2026-05-16"
13
+ evolved-by: "aprender"
14
+ evolved-note: "v1.0.1 (PATCH): nuevo gotcha 'Filtro de exclusión de hooks debe cubrir tests/'. Origen: H3 sesión 2026-05-16 — el extractor de aprendizajes capturaba comentarios JSDoc de un test recién escrito (palabras 'bug', 'patrón', 'fix') y los promovía como entradas truncadas a APRENDIZAJES.md porque PATRONES_ARCHIVO_SWL_EXCLUIDO no incluía tests/."
10
15
  herramientasPermitidas: [Read]
11
16
  exclusiones:
12
17
  - "No cargar para consultar instintos ya cargados en la sesión actual — si el perfil fue leído, re-cargarlo es desperdicio de contexto."
@@ -141,6 +146,7 @@ ver [recursos/referencia-instintos.md](recursos/referencia-instintos.md).
141
146
  - **Hooks de observación con exit code != 0 interrumpen la sesión**: el hook `observe-pre.js` lanza una excepción y Claude Code detiene la tarea en curso. Causa: violación de la regla "los hooks de observación NUNCA deben producir exit code != 0". Solución: envolver toda la lógica del hook en `try/catch` y loggear el error al stderr sin propagarlo — la observabilidad nunca debe bloquear el trabajo productivo.
142
147
  - **Duplicación de instintos entre `proyecto.yaml` y `APRENDIZAJES.md`**: el mismo anti-patrón existe en ambos canales con información inconsistente. Causa: el instinto se creó manualmente sin verificar si ya había una entrada en APRENDIZAJES.md. Solución: antes de crear un instinto nuevo, ejecutar `memoria-busqueda` para verificar si ya existe en otro canal; si existe, actualizar el canal correcto según `reglas/memoria-consolidada.md`.
143
148
  - **Confianza llegando a 0.95 sin revisión humana**: el algoritmo suma 0.1 por evento y el instinto llega a 0.95 sin que nadie lo revise antes de la promoción. Causa: no se aplicó la restricción del último 5% (requiere revisión explícita). Solución: al llegar a 0.90, el sistema debe emitir un checkpoint `human-verify` antes de superar ese umbral — automatizar la vigilancia en `session-end.js`.
149
+ - **Filtro de exclusión de hooks de extracción no cubre `tests/`** [CONFIRMADO 2026-05-16]: el hook `hooks/extraccion-aprendizajes.js` capturaba comentarios JSDoc/docstring de tests recién escritos por el agente y los promovía como entradas truncadas a `APRENDIZAJES.md`. Caso real: al escribir `tests/lib/ui-spinner-prompt.test.js` con un comentario `/** Bug original: cuando un comando arrancaba un spinner y luego (dentro de la lógica...) */`, el hook detectaba la palabra "bug" y promovía una entrada con título cortado a mitad de frase. Causa: `PATRONES_ARCHIVO_SWL_EXCLUIDO` tenía `agentes/`, `habilidades/`, `comandos/swl/`, `hooks/`, `scripts/`, etc., pero **no incluía `tests/`**. Solución: cualquier filtro de exclusión que protege contra ruido auto-referente del agente DEBE incluir explícitamente todos los patrones de tests: `tests/`, `__tests__/`, `spec/`, `*.test.{js,ts,jsx,tsx,mjs,cjs}`, `test_*.py`, `_test.{py,go}`. Los comentarios de un test describen el SUT (System Under Test) — contienen las mismas keywords que un descubrimiento real ("bug", "patrón", "fix") pero NO son descubrimientos. Patrón general: al diseñar un filtro de exclusión para hooks de observación, listar **todas las convenciones de naming de tests del ecosistema target**, no solo los directorios. Verificado en commit `cb4332e` swl-ses v1.6.0.
144
150
 
145
151
  ## Anti-patrones
146
152
 
@@ -6,6 +6,7 @@ description: >
6
6
  description como prompt engineering, naming MCP y diseno de mensajes de error.
7
7
  Cargar cuando se disenan tools para agentes, se configura MCP, se definen
8
8
  toolBudget en agentes SWL, o se evalua la coleccion de herramientas de un agente.
9
+ version: "1.1.0"
9
10
  herramientasPermitidas: [Read, Grep]
10
11
  exclusiones:
11
12
  - "No cargar para implementar el hook que ejecuta los tools — este skill diseña la interfaz, no el handler; para implementar PreToolUse o PostToolUse cargar `hooks` o el agente correspondiente."
@@ -197,3 +198,19 @@ Antes de agregar una herramienta nueva a un agente, verificar:
197
198
  - **Error `recovery` genérico ("intenta de nuevo")**: el agente reintenta la misma llamada idéntica y falla de nuevo. Causa: el campo `recovery` dice "Reintenta más tarde" sin indicar qué debe cambiar. Solución: el `recovery` debe describir la acción correctiva específica ("Verificar que el archivo existe antes de llamar", "Reducir el campo `limit` a menos de 100").
198
199
  - **Naming MCP sin prefijo de servidor**: la tool `buscar_documentos` de un MCP server colisiona con otra tool local del mismo nombre. Causa: no seguir el formato `ServidorMCP:nombre_tool`. Solución: en MCP servers siempre usar `NombreServidor:accion_sustantivo`; el `:` no es opcional aunque el servidor solo tenga una tool.
199
200
  - **toolBudget `complex: 35` ignorado porque el agente no lo valida**: el orquestador asigna una tarea simple a un agente que usó 42 tool calls. Causa: `toolBudget` solo es efectivo si el hook de validación o el agente lo respeta activamente; declararlo en frontmatter sin lógica que lo cumpla no tiene efecto. Solución: verificar que el agente o el hook de control de presupuesto lee el campo `toolBudget` del frontmatter antes de asumir que el límite se aplicará automáticamente.
201
+
202
+ - **Parser YAML inline zero-deps no maneja CRLF / comentarios / comillas** [CONFIRMADO x2]: hooks que parsean frontmatter de Markdown con regex inline (`/^---\n([\s\S]+?)\n---/`) fallan silenciosamente en Windows con `autocrlf=true`. Caso 2026-04-20: `auditar-skills-gaps.js` reportaba 133/143 falsos positivos. Caso 2026-05-18: `validar-intent-spec.js` no detectaba ningún agente, exit 0 silent sin emitir nudges. Tres reglas obligatorias para parsers YAML inline en hooks/scripts SWL:
203
+ 1. **Normalizar line endings**: `contenido = contenido.replace(/\r\n/g, '\n').replace(/\r/g, '\n')` ANTES del regex.
204
+ 2. **Strip comentarios inline**: `nivelRiesgo: ALTO # ejemplo` → extraer `"ALTO"`, no `"ALTO # ejemplo"`. Helper `limpiarValorYaml(crudo)` que aplica `crudo.match(/^(.*?)(?:\s+#.*)?$/)[1]`.
205
+ 3. **Strip comillas wrapping**: `nivelRiesgo: "ALTO"` → extraer `"ALTO"`, no `'"ALTO"'`. Helper aplica `slice(1,-1)` si empieza y termina con `"` o `'`.
206
+
207
+ Considerar centralizar `limpiarValorYaml()` en `hooks/lib/yaml-mini.js` para reutilización. Causa: hookear los 3 detalles uno por uno cuando aparecen bugs en producción es costoso; aplicar las tres reglas desde el inicio del parser inline.
208
+
209
+ - **Hook validador no-funcional acumula bugs latentes silenciosamente**: cuando un hook PostToolUse warn-only (`blocking: false`) deja de funcionar por un bug interno (regex roto, parser incompleto, ruta excluida que matchea por error), no hay diferencia observable entre "hook OK, nada que reportar" y "hook roto, ningún reporte posible". Defensa en profundidad rota silenciosamente. Caso: F2 de PR #39 refactorizó 8 agentes ALTO bajo nueva regla obligatoria; 5 omitieron `maxTurnos`, hook debía emitirlos como `intent-spec-incomplete`, pero estaba roto por CRLF. Las 5 omisiones persistieron en main sin alarma.
210
+
211
+ Tres mitigaciones obligatorias al crear un hook nuevo de validación:
212
+ 1. **Smoke test end-to-end tras creación**: alimentar input que debería emitir nudge → verificar que `nudges.jsonl` contiene la entrada esperada (no solo `exit 0`).
213
+ 2. **Validador 1-shot tras refactor masivo**: si N componentes se refactorizan bajo nueva regla obligatoria, ejecutar el validador 1-shot contra cada uno antes de declarar completo.
214
+ 3. **Canary mode opcional**: emitir 1 nudge inicial "hook activo, monitoreando" la primera vez que se ejecuta tras instalación/actualización, para confirmar que el hook corre en la plataforma del usuario.
215
+
216
+ - **Smoke tests de hooks JSON-in en Windows con `echo` shell pierden escapes**: al debuguear hooks que reciben JSON en stdin, NUNCA construir el JSON con `echo` o heredoc desde Git Bash. Caso 2026-05-18: `echo '{"file_path":"D:\\Python\\swl-ses\\..."}'` producía JSON con `D:Python...` (sin backslashes) — los `\\` se comían en shell expansion. El hook recibía path inválido, no encontraba archivo, exit 0 silent. Tomó 3 intentos identificar que el problema era el shell, no el hook. **Patrón correcto**: escribir el JSON con un script Node standalone (`require('fs').writeFileSync('input.json', JSON.stringify({...}))`) y luego `node hook.js < input.json`. JSON correctamente escapado garantizado.