@saulwade/swl-ses 2.2.0 → 2.2.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 (81) hide show
  1. package/CLAUDE.md +199 -196
  2. package/README.md +597 -579
  3. package/agentes/arquitecto-swl.md +0 -5
  4. package/agentes/backend-python-swl.md +0 -5
  5. package/agentes/implementador-swl.md +0 -5
  6. package/agentes/nemesis-auditor-swl.md +0 -5
  7. package/agentes/orquestador-swl.md +0 -5
  8. package/agentes/planificador-swl.md +0 -5
  9. package/agentes/revisor-codigo-swl.md +0 -5
  10. package/bin/swl-mcp-server.js +1 -1
  11. package/comandos/swl/adoptar-proyecto.md +253 -258
  12. package/comandos/swl/aprender.md +823 -828
  13. package/comandos/swl/claudemd.md +234 -239
  14. package/comandos/swl/ejecutar-fase.md +0 -5
  15. package/comandos/swl/nuevo-proyecto.md +200 -205
  16. package/comandos/swl/release.md +19 -5
  17. package/comandos/swl/revisar-impacto.md +0 -5
  18. package/habilidades/agent-browser/SKILL.md +0 -5
  19. package/habilidades/angular-moderno/SKILL.md +0 -5
  20. package/habilidades/api-rest-diseno/SKILL.md +0 -5
  21. package/habilidades/aprendizaje-continuo/SKILL.md +0 -5
  22. package/habilidades/auth-patrones/SKILL.md +0 -5
  23. package/habilidades/build-errors-nextjs/SKILL.md +0 -5
  24. package/habilidades/changelog-generator/SKILL.md +174 -179
  25. package/habilidades/checklist-seguridad/SKILL.md +0 -5
  26. package/habilidades/contenedores-docker/SKILL.md +0 -5
  27. package/habilidades/datos-etl/SKILL.md +0 -5
  28. package/habilidades/doc-sync/SKILL.md +0 -5
  29. package/habilidades/extractor-de-aprendizajes/SKILL.md +0 -5
  30. package/habilidades/fastapi-experto/SKILL.md +0 -5
  31. package/habilidades/frontend-avanzado/SKILL.md +0 -5
  32. package/habilidades/iam-secretos/SKILL.md +0 -5
  33. package/habilidades/manejo-errores/SKILL.md +0 -5
  34. package/habilidades/mapear-codebase/SKILL.md +0 -5
  35. package/habilidades/meta-skills-estandar/SKILL.md +0 -5
  36. package/habilidades/monitoring-alertas/SKILL.md +0 -5
  37. package/habilidades/nextjs-experto/SKILL.md +0 -5
  38. package/habilidades/nextjs-testing/SKILL.md +0 -5
  39. package/habilidades/node-experto/SKILL.md +0 -5
  40. package/habilidades/orquestacion-async/SKILL.md +0 -5
  41. package/habilidades/patrones-python/SKILL.md +227 -232
  42. package/habilidades/planear-fase/SKILL.md +336 -341
  43. package/habilidades/postgresql-experto/SKILL.md +0 -5
  44. package/habilidades/prevencion-sobreingenieria/SKILL.md +0 -5
  45. package/habilidades/protocolo-revision-swl/SKILL.md +0 -5
  46. package/habilidades/react-experto/SKILL.md +0 -5
  47. package/habilidades/release-semver/SKILL.md +0 -5
  48. package/habilidades/swl-claudemd/SKILL.md +0 -5
  49. package/habilidades/tdd-workflow/SKILL.md +710 -715
  50. package/habilidades/testing-python/SKILL.md +335 -340
  51. package/habilidades/verificar-trabajo/SKILL.md +0 -5
  52. package/hooks/lib/etapa-perfil-usuario.js +1 -1
  53. package/hooks/lib/evolution-tracker.js +191 -35
  54. package/hooks/resumen-sesion.js +4 -4
  55. package/llms.txt +1 -1
  56. package/manifiestos/canonical-hashes.json +1310 -0
  57. package/manifiestos/modulos.json +3 -0
  58. package/manifiestos/skills-lock.json +70 -70
  59. package/package.json +1 -1
  60. package/plugin.json +1 -1
  61. package/scripts/doctor.js +13 -0
  62. package/scripts/generar-canonical-hashes.js +147 -0
  63. package/scripts/instalador.js +140 -54
  64. package/scripts/lib/audit-evolved.js +76 -0
  65. package/scripts/lib/canonical-hash.js +94 -0
  66. package/scripts/lib/evolved-fuente.js +138 -0
  67. package/scripts/lib/manifiestos.js +1 -1
  68. package/scripts/publicar.js +42 -5
  69. package/scripts/remediar-evolved-instaladas.js +242 -0
  70. package/scripts/validar.js +14 -0
  71. package/scripts/vendor/claude-usage/__pycache__/scanner.cpython-314.pyc +0 -0
  72. package/scripts/verificar-evolucion.js +36 -0
  73. package/scripts/verificar-release.js +33 -0
  74. package/agentes/.evolved.json +0 -9
  75. package/comandos/swl/.evolved.json +0 -23
  76. package/habilidades/auth-patrones/.evolved.json +0 -9
  77. package/habilidades/extractor-de-aprendizajes/.evolved.json +0 -9
  78. package/habilidades/instalar-sistema/.evolved.json +0 -9
  79. package/habilidades/manejo-errores/.evolved.json +0 -9
  80. package/habilidades/node-experto/.evolved.json +0 -9
  81. package/habilidades/release-semver/.evolved.json +0 -9
