@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.
- package/CLAUDE.md +32 -61
- package/README.md +4 -4
- package/agentes/_intent-spec.md +73 -0
- package/agentes/auto-evolucion-swl.md +24 -0
- package/agentes/cloud-infra-swl.md +25 -0
- package/agentes/datos-swl.md +24 -1
- package/agentes/devops-ci-swl.md +24 -0
- package/agentes/frontend-angular-swl.md +7 -7
- package/agentes/frontend-css-swl.md +4 -4
- package/agentes/frontend-react-swl.md +7 -7
- package/agentes/frontend-swl.md +9 -9
- package/agentes/frontend-tailwind-swl.md +4 -4
- package/agentes/migrador-swl.md +22 -0
- package/agentes/pagos-swl.md +25 -0
- package/agentes/release-manager-swl.md +24 -0
- package/agentes/rendimiento-swl.md +2 -2
- package/agentes/sre-swl.md +24 -0
- package/comandos/swl/brainstorm.md +1 -0
- package/comandos/swl/compactar.md +1 -1
- package/comandos/swl/discutir-fase.md +15 -1
- package/comandos/swl/mapear-codebase.md +1 -1
- package/comandos/swl/nemesis.md +29 -0
- package/comandos/swl/planear-fase.md +18 -2
- package/comandos/swl/verificar.md +4 -4
- package/habilidades/aprender-de-git-diff/SKILL.md +288 -0
- package/habilidades/aprendizaje-continuo/SKILL.md +7 -1
- package/habilidades/diseno-herramientas-agente/SKILL.md +17 -0
- package/habilidades/doc-sync/SKILL.md +441 -1
- package/habilidades/doubt-driven-review/SKILL.md +177 -171
- package/habilidades/feynman-auditor-swl/SKILL.md +129 -123
- package/habilidades/infra-github-actions/SKILL.md +172 -166
- package/habilidades/meta-skills-estandar/SKILL.md +6 -0
- package/habilidades/meta-skills-estandar/recursos/skill-judge-rubrica.md +281 -0
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
- package/habilidades/nemesis-evaluacion-json/SKILL.md +5 -0
- package/habilidades/nemesis-redistribuir/SKILL.md +5 -0
- package/habilidades/node-experto/SKILL.md +197 -3
- package/habilidades/prevencion-racionalizacion/SKILL.md +1 -0
- package/habilidades/privacy-memoria/SKILL.md +1 -0
- package/habilidades/proceso-autoverificacion-evidencias/SKILL.md +258 -0
- package/habilidades/proceso-confianza-pre-implementacion/SKILL.md +246 -0
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -0
- package/habilidades/proceso-ddia-streaming/SKILL.md +231 -0
- package/habilidades/proceso-intent-engineering/SKILL.md +269 -0
- package/habilidades/reducir-entropia/SKILL.md +219 -0
- package/habilidades/sre-patrones/SKILL.md +1 -1
- package/habilidades/state-inconsistency-auditor-swl/SKILL.md +172 -166
- package/habilidades/tdd-workflow/SKILL.md +178 -3
- package/habilidades/verificacion-evidencia/SKILL.md +1 -0
- package/habilidades/web-fetcher-routing/SKILL.md +81 -75
- package/habilidades/workflow-claude-code/SKILL.md +2 -2
- package/hooks/lib/task-budget.js +218 -0
- package/hooks/validar-intent-spec.js +222 -0
- package/manifiestos/hooks-config.json +9 -0
- package/manifiestos/modulos.json +12 -2
- package/manifiestos/skills-lock.json +1191 -1142
- package/package.json +5 -3
- package/plugin.json +9 -2
- package/reglas/auditorias-documentales-estructurales.md +205 -0
- package/reglas/fragmentos-compartidos.md +26 -0
- package/reglas/intent-engineering.md +214 -0
- package/reglas/registro-componentes-nuevos.md +38 -0
- package/schemas/agent-frontmatter.schema.json +294 -167
- package/schemas/agent-message.schema.json +73 -53
- package/schemas/agent-output-implementacion.schema.json +114 -85
- package/schemas/agent-output-planificacion.schema.json +150 -113
- package/schemas/agent-output-review.schema.json +98 -78
- package/schemas/diary-entry.schema.json +42 -10
- package/schemas/hook-profiles.schema.json +54 -39
- package/schemas/hooks-config.schema.json +89 -74
- package/schemas/instinct.schema.json +152 -115
- package/schemas/modulos.schema.json +38 -29
- package/schemas/perfiles.schema.json +36 -28
- package/schemas/plugin.schema.json +77 -64
- package/schemas/skill-evals.schema.json +119 -95
- package/schemas/skill-frontmatter.schema.json +245 -170
- package/scripts/generar-inventario.js +452 -420
- package/scripts/lib/schema-version.js +164 -0
- package/scripts/validar-manifest.js +1 -1
- package/scripts/validar.js +3 -2
- package/scripts/verificar-docs-vs-codigo.js +654 -425
- package/scripts/verificar-evolucion.js +19 -3
package/agentes/sre-swl.md
CHANGED
|
@@ -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
|
|
|
@@ -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
|
|
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("
|
|
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,
|
|
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
|
|
package/comandos/swl/nemesis.md
CHANGED
|
@@ -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
|
|
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-
|
|
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("
|
|
55
|
-
Skill("
|
|
54
|
+
Skill("manejo-errores")
|
|
55
|
+
Skill("checklist-calidad")
|
|
56
56
|
```
|
|
57
57
|
|
|
58
|
-
Si el stack tiene Python: `Skill("
|
|
59
|
-
Si el stack tiene Angular: `
|
|
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.
|
|
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.
|