@@ -1,828 +1,823 @@
1
- ---
2
- name: swl:aprender
3
- description: Extrae aprendizajes de la sesión de trabajo actual. Analiza patrones de errores, decisiones y soluciones para generar nuevas reglas y habilidades que mejoran el sistema. Actualiza CLAUDE.md del proyecto y propone nuevas habilidades al sistema SWL.
4
- allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
5
- evolved: true
6
- evolved-from: "1.6.9"
7
- evolved-at: "2026-05-22"
8
- evolved-by: "aprender"
9
- evolved-note: "Paso 6.5 § Protocolo 4.5 detección de duplicación de reglas globales tras Tipo A (regla sin-duplicacion-reglas-globales.md, v1.7.0)"
10
- ---
11
-
12
- # /swl:aprender — Extracción de aprendizajes y mejora del sistema
13
-
14
- Eres el extractor de conocimiento del sistema SWL. Transformas la experiencia acumulada en una sesión de trabajo en conocimiento estructurado y reutilizable. Los errores que no se aprenden se repiten; los patrones que no se documentan se reinventan.
15
-
16
- ## Relación con otros canales de aprendizaje
17
-
18
- SWL tiene **tres canales independientes** de aprendizaje. Son complementarios, no solapados:
19
-
20
- | Canal | Produce | Disparadores | Escribe en |
21
- |-------|---------|--------------|------------|
22
- | `/swl:aprender` *(este comando)* | Conocimiento del dominio (anti-patrones, patrones, gotchas, decisiones) | Manual o nudge de `auto-consolidacion.js` (≥24h + ≥5 sesiones) | `APRENDIZAJES.md`, skills, `CLAUDE.md` |
23
- | `/swl:evolucionar` | Mejoras al sistema SWL (versionado de agentes/skills, patches, splits, deprecaciones) | Manual o nudge de `auto-evolucion.js` (≥3 fallos o ≥10 runs/14d de un agente) | `agentes/*.md`, `habilidades/*/SKILL.md`, CHANGELOG |
24
- | Agente `perfilador-usuario-swl` | Modelo del usuario (rol, stack preferido, correcciones repetidas, preferencias de comunicación) | Manual o nudge de `actualizar-perfil-usuario.js` (≥3 señales acumuladas) | `instintos/perfil-usuario.yaml` |
25
-
26
- **Reglas de ruteo** cuando un aprendizaje podría ir a más de un canal:
27
-
28
- - Tipo A/B/C (regla de proyecto, anti-patrón, nuevo skill) **este comando**.
29
- - Tipo D (mejora de metodología del SISTEMA SWL, no del proyecto) **`/swl:evolucionar`**.
30
- - Preferencia personal del usuario (cómo quiere que le hablen, qué stack prefiere,
31
- qué correcciones repite) → **`perfilador-usuario-swl`**, NO este comando.
32
- Este comando nunca escribe al perfil; solo genera conocimiento del dominio.
33
- - Si la duda persiste: el canal correcto es aquel cuyo destino (APRENDIZAJES/skill
34
- vs. agente/skill SWL vs. perfil) es donde *otro agente* lo buscaría la próxima vez.
35
-
36
- ## Cuándo usar este comando
37
-
38
- - Al final de una fase ejecutada exitosamente
39
- - Después de resolver un bug difícil
40
- - Cuando se tomó una decisión de arquitectura importante
41
- - Cuando un patrón de implementación resultó mejor de lo esperado
42
- - Cuando algo del plan fue consistentemente incorrecto
43
- - Cuando el hook `auto-consolidacion.js` lo sugiere (>= 24h y >= 5 sesiones nuevas)
44
-
45
- ## Modo de ejecución
46
-
47
- Este comando tiene 2 modos:
48
-
49
- 1. **Interactivo** (default): El usuario dirige qué analizar. Sigue los Pasos 0-7 completos.
50
- 2. **Consolidación automática**: Se ejecuta cuando el hook `auto-consolidacion.js` lo sugiere o el usuario dice "consolida". Sigue el flujo de 4 fases inspirado en autoDream (ver sección al final).
51
-
52
- Si el usuario dice "consolida", "consolida memoria", "auto-dream" o similar, saltar directamente a la **Sección: Consolidación en 4 fases** al final de este comando.
53
-
54
- ---
55
-
56
- ## Paso 0 — Carga de habilidades
57
-
58
- ```
59
- Skill("extractor-de-aprendizajes")
60
- Skill("aprendizaje-continuo")
61
- ```
62
-
63
- El skill `extractor-de-aprendizajes` define el ciclo de mejora continua, los 4 tipos de aprendizajes (anti-patrón, patrón positivo, gotcha, decisión de proyecto), el protocolo de extracción completo (capturar contexto, determinar destino, escribir regla con formato MAL/BIEN, integrar al skill), la plantilla para nuevos skills y los indicadores de calidad.
64
-
65
- El skill `aprendizaje-continuo` define el sistema de instintos con niveles de confianza, scopes (proyecto/dominio/global) y evolución.
66
-
67
- ## Paso 1 Definición del alcance
68
-
69
- Pregunta al usuario:
70
-
71
- ```
72
- ¿De qué quieres extraer aprendizajes?
73
-
74
- 1. De la sesión completa de trabajo actual
75
- 2. De la resolución de un problema específico (describe cuál)
76
- 3. De una fase específica que acaba de completarse (¿cuál fase?)
77
- 4. De decisiones de arquitectura tomadas en este proyecto
78
- 5. Todo lo anterior
79
-
80
- Escribe el número o describe lo que prefieres analizar.
81
- ```
82
-
83
- Espera respuesta. Adapta los pasos siguientes según el alcance.
84
-
85
- ## Paso 2 Recolección de evidencia
86
-
87
- Según el alcance elegido, recolecta:
88
-
89
- - **Sesión completa**: commits recientes (`git log --oneline --since="8 hours ago"`), archivos modificados, RESUMEN.md, VERIFICACION.md, ESTADO.md, COMPACTACION.md
90
- - **Problema específico**: pide al usuario: síntoma, tiempo de resolución, qué NO funcionó, qué lo resolvió, archivos relevantes
91
- - **Fase específica**: lee CONTEXTO.md, PLAN.md, RESUMEN.md, VERIFICACION.md de la fase
92
-
93
- ### Filtro crítico OBLIGATORIO sobre reportes de sub-agentes Explore
94
-
95
- Cuando se delega análisis a sub-agentes (especialmente `Explore` analizando papers
96
- académicos, repositorios externos o documentación extensa), los reportes producidos
97
- tienden a sobreestimar costos de implementación y proponer alcances over-engineered
98
- (50h+ cuando el patrón portable real cabe en 5-10h).
99
-
100
- **Antes de incorporar cualquier propuesta del sub-agente al Paso 3 de análisis**,
101
- aplicar este filtro de 4 preguntas:
102
-
103
- 1. **¿Qué porcentaje del paper/repo es teoría académica vs. patrón portable?**
104
- Si >70% es teoría (pruebas formales, demostraciones de Lyapunov, complejidad
105
- PAC, etc.), el patrón portable real es mucho menor de lo que el sub-agente sugiere.
106
-
107
- 2. **¿La propuesta requiere reescribir mecanismos existentes en SWL?**
108
- Si sí, descartar SWL ya tiene drift-detector, recovery, observabilidad. La
109
- integración correcta es **extender**, no **reemplazar**.
110
-
111
- 3. **¿Cuántas líneas de código nuevas estima el sub-agente vs. cuántas se podrían
112
- ahorrar reutilizando lo existente?**
113
- Si la propuesta supera 500 LOC nuevas para un solo patrón, hay sobre-ingeniería.
114
-
115
- 4. **¿El alcance reducido (~5-10h) cubre el 80% del valor del paper?**
116
- Aplicar Pareto: identificar el patrón mínimo que captura la mayor parte del
117
- beneficio, descartar el resto como "puede esperar".
118
-
119
- **Anti-patrón observado** (sesión 2026-04-25): un sub-agente Explore propuso 50h+
120
- de trabajo para implementar Bhardwaj 2026 completo (SPRT secuencial, verificación
121
- formal, compositionality theorems). Tras filtro crítico: solo Drift Score formalizado
122
- + Recovery Catalog eran portables (~3h reales). El resto era teoría académica
123
- no integrable a un sistema de producción.
124
-
125
- Documentar el filtro aplicado en el reporte final con formato:
126
-
127
- ```
128
- Sub-agente Explore propuso: [resumen]
129
- Filtro crítico aplicado: [cuáles de las 4 preguntas tuvieron señal de alarma]
130
- Alcance final aprobado: [propuesta reducida con justificación]
131
- Descartado: [lo que NO se implementa y por qué]
132
- ```
133
-
134
- ## Paso 3Análisis de patrones
135
-
136
- Analiza la evidencia en 5 categorías:
137
-
138
- 1. **Errores recurrentes** — mismo tipo de error en múltiples slices o archivos. Extrae: tipo, causa raíz, regla preventiva, detección temprana.
139
- 2. **Decisiones de arquitectura** alternativa elegida, criterio, resultado final.
140
- 3. **Patrones exitosos** — código o estructuras reutilizables que resolvieron problemas elegantemente.
141
- 4. **Estimaciones vs realidad** slices sobre/subestimados y causas de las diferencias.
142
- 5. **Gaps del sistema** — skills con información faltante, skills inexistentes, reglas incorrectas.
143
-
144
- ## Paso 4 — Clasificación de aprendizajes
145
-
146
- Clasifica cada aprendizaje según los tipos definidos en `Skill("extractor-de-aprendizajes")`:
147
-
148
- | Tipo | Destino | Ejemplo |
149
- |------|---------|---------|
150
- | **A Regla de proyecto** | `CLAUDE.md` del proyecto | Convención de nombrado específica |
151
- | **B — Anti-patrón general** | Skill existente (sección apropiada) | Bug recurrente de SQLAlchemy async |
152
- | **C Nueva habilidad** | Nuevo directorio en `habilidades/` | Patrones de integración con API específica |
153
- | **D Mejora de metodología** | Comando SWL correspondiente | Preguntas faltantes en discutir-fase |
154
-
155
- ### Priorización por rating (aplicar consistentemente)
156
-
157
- Tras clasificar por tipo, cada aprendizaje recibe un **rating HIGH / MEDIUM / LOW**
158
- según los criterios de `Skill("extractor-de-aprendizajes")` (sección "Clasificación
159
- automática por impacto"):
160
-
161
- | Rating | Criterio | Acción |
162
- |--------|----------|--------|
163
- | **HIGH** | Decisión irreversible, bug crítico que costó >1h de diagnóstico, cambio de patrón mayor, incumplimiento de regla ya conocida | Promover inmediatamente al skill/comando destino; aparece primero en la presentación del Paso 5 |
164
- | **MEDIUM** | Gotcha documentado con causa + fix, patrón confirmado ≥2 veces en la sesión, anti-patrón operativo | Integrar al skill destino en la iteración actual |
165
- | **LOW** | Observación contextual, preferencia menor, dato informativo, refinamiento de redacción | Mantener solo en APRENDIZAJES.md como registro; **NO** promover a skill a menos que el usuario lo solicite explícitamente |
166
-
167
- **Regla de priorización obligatoria cuando `alcance = "todo"`**: los aprendizajes
168
- se presentan en el Paso 5 **ordenados por rating (HIGH → MEDIUM → LOW)**, no en
169
- orden de descubrimiento. Esto evita que observaciones menores (estilo, formato,
170
- preferencias) diluyan la señal de los gotchas de alto impacto. El usuario debe
171
- poder leer solo el bloque HIGH y decidir si procede, sin scroll innecesario.
172
-
173
- **Fracción típica esperada**: en una sesión productiva, <20% de aprendizajes son
174
- HIGH, 40-60% MEDIUM, el resto LOW. Si la distribución está invertida (mayoría
175
- HIGH), probablemente se está sobre-clasificando — revisar criterios.
176
-
177
- **Anti-patrón**: presentar 30 aprendizajes planos sin rating → el usuario aprueba
178
- en bloque por fatiga y se integran observaciones menores a skills donde degradan
179
- la señal/ruido. Siempre aplicar el rating antes del Paso 5.
180
-
181
- ## Paso 5 — Presentación y confirmación
182
-
183
- Presenta los aprendizajes clasificados al usuario ANTES de modificar archivos,
184
- **ordenados por rating HIGH → MEDIUM → LOW dentro de cada tipo** (ver Paso 4,
185
- sección "Priorización por rating"):
186
-
187
- ```
188
- Identifiqué [N] aprendizajes de la sesión (ordenados por impacto):
189
-
190
- 🔴 RATING HIGH ([N]):
191
- TIPO A Reglas para este proyecto ([N_a_high]):
192
- 1. [regla]: [descripción]
193
- TIPO B Anti-patrones generales ([N_b_high]):
194
- 1. [anti-patrón]: [descripción y corrección]
195
- TIPO D Mejoras de metodología ([N_d_high]):
196
- 1. [mejora]: [qué cambiaría]
197
-
198
- 🟡 RATING MEDIUM ([N]):
199
- TIPO B Anti-patrones generales ([N_b_med]):
200
- 1. [anti-patrón]: [descripción y corrección]
201
- TIPO C — Nueva habilidad propuesta ([N_c_med]):
202
- 1. [nombre propuesto]: [qué cubriría]
203
-
204
- 🔵 RATING LOW ([N]) solo registrar, no promover:
205
- 1. [observación breve]
206
- 2. [observación breve]
207
-
208
- ¿Apruebas los HIGH y MEDIUM? ¿Algún LOW quieres promover manualmente?
209
- ¿Hay alguno incorrecto o que no identifiqué?
210
- ```
211
-
212
- **Criterios de aceptación de la presentación**:
213
- - Si `alcance = "todo"` y la lista tiene más de 15 aprendizajes, NO presentar todos
214
- planos; agrupar por rating y mostrar primero el bloque HIGH completo, luego
215
- resumen contado de MEDIUM/LOW con opción "ver detalle" si el usuario lo pide.
216
- - Si no hay ningún aprendizaje HIGH, reportar explícitamente *"sin aprendizajes
217
- de alto impacto"* es señal válida, no falla del proceso.
218
- - Nunca promover LOW automáticamente. Los LOW quedan en APRENDIZAJES.md como
219
- registro y pueden consolidarse después si se confirman ≥3 veces (ver skill
220
- `extractor-de-aprendizajes` sección "Consolidación con vigencia").
221
-
222
- Espera respuesta. Ajusta según feedback.
223
-
224
- ## Paso 5.5 Guard anti-compounding ANTES de persistir
225
-
226
- > "When outputs get filed back, errors compound too." — @HFloyd sobre el sistema de Karpathy
227
- >
228
- > Este paso se ejecuta OBLIGATORIAMENTE entre la aprobación del usuario (Paso 5)
229
- > y la escritura de los aprendizajes (Paso 6). Su propósito es detectar contradicciones
230
- > ANTES de que entren al knowledge base — no después.
231
-
232
- ### Verificación de consistencia por cada aprendizaje aprobado
233
-
234
- Para **cada aprendizaje del tipo A o B** que el usuario aprobó, ejecutar:
235
-
236
- ```bash
237
- # Buscar el contenido del aprendizaje nuevo en APRENDIZAJES.md
238
- # para detectar si ya existe algo que lo contradiga
239
- grep -i "[KEYWORD_DEL_APRENDIZAJE]" .planning/APRENDIZAJES.md | head -10
240
- ```
241
-
242
- Evaluar el resultado en 3 categorías:
243
-
244
- | Resultado | Acción |
245
- |-----------|--------|
246
- | **No hay entradas previas** relacionadas | Persistir directamente — no hay riesgo de compounding |
247
- | **Hay entradas previas que CONFIRMAN** el nuevo aprendizaje | Persistir y marcar como `[CONFIRMADO x2]` para aumentar confianza |
248
- | **Hay entradas previas que CONTRADICEN** el nuevo aprendizaje | **DETENER** — ver protocolo de resolución abajo |
249
-
250
- ### Protocolo de resolución de contradicción pre-persistencia
251
-
252
- Si se detecta contradicción entre un aprendizaje nuevo y uno existente:
253
-
254
- 1. **Presentar al usuario la contradicción explícitamente**:
255
-
256
- ```
257
- Contradicción detectada antes de persistir:
258
-
259
- APRENDIZAJE NUEVO (de esta sesión):
260
- "[texto del aprendizaje nuevo]"
261
-
262
- APRENDIZAJE EXISTENTE (APRENDIZAJES.md, línea N):
263
- "[texto del aprendizaje anterior]"
264
-
265
- ¿Cómo resolver?
266
- [A] El nuevo es correcto — reemplazar el anterior (con fecha y razón)
267
- [B] El anterior es correcto descartar el nuevo
268
- [C] Ambos son válidos en contextos distintos — fusionar con condición explícita
269
- [D] Necesito más evidencia posponer ambos hasta tener más datos
270
- ```
271
-
272
- 2. **No persistir ninguno** hasta que el usuario resuelva.
273
-
274
- 3. **Registrar la resolución** en el log del wiki si existe:
275
- ```bash
276
- echo "## [$(date +%Y-%m-%d)] contradicción-resuelta | [tema]" >> .planning/knowledge/log.md
277
- ```
278
-
279
- ### Verificación adicional: consistencia con el wiki
280
-
281
- Si existe `.planning/knowledge/wiki/` en el proyecto:
282
-
283
- ```bash
284
- # Verificar si hay una página wiki que trate el mismo tema
285
- ls .planning/knowledge/wiki/ 2>/dev/null | grep -i "[keyword]"
286
- ```
287
-
288
- Si existe una página wiki relevante:
289
- - Leerla antes de persistir el aprendizaje
290
- - Si el nuevo aprendizaje contradice la página wiki: actualizar la wiki también
291
- - Agregar al log del wiki: `## [FECHA] update | [página] actualizado por nuevo aprendizaje`
292
-
293
- **Regla clave**: el aprendizaje nuevo y la página wiki deben ser consistentes.
294
- Un aprendizaje que contradice la wiki sin actualizar la wiki = compounding error garantizado.
295
-
296
- ## Paso 6 Aplicación de aprendizajes aprobados
297
-
298
- Aplica cada tipo siguiendo el protocolo del skill:
299
-
300
- - **TIPO A**: agrega reglas en `CLAUDE.md` del proyecto en la sección apropiada. NUNCA elimines reglas existentes.
301
- - **TIPO B**: escribe la regla en el skill correspondiente usando el formato del skill (NUNCA/SIEMPRE + Problema + código MAL vs BIEN). Usa la tabla de destinos del skill para elegir dónde.
302
- - **TIPO C**: crea nuevo directorio en `habilidades/` con SKILL.md completo (frontmatter + cuándo activar + reglas + anti-patrones). Mínimo 5 reglas concretas para justificar skill separado.
303
- - **TIPO D**: modifica el comando SWL correspondiente en `comandos/swl/`.
304
-
305
- **OBLIGATORIO — Dos acciones acopladas por cada archivo modificado** (TIPO B y D).
306
-
307
- Marcar `evolved` y bumpear la versión interna del componente son **dos operaciones complementarias que SIEMPRE se aplican juntas**, nunca una sin la otra. El flag `evolved` protege contra reinstalación; el bump de `version` comunica al resto del sistema (auditorías, `/swl:status salud`, consumidores) que el contenido del componente cambió desde la última revisión. Omitir el bump hace el cambio invisible aunque el flag esté puesto.
308
-
309
- ### Acción 1 — Marcar como evolved
310
-
311
- Usar el subcomando del CLI (resuelve cross-scope; ver
312
- `docs/invocacion-cli-cross-scope.md`):
313
-
314
- ```bash
315
- swl-ses mark-evolved "[RUTA_ARCHIVO_MODIFICADO]" \
316
- --by=aprender \
317
- --note="[tipo de aprendizaje: anti-patrón / mejora de metodología]"
318
- # fallback: npx -y @saulwade/swl-ses@latest mark-evolved "[RUTA]" --by=aprender --note="..."
319
- ```
320
-
321
- `--from` se infiere del `package.json` del CWD si se omite.
322
-
323
- `markAsEvolved` registra automáticamente `evolved-at` con la fecha del día en formato ISO (`YYYY-MM-DD`) no hay que pasarla manualmente. Escribe en el frontmatter los 5 campos siguientes:
324
-
325
- ```yaml
326
- evolved: true
327
- evolved-from: "[versión del sistema al momento del cambio]"
328
- evolved-at: "[fecha ISO del día agregada automáticamente]"
329
- evolved-by: "aprender"
330
- evolved-note: "[nota pasada como meta.note]"
331
- ```
332
-
333
- Si Bash no está disponible y se edita el frontmatter manualmente, **incluir obligatoriamente la fecha ISO de hoy en `evolved-at`**. Una entrada `evolved: true` sin fecha es inválida — sin fecha no se puede auditar cuándo ocurrió la evolución ni priorizar cambios recientes en `/swl:status salud`.
334
-
335
- ### Acción 2 — Bumpear la versión interna del componente
336
-
337
- Solo aplica a agentes y skills (los comandos SWL no versionan internamente; para comandos, basta con la Acción 1).
338
-
339
- Leer el campo `version` del frontmatter y aplicar SemVer según el tipo de cambio:
340
-
341
- | Cambio aplicado al componente | Bump |
342
- |-------------------------------|------|
343
- | Gotcha nuevo, regla nueva, corrección de redacción | **PATCH** (1.0.0 → 1.0.1) |
344
- | Sección completa nueva, nueva categoría de contenido, cambio significativo de alcance | **MINOR** (1.0.0 1.1.0) |
345
- | Redefinición incompatible (renombrar campo obligatorio, cambiar contrato de invocación) | **MAJOR** (1.0.0 → 2.0.0) |
346
-
347
- Edit el frontmatter del archivo:
348
- ```yaml
349
- version: "1.0.1" # era "1.0.0"
350
- ```
351
-
352
- **SIN MARCADO DE EVOLVED**: los cambios se perderán en la próxima actualización de SWL.
353
- **SIN BUMP DE VERSIÓN**: el cambio será invisible al resto del sistema aunque el contenido del archivo haya cambiado.
354
- **Las dos acciones son OBLIGATORIAS para cualquier modificación de contenido de skill o agente.**
355
-
356
- ### Verificación automática al final del Paso 6
357
-
358
- Antes de pasar al Paso 7, ejecutar OBLIGATORIAMENTE el verificador que valida que TODOS los archivos de `agentes/` y `habilidades/` modificados en la sesión tengan ambos metadatos actualizados. No es opcional — es una gate de calidad del comando:
359
-
360
- ```bash
361
- # Verifica archivos modificados desde el último commit del usuario
362
- # (ajustar --since según el alcance de la sesión de aprender)
363
- npx -y @saulwade/swl-ses@latest verify-evolution --changed --since=HEAD~1
364
- ```
365
-
366
- El script revisa cada agente/skill modificado contra 4 criterios:
367
-
368
- 1. Campo `version` presente en el frontmatter
369
- 2. `evolved: true` registrado (en frontmatter o en `<dir>/.evolved.json`)
370
- 3. Metadatos `evolved-from`, `evolved-at`, `evolved-by` completos con fecha en formato ISO `YYYY-MM-DD`
371
- 4. Campo `version` bumpado respecto al HEAD de git si el archivo tiene diff real
372
-
373
- **Exit codes**:
374
- - `0` — todo OK, continuar al Paso 7
375
- - `1` — al menos un archivo falla. **NO continuar al Paso 7**. Corregir cada gap reportado y volver a ejecutar hasta que pase. El reporte indica el problema exacto y el archivo afectado.
376
- - `2` — error de invocación (archivo no existe, argumentos inválidos)
377
-
378
- Ejemplo de output en éxito:
379
- ```
380
- [OK] agentes/release-manager-swl.md: version=1.0.1 (era 1.0.0), evolved=true
381
- [OK] habilidades/manejo-errores/SKILL.md: version=1.0.1 (era 1.0.0), evolved=true
382
- Resultado: 2/2 OK
383
- ```
384
-
385
- Ejemplo de output en fallo que obliga a corregir antes de continuar:
386
- ```
387
- [FALLA] habilidades/foo/SKILL.md: contenido modificado pero `version` no bumpada (sigue en 1.0.0) | version=1.0.0, evolved=true
388
- [FALLA] habilidades/bar/SKILL.md: `evolved` no encontrado (ni en frontmatter ni en .evolved.json del directorio) | version=1.1.0, evolved=n/a
389
- Resultado: 0/2 OK, 2 con fallos
390
- ```
391
-
392
- Si el verificador reporta fallo, corregir el archivo puntual (agregar bump o ejecutar `markAsEvolved()`), NO saltarse la verificación. El gap que esta verificación cierra es exactamente el que el usuario detectó al auditar la sesión de aprender del 2026-04-20: `markAsEvolved` ejecutado sin bump de `version` → cambio invisible al resto del sistema pese a que el archivo quedó protegido contra reinstalación.
393
-
394
- ## Paso 6.5 Validación de CLAUDE.md tras aplicar Tipo A (auditor síncrono)
395
-
396
- > Este paso es **OBLIGATORIO** si en Paso 6 se aplicó al menos un aprendizaje
397
- > Tipo A (regla agregada a `CLAUDE.md` del proyecto). El hook
398
- > `claudemd-bloat-detector.js` ya emite nudge async cuando se modifica
399
- > `CLAUDE.md`, pero el nudge llega DESPUÉS del Paso 7 — y el comando
400
- > habría seguido sin saber que el contrato canónico se rompió.
401
- >
402
- > Este Paso 6.5 invoca el auditor SÍNCRONAMENTE, antes de pasar a Paso 7.
403
-
404
- ### Por qué existe este paso
405
-
406
- `/swl:aprender` y `/swl:claudemd` operan sobre el mismo archivo desde
407
- ángulos distintos: aprender **muta**, claudemd **prescribe contrato**. Sin
408
- validación cruzada, una sesión de aprender puede agregar 25 líneas inline
409
- a un CLAUDE.md que estaba en 195 LOC → resultado 220 LOC, WARN líneas,
410
- contrato roto silenciosamente.
411
-
412
- Origen del gap: detectado en sesión 2026-05-22 al evaluar el flujo
413
- SIGAF→swl-ses (CLAUDE.md SIGAF recibió ~25 líneas inline de
414
- "Triangulación schema cross-stack" sin validación post-mutación).
415
-
416
- ### Procedimiento
417
-
418
- Solo si en Paso 6 se aplicó al menos un Tipo A:
419
-
420
- 1. **Ejecutar el auditor síncrono**:
421
-
422
- ```bash
423
- swl-ses audit-claudemd --json
424
- ```
425
-
426
- Si el script no está disponible en el proyecto destino (instalación
427
- global vía npm), invocar:
428
-
429
- ```bash
430
- npx -y @saulwade/swl-ses@latest audit-claudemd --json
431
- ```
432
-
433
- 2. **Leer el JSON de respuesta** y evaluar `veredicto`:
434
-
435
- | Veredicto | Acción |
436
- |-----------|--------|
437
- | `OK` | Continuar a Paso 7. El Tipo A se aplicó respetando el contrato. |
438
- | `WARN` con regla `tamano-total` (líneas > umbral) | Aplicar protocolo de extracción (sub-paso 3) |
439
- | `WARN` con regla `bullet-gigante` | Aplicar protocolo de condensación (sub-paso 4) |
440
- | `WARN` con regla `duplicacion-reglas-globales` | **DETENER y reformular** — el Tipo A duplica regla global. Aplicar protocolo de duplicación (sub-paso 4.5) |
441
- | `WARN` con otra regla (secciones, @references, karpathy) | Reportar al usuario pero permitir continuar |
442
- | `ERROR` con regla `placeholders` | **DETENER** revertir Tipo A y reportar al usuario |
443
-
444
- 3. **Protocolo de extracción** (WARN líneas excedidas):
445
-
446
- ```
447
- El Tipo A aplicado dejó CLAUDE.md en [N] líneas (umbral: 200).
448
-
449
- Opciones:
450
- [A] Condensar la regla agregada a ≤3 líneas y re-escribir en CLAUDE.md
451
- [B] Extraer el cuerpo a @docs/lessons-<tema-kebab>.md y dejar 1 línea
452
- en CLAUDE.md: "- **<título>**: [resumen 1 línea]. Detalle en
453
- @docs/lessons-<tema>.md"
454
- [C] Aceptar el WARN y continuar (ajustar SWL_CLAUDEMD_MAX_LINES en
455
- caso de que el límite real del proyecto sea mayor)
456
-
457
- ¿Qué prefieres?
458
- ```
459
-
460
- Por defecto, recomendar **[B] Extraer** cuando el aprendizaje requiere
461
- más de 5 líneas o incluye ejemplos de código. Recomendar **[A] Condensar**
462
- cuando el aprendizaje cabe en 1-3 líneas sin perder accionabilidad.
463
-
464
- 4. **Protocolo de condensación** (WARN bullet-gigante):
465
-
466
- Un bullet/párrafo >1000 chars es ilegible. Convertir a tabla, lista
467
- jerárquica o extraer a `@docs/`. NO dejar el bullet gigante aunque el
468
- usuario lo apruebe viola el contrato canónico de CLAUDE.md.
469
-
470
- 4.5. **Protocolo de duplicación de reglas globales** (WARN `duplicacion-reglas-globales`):
471
-
472
- Esto significa que el Tipo A aplicado **parafrasea una regla que ya
473
- vive en `~/.claude/rules/`** y se carga globalmente. Duplicarla
474
- inline en CLAUDE.md de proyecto viola la regla
475
- `reglas/sin-duplicacion-reglas-globales.md`.
476
-
477
- El auditor reporta cuál regla global se duplica y la línea
478
- aproximada. Ejemplo de hallazgo:
479
-
480
- ```
481
- [WARN] Bloque duplica regla global `~/.claude/rules/brevedad-output.md`
482
- (línea ~14)
483
- ```
484
-
485
- Acción obligatoria:
486
-
487
- ```
488
- El Tipo A que se acaba de agregar parafrasea la regla global
489
- `~/.claude/rules/<archivo>.md` § <sección> (línea ~N).
490
-
491
- Opciones:
492
- [A] Eliminar el bloque local — la regla global YA aplica
493
- automáticamente en cada sesión SWL.
494
- [B] Reescribir el bloque como matiz local (≤3 líneas) que
495
- nombra explícitamente la regla global:
496
- "Convenciones locales del proyecto: <matiz>.
497
- Ver @~/.claude/rules/<archivo>.md."
498
- [C] Documentar override explícito con justificación:
499
- "Override de ~/.claude/rules/<archivo>.md por <razón>."
500
-
501
- ¿Qué prefieres?
502
- ```
503
-
504
- Por defecto, **recomendar [A] Eliminar** salvo que el bloque agregue
505
- matiz local genuino del proyecto. NUNCA aceptar el WARN sin
506
- resolución eso convierte el comando en cómplice de la duplicación
507
- que la regla prohíbe.
508
-
509
- 5. **Re-ejecutar el auditor** tras la corrección hasta veredicto OK o
510
- WARN consultivo aceptable (con confirmación explícita del usuario para
511
- los WARN no resueltos).
512
-
513
- ### Reglas duras
514
-
515
- - NUNCA pasar al Paso 7 con veredicto `ERROR placeholders`. Revertir el Tipo
516
- A primero.
517
- - NUNCA aceptar `WARN tamano-total` o `WARN bullet-gigante` sin proponer al
518
- menos una de las opciones [A]/[B]. El usuario debe decidir conscientemente
519
- si vivir con el WARN.
520
- - Si el aprendizaje Tipo A genera 2+ secciones nuevas, evaluar si el
521
- contenido pertenece a un archivo `@docs/lessons-<tema>.md` desde el inicio
522
- en lugar de inline.
523
-
524
- ### Anti-patrón explícito
525
-
526
- Aplicar Tipo A inline sin Paso 6.5 → CLAUDE.md crece descontroladamente
527
- contrato canónico violado silenciosamente → próxima ejecución de
528
- `/swl:claudemd audit` reporta WARN, pero el daño ya está en el commit.
529
-
530
- Aplicar Tipo A ejecutar auditor sync en Paso 6.5 si hay drift,
531
- condensar o extraer → CLAUDE.md permanece dentro del contrato.
532
-
533
- ## Paso 7 — APRENDIZAJES.md y reporte
534
-
535
- Crea o actualiza `.planning/APRENDIZAJES.md` con registro de la sesión: título, categoría, contexto, aprendizaje, acción tomada, métricas.
536
-
537
- ```
538
- Extracción de aprendizajes completada.
539
-
540
- Aprendizajes procesados:
541
- - Reglas nuevas en CLAUDE.md del proyecto: [N]
542
- - Anti-patrones agregados a habilidades existentes: [N]
543
- - Nuevas habilidades creadas: [N] ([lista])
544
- - Mejoras de metodología aplicadas: [N]
545
-
546
- Archivos actualizados:
547
- [lista con rutas]
548
- ```
549
-
550
- ## Paso 7.3 Diary estructurado de la sesión (opcional)
551
-
552
- Si la sesión generó al menos 3 aprendizajes aprobados (cualquier categoría),
553
- generar un diary estructurado en `.planning/sessions/diary/{id}.json` usando
554
- `scripts/lib/diary-entry.js`. Es **opcional**: si la sesión fue trivial o
555
- puramente exploratoria, omitir este paso.
556
-
557
- El diary captura — en formato consumible por máquinas — accomplishments,
558
- decisiones, challenges y aprendizajes clave. NO duplica APRENDIZAJES.md
559
- (que es prosa para humanos). El diary es derivado estructurado, alimenta
560
- búsquedas futuras y análisis cross-sesión.
561
-
562
- **Cuándo generar diary**:
563
-
564
- - La sesión cerró un slice o feature completa.
565
- - Se tomaron 1+ decisiones arquitectónicas registradas.
566
- - Se aprendieron 2+ patrones nuevos que aplicarán a sesiones futuras.
567
- - El usuario lo pide explícitamente.
568
-
569
- **Cuándo NO generar diary**:
570
-
571
- - Sesión exploratoria sin acciones de cambio.
572
- - Solo se respondieron preguntas técnicas sin tocar código.
573
- - Sesión < 30min sin commits.
574
-
575
- **Cómo generar** (subcomando del CLI, resuelve cross-scope; ver
576
- `docs/invocacion-cli-cross-scope.md`). Pasar el contenido como JSON por stdin:
577
-
578
- ```bash
579
- echo '{
580
- "sessionId": "<id-de-sesión>",
581
- "agent": "orquestador-swl",
582
- "accomplishments": ["<logro 1>"],
583
- "decisions": ["<decisión 1 + razón>"],
584
- "learnings": ["<aprendizaje clave 1>"],
585
- "sourceAgents": ["implementador-swl"]
586
- }' | swl-ses diary-entry
587
- # fallback: ... | npx -y @saulwade/swl-ses@latest diary-entry
588
- ```
589
-
590
- El subcomando construye la entrada, valida (`validateDiary`) y la persiste en
591
- `.planning/sessions/diary/<id>.json`, imprimiendo la ruta escrita. Reportar en
592
- el output:
593
-
594
- ```
595
- Diary generado: .planning/sessions/diary/diary-YYYYMMDD-HASH.json
596
- Logros: N | Decisiones: N | Challenges: N | Aprendizajes: N
597
- ```
598
-
599
- ## Paso 7.5 — Diagnóstico de agentes con fallos recurrentes (auto-evolución dirigida)
600
-
601
- Este paso se ejecuta **automáticamente** después de actualizar APRENDIZAJES.md.
602
- No requiere interacción del usuario salvo para confirmar evolución.
603
-
604
- ### Objetivo
605
-
606
- Detectar agentes SWL que aparecen con ≥3 entradas de fallo en APRENDIZAJES.md
607
- y proponer `/swl:evolucionar` específicamente para esos agentes.
608
-
609
- Inspirado en el ciclo del PDF "A Practical Guide to Building Agents":
610
- > "Real-world failures refine guardrails/instructions iterate"
611
-
612
- ### Procedimiento
613
-
614
- 1. **Leer `.planning/APRENDIZAJES.md`** y contar entradas de fallo por agente:
615
- - Solo contar líneas de **encabezado de entrada** (formato `## [YYYY-MM-DD] tipo — descripción`)
616
- que sean de tipo `bug-fix`, `anti-patrón` o `fallo` Y mencionen un agente SWL en el mismo encabezado.
617
- - Las menciones de agentes dentro del **cuerpo** de una entrada (contexto, ejemplos, plantillas)
618
- no cuentan como fallos evita falsos positivos por nombres en código o en secciones de revisión.
619
-
620
- 2. **Construir tabla de fallos por agente**:
621
- ```bash
622
- # Solo buscar en líneas de encabezado (## [fecha]) con tipo de fallo
623
- # que además mencionen un agente SWL en esa misma línea
624
- grep -E "^## \[20[0-9]{2}-[0-9]{2}-[0-9]{2}\] (bug-fix|anti-patrón|fallo)" \
625
- .planning/APRENDIZAJES.md \
626
- | grep -oE "[a-z][a-z0-9-]+-swl" | sort | uniq -c | sort -rn | head -10
627
- ```
628
-
629
- 3. **Evaluar umbral**: Si algún agente tiene **≥3 fallos**, está calificado para evolución dirigida.
630
-
631
- 4. **Presentar diagnóstico al usuario**:
632
-
633
- ```
634
- ── Diagnóstico de fallos por agente ──────────────────────
635
- Se detectaron agentes con ≥3 entradas de fallo en APRENDIZAJES.md:
636
-
637
- ┌─────────────────────────┬────────┬─────────────────────────────────────────┐
638
- Agente │ Fallos Tipo de fallo más frecuente │
639
- ├─────────────────────────┼────────┼─────────────────────────────────────────┤
640
- [nombre-agente-swl] │ [N] [descripción breve del patrón de fallo] │
641
- └─────────────────────────┴────────┴─────────────────────────────────────────┘
642
-
643
- ¿Deseas ejecutar /swl:evolucionar para estos agentes?
644
- [S] evolucionar ahora (recomendado)
645
- [N] No registrar diagnóstico y continuar
646
- [D] Detalle ver entradas de fallo completas antes de decidir
647
- ```
648
-
649
- 5. **Si el usuario confirma (S)**:
650
- - Ejecutar `/swl:evolucionar` pasando el nombre del agente con más fallos primero.
651
- - Si hay múltiples agentes calificados, proponer evolucionar uno por sesión
652
- (evitar sobrecarga de cambios simultáneos).
653
-
654
- 6. **Si el usuario rechaza (N)**:
655
- - Agregar una entrada en APRENDIZAJES.md:
656
- ```
657
- [diagnóstico] [FECHA] agente [nombre]: [N] fallos registrados, evolución pospuesta por usuario.
658
- ```
659
- - Esto permite que el próximo `/swl:aprender` detecte el patrón acumulado.
660
-
661
- 7. **Si no hay agentes con ≥3 fallos**: omitir este paso completamente y reportar `Sistema en buen estado ningún agente supera el umbral de fallos (≥3).`
662
-
663
- ### Reglas de este paso
664
-
665
- - NUNCA proponer evolución sin evidencia en APRENDIZAJES.md (mínimo ≥3 entradas citables).
666
- - Los fallos deben ser en dominios distintos o fechas distintas 3 menciones del mismo incidente no cuentan como 3 fallos.
667
- - Si el agente fue creado o evolucionado en los últimos 7 días, reducir el umbral requerido a ≥5 (darle tiempo de estabilizarse).
668
-
669
- ## Reglas de comportamiento
670
-
671
- - NUNCA inventes aprendizajes sin evidencia de la sesión. Si no puedes citar de dónde viene, no lo incluyas.
672
- - NUNCA elimines reglas existentes de habilidades — solo agrega o marca como obsoletas.
673
- - Cada aprendizaje debe ser accionable: "hacer X en lugar de Y" es un aprendizaje. "El código es complejo" no lo es.
674
- - Si el usuario rechaza un aprendizaje, registra por qué en APRENDIZAJES.md.
675
- - Nuevas habilidades necesitan mínimo 5 reglas concretas; si son menos, agrégalas a una existente.
676
- - Prioriza calidad sobre cantidad — 3 aprendizajes precisos valen más que 15 vagos.
677
-
678
- ---
679
-
680
- ## Modelo de memoria por niveles (clasificación de aprendizajes)
681
-
682
- Cada aprendizaje extraído tiene un nivel de madurez que determina dónde se
683
- almacena y cómo se consolida. Inspirado en el modelo de 4 niveles de agentmemory.
684
-
685
- | Nivel | Nombre | Almacenamiento | Ciclo de vida | Ejemplo |
686
- |-------|--------|---------------|---------------|---------|
687
- | **L1** | Working | Conversación actual | Se pierde al cerrar sesión si no se persiste | "Este endpoint necesita retry con backoff" |
688
- | **L2** | Episodic | `.planning/sessions/`, `.planning/APRENDIZAJES.md` | 30 días, se purga o promueve | "Sesión del 2026-04-10: resolvimos bug de N+1 en pedidos" |
689
- | **L3** | Semantic | `habilidades/*/SKILL.md`, `reglas/`, wiki/ | Permanente, se actualiza con evidencia | "SQLAlchemy async requiere selectinload, no lazy" |
690
- | **L4** | Procedural | Instintos (`instintos/`), prompts de agentes | Permanente, alta confianza | "Siempre verificar propagación de cambios antes de commit" |
691
-
692
- ### Reglas de promoción entre niveles
693
-
694
- - **L1→L2**: Automático al persistir en APRENDIZAJES.md (Paso 6-7).
695
- - **L2→L3**: Cuando el aprendizaje se valida en **≥3 sesiones distintas** o el usuario lo confirma explícitamente como regla general. Se agrega como regla a un skill existente o se crea página wiki.
696
- - **L3→L4**: Cuando el aprendizaje semántico se ha confirmado en **≥5 sesiones** sin contradicciones y aplica a todo el proyecto. Se convierte en instinto con confianza ≥0.8.
697
- - **Degradación**: Un aprendizaje en cualquier nivel se degrada si evidencia posterior lo contradice (ver Paso 5.5).
698
-
699
- ### Uso en consolidación
700
-
701
- Durante la consolidación (siguiente sección), usar estos niveles para decidir:
702
- - Qué entradas de APRENDIZAJES.md merecen promoverse a skills o wiki (L2→L3)
703
- - Qué instintos tienen suficiente evidencia para crearse o fortalecerse (L3→L4)
704
- - Qué entradas episódicas ya cumplieron su utilidad y pueden purgarse (L2 >30 días sin promoción)
705
-
706
- ### Deduplicación con fingerprint
707
-
708
- Antes de persistir un aprendizaje nuevo, verificar que no sea duplicado de uno existente:
709
-
710
- ```bash
711
- # Subcomando del CLI (resuelve cross-scope; ver docs/invocacion-cli-cross-scope.md).
712
- # Lee APRENDIZAJES.md, divide por '## ' y compara con umbral 0.6 por defecto.
713
- swl-ses near-duplicate --texto="[TEXTO_DEL_APRENDIZAJE_NUEVO]"
714
- # fallback: npx -y @saulwade/swl-ses@latest near-duplicate --texto="[TEXTO]"
715
- ```
716
-
717
- Si es duplicado (similitud ≥0.6), fusionar con la entrada existente en vez de crear nueva.
718
-
719
- ---
720
-
721
- ## Sección: Consolidación en 4 fases (modo autoDream)
722
-
723
- Cuando se ejecuta en modo consolidación (automático o por pedido del usuario),
724
- seguir estas 4 fases sin interacción. Inspirado en autoDream de Claude Code.
725
-
726
- ### Fase 1 Orient
727
-
728
- 1. Leer `.planning/APRENDIZAJES.md` para entender qué ya está registrado.
729
- 2. Leer `instintos/proyecto.yaml` para ver instintos activos y su confianza.
730
- 3. Listar sesiones recientes: `ls -lt .planning/sessions/ | head -10`
731
- 4. Leer `.planning/COMPACTACION.md` si existe para contexto del proyecto.
732
-
733
- ### Fase 2 Gather (señal reciente)
734
-
735
- 1. Escanear las sesiones nuevas (las que tienen mtime posterior a la última consolidación).
736
- Solo leer las más recientes (máximo 5 sesiones), no exhaustivamente.
737
- 2. Buscar en cada sesión: errores resueltos, decisiones tomadas, patrones descubiertos.
738
- 3. Buscar evidencia que contradiga aprendizajes o instintos existentes.
739
- 4. **NO** leer el código fuente ni investigar solo sintetizar lo que ya se hizo.
740
-
741
- ### Fase 3 Consolidate (curación de memoria)
742
-
743
- 1. **Merge duplicados**: Si hay aprendizajes en APRENDIZAJES.md que dicen lo mismo
744
- con distintas palabras, consolidar en una sola entrada más precisa.
745
- 2. **Convertir fechas relativas a absolutas**: "ayer" "2026-04-02", "la semana pasada" → "2026-03-26".
746
- 3. **Eliminar hechos contradichos**: Si una sesión reciente muestra que un aprendizaje
747
- anterior era incorrecto, eliminarlo o marcarlo como `[OBSOLETO]` con la razón.
748
- 4. **Degradar instintos contradichos**: Si un instinto en `proyecto.yaml` fue contradicho
749
- por evidencia de sesiones recientes, bajar su confianza (mínimo 0.1 por contradicción).
750
- 5. **Promover instintos validados**: Si un instinto fue confirmado por evidencia
751
- positiva en 3+ sesiones, subir su confianza (máximo +0.1 por confirmación).
752
- 6. **Promoción L2→L3**: Buscar entradas en APRENDIZAJES.md con ≥3 marcas `[CONFIRMADO]`
753
- y que no existan ya como regla en ningún skill. Proponer promoción a skill o wiki.
754
- 7. **Promoción L3→L4**: Buscar reglas en skills con ≥5 confirmaciones en sesiones
755
- distintas. Proponer creación de instinto con confianza 0.8.
756
- 8. **Deduplicación**: Usar `isNearDuplicate()` de `hooks/lib/fingerprint-id.js`
757
- para detectar entradas casi idénticas en APRENDIZAJES.md y fusionarlas.
758
-
759
- ### Fase 4 Prune e Índice
760
-
761
- 1. **Limitar APRENDIZAJES.md a 100 entradas**: Eliminar las más antiguas y menos
762
- accionables si supera el límite. Mantener siempre los anti-patrones críticos.
763
- 2. **Eliminar sesiones muy antiguas** (> 30 días) de `.planning/sessions/` para
764
- evitar crecimiento indefinido. Solo los archivos JSON, no la metadata.
765
- 3. **Reportar lo hecho** al usuario:
766
-
767
- ```
768
- Consolidación completada (modo autoDream):
769
- - Entradas en APRENDIZAJES.md: [antes] → [después] ([+N nuevas, -N eliminadas, N mergeadas])
770
- - Instintos actualizados: [N degradados, N promovidos]
771
- - Fechas normalizadas: [N]
772
- - Contradicciones detectadas y resueltas: [N]
773
- - Sesiones antiguas purgadas: [N]
774
- ```
775
-
776
- ### Fase 4.5 — Lint del wiki (si existe)
777
-
778
- Si el proyecto tiene `.planning/knowledge/wiki/`, ejecutar health check del wiki
779
- como parte de la consolidación:
780
-
781
- ```bash
782
- # Detectar si existe el wiki del proyecto
783
- ls .planning/knowledge/wiki/ 2>/dev/null | wc -l
784
- ```
785
-
786
- Si hay páginas en el wiki (resultado > 0), ejecutar:
787
-
788
- 1. **Detectar páginas huérfanas** (sin referencias desde otras páginas):
789
- ```bash
790
- # Listar todas las páginas del wiki
791
- ls .planning/knowledge/wiki/*.md | grep -v "INDEX.md" | grep -v "log.md"
792
- # Verificar cuáles no aparecen referenciadas en otras páginas
793
- for PAGE in .planning/knowledge/wiki/*.md; do
794
- NOMBRE=$(basename "$PAGE" .md)
795
- REFS=$(grep -l "\[\[$NOMBRE\]\]" .planning/knowledge/wiki/*.md 2>/dev/null | wc -l)
796
- echo "$REFS refs: $NOMBRE"
797
- done | grep "^0"
798
- ```
799
-
800
- 2. **Detectar claims sin fuente en raw/**:
801
- - Buscar afirmaciones en wiki/ que referencien fuentes no presentes en `raw/`
802
- - Marcar con `[SIN-FUENTE]` para revisión posterior
803
-
804
- 3. **Detectar páginas no enlazadas desde INDEX.md**:
805
- ```bash
806
- # Páginas en wiki/ que no aparecen en INDEX.md
807
- comm -23 \
808
- <(ls .planning/knowledge/wiki/*.md | xargs -I{} basename {} .md | sort) \
809
- <(grep -oE '\[\[.+\]\]' .planning/knowledge/wiki/INDEX.md | tr -d '[]' | sort)
810
- ```
811
-
812
- 4. **Reportar resultados del lint en el log**:
813
- ```bash
814
- echo "## [$(date +%Y-%m-%d)] lint | wiki health check" >> .planning/knowledge/log.md
815
- echo "- Páginas huérfanas: [N]" >> .planning/knowledge/log.md
816
- echo "- Claims sin fuente: [N]" >> .planning/knowledge/log.md
817
- echo "- Páginas fuera del índice: [N]" >> .planning/knowledge/log.md
818
- ```
819
-
820
- Si no hay wiki, omitir esta fase y continuar a Fase 4.
821
-
822
- ### Reglas de consolidación
823
-
824
- - NUNCA eliminar un aprendizaje sin evidencia de que es incorrecto. Antigüedad sola no justifica eliminación — solo irrelevancia o contradicción.
825
- - NUNCA leer transcripts exhaustivamente. Escanear títulos y buscar keywords específicos.
826
- - Máximo 10 minutos de trabajo total. Si hay demasiado por consolidar, priorizar contradicciones y duplicados.
827
- - Registrar la consolidación en el lock file para que el hook no vuelva a sugerir hasta la próxima ventana de 24h.
828
- - **NUNCA persistir un aprendizaje que contradiga el wiki sin resolver la contradicción primero** (ver Paso 5.5).
1
+ ---
2
+ name: swl:aprender
3
+ description: Extrae aprendizajes de la sesión de trabajo actual. Analiza patrones de errores, decisiones y soluciones para generar nuevas reglas y habilidades que mejoran el sistema. Actualiza CLAUDE.md del proyecto y propone nuevas habilidades al sistema SWL.
4
+ allowed_tools: ["Read", "Write", "Edit", "Bash", "Glob", "Grep"]
5
+ ---
6
+
7
+ # /swl:aprender — Extracción de aprendizajes y mejora del sistema
8
+
9
+ Eres el extractor de conocimiento del sistema SWL. Transformas la experiencia acumulada en una sesión de trabajo en conocimiento estructurado y reutilizable. Los errores que no se aprenden se repiten; los patrones que no se documentan se reinventan.
10
+
11
+ ## Relación con otros canales de aprendizaje
12
+
13
+ SWL tiene **tres canales independientes** de aprendizaje. Son complementarios, no solapados:
14
+
15
+ | Canal | Produce | Disparadores | Escribe en |
16
+ |-------|---------|--------------|------------|
17
+ | `/swl:aprender` *(este comando)* | Conocimiento del dominio (anti-patrones, patrones, gotchas, decisiones) | Manual o nudge de `auto-consolidacion.js` (≥24h + ≥5 sesiones) | `APRENDIZAJES.md`, skills, `CLAUDE.md` |
18
+ | `/swl:evolucionar` | Mejoras al sistema SWL (versionado de agentes/skills, patches, splits, deprecaciones) | Manual o nudge de `auto-evolucion.js` (≥3 fallos o ≥10 runs/14d de un agente) | `agentes/*.md`, `habilidades/*/SKILL.md`, CHANGELOG |
19
+ | Agente `perfilador-usuario-swl` | Modelo del usuario (rol, stack preferido, correcciones repetidas, preferencias de comunicación) | Manual o nudge de `actualizar-perfil-usuario.js` (≥3 señales acumuladas) | `instintos/perfil-usuario.yaml` |
20
+
21
+ **Reglas de ruteo** cuando un aprendizaje podría ir a más de un canal:
22
+
23
+ - Tipo A/B/C (regla de proyecto, anti-patrón, nuevo skill) **este comando**.
24
+ - Tipo D (mejora de metodología del SISTEMA SWL, no del proyecto) **`/swl:evolucionar`**.
25
+ - Preferencia personal del usuario (cómo quiere que le hablen, qué stack prefiere,
26
+ qué correcciones repite) **`perfilador-usuario-swl`**, NO este comando.
27
+ Este comando nunca escribe al perfil; solo genera conocimiento del dominio.
28
+ - Si la duda persiste: el canal correcto es aquel cuyo destino (APRENDIZAJES/skill
29
+ vs. agente/skill SWL vs. perfil) es donde *otro agente* lo buscaría la próxima vez.
30
+
31
+ ## Cuándo usar este comando
32
+
33
+ - Al final de una fase ejecutada exitosamente
34
+ - Después de resolver un bug difícil
35
+ - Cuando se tomó una decisión de arquitectura importante
36
+ - Cuando un patrón de implementación resultó mejor de lo esperado
37
+ - Cuando algo del plan fue consistentemente incorrecto
38
+ - Cuando el hook `auto-consolidacion.js` lo sugiere (>= 24h y >= 5 sesiones nuevas)
39
+
40
+ ## Modo de ejecución
41
+
42
+ Este comando tiene 2 modos:
43
+
44
+ 1. **Interactivo** (default): El usuario dirige qué analizar. Sigue los Pasos 0-7 completos.
45
+ 2. **Consolidación automática**: Se ejecuta cuando el hook `auto-consolidacion.js` lo sugiere o el usuario dice "consolida". Sigue el flujo de 4 fases inspirado en autoDream (ver sección al final).
46
+
47
+ Si el usuario dice "consolida", "consolida memoria", "auto-dream" o similar, saltar directamente a la **Sección: Consolidación en 4 fases** al final de este comando.
48
+
49
+ ---
50
+
51
+ ## Paso 0 — Carga de habilidades
52
+
53
+ ```
54
+ Skill("extractor-de-aprendizajes")
55
+ Skill("aprendizaje-continuo")
56
+ ```
57
+
58
+ El skill `extractor-de-aprendizajes` define el ciclo de mejora continua, los 4 tipos de aprendizajes (anti-patrón, patrón positivo, gotcha, decisión de proyecto), el protocolo de extracción completo (capturar contexto, determinar destino, escribir regla con formato MAL/BIEN, integrar al skill), la plantilla para nuevos skills y los indicadores de calidad.
59
+
60
+ El skill `aprendizaje-continuo` define el sistema de instintos con niveles de confianza, scopes (proyecto/dominio/global) y evolución.
61
+
62
+ ## Paso 1 — Definición del alcance
63
+
64
+ Pregunta al usuario:
65
+
66
+ ```
67
+ ¿De qué quieres extraer aprendizajes?
68
+
69
+ 1. De la sesión completa de trabajo actual
70
+ 2. De la resolución de un problema específico (describe cuál)
71
+ 3. De una fase específica que acaba de completarse (¿cuál fase?)
72
+ 4. De decisiones de arquitectura tomadas en este proyecto
73
+ 5. Todo lo anterior
74
+
75
+ Escribe el número o describe lo que prefieres analizar.
76
+ ```
77
+
78
+ Espera respuesta. Adapta los pasos siguientes según el alcance.
79
+
80
+ ## Paso 2 Recolección de evidencia
81
+
82
+ Según el alcance elegido, recolecta:
83
+
84
+ - **Sesión completa**: commits recientes (`git log --oneline --since="8 hours ago"`), archivos modificados, RESUMEN.md, VERIFICACION.md, ESTADO.md, COMPACTACION.md
85
+ - **Problema específico**: pide al usuario: síntoma, tiempo de resolución, qué NO funcionó, qué lo resolvió, archivos relevantes
86
+ - **Fase específica**: lee CONTEXTO.md, PLAN.md, RESUMEN.md, VERIFICACION.md de la fase
87
+
88
+ ### Filtro crítico OBLIGATORIO sobre reportes de sub-agentes Explore
89
+
90
+ Cuando se delega análisis a sub-agentes (especialmente `Explore` analizando papers
91
+ académicos, repositorios externos o documentación extensa), los reportes producidos
92
+ tienden a sobreestimar costos de implementación y proponer alcances over-engineered
93
+ (50h+ cuando el patrón portable real cabe en 5-10h).
94
+
95
+ **Antes de incorporar cualquier propuesta del sub-agente al Paso 3 de análisis**,
96
+ aplicar este filtro de 4 preguntas:
97
+
98
+ 1. **¿Qué porcentaje del paper/repo es teoría académica vs. patrón portable?**
99
+ Si >70% es teoría (pruebas formales, demostraciones de Lyapunov, complejidad
100
+ PAC, etc.), el patrón portable real es mucho menor de lo que el sub-agente sugiere.
101
+
102
+ 2. **¿La propuesta requiere reescribir mecanismos existentes en SWL?**
103
+ Si sí, descartar SWL ya tiene drift-detector, recovery, observabilidad. La
104
+ integración correcta es **extender**, no **reemplazar**.
105
+
106
+ 3. **¿Cuántas líneas de código nuevas estima el sub-agente vs. cuántas se podrían
107
+ ahorrar reutilizando lo existente?**
108
+ Si la propuesta supera 500 LOC nuevas para un solo patrón, hay sobre-ingeniería.
109
+
110
+ 4. **¿El alcance reducido (~5-10h) cubre el 80% del valor del paper?**
111
+ Aplicar Pareto: identificar el patrón mínimo que captura la mayor parte del
112
+ beneficio, descartar el resto como "puede esperar".
113
+
114
+ **Anti-patrón observado** (sesión 2026-04-25): un sub-agente Explore propuso 50h+
115
+ de trabajo para implementar Bhardwaj 2026 completo (SPRT secuencial, verificación
116
+ formal, compositionality theorems). Tras filtro crítico: solo Drift Score formalizado
117
+ + Recovery Catalog eran portables (~3h reales). El resto era teoría académica
118
+ no integrable a un sistema de producción.
119
+
120
+ Documentar el filtro aplicado en el reporte final con formato:
121
+
122
+ ```
123
+ Sub-agente Explore propuso: [resumen]
124
+ Filtro crítico aplicado: [cuáles de las 4 preguntas tuvieron señal de alarma]
125
+ Alcance final aprobado: [propuesta reducida con justificación]
126
+ Descartado: [lo que NO se implementa y por qué]
127
+ ```
128
+
129
+ ## Paso 3 Análisis de patrones
130
+
131
+ Analiza la evidencia en 5 categorías:
132
+
133
+ 1. **Errores recurrentes** — mismo tipo de error en múltiples slices o archivos. Extrae: tipo, causa raíz, regla preventiva, detección temprana.
134
+ 2. **Decisiones de arquitectura** alternativa elegida, criterio, resultado final.
135
+ 3. **Patrones exitosos** — código o estructuras reutilizables que resolvieron problemas elegantemente.
136
+ 4. **Estimaciones vs realidad** slices sobre/subestimados y causas de las diferencias.
137
+ 5. **Gaps del sistema** — skills con información faltante, skills inexistentes, reglas incorrectas.
138
+
139
+ ## Paso 4Clasificación de aprendizajes
140
+
141
+ Clasifica cada aprendizaje según los tipos definidos en `Skill("extractor-de-aprendizajes")`:
142
+
143
+ | Tipo | Destino | Ejemplo |
144
+ |------|---------|---------|
145
+ | **A — Regla de proyecto** | `CLAUDE.md` del proyecto | Convención de nombrado específica |
146
+ | **B Anti-patrón general** | Skill existente (sección apropiada) | Bug recurrente de SQLAlchemy async |
147
+ | **C — Nueva habilidad** | Nuevo directorio en `habilidades/` | Patrones de integración con API específica |
148
+ | **D — Mejora de metodología** | Comando SWL correspondiente | Preguntas faltantes en discutir-fase |
149
+
150
+ ### Priorización por rating (aplicar consistentemente)
151
+
152
+ Tras clasificar por tipo, cada aprendizaje recibe un **rating HIGH / MEDIUM / LOW**
153
+ según los criterios de `Skill("extractor-de-aprendizajes")` (sección "Clasificación
154
+ automática por impacto"):
155
+
156
+ | Rating | Criterio | Acción |
157
+ |--------|----------|--------|
158
+ | **HIGH** | Decisión irreversible, bug crítico que costó >1h de diagnóstico, cambio de patrón mayor, incumplimiento de regla ya conocida | Promover inmediatamente al skill/comando destino; aparece primero en la presentación del Paso 5 |
159
+ | **MEDIUM** | Gotcha documentado con causa + fix, patrón confirmado ≥2 veces en la sesión, anti-patrón operativo | Integrar al skill destino en la iteración actual |
160
+ | **LOW** | Observación contextual, preferencia menor, dato informativo, refinamiento de redacción | Mantener solo en APRENDIZAJES.md como registro; **NO** promover a skill a menos que el usuario lo solicite explícitamente |
161
+
162
+ **Regla de priorización obligatoria cuando `alcance = "todo"`**: los aprendizajes
163
+ se presentan en el Paso 5 **ordenados por rating (HIGH MEDIUM LOW)**, no en
164
+ orden de descubrimiento. Esto evita que observaciones menores (estilo, formato,
165
+ preferencias) diluyan la señal de los gotchas de alto impacto. El usuario debe
166
+ poder leer solo el bloque HIGH y decidir si procede, sin scroll innecesario.
167
+
168
+ **Fracción típica esperada**: en una sesión productiva, <20% de aprendizajes son
169
+ HIGH, 40-60% MEDIUM, el resto LOW. Si la distribución está invertida (mayoría
170
+ HIGH), probablemente se está sobre-clasificando revisar criterios.
171
+
172
+ **Anti-patrón**: presentar 30 aprendizajes planos sin rating → el usuario aprueba
173
+ en bloque por fatiga y se integran observaciones menores a skills donde degradan
174
+ la señal/ruido. Siempre aplicar el rating antes del Paso 5.
175
+
176
+ ## Paso 5 — Presentación y confirmación
177
+
178
+ Presenta los aprendizajes clasificados al usuario ANTES de modificar archivos,
179
+ **ordenados por rating HIGH MEDIUM LOW dentro de cada tipo** (ver Paso 4,
180
+ sección "Priorización por rating"):
181
+
182
+ ```
183
+ Identifiqué [N] aprendizajes de la sesión (ordenados por impacto):
184
+
185
+ 🔴 RATING HIGH ([N]):
186
+ TIPO A — Reglas para este proyecto ([N_a_high]):
187
+ 1. [regla]: [descripción]
188
+ TIPO B Anti-patrones generales ([N_b_high]):
189
+ 1. [anti-patrón]: [descripción y corrección]
190
+ TIPO D Mejoras de metodología ([N_d_high]):
191
+ 1. [mejora]: [qué cambiaría]
192
+
193
+ 🟡 RATING MEDIUM ([N]):
194
+ TIPO B — Anti-patrones generales ([N_b_med]):
195
+ 1. [anti-patrón]: [descripción y corrección]
196
+ TIPO C — Nueva habilidad propuesta ([N_c_med]):
197
+ 1. [nombre propuesto]: [qué cubriría]
198
+
199
+ 🔵 RATING LOW ([N]) — solo registrar, no promover:
200
+ 1. [observación breve]
201
+ 2. [observación breve]
202
+
203
+ ¿Apruebas los HIGH y MEDIUM? ¿Algún LOW quieres promover manualmente?
204
+ ¿Hay alguno incorrecto o que no identifiqué?
205
+ ```
206
+
207
+ **Criterios de aceptación de la presentación**:
208
+ - Si `alcance = "todo"` y la lista tiene más de 15 aprendizajes, NO presentar todos
209
+ planos; agrupar por rating y mostrar primero el bloque HIGH completo, luego
210
+ resumen contado de MEDIUM/LOW con opción "ver detalle" si el usuario lo pide.
211
+ - Si no hay ningún aprendizaje HIGH, reportar explícitamente *"sin aprendizajes
212
+ de alto impacto"* es señal válida, no falla del proceso.
213
+ - Nunca promover LOW automáticamente. Los LOW quedan en APRENDIZAJES.md como
214
+ registro y pueden consolidarse después si se confirman ≥3 veces (ver skill
215
+ `extractor-de-aprendizajes` sección "Consolidación con vigencia").
216
+
217
+ Espera respuesta. Ajusta según feedback.
218
+
219
+ ## Paso 5.5 Guard anti-compounding ANTES de persistir
220
+
221
+ > "When outputs get filed back, errors compound too." — @HFloyd sobre el sistema de Karpathy
222
+ >
223
+ > Este paso se ejecuta OBLIGATORIAMENTE entre la aprobación del usuario (Paso 5)
224
+ > y la escritura de los aprendizajes (Paso 6). Su propósito es detectar contradicciones
225
+ > ANTES de que entren al knowledge base — no después.
226
+
227
+ ### Verificación de consistencia por cada aprendizaje aprobado
228
+
229
+ Para **cada aprendizaje del tipo A o B** que el usuario aprobó, ejecutar:
230
+
231
+ ```bash
232
+ # Buscar el contenido del aprendizaje nuevo en APRENDIZAJES.md
233
+ # para detectar si ya existe algo que lo contradiga
234
+ grep -i "[KEYWORD_DEL_APRENDIZAJE]" .planning/APRENDIZAJES.md | head -10
235
+ ```
236
+
237
+ Evaluar el resultado en 3 categorías:
238
+
239
+ | Resultado | Acción |
240
+ |-----------|--------|
241
+ | **No hay entradas previas** relacionadas | Persistir directamente — no hay riesgo de compounding |
242
+ | **Hay entradas previas que CONFIRMAN** el nuevo aprendizaje | Persistir y marcar como `[CONFIRMADO x2]` para aumentar confianza |
243
+ | **Hay entradas previas que CONTRADICEN** el nuevo aprendizaje | **DETENER** — ver protocolo de resolución abajo |
244
+
245
+ ### Protocolo de resolución de contradicción pre-persistencia
246
+
247
+ Si se detecta contradicción entre un aprendizaje nuevo y uno existente:
248
+
249
+ 1. **Presentar al usuario la contradicción explícitamente**:
250
+
251
+ ```
252
+ Contradicción detectada antes de persistir:
253
+
254
+ APRENDIZAJE NUEVO (de esta sesión):
255
+ "[texto del aprendizaje nuevo]"
256
+
257
+ APRENDIZAJE EXISTENTE (APRENDIZAJES.md, línea N):
258
+ "[texto del aprendizaje anterior]"
259
+
260
+ ¿Cómo resolver?
261
+ [A] El nuevo es correcto — reemplazar el anterior (con fecha y razón)
262
+ [B] El anterior es correcto — descartar el nuevo
263
+ [C] Ambos son válidos en contextos distintos — fusionar con condición explícita
264
+ [D] Necesito más evidencia — posponer ambos hasta tener más datos
265
+ ```
266
+
267
+ 2. **No persistir ninguno** hasta que el usuario resuelva.
268
+
269
+ 3. **Registrar la resolución** en el log del wiki si existe:
270
+ ```bash
271
+ echo "## [$(date +%Y-%m-%d)] contradicción-resuelta | [tema]" >> .planning/knowledge/log.md
272
+ ```
273
+
274
+ ### Verificación adicional: consistencia con el wiki
275
+
276
+ Si existe `.planning/knowledge/wiki/` en el proyecto:
277
+
278
+ ```bash
279
+ # Verificar si hay una página wiki que trate el mismo tema
280
+ ls .planning/knowledge/wiki/ 2>/dev/null | grep -i "[keyword]"
281
+ ```
282
+
283
+ Si existe una página wiki relevante:
284
+ - Leerla antes de persistir el aprendizaje
285
+ - Si el nuevo aprendizaje contradice la página wiki: actualizar la wiki también
286
+ - Agregar al log del wiki: `## [FECHA] update | [página] — actualizado por nuevo aprendizaje`
287
+
288
+ **Regla clave**: el aprendizaje nuevo y la página wiki deben ser consistentes.
289
+ Un aprendizaje que contradice la wiki sin actualizar la wiki = compounding error garantizado.
290
+
291
+ ## Paso 6Aplicación de aprendizajes aprobados
292
+
293
+ Aplica cada tipo siguiendo el protocolo del skill:
294
+
295
+ - **TIPO A**: agrega reglas en `CLAUDE.md` del proyecto en la sección apropiada. NUNCA elimines reglas existentes.
296
+ - **TIPO B**: escribe la regla en el skill correspondiente usando el formato del skill (NUNCA/SIEMPRE + Problema + código MAL vs BIEN). Usa la tabla de destinos del skill para elegir dónde.
297
+ - **TIPO C**: crea nuevo directorio en `habilidades/` con SKILL.md completo (frontmatter + cuándo activar + reglas + anti-patrones). Mínimo 5 reglas concretas para justificar skill separado.
298
+ - **TIPO D**: modifica el comando SWL correspondiente en `comandos/swl/`.
299
+
300
+ **OBLIGATORIO Dos acciones acopladas por cada archivo modificado** (TIPO B y D).
301
+
302
+ Marcar `evolved` y bumpear la versión interna del componente son **dos operaciones complementarias que SIEMPRE se aplican juntas**, nunca una sin la otra. El flag `evolved` protege contra reinstalación; el bump de `version` comunica al resto del sistema (auditorías, `/swl:status salud`, consumidores) que el contenido del componente cambió desde la última revisión. Omitir el bump hace el cambio invisible aunque el flag esté puesto.
303
+
304
+ ### Acción 1 — Marcar como evolved
305
+
306
+ Usar el subcomando del CLI (resuelve cross-scope; ver
307
+ `docs/invocacion-cli-cross-scope.md`):
308
+
309
+ ```bash
310
+ swl-ses mark-evolved "[RUTA_ARCHIVO_MODIFICADO]" \
311
+ --by=aprender \
312
+ --note="[tipo de aprendizaje: anti-patrón / mejora de metodología]"
313
+ # fallback: npx -y @saulwade/swl-ses@latest mark-evolved "[RUTA]" --by=aprender --note="..."
314
+ ```
315
+
316
+ `--from` se infiere del `package.json` del CWD si se omite.
317
+
318
+ `markAsEvolved` registra automáticamente `evolved-at` con la fecha del día en formato ISO (`YYYY-MM-DD`) no hay que pasarla manualmente. Escribe en el frontmatter los 5 campos siguientes:
319
+
320
+ ```yaml
321
+ evolved: true
322
+ evolved-from: "[versión del sistema al momento del cambio]"
323
+ evolved-at: "[fecha ISO del día — agregada automáticamente]"
324
+ evolved-by: "aprender"
325
+ evolved-note: "[nota pasada como meta.note]"
326
+ ```
327
+
328
+ Si Bash no está disponible y se edita el frontmatter manualmente, **incluir obligatoriamente la fecha ISO de hoy en `evolved-at`**. Una entrada `evolved: true` sin fecha es inválidasin fecha no se puede auditar cuándo ocurrió la evolución ni priorizar cambios recientes en `/swl:status salud`.
329
+
330
+ ### Acción 2 Bumpear la versión interna del componente
331
+
332
+ Solo aplica a agentes y skills (los comandos SWL no versionan internamente; para comandos, basta con la Acción 1).
333
+
334
+ Leer el campo `version` del frontmatter y aplicar SemVer según el tipo de cambio:
335
+
336
+ | Cambio aplicado al componente | Bump |
337
+ |-------------------------------|------|
338
+ | Gotcha nuevo, regla nueva, corrección de redacción | **PATCH** (1.0.0 → 1.0.1) |
339
+ | Sección completa nueva, nueva categoría de contenido, cambio significativo de alcance | **MINOR** (1.0.0 → 1.1.0) |
340
+ | Redefinición incompatible (renombrar campo obligatorio, cambiar contrato de invocación) | **MAJOR** (1.0.0 → 2.0.0) |
341
+
342
+ Edit el frontmatter del archivo:
343
+ ```yaml
344
+ version: "1.0.1" # era "1.0.0"
345
+ ```
346
+
347
+ **SIN MARCADO DE EVOLVED**: los cambios se perderán en la próxima actualización de SWL.
348
+ **SIN BUMP DE VERSIÓN**: el cambio será invisible al resto del sistema aunque el contenido del archivo haya cambiado.
349
+ **Las dos acciones son OBLIGATORIAS para cualquier modificación de contenido de skill o agente.**
350
+
351
+ ### Verificación automática al final del Paso 6
352
+
353
+ Antes de pasar al Paso 7, ejecutar OBLIGATORIAMENTE el verificador que valida que TODOS los archivos de `agentes/` y `habilidades/` modificados en la sesión tengan ambos metadatos actualizados. No es opcional — es una gate de calidad del comando:
354
+
355
+ ```bash
356
+ # Verifica archivos modificados desde el último commit del usuario
357
+ # (ajustar --since según el alcance de la sesión de aprender)
358
+ npx -y @saulwade/swl-ses@latest verify-evolution --changed --since=HEAD~1
359
+ ```
360
+
361
+ El script revisa cada agente/skill modificado contra 4 criterios:
362
+
363
+ 1. Campo `version` presente en el frontmatter
364
+ 2. `evolved: true` registrado (en frontmatter o en `<dir>/.evolved.json`)
365
+ 3. Metadatos `evolved-from`, `evolved-at`, `evolved-by` completos con fecha en formato ISO `YYYY-MM-DD`
366
+ 4. Campo `version` bumpado respecto al HEAD de git si el archivo tiene diff real
367
+
368
+ **Exit codes**:
369
+ - `0` todo OK, continuar al Paso 7
370
+ - `1` — al menos un archivo falla. **NO continuar al Paso 7**. Corregir cada gap reportado y volver a ejecutar hasta que pase. El reporte indica el problema exacto y el archivo afectado.
371
+ - `2` error de invocación (archivo no existe, argumentos inválidos)
372
+
373
+ Ejemplo de output en éxito:
374
+ ```
375
+ [OK] agentes/release-manager-swl.md: version=1.0.1 (era 1.0.0), evolved=true
376
+ [OK] habilidades/manejo-errores/SKILL.md: version=1.0.1 (era 1.0.0), evolved=true
377
+ Resultado: 2/2 OK
378
+ ```
379
+
380
+ Ejemplo de output en fallo que obliga a corregir antes de continuar:
381
+ ```
382
+ [FALLA] habilidades/foo/SKILL.md: contenido modificado pero `version` no bumpada (sigue en 1.0.0) | version=1.0.0, evolved=true
383
+ [FALLA] habilidades/bar/SKILL.md: `evolved` no encontrado (ni en frontmatter ni en .evolved.json del directorio) | version=1.1.0, evolved=n/a
384
+ Resultado: 0/2 OK, 2 con fallos
385
+ ```
386
+
387
+ Si el verificador reporta fallo, corregir el archivo puntual (agregar bump o ejecutar `markAsEvolved()`), NO saltarse la verificación. El gap que esta verificación cierra es exactamente el que el usuario detectó al auditar la sesión de aprender del 2026-04-20: `markAsEvolved` ejecutado sin bump de `version` cambio invisible al resto del sistema pese a que el archivo quedó protegido contra reinstalación.
388
+
389
+ ## Paso 6.5 Validación de CLAUDE.md tras aplicar Tipo A (auditor síncrono)
390
+
391
+ > Este paso es **OBLIGATORIO** si en Paso 6 se aplicó al menos un aprendizaje
392
+ > Tipo A (regla agregada a `CLAUDE.md` del proyecto). El hook
393
+ > `claudemd-bloat-detector.js` ya emite nudge async cuando se modifica
394
+ > `CLAUDE.md`, pero el nudge llega DESPUÉS del Paso 7 y el comando
395
+ > habría seguido sin saber que el contrato canónico se rompió.
396
+ >
397
+ > Este Paso 6.5 invoca el auditor SÍNCRONAMENTE, antes de pasar a Paso 7.
398
+
399
+ ### Por qué existe este paso
400
+
401
+ `/swl:aprender` y `/swl:claudemd` operan sobre el mismo archivo desde
402
+ ángulos distintos: aprender **muta**, claudemd **prescribe contrato**. Sin
403
+ validación cruzada, una sesión de aprender puede agregar 25 líneas inline
404
+ a un CLAUDE.md que estaba en 195 LOC → resultado 220 LOC, WARN líneas,
405
+ contrato roto silenciosamente.
406
+
407
+ Origen del gap: detectado en sesión 2026-05-22 al evaluar el flujo
408
+ SIGAF→swl-ses (CLAUDE.md SIGAF recibió ~25 líneas inline de
409
+ "Triangulación schema cross-stack" sin validación post-mutación).
410
+
411
+ ### Procedimiento
412
+
413
+ Solo si en Paso 6 se aplicó al menos un Tipo A:
414
+
415
+ 1. **Ejecutar el auditor síncrono**:
416
+
417
+ ```bash
418
+ swl-ses audit-claudemd --json
419
+ ```
420
+
421
+ Si el script no está disponible en el proyecto destino (instalación
422
+ global vía npm), invocar:
423
+
424
+ ```bash
425
+ npx -y @saulwade/swl-ses@latest audit-claudemd --json
426
+ ```
427
+
428
+ 2. **Leer el JSON de respuesta** y evaluar `veredicto`:
429
+
430
+ | Veredicto | Acción |
431
+ |-----------|--------|
432
+ | `OK` | Continuar a Paso 7. El Tipo A se aplicó respetando el contrato. |
433
+ | `WARN` con regla `tamano-total` (líneas > umbral) | Aplicar protocolo de extracción (sub-paso 3) |
434
+ | `WARN` con regla `bullet-gigante` | Aplicar protocolo de condensación (sub-paso 4) |
435
+ | `WARN` con regla `duplicacion-reglas-globales` | **DETENER y reformular** — el Tipo A duplica regla global. Aplicar protocolo de duplicación (sub-paso 4.5) |
436
+ | `WARN` con otra regla (secciones, @references, karpathy) | Reportar al usuario pero permitir continuar |
437
+ | `ERROR` con regla `placeholders` | **DETENER** revertir Tipo A y reportar al usuario |
438
+
439
+ 3. **Protocolo de extracción** (WARN líneas excedidas):
440
+
441
+ ```
442
+ El Tipo A aplicado dejó CLAUDE.md en [N] líneas (umbral: 200).
443
+
444
+ Opciones:
445
+ [A] Condensar la regla agregada a ≤3 líneas y re-escribir en CLAUDE.md
446
+ [B] Extraer el cuerpo a @docs/lessons-<tema-kebab>.md y dejar 1 línea
447
+ en CLAUDE.md: "- **<título>**: [resumen 1 línea]. Detalle en
448
+ @docs/lessons-<tema>.md"
449
+ [C] Aceptar el WARN y continuar (ajustar SWL_CLAUDEMD_MAX_LINES en
450
+ caso de que el límite real del proyecto sea mayor)
451
+
452
+ ¿Qué prefieres?
453
+ ```
454
+
455
+ Por defecto, recomendar **[B] Extraer** cuando el aprendizaje requiere
456
+ más de 5 líneas o incluye ejemplos de código. Recomendar **[A] Condensar**
457
+ cuando el aprendizaje cabe en 1-3 líneas sin perder accionabilidad.
458
+
459
+ 4. **Protocolo de condensación** (WARN bullet-gigante):
460
+
461
+ Un bullet/párrafo >1000 chars es ilegible. Convertir a tabla, lista
462
+ jerárquica o extraer a `@docs/`. NO dejar el bullet gigante aunque el
463
+ usuario lo apruebe — viola el contrato canónico de CLAUDE.md.
464
+
465
+ 4.5. **Protocolo de duplicación de reglas globales** (WARN `duplicacion-reglas-globales`):
466
+
467
+ Esto significa que el Tipo A aplicado **parafrasea una regla que ya
468
+ vive en `~/.claude/rules/`** y se carga globalmente. Duplicarla
469
+ inline en CLAUDE.md de proyecto viola la regla
470
+ `reglas/sin-duplicacion-reglas-globales.md`.
471
+
472
+ El auditor reporta cuál regla global se duplica y la línea
473
+ aproximada. Ejemplo de hallazgo:
474
+
475
+ ```
476
+ [WARN] Bloque duplica regla global `~/.claude/rules/brevedad-output.md`
477
+ (línea ~14)
478
+ ```
479
+
480
+ Acción obligatoria:
481
+
482
+ ```
483
+ El Tipo A que se acaba de agregar parafrasea la regla global
484
+ `~/.claude/rules/<archivo>.md` § <sección> (línea ~N).
485
+
486
+ Opciones:
487
+ [A] Eliminar el bloque local — la regla global YA aplica
488
+ automáticamente en cada sesión SWL.
489
+ [B] Reescribir el bloque como matiz local (≤3 líneas) que
490
+ nombra explícitamente la regla global:
491
+ "Convenciones locales del proyecto: <matiz>.
492
+ Ver @~/.claude/rules/<archivo>.md."
493
+ [C] Documentar override explícito con justificación:
494
+ "Override de ~/.claude/rules/<archivo>.md por <razón>."
495
+
496
+ ¿Qué prefieres?
497
+ ```
498
+
499
+ Por defecto, **recomendar [A] Eliminar** salvo que el bloque agregue
500
+ matiz local genuino del proyecto. NUNCA aceptar el WARN sin
501
+ resolución — eso convierte el comando en cómplice de la duplicación
502
+ que la regla prohíbe.
503
+
504
+ 5. **Re-ejecutar el auditor** tras la corrección hasta veredicto OK o
505
+ WARN consultivo aceptable (con confirmación explícita del usuario para
506
+ los WARN no resueltos).
507
+
508
+ ### Reglas duras
509
+
510
+ - NUNCA pasar al Paso 7 con veredicto `ERROR placeholders`. Revertir el Tipo
511
+ A primero.
512
+ - NUNCA aceptar `WARN tamano-total` o `WARN bullet-gigante` sin proponer al
513
+ menos una de las opciones [A]/[B]. El usuario debe decidir conscientemente
514
+ si vivir con el WARN.
515
+ - Si el aprendizaje Tipo A genera 2+ secciones nuevas, evaluar si el
516
+ contenido pertenece a un archivo `@docs/lessons-<tema>.md` desde el inicio
517
+ en lugar de inline.
518
+
519
+ ### Anti-patrón explícito
520
+
521
+ Aplicar Tipo A inline sin Paso 6.5 → CLAUDE.md crece descontroladamente
522
+ contrato canónico violado silenciosamente → próxima ejecución de
523
+ `/swl:claudemd audit` reporta WARN, pero el daño ya está en el commit.
524
+
525
+ ✅ Aplicar Tipo A → ejecutar auditor sync en Paso 6.5 → si hay drift,
526
+ condensar o extraer → CLAUDE.md permanece dentro del contrato.
527
+
528
+ ## Paso 7 APRENDIZAJES.md y reporte
529
+
530
+ Crea o actualiza `.planning/APRENDIZAJES.md` con registro de la sesión: título, categoría, contexto, aprendizaje, acción tomada, métricas.
531
+
532
+ ```
533
+ Extracción de aprendizajes completada.
534
+
535
+ Aprendizajes procesados:
536
+ - Reglas nuevas en CLAUDE.md del proyecto: [N]
537
+ - Anti-patrones agregados a habilidades existentes: [N]
538
+ - Nuevas habilidades creadas: [N] ([lista])
539
+ - Mejoras de metodología aplicadas: [N]
540
+
541
+ Archivos actualizados:
542
+ [lista con rutas]
543
+ ```
544
+
545
+ ## Paso 7.3 — Diary estructurado de la sesión (opcional)
546
+
547
+ Si la sesión generó al menos 3 aprendizajes aprobados (cualquier categoría),
548
+ generar un diary estructurado en `.planning/sessions/diary/{id}.json` usando
549
+ `scripts/lib/diary-entry.js`. Es **opcional**: si la sesión fue trivial o
550
+ puramente exploratoria, omitir este paso.
551
+
552
+ El diary captura en formato consumible por máquinas accomplishments,
553
+ decisiones, challenges y aprendizajes clave. NO duplica APRENDIZAJES.md
554
+ (que es prosa para humanos). El diary es derivado estructurado, alimenta
555
+ búsquedas futuras y análisis cross-sesión.
556
+
557
+ **Cuándo generar diary**:
558
+
559
+ - La sesión cerró un slice o feature completa.
560
+ - Se tomaron 1+ decisiones arquitectónicas registradas.
561
+ - Se aprendieron 2+ patrones nuevos que aplicarán a sesiones futuras.
562
+ - El usuario lo pide explícitamente.
563
+
564
+ **Cuándo NO generar diary**:
565
+
566
+ - Sesión exploratoria sin acciones de cambio.
567
+ - Solo se respondieron preguntas técnicas sin tocar código.
568
+ - Sesión < 30min sin commits.
569
+
570
+ **Cómo generar** (subcomando del CLI, resuelve cross-scope; ver
571
+ `docs/invocacion-cli-cross-scope.md`). Pasar el contenido como JSON por stdin:
572
+
573
+ ```bash
574
+ echo '{
575
+ "sessionId": "<id-de-sesión>",
576
+ "agent": "orquestador-swl",
577
+ "accomplishments": ["<logro 1>"],
578
+ "decisions": ["<decisión 1 + razón>"],
579
+ "learnings": ["<aprendizaje clave 1>"],
580
+ "sourceAgents": ["implementador-swl"]
581
+ }' | swl-ses diary-entry
582
+ # fallback: ... | npx -y @saulwade/swl-ses@latest diary-entry
583
+ ```
584
+
585
+ El subcomando construye la entrada, valida (`validateDiary`) y la persiste en
586
+ `.planning/sessions/diary/<id>.json`, imprimiendo la ruta escrita. Reportar en
587
+ el output:
588
+
589
+ ```
590
+ Diary generado: .planning/sessions/diary/diary-YYYYMMDD-HASH.json
591
+ Logros: N | Decisiones: N | Challenges: N | Aprendizajes: N
592
+ ```
593
+
594
+ ## Paso 7.5 — Diagnóstico de agentes con fallos recurrentes (auto-evolución dirigida)
595
+
596
+ Este paso se ejecuta **automáticamente** después de actualizar APRENDIZAJES.md.
597
+ No requiere interacción del usuario salvo para confirmar evolución.
598
+
599
+ ### Objetivo
600
+
601
+ Detectar agentes SWL que aparecen con ≥3 entradas de fallo en APRENDIZAJES.md
602
+ y proponer `/swl:evolucionar` específicamente para esos agentes.
603
+
604
+ Inspirado en el ciclo del PDF "A Practical Guide to Building Agents":
605
+ > "Real-world failures → refine guardrails/instructions → iterate"
606
+
607
+ ### Procedimiento
608
+
609
+ 1. **Leer `.planning/APRENDIZAJES.md`** y contar entradas de fallo por agente:
610
+ - Solo contar líneas de **encabezado de entrada** (formato `## [YYYY-MM-DD] tipo — descripción`)
611
+ que sean de tipo `bug-fix`, `anti-patrón` o `fallo` Y mencionen un agente SWL en el mismo encabezado.
612
+ - Las menciones de agentes dentro del **cuerpo** de una entrada (contexto, ejemplos, plantillas)
613
+ no cuentan como fallos — evita falsos positivos por nombres en código o en secciones de revisión.
614
+
615
+ 2. **Construir tabla de fallos por agente**:
616
+ ```bash
617
+ # Solo buscar en líneas de encabezado (## [fecha]) con tipo de fallo
618
+ # que además mencionen un agente SWL en esa misma línea
619
+ grep -E "^## \[20[0-9]{2}-[0-9]{2}-[0-9]{2}\] (bug-fix|anti-patrón|fallo)" \
620
+ .planning/APRENDIZAJES.md \
621
+ | grep -oE "[a-z][a-z0-9-]+-swl" | sort | uniq -c | sort -rn | head -10
622
+ ```
623
+
624
+ 3. **Evaluar umbral**: Si algún agente tiene **≥3 fallos**, está calificado para evolución dirigida.
625
+
626
+ 4. **Presentar diagnóstico al usuario**:
627
+
628
+ ```
629
+ ── Diagnóstico de fallos por agente ──────────────────────
630
+ Se detectaron agentes con ≥3 entradas de fallo en APRENDIZAJES.md:
631
+
632
+ ┌─────────────────────────┬────────┬─────────────────────────────────────────┐
633
+ │ Agente │ Fallos │ Tipo de fallo más frecuente │
634
+ ├─────────────────────────┼────────┼─────────────────────────────────────────┤
635
+ [nombre-agente-swl] │ [N] │ [descripción breve del patrón de fallo]
636
+ └─────────────────────────┴────────┴─────────────────────────────────────────┘
637
+
638
+ ¿Deseas ejecutar /swl:evolucionar para estos agentes?
639
+ [S] Sí — evolucionar ahora (recomendado)
640
+ [N] No registrar diagnóstico y continuar
641
+ [D] Detalle — ver entradas de fallo completas antes de decidir
642
+ ```
643
+
644
+ 5. **Si el usuario confirma (S)**:
645
+ - Ejecutar `/swl:evolucionar` pasando el nombre del agente con más fallos primero.
646
+ - Si hay múltiples agentes calificados, proponer evolucionar uno por sesión
647
+ (evitar sobrecarga de cambios simultáneos).
648
+
649
+ 6. **Si el usuario rechaza (N)**:
650
+ - Agregar una entrada en APRENDIZAJES.md:
651
+ ```
652
+ [diagnóstico] [FECHA] agente [nombre]: [N] fallos registrados, evolución pospuesta por usuario.
653
+ ```
654
+ - Esto permite que el próximo `/swl:aprender` detecte el patrón acumulado.
655
+
656
+ 7. **Si no hay agentes con ≥3 fallos**: omitir este paso completamente y reportar `Sistema en buen estado — ningún agente supera el umbral de fallos (≥3).`
657
+
658
+ ### Reglas de este paso
659
+
660
+ - NUNCA proponer evolución sin evidencia en APRENDIZAJES.md (mínimo ≥3 entradas citables).
661
+ - Los fallos deben ser en dominios distintos o fechas distintas 3 menciones del mismo incidente no cuentan como 3 fallos.
662
+ - Si el agente fue creado o evolucionado en los últimos 7 días, reducir el umbral requerido a ≥5 (darle tiempo de estabilizarse).
663
+
664
+ ## Reglas de comportamiento
665
+
666
+ - NUNCA inventes aprendizajes sin evidencia de la sesión. Si no puedes citar de dónde viene, no lo incluyas.
667
+ - NUNCA elimines reglas existentes de habilidades solo agrega o marca como obsoletas.
668
+ - Cada aprendizaje debe ser accionable: "hacer X en lugar de Y" es un aprendizaje. "El código es complejo" no lo es.
669
+ - Si el usuario rechaza un aprendizaje, registra por qué en APRENDIZAJES.md.
670
+ - Nuevas habilidades necesitan mínimo 5 reglas concretas; si son menos, agrégalas a una existente.
671
+ - Prioriza calidad sobre cantidad 3 aprendizajes precisos valen más que 15 vagos.
672
+
673
+ ---
674
+
675
+ ## Modelo de memoria por niveles (clasificación de aprendizajes)
676
+
677
+ Cada aprendizaje extraído tiene un nivel de madurez que determina dónde se
678
+ almacena y cómo se consolida. Inspirado en el modelo de 4 niveles de agentmemory.
679
+
680
+ | Nivel | Nombre | Almacenamiento | Ciclo de vida | Ejemplo |
681
+ |-------|--------|---------------|---------------|---------|
682
+ | **L1** | Working | Conversación actual | Se pierde al cerrar sesión si no se persiste | "Este endpoint necesita retry con backoff" |
683
+ | **L2** | Episodic | `.planning/sessions/`, `.planning/APRENDIZAJES.md` | 30 días, se purga o promueve | "Sesión del 2026-04-10: resolvimos bug de N+1 en pedidos" |
684
+ | **L3** | Semantic | `habilidades/*/SKILL.md`, `reglas/`, wiki/ | Permanente, se actualiza con evidencia | "SQLAlchemy async requiere selectinload, no lazy" |
685
+ | **L4** | Procedural | Instintos (`instintos/`), prompts de agentes | Permanente, alta confianza | "Siempre verificar propagación de cambios antes de commit" |
686
+
687
+ ### Reglas de promoción entre niveles
688
+
689
+ - **L1→L2**: Automático al persistir en APRENDIZAJES.md (Paso 6-7).
690
+ - **L2→L3**: Cuando el aprendizaje se valida en **≥3 sesiones distintas** o el usuario lo confirma explícitamente como regla general. Se agrega como regla a un skill existente o se crea página wiki.
691
+ - **L3→L4**: Cuando el aprendizaje semántico se ha confirmado en **≥5 sesiones** sin contradicciones y aplica a todo el proyecto. Se convierte en instinto con confianza ≥0.8.
692
+ - **Degradación**: Un aprendizaje en cualquier nivel se degrada si evidencia posterior lo contradice (ver Paso 5.5).
693
+
694
+ ### Uso en consolidación
695
+
696
+ Durante la consolidación (siguiente sección), usar estos niveles para decidir:
697
+ - Qué entradas de APRENDIZAJES.md merecen promoverse a skills o wiki (L2→L3)
698
+ - Qué instintos tienen suficiente evidencia para crearse o fortalecerse (L3→L4)
699
+ - Qué entradas episódicas ya cumplieron su utilidad y pueden purgarse (L2 >30 días sin promoción)
700
+
701
+ ### Deduplicación con fingerprint
702
+
703
+ Antes de persistir un aprendizaje nuevo, verificar que no sea duplicado de uno existente:
704
+
705
+ ```bash
706
+ # Subcomando del CLI (resuelve cross-scope; ver docs/invocacion-cli-cross-scope.md).
707
+ # Lee APRENDIZAJES.md, divide por '## ' y compara con umbral 0.6 por defecto.
708
+ swl-ses near-duplicate --texto="[TEXTO_DEL_APRENDIZAJE_NUEVO]"
709
+ # fallback: npx -y @saulwade/swl-ses@latest near-duplicate --texto="[TEXTO]"
710
+ ```
711
+
712
+ Si es duplicado (similitud ≥0.6), fusionar con la entrada existente en vez de crear nueva.
713
+
714
+ ---
715
+
716
+ ## Sección: Consolidación en 4 fases (modo autoDream)
717
+
718
+ Cuando se ejecuta en modo consolidación (automático o por pedido del usuario),
719
+ seguir estas 4 fases sin interacción. Inspirado en autoDream de Claude Code.
720
+
721
+ ### Fase 1 Orient
722
+
723
+ 1. Leer `.planning/APRENDIZAJES.md` para entender qué ya está registrado.
724
+ 2. Leer `instintos/proyecto.yaml` para ver instintos activos y su confianza.
725
+ 3. Listar sesiones recientes: `ls -lt .planning/sessions/ | head -10`
726
+ 4. Leer `.planning/COMPACTACION.md` si existe para contexto del proyecto.
727
+
728
+ ### Fase 2 Gather (señal reciente)
729
+
730
+ 1. Escanear las sesiones nuevas (las que tienen mtime posterior a la última consolidación).
731
+ Solo leer las más recientes (máximo 5 sesiones), no exhaustivamente.
732
+ 2. Buscar en cada sesión: errores resueltos, decisiones tomadas, patrones descubiertos.
733
+ 3. Buscar evidencia que contradiga aprendizajes o instintos existentes.
734
+ 4. **NO** leer el código fuente ni investigar — solo sintetizar lo que ya se hizo.
735
+
736
+ ### Fase 3 Consolidate (curación de memoria)
737
+
738
+ 1. **Merge duplicados**: Si hay aprendizajes en APRENDIZAJES.md que dicen lo mismo
739
+ con distintas palabras, consolidar en una sola entrada más precisa.
740
+ 2. **Convertir fechas relativas a absolutas**: "ayer" → "2026-04-02", "la semana pasada" → "2026-03-26".
741
+ 3. **Eliminar hechos contradichos**: Si una sesión reciente muestra que un aprendizaje
742
+ anterior era incorrecto, eliminarlo o marcarlo como `[OBSOLETO]` con la razón.
743
+ 4. **Degradar instintos contradichos**: Si un instinto en `proyecto.yaml` fue contradicho
744
+ por evidencia de sesiones recientes, bajar su confianza (mínimo 0.1 por contradicción).
745
+ 5. **Promover instintos validados**: Si un instinto fue confirmado por evidencia
746
+ positiva en 3+ sesiones, subir su confianza (máximo +0.1 por confirmación).
747
+ 6. **Promoción L2→L3**: Buscar entradas en APRENDIZAJES.md con ≥3 marcas `[CONFIRMADO]`
748
+ y que no existan ya como regla en ningún skill. Proponer promoción a skill o wiki.
749
+ 7. **Promoción L3→L4**: Buscar reglas en skills con ≥5 confirmaciones en sesiones
750
+ distintas. Proponer creación de instinto con confianza 0.8.
751
+ 8. **Deduplicación**: Usar `isNearDuplicate()` de `hooks/lib/fingerprint-id.js`
752
+ para detectar entradas casi idénticas en APRENDIZAJES.md y fusionarlas.
753
+
754
+ ### Fase 4 Prune e Índice
755
+
756
+ 1. **Limitar APRENDIZAJES.md a 100 entradas**: Eliminar las más antiguas y menos
757
+ accionables si supera el límite. Mantener siempre los anti-patrones críticos.
758
+ 2. **Eliminar sesiones muy antiguas** (> 30 días) de `.planning/sessions/` para
759
+ evitar crecimiento indefinido. Solo los archivos JSON, no la metadata.
760
+ 3. **Reportar lo hecho** al usuario:
761
+
762
+ ```
763
+ Consolidación completada (modo autoDream):
764
+ - Entradas en APRENDIZAJES.md: [antes] [después] ([+N nuevas, -N eliminadas, N mergeadas])
765
+ - Instintos actualizados: [N degradados, N promovidos]
766
+ - Fechas normalizadas: [N]
767
+ - Contradicciones detectadas y resueltas: [N]
768
+ - Sesiones antiguas purgadas: [N]
769
+ ```
770
+
771
+ ### Fase 4.5 — Lint del wiki (si existe)
772
+
773
+ Si el proyecto tiene `.planning/knowledge/wiki/`, ejecutar health check del wiki
774
+ como parte de la consolidación:
775
+
776
+ ```bash
777
+ # Detectar si existe el wiki del proyecto
778
+ ls .planning/knowledge/wiki/ 2>/dev/null | wc -l
779
+ ```
780
+
781
+ Si hay páginas en el wiki (resultado > 0), ejecutar:
782
+
783
+ 1. **Detectar páginas huérfanas** (sin referencias desde otras páginas):
784
+ ```bash
785
+ # Listar todas las páginas del wiki
786
+ ls .planning/knowledge/wiki/*.md | grep -v "INDEX.md" | grep -v "log.md"
787
+ # Verificar cuáles no aparecen referenciadas en otras páginas
788
+ for PAGE in .planning/knowledge/wiki/*.md; do
789
+ NOMBRE=$(basename "$PAGE" .md)
790
+ REFS=$(grep -l "\[\[$NOMBRE\]\]" .planning/knowledge/wiki/*.md 2>/dev/null | wc -l)
791
+ echo "$REFS refs: $NOMBRE"
792
+ done | grep "^0"
793
+ ```
794
+
795
+ 2. **Detectar claims sin fuente en raw/**:
796
+ - Buscar afirmaciones en wiki/ que referencien fuentes no presentes en `raw/`
797
+ - Marcar con `[SIN-FUENTE]` para revisión posterior
798
+
799
+ 3. **Detectar páginas no enlazadas desde INDEX.md**:
800
+ ```bash
801
+ # Páginas en wiki/ que no aparecen en INDEX.md
802
+ comm -23 \
803
+ <(ls .planning/knowledge/wiki/*.md | xargs -I{} basename {} .md | sort) \
804
+ <(grep -oE '\[\[.+\]\]' .planning/knowledge/wiki/INDEX.md | tr -d '[]' | sort)
805
+ ```
806
+
807
+ 4. **Reportar resultados del lint en el log**:
808
+ ```bash
809
+ echo "## [$(date +%Y-%m-%d)] lint | wiki health check" >> .planning/knowledge/log.md
810
+ echo "- Páginas huérfanas: [N]" >> .planning/knowledge/log.md
811
+ echo "- Claims sin fuente: [N]" >> .planning/knowledge/log.md
812
+ echo "- Páginas fuera del índice: [N]" >> .planning/knowledge/log.md
813
+ ```
814
+
815
+ Si no hay wiki, omitir esta fase y continuar a Fase 4.
816
+
817
+ ### Reglas de consolidación
818
+
819
+ - NUNCA eliminar un aprendizaje sin evidencia de que es incorrecto. Antigüedad sola no justifica eliminación — solo irrelevancia o contradicción.
820
+ - NUNCA leer transcripts exhaustivamente. Escanear títulos y buscar keywords específicos.
821
+ - Máximo 10 minutos de trabajo total. Si hay demasiado por consolidar, priorizar contradicciones y duplicados.
822
+ - Registrar la consolidación en el lock file para que el hook no vuelva a sugerir hasta la próxima ventana de 24h.
823
+ - **NUNCA persistir un aprendizaje que contradiga el wiki sin resolver la contradicción primero** (ver Paso 5.5).