@saulwade/swl-ses 1.8.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +8 -8
- package/README.md +13 -13
- package/agentes/accesibilidad-wcag-swl.md +3 -3
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/disenador-ui-swl.md +6 -5
- package/agentes/frontend-angular-swl.md +2 -2
- package/agentes/frontend-css-swl.md +2 -2
- package/agentes/frontend-react-swl.md +4 -4
- package/agentes/frontend-swl.md +6 -6
- package/agentes/investigador-ux-swl.md +5 -5
- package/agentes/orquestador-swl.md +96 -8
- package/agentes/perfilador-usuario-swl.md +308 -308
- package/agentes/producto-prd-swl.md +1 -1
- package/agentes/red-team-swl.md +218 -218
- package/agentes/revisor-codigo-swl.md +34 -10
- package/agentes/revisor-seguridad-swl.md +7 -0
- package/agentes/tdd-qa-swl.md +39 -2
- package/comandos/swl/actualizar.md +1 -1
- package/comandos/swl/aprender.md +2 -2
- package/comandos/swl/aprobar-plan.md +152 -0
- package/comandos/swl/autoresearch.md +102 -6
- package/comandos/swl/ayuda.md +3 -3
- package/comandos/swl/discutir-fase.md +20 -2
- package/comandos/swl/ejecutar-fase.md +53 -6
- package/comandos/swl/evolucionar.md +1 -1
- package/comandos/swl/inbox.md +1 -1
- package/comandos/swl/instalar.md +1 -1
- package/comandos/swl/nemesis.md +42 -1
- package/comandos/swl/planear-fase.md +25 -1
- package/comandos/swl/plugins.md +1 -1
- package/comandos/swl/predecir.md +139 -0
- package/comandos/swl/release.md +1 -1
- package/comandos/swl/status.md +279 -0
- package/comandos/swl/verificar.md +75 -7
- package/habilidades/ai-runtime-security/SKILL.md +1 -1
- package/habilidades/angular-moderno/SKILL.md +44 -1
- package/habilidades/auto-evolucion-protocolo/SKILL.md +276 -276
- package/habilidades/autoresearch/SKILL.md +15 -1
- package/habilidades/benchmark-memoria/SKILL.md +1 -1
- package/habilidades/calidad-contract-testing/SKILL.md +165 -0
- package/habilidades/calidad-mutation-testing/SKILL.md +170 -0
- package/habilidades/changelog-generator/SKILL.md +9 -2
- package/habilidades/changelog-generator/scripts/parse-commits.js +12 -1
- package/habilidades/checklist-seguridad/SKILL.md +29 -1
- package/habilidades/checklist-seguridad/recursos/stride-cobertura.md +60 -0
- package/habilidades/css-moderno/SKILL.md +3 -1
- package/habilidades/diagrama-arquitectura/SKILL.md +1 -1
- package/habilidades/drift-detection/SKILL.md +179 -179
- package/habilidades/ejecutar-fase/SKILL.md +64 -14
- package/habilidades/estructura-proyecto-claude/SKILL.md +17 -14
- package/habilidades/estructura-proyecto-claude/recursos/configuracion-y-extensiones.md +34 -23
- package/habilidades/estructura-proyecto-claude/recursos/frontmatter-y-hooks-referencia.md +70 -53
- package/habilidades/estructura-proyecto-claude/recursos/mcp-json-template.json +57 -77
- package/habilidades/extractor-de-aprendizajes/SKILL.md +9 -5
- package/habilidades/fastapi-experto/SKILL.md +56 -5
- package/habilidades/harness-claude-code/SKILL.md +10 -7
- package/{reglas/harness-claude-code.md → habilidades/harness-claude-code/recursos/disciplina-harness-regla.md} +2 -2
- package/habilidades/instalar-sistema/SKILL.md +3 -3
- package/habilidades/meta-skills-estandar/recursos/frameworks-seguridad.md +1 -1
- package/habilidades/patrones-python/SKILL.md +8 -5
- package/habilidades/perfil-usuario/SKILL.md +200 -200
- package/habilidades/planear-fase/SKILL.md +25 -4
- package/habilidades/proceso-ddia-fundamentos/SKILL.md +1 -1
- package/habilidades/proceso-ddia-streaming/SKILL.md +4 -4
- package/habilidades/proceso-debate-adversarial/SKILL.md +164 -0
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +105 -0
- package/habilidades/proceso-dynamic-workflows/SKILL.md +138 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-adversarial-verify.js +65 -0
- package/habilidades/proceso-dynamic-workflows/recursos/template-triage.js +65 -0
- package/habilidades/protocolo-revision-swl/SKILL.md +1 -1
- package/habilidades/seguridad-skills-ia/SKILL.md +1 -1
- package/habilidades/swl-claudemd/SKILL.md +50 -210
- package/habilidades/swl-claudemd/recursos/contrato-aprender.md +83 -0
- package/habilidades/swl-claudemd/recursos/duplicacion-reglas-globales.md +85 -0
- package/habilidades/swl-claudemd/recursos/plantillas-init.md +94 -0
- package/habilidades/swl-dashboard/SKILL.md +9 -9
- package/habilidades/swl-revisar-impacto/SKILL.md +1 -1
- package/habilidades/tdd-workflow/SKILL.md +58 -5
- package/habilidades/tdd-workflow/recursos/gherkin-bdd.md +111 -0
- package/habilidades/validacion-ci-sistema/SKILL.md +3 -3
- package/hooks/calidad-pre-commit.js +340 -3
- package/hooks/ciclo-evolucion-subagente.js +26 -0
- package/hooks/ciclo-evolucion.js +26 -0
- package/hooks/contexto-iteracion.js +144 -0
- package/hooks/extraccion-aprendizajes.js +13 -0
- package/hooks/lib/ciclo-evolucion.js +47 -0
- package/hooks/{auto-evolucion.js → lib/etapa-auto-evolucion.js} +701 -700
- package/hooks/{metricas-evolucion.js → lib/etapa-metricas.js} +388 -376
- package/hooks/{actualizar-perfil-usuario.js → lib/etapa-perfil-usuario.js} +376 -364
- package/hooks/lib/evolution-tracker.js +24 -3
- package/hooks/lib/loop-telemetry.js +321 -0
- package/hooks/notificacion-telegram.js +11 -3
- package/hooks/spec-gate.js +211 -0
- package/hooks/tdd-gate.js +241 -0
- package/hooks/validar-intent-spec.js +30 -10
- package/llms.txt +29 -0
- package/manifiestos/hooks-config.json +36 -18
- package/manifiestos/modulos.json +23 -14
- package/manifiestos/skills-lock.json +100 -72
- package/package.json +4 -3
- package/plugin.json +9 -10
- package/reglas/accesibilidad.md +10 -0
- package/reglas/api-diseno.md +9 -0
- package/reglas/arquitectura.evolved.json +7 -0
- package/reglas/arquitectura.md +65 -0
- package/reglas/auditorias-documentales-estructurales.md +7 -0
- package/reglas/cloud-infra.md +8 -0
- package/reglas/fragmentos-compartidos.md +5 -0
- package/reglas/gobernanza.md +4 -4
- package/reglas/hooks.md +6 -0
- package/reglas/intent-engineering.md +4 -0
- package/reglas/markitdown.md +8 -0
- package/reglas/memoria-consolidada.md +1 -1
- package/reglas/patrones.md +6 -0
- package/reglas/registro-componentes-nuevos.md +10 -1
- package/reglas/seguridad-agentes.md +1 -1
- package/reglas/seguridad.evolved.json +7 -0
- package/reglas/seguridad.md +144 -0
- package/reglas/skills-estandar.md +6 -0
- package/reglas/testing.md +7 -0
- package/reglas/tests-cleanup.md +4 -0
- package/reglas/usar-sistema-swl.md +1 -1
- package/scripts/generar-inventario.js +64 -1
- package/scripts/instalador.js +32 -2
- package/scripts/lib/gitignore-manifest.js +29 -1
- package/scripts/lib/plan-lock.js +275 -0
- package/scripts/migrar-fase-dominio.js +0 -1
- package/scripts/smoke-test.js +24 -2
- package/scripts/verificar-trazabilidad.js +292 -0
- package/agentes/ux-disenador-swl.md +0 -503
- package/comandos/swl/dashboard.md +0 -146
- package/comandos/swl/evolucion-estado.md +0 -191
- package/comandos/swl/metricas.md +0 -342
- package/comandos/swl/salud.md +0 -481
- package/reglas/verificar-citas-temporales.md +0 -139
|
@@ -1,179 +1,179 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: drift-detection
|
|
3
|
-
version: 1.0.0
|
|
4
|
-
herramientasPermitidas: [Read]
|
|
5
|
-
description: "Detección de drift de métricas de agentes/skills via ventana deslizante (7d) vs baseline (4 semanas). Integrado al operador Reflect del ciclo AGP."
|
|
6
|
-
exclusiones:
|
|
7
|
-
- "No cargar para detectar drift en código de aplicación (regressions de negocio); este skill detecta drift en métricas de uso de agentes/skills del sistema SWL."
|
|
8
|
-
- "No cargar si hay menos de 7 días de trazas en `.planning/traces/`; el baseline de 4 semanas no existirá y los resultados serán estadísticamente inválidos."
|
|
9
|
-
- "No cargar para observabilidad de la aplicación en producción; usar `monitoring-alertas` para eso."
|
|
10
|
-
- "No cargar manualmente cuando el ciclo AGP ya ejecuta `ejecutarDriftAutomatico()` en cada SubagentStop — invocarlo dos veces dobla el trabajo sin beneficio."
|
|
11
|
-
author: swl-ses
|
|
12
|
-
evolvable: true
|
|
13
|
-
evolvable_scope: [content, examples]
|
|
14
|
-
domain: ingeniería-de-software
|
|
15
|
-
tags: [agp, observabilidad, drift, métricas, ciclo-agp]
|
|
16
|
-
---
|
|
17
|
-
# drift-detection — Detección de drift para el ciclo AGP
|
|
18
|
-
|
|
19
|
-
Algoritmo de ventana deslizante que compara métricas recientes (últimos 7 días)
|
|
20
|
-
contra un baseline histórico (4 semanas previas) para detectar degradación de
|
|
21
|
-
skills y agentes antes de que el health score lo refleje.
|
|
22
|
-
|
|
23
|
-
Adaptado de `runDriftCheck`/`getDriftTimeline` en mission-control-main (MIT).
|
|
24
|
-
|
|
25
|
-
## Módulo principal
|
|
26
|
-
|
|
27
|
-
`scripts/lib/drift-detector.js` — zero-deps, Node stdlib únicamente.
|
|
28
|
-
|
|
29
|
-
## Cuándo se activa
|
|
30
|
-
|
|
31
|
-
- Manual: desde cualquier script o agente que necesite análisis de degradación.
|
|
32
|
-
- Automático (vía `hooks/auto-evolucion.js`): el hook ejecuta `ejecutarDriftAutomatico()`
|
|
33
|
-
en cada `SubagentStop` con un throttle de 24 h (configurable con `SWL_DRIFT_THROTTLE_H`).
|
|
34
|
-
Se evalúan los últimos 5 archivos JSONL de trazas. Opt-out total con `SWL_DRIFT_DISABLED=1`.
|
|
35
|
-
- Automático (vía ciclo AGP): `hooks/lib/reflect-classifier.js` expone
|
|
36
|
-
`ejecutarDriftReflect(rutaJsonl, nombreAgente)` como punto de extensión alternativo.
|
|
37
|
-
- Las trazas de agentes viven en `.planning/traces/YYYY-MM-DD.jsonl`.
|
|
38
|
-
|
|
39
|
-
## Exports del módulo
|
|
40
|
-
|
|
41
|
-
```js
|
|
42
|
-
const { detectarDrift, generarLineaTemporal } = require('./scripts/lib/drift-detector');
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
### `detectarDrift(opts)`
|
|
46
|
-
|
|
47
|
-
```js
|
|
48
|
-
detectarDrift({
|
|
49
|
-
rutaJsonl: '/ruta/a/traces.jsonl',
|
|
50
|
-
ventanaDias: 7, // default
|
|
51
|
-
baselineSemanasBase: 4, // default
|
|
52
|
-
umbralPct: 10, // warn si |drift| > 10%
|
|
53
|
-
metricas: ['tokens_promedio_por_sesion', 'tasa_exito_tool', 'tasa_finalizacion_tarea'],
|
|
54
|
-
agente: 'backend-python-swl', // para nudges
|
|
55
|
-
})
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
**Retorna:**
|
|
59
|
-
|
|
60
|
-
```json
|
|
61
|
-
{
|
|
62
|
-
"drifts": [
|
|
63
|
-
{
|
|
64
|
-
"metrica": "tokens_promedio_por_sesion",
|
|
65
|
-
"baseline": 1000,
|
|
66
|
-
"reciente": 2100,
|
|
67
|
-
"driftPct": 110.0,
|
|
68
|
-
"estado": "critico"
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"metrica": "tasa_exito_tool",
|
|
72
|
-
"baseline": 0.9,
|
|
73
|
-
"reciente": 0.85,
|
|
74
|
-
"driftPct": -5.56,
|
|
75
|
-
"estado": "ok"
|
|
76
|
-
}
|
|
77
|
-
],
|
|
78
|
-
"timestamp": "2026-04-19T12:00:00.000Z",
|
|
79
|
-
"estado_global": "critico"
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
**Estados por métrica:**
|
|
84
|
-
|
|
85
|
-
| Condición | Estado |
|
|
86
|
-
|-----------|--------|
|
|
87
|
-
| `abs(driftPct) <= umbralPct` | `ok` |
|
|
88
|
-
| `abs(driftPct) > umbralPct` | `warn` |
|
|
89
|
-
| `abs(driftPct) > umbralPct * 2` | `critico` |
|
|
90
|
-
|
|
91
|
-
**Estado global:** el peor estado entre todas las métricas.
|
|
92
|
-
|
|
93
|
-
### `generarLineaTemporal(opts)`
|
|
94
|
-
|
|
95
|
-
```js
|
|
96
|
-
generarLineaTemporal({
|
|
97
|
-
rutaJsonl: '/ruta/a/traces.jsonl',
|
|
98
|
-
dias: 30, // default
|
|
99
|
-
})
|
|
100
|
-
// → [{ fecha: '2026-04-19', tokens: 3200, exitos: 12, fallos: 1 }, ...]
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
Retorna un array de longitud `dias`, uno por día, para visualización en
|
|
104
|
-
el dashboard o en reportes de salud.
|
|
105
|
-
|
|
106
|
-
## Estructura de eventos esperada en el JSONL
|
|
107
|
-
|
|
108
|
-
El módulo es permisivo: extrae métricas de cualquier campo que coincida.
|
|
109
|
-
|
|
110
|
-
| Métrica | Campos aceptados en el evento |
|
|
111
|
-
|---------|-------------------------------|
|
|
112
|
-
| Tokens | `atributos.tokens_totales`, `tokens`, `total_tokens` |
|
|
113
|
-
| Éxito de tool | `success`, `exito`, `atributos.success` |
|
|
114
|
-
| Finalización de tarea | `estado`, `status`, `atributos.estado` (valores: `OK`, `done`, `completado`) |
|
|
115
|
-
| Timestamp | `timestamp`, `ts`, `inicio`, `created_at` |
|
|
116
|
-
|
|
117
|
-
Formato nativo de `.planning/traces/YYYY-MM-DD.jsonl`:
|
|
118
|
-
|
|
119
|
-
```json
|
|
120
|
-
{"traceId":"...","nombre":"agent:backend-python-swl","inicio":"2026-04-19T10:00:00.000Z","estado":"OK","atributos":{"tokens_totales":1500}}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## Integración con el ciclo AGP
|
|
124
|
-
|
|
125
|
-
El operador Reflect (`hooks/lib/reflect-classifier.js`) expone:
|
|
126
|
-
|
|
127
|
-
```js
|
|
128
|
-
const { ejecutarDriftReflect } = require('./hooks/lib/reflect-classifier');
|
|
129
|
-
|
|
130
|
-
const resultado = ejecutarDriftReflect(
|
|
131
|
-
'.planning/traces/2026-04-19.jsonl',
|
|
132
|
-
'backend-python-swl'
|
|
133
|
-
);
|
|
134
|
-
// resultado: { drifts, timestamp, estado_global } o null si módulo no disponible
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
Cuando `estado_global === 'critico'`, el módulo emite automáticamente un nudge
|
|
138
|
-
a `.planning/evolution/nudges.jsonl`:
|
|
139
|
-
|
|
140
|
-
```json
|
|
141
|
-
{
|
|
142
|
-
"timestamp": "2026-04-19T12:00:00.000Z",
|
|
143
|
-
"tipo": "drift-detectado",
|
|
144
|
-
"agente_o_skill": "backend-python-swl",
|
|
145
|
-
"metrica": "tokens_promedio_por_sesion",
|
|
146
|
-
"drift_pct": 110.0,
|
|
147
|
-
"estado": "critico"
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
El agente `auto-evolucion-swl` consume estos nudges para proponer mejoras.
|
|
152
|
-
|
|
153
|
-
## Cómo interpretar los resultados
|
|
154
|
-
|
|
155
|
-
- **`ok`**: métricas estables. Sin acción requerida.
|
|
156
|
-
- **`warn`**: degradación moderada. Revisar en el próximo ciclo de evolución.
|
|
157
|
-
- **`critico`**: degradación severa. Invocar `/swl:evolucionar` con el agente
|
|
158
|
-
identificado. El nudge ya fue emitido — aparecerá en `/swl:salud`.
|
|
159
|
-
|
|
160
|
-
## Cuándo NO cargar
|
|
161
|
-
|
|
162
|
-
- Se busca detectar regresiones en el código de la aplicación (tests fallando, performance degradada); para eso usar `monitoring-alertas` o el revisor de código correspondiente.
|
|
163
|
-
- El proyecto tiene menos de 7 días de trazas — el baseline de 4 semanas no puede calcularse y `detectarDrift` retornará resultados sin significado estadístico.
|
|
164
|
-
- El ciclo AGP ya tiene configurado el throttle automático de 24 h; invocar el drift manualmente en el mismo intervalo produce el mismo nudge dos veces sin nuevo valor.
|
|
165
|
-
|
|
166
|
-
## Gotchas / Errores comunes no obvios
|
|
167
|
-
|
|
168
|
-
- **Timestamps inválidos en eventos JSONL provocan líneas ignoradas silenciosamente**: el módulo es permisivo con los campos pero si ningún campo de timestamp (`timestamp`, `ts`, `inicio`, `created_at`) tiene una fecha ISO válida, el evento se descarta del cálculo. Causa: eventos generados con timestamps de formato local (ej. `"19/04/2026"`) no pasan la validación. Solución: verificar que todos los eventos JSONL del trace tengan al menos un campo de timestamp en formato ISO 8601 — si el baseline aparece como 0, es el primer síntoma de eventos descartados.
|
|
169
|
-
- **Estado `critico` emitido por baseline con muy pocos eventos**: si el baseline de 4 semanas tiene solo 3 eventos y la ventana de 7 días tiene 8, el `driftPct` de tokens se dispara al 166% cuando en realidad el agente está más activo, no degradado. Causa: el módulo no valida que el baseline tenga suficientes eventos para ser estadísticamente válido. Solución: antes de interpretar un estado `critico`, verificar que el baseline tiene al menos 20 eventos — si no, marcar el resultado como `insufficient-data` en lugar de accionar.
|
|
170
|
-
- **Nudge duplicado en `.planning/evolution/nudges.jsonl` por falta de deduplicación**: el hook se ejecuta dos veces en el mismo `SubagentStop` (por bug de throttle) y emite el mismo nudge dos veces. Causa: el throttle `SWL_DRIFT_THROTTLE_H` no validó correctamente el timestamp del último run. Solución: el archivo `nudges.jsonl` es append-only — antes de emitir un nudge, verificar si el último evento del mismo `agente_o_skill` y `metrica` tiene un timestamp dentro de la ventana de throttle.
|
|
171
|
-
- **`atomicWriteJSON` usado para escribir en nudges.jsonl**: escribir el archivo completo en lugar de hacer append corrompe el historial de nudges previos. Causa: confusión entre archivos de estado mutable (usan `atomicWriteJSON`) y archivos de eventos de alta frecuencia (usan `fs.appendFileSync`). Solución: `nudges.jsonl` es un JSONL de alta frecuencia — siempre usar `fs.appendFileSync(ruta, JSON.stringify(nudge) + '\n')`, nunca reescribir el archivo completo.
|
|
172
|
-
|
|
173
|
-
## Referencia cruzada
|
|
174
|
-
|
|
175
|
-
- Módulo: `scripts/lib/drift-detector.js`
|
|
176
|
-
- Tests: `tests/lib/drift-detector.test.js`
|
|
177
|
-
- Operador Reflect: `hooks/lib/reflect-classifier.js`
|
|
178
|
-
- Ciclo AGP: `.planning/evolution/nudges.jsonl`
|
|
179
|
-
- Origen (adaptado de): `temp/mission-control-main/src/lib/agent-evals.ts` — MIT
|
|
1
|
+
---
|
|
2
|
+
name: drift-detection
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
herramientasPermitidas: [Read]
|
|
5
|
+
description: "Detección de drift de métricas de agentes/skills via ventana deslizante (7d) vs baseline (4 semanas). Integrado al operador Reflect del ciclo AGP."
|
|
6
|
+
exclusiones:
|
|
7
|
+
- "No cargar para detectar drift en código de aplicación (regressions de negocio); este skill detecta drift en métricas de uso de agentes/skills del sistema SWL."
|
|
8
|
+
- "No cargar si hay menos de 7 días de trazas en `.planning/traces/`; el baseline de 4 semanas no existirá y los resultados serán estadísticamente inválidos."
|
|
9
|
+
- "No cargar para observabilidad de la aplicación en producción; usar `monitoring-alertas` para eso."
|
|
10
|
+
- "No cargar manualmente cuando el ciclo AGP ya ejecuta `ejecutarDriftAutomatico()` en cada SubagentStop — invocarlo dos veces dobla el trabajo sin beneficio."
|
|
11
|
+
author: swl-ses
|
|
12
|
+
evolvable: true
|
|
13
|
+
evolvable_scope: [content, examples]
|
|
14
|
+
domain: ingeniería-de-software
|
|
15
|
+
tags: [agp, observabilidad, drift, métricas, ciclo-agp]
|
|
16
|
+
---
|
|
17
|
+
# drift-detection — Detección de drift para el ciclo AGP
|
|
18
|
+
|
|
19
|
+
Algoritmo de ventana deslizante que compara métricas recientes (últimos 7 días)
|
|
20
|
+
contra un baseline histórico (4 semanas previas) para detectar degradación de
|
|
21
|
+
skills y agentes antes de que el health score lo refleje.
|
|
22
|
+
|
|
23
|
+
Adaptado de `runDriftCheck`/`getDriftTimeline` en mission-control-main (MIT).
|
|
24
|
+
|
|
25
|
+
## Módulo principal
|
|
26
|
+
|
|
27
|
+
`scripts/lib/drift-detector.js` — zero-deps, Node stdlib únicamente.
|
|
28
|
+
|
|
29
|
+
## Cuándo se activa
|
|
30
|
+
|
|
31
|
+
- Manual: desde cualquier script o agente que necesite análisis de degradación.
|
|
32
|
+
- Automático (vía `hooks/lib/etapa-auto-evolucion.js`): el hook ejecuta `ejecutarDriftAutomatico()`
|
|
33
|
+
en cada `SubagentStop` con un throttle de 24 h (configurable con `SWL_DRIFT_THROTTLE_H`).
|
|
34
|
+
Se evalúan los últimos 5 archivos JSONL de trazas. Opt-out total con `SWL_DRIFT_DISABLED=1`.
|
|
35
|
+
- Automático (vía ciclo AGP): `hooks/lib/reflect-classifier.js` expone
|
|
36
|
+
`ejecutarDriftReflect(rutaJsonl, nombreAgente)` como punto de extensión alternativo.
|
|
37
|
+
- Las trazas de agentes viven en `.planning/traces/YYYY-MM-DD.jsonl`.
|
|
38
|
+
|
|
39
|
+
## Exports del módulo
|
|
40
|
+
|
|
41
|
+
```js
|
|
42
|
+
const { detectarDrift, generarLineaTemporal } = require('./scripts/lib/drift-detector');
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### `detectarDrift(opts)`
|
|
46
|
+
|
|
47
|
+
```js
|
|
48
|
+
detectarDrift({
|
|
49
|
+
rutaJsonl: '/ruta/a/traces.jsonl',
|
|
50
|
+
ventanaDias: 7, // default
|
|
51
|
+
baselineSemanasBase: 4, // default
|
|
52
|
+
umbralPct: 10, // warn si |drift| > 10%
|
|
53
|
+
metricas: ['tokens_promedio_por_sesion', 'tasa_exito_tool', 'tasa_finalizacion_tarea'],
|
|
54
|
+
agente: 'backend-python-swl', // para nudges
|
|
55
|
+
})
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**Retorna:**
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"drifts": [
|
|
63
|
+
{
|
|
64
|
+
"metrica": "tokens_promedio_por_sesion",
|
|
65
|
+
"baseline": 1000,
|
|
66
|
+
"reciente": 2100,
|
|
67
|
+
"driftPct": 110.0,
|
|
68
|
+
"estado": "critico"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"metrica": "tasa_exito_tool",
|
|
72
|
+
"baseline": 0.9,
|
|
73
|
+
"reciente": 0.85,
|
|
74
|
+
"driftPct": -5.56,
|
|
75
|
+
"estado": "ok"
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
"timestamp": "2026-04-19T12:00:00.000Z",
|
|
79
|
+
"estado_global": "critico"
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
**Estados por métrica:**
|
|
84
|
+
|
|
85
|
+
| Condición | Estado |
|
|
86
|
+
|-----------|--------|
|
|
87
|
+
| `abs(driftPct) <= umbralPct` | `ok` |
|
|
88
|
+
| `abs(driftPct) > umbralPct` | `warn` |
|
|
89
|
+
| `abs(driftPct) > umbralPct * 2` | `critico` |
|
|
90
|
+
|
|
91
|
+
**Estado global:** el peor estado entre todas las métricas.
|
|
92
|
+
|
|
93
|
+
### `generarLineaTemporal(opts)`
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
generarLineaTemporal({
|
|
97
|
+
rutaJsonl: '/ruta/a/traces.jsonl',
|
|
98
|
+
dias: 30, // default
|
|
99
|
+
})
|
|
100
|
+
// → [{ fecha: '2026-04-19', tokens: 3200, exitos: 12, fallos: 1 }, ...]
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Retorna un array de longitud `dias`, uno por día, para visualización en
|
|
104
|
+
el dashboard o en reportes de salud.
|
|
105
|
+
|
|
106
|
+
## Estructura de eventos esperada en el JSONL
|
|
107
|
+
|
|
108
|
+
El módulo es permisivo: extrae métricas de cualquier campo que coincida.
|
|
109
|
+
|
|
110
|
+
| Métrica | Campos aceptados en el evento |
|
|
111
|
+
|---------|-------------------------------|
|
|
112
|
+
| Tokens | `atributos.tokens_totales`, `tokens`, `total_tokens` |
|
|
113
|
+
| Éxito de tool | `success`, `exito`, `atributos.success` |
|
|
114
|
+
| Finalización de tarea | `estado`, `status`, `atributos.estado` (valores: `OK`, `done`, `completado`) |
|
|
115
|
+
| Timestamp | `timestamp`, `ts`, `inicio`, `created_at` |
|
|
116
|
+
|
|
117
|
+
Formato nativo de `.planning/traces/YYYY-MM-DD.jsonl`:
|
|
118
|
+
|
|
119
|
+
```json
|
|
120
|
+
{"traceId":"...","nombre":"agent:backend-python-swl","inicio":"2026-04-19T10:00:00.000Z","estado":"OK","atributos":{"tokens_totales":1500}}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Integración con el ciclo AGP
|
|
124
|
+
|
|
125
|
+
El operador Reflect (`hooks/lib/reflect-classifier.js`) expone:
|
|
126
|
+
|
|
127
|
+
```js
|
|
128
|
+
const { ejecutarDriftReflect } = require('./hooks/lib/reflect-classifier');
|
|
129
|
+
|
|
130
|
+
const resultado = ejecutarDriftReflect(
|
|
131
|
+
'.planning/traces/2026-04-19.jsonl',
|
|
132
|
+
'backend-python-swl'
|
|
133
|
+
);
|
|
134
|
+
// resultado: { drifts, timestamp, estado_global } o null si módulo no disponible
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Cuando `estado_global === 'critico'`, el módulo emite automáticamente un nudge
|
|
138
|
+
a `.planning/evolution/nudges.jsonl`:
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"timestamp": "2026-04-19T12:00:00.000Z",
|
|
143
|
+
"tipo": "drift-detectado",
|
|
144
|
+
"agente_o_skill": "backend-python-swl",
|
|
145
|
+
"metrica": "tokens_promedio_por_sesion",
|
|
146
|
+
"drift_pct": 110.0,
|
|
147
|
+
"estado": "critico"
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
El agente `auto-evolucion-swl` consume estos nudges para proponer mejoras.
|
|
152
|
+
|
|
153
|
+
## Cómo interpretar los resultados
|
|
154
|
+
|
|
155
|
+
- **`ok`**: métricas estables. Sin acción requerida.
|
|
156
|
+
- **`warn`**: degradación moderada. Revisar en el próximo ciclo de evolución.
|
|
157
|
+
- **`critico`**: degradación severa. Invocar `/swl:evolucionar` con el agente
|
|
158
|
+
identificado. El nudge ya fue emitido — aparecerá en `/swl:status salud`.
|
|
159
|
+
|
|
160
|
+
## Cuándo NO cargar
|
|
161
|
+
|
|
162
|
+
- Se busca detectar regresiones en el código de la aplicación (tests fallando, performance degradada); para eso usar `monitoring-alertas` o el revisor de código correspondiente.
|
|
163
|
+
- El proyecto tiene menos de 7 días de trazas — el baseline de 4 semanas no puede calcularse y `detectarDrift` retornará resultados sin significado estadístico.
|
|
164
|
+
- El ciclo AGP ya tiene configurado el throttle automático de 24 h; invocar el drift manualmente en el mismo intervalo produce el mismo nudge dos veces sin nuevo valor.
|
|
165
|
+
|
|
166
|
+
## Gotchas / Errores comunes no obvios
|
|
167
|
+
|
|
168
|
+
- **Timestamps inválidos en eventos JSONL provocan líneas ignoradas silenciosamente**: el módulo es permisivo con los campos pero si ningún campo de timestamp (`timestamp`, `ts`, `inicio`, `created_at`) tiene una fecha ISO válida, el evento se descarta del cálculo. Causa: eventos generados con timestamps de formato local (ej. `"19/04/2026"`) no pasan la validación. Solución: verificar que todos los eventos JSONL del trace tengan al menos un campo de timestamp en formato ISO 8601 — si el baseline aparece como 0, es el primer síntoma de eventos descartados.
|
|
169
|
+
- **Estado `critico` emitido por baseline con muy pocos eventos**: si el baseline de 4 semanas tiene solo 3 eventos y la ventana de 7 días tiene 8, el `driftPct` de tokens se dispara al 166% cuando en realidad el agente está más activo, no degradado. Causa: el módulo no valida que el baseline tenga suficientes eventos para ser estadísticamente válido. Solución: antes de interpretar un estado `critico`, verificar que el baseline tiene al menos 20 eventos — si no, marcar el resultado como `insufficient-data` en lugar de accionar.
|
|
170
|
+
- **Nudge duplicado en `.planning/evolution/nudges.jsonl` por falta de deduplicación**: el hook se ejecuta dos veces en el mismo `SubagentStop` (por bug de throttle) y emite el mismo nudge dos veces. Causa: el throttle `SWL_DRIFT_THROTTLE_H` no validó correctamente el timestamp del último run. Solución: el archivo `nudges.jsonl` es append-only — antes de emitir un nudge, verificar si el último evento del mismo `agente_o_skill` y `metrica` tiene un timestamp dentro de la ventana de throttle.
|
|
171
|
+
- **`atomicWriteJSON` usado para escribir en nudges.jsonl**: escribir el archivo completo en lugar de hacer append corrompe el historial de nudges previos. Causa: confusión entre archivos de estado mutable (usan `atomicWriteJSON`) y archivos de eventos de alta frecuencia (usan `fs.appendFileSync`). Solución: `nudges.jsonl` es un JSONL de alta frecuencia — siempre usar `fs.appendFileSync(ruta, JSON.stringify(nudge) + '\n')`, nunca reescribir el archivo completo.
|
|
172
|
+
|
|
173
|
+
## Referencia cruzada
|
|
174
|
+
|
|
175
|
+
- Módulo: `scripts/lib/drift-detector.js`
|
|
176
|
+
- Tests: `tests/lib/drift-detector.test.js`
|
|
177
|
+
- Operador Reflect: `hooks/lib/reflect-classifier.js`
|
|
178
|
+
- Ciclo AGP: `.planning/evolution/nudges.jsonl`
|
|
179
|
+
- Origen (adaptado de): `temp/mission-control-main/src/lib/agent-evals.ts` — MIT
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ejecutar-fase
|
|
3
|
-
description: Ejecuta el PLAN.md de una fase con commits atómicos por tarea. Aplica reglas de desviación, maneja checkpoints HITL,
|
|
4
|
-
version: "1.
|
|
3
|
+
description: Ejecuta el PLAN.md de una fase con commits atómicos por tarea. Aplica reglas de desviación, maneja checkpoints HITL, ejecuta TDD por default con evidencia RED en telemetría (opt-out declarado), y mantiene ESTADO.md y HOJA-RUTA.md actualizados tras cada tarea completada.
|
|
4
|
+
version: "1.2.0"
|
|
5
5
|
herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
|
|
6
6
|
exclusiones:
|
|
7
7
|
- "No cargar si no existe PLAN.md con `estado: aprobado` — ejecutar `planear-fase` primero."
|
|
@@ -31,7 +31,7 @@ antipatrón de acumular cambios sin verificar y commitear "todo de golpe".
|
|
|
31
31
|
|
|
32
32
|
## Cuándo NO cargar
|
|
33
33
|
|
|
34
|
-
- No hay PLAN.md o el plan tiene `estado:
|
|
34
|
+
- No hay PLAN.md o el plan no tiene `estado: aprobado` — ejecutar `planear-fase` y aprobar con `/swl:aprobar-plan N` (firma el lock G1) antes de ejecutar.
|
|
35
35
|
- El objetivo es solo verificar calidad del trabajo ya implementado; usar `verificar-trabajo`.
|
|
36
36
|
- Hay un checkpoint `decision` o `human-action` sin resolver en ESTADO.md — resolver el checkpoint antes de continuar la ejecución.
|
|
37
37
|
- Se quiere ejecutar solo una sub-tarea fuera de la secuencia de oleadas del plan; hacerlo rompe el grafo de dependencias y el estado en ESTADO.md.
|
|
@@ -41,6 +41,26 @@ antipatrón de acumular cambios sin verificar y commitear "todo de golpe".
|
|
|
41
41
|
Leer `.planning/fases/0N-PLAN.md` y `.planning/ESTADO.md` (si existe) antes de
|
|
42
42
|
ejecutar la primera tarea.
|
|
43
43
|
|
|
44
|
+
### Gate G1 — integridad del plan firmado
|
|
45
|
+
|
|
46
|
+
Antes de la primera tarea Y al inicio de cada slice, verificar que el PLAN no
|
|
47
|
+
fue mutado tras su aprobación:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
node -e "const {verificarPlan}=require('./scripts/lib/plan-lock'); console.log(JSON.stringify(verificarPlan('.planning/fases/0N-PLAN.md')))"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
- `modo: "firmado"` → continuar.
|
|
54
|
+
- `modo: "legacy"` (plan aprobado sin lock, cláusula de gracia D-05 para planes
|
|
55
|
+
pre-Fase09) → advertencia visible al usuario y continuar sin verificación de
|
|
56
|
+
integridad. Para activar el gate: `/swl:aprobar-plan N`.
|
|
57
|
+
- `modo: "mutado"` → DETENER. El plan cambió tras la firma; reportar
|
|
58
|
+
`hashEsperado`/`hashActual` y remitir a `/swl:aprobar-plan N`.
|
|
59
|
+
- cualquier otro `ok: false` → DETENER y reportar el `motivo`.
|
|
60
|
+
|
|
61
|
+
La firma se escribe en `.planning/locks/0N-PLAN.md.lock` (versionado en git).
|
|
62
|
+
La única vía válida de aprobar+firmar es `/swl:aprobar-plan`.
|
|
63
|
+
|
|
44
64
|
---
|
|
45
65
|
|
|
46
66
|
## Protocolo de ejecución por tarea
|
|
@@ -146,11 +166,16 @@ Reglas:
|
|
|
146
166
|
- Detalle adicional si es necesario
|
|
147
167
|
- Referencia a la tarea del plan
|
|
148
168
|
|
|
149
|
-
|
|
169
|
+
Refs: REQ-NN[, REQ-MM]
|
|
150
170
|
```
|
|
151
171
|
|
|
152
172
|
Tipos de commit válidos: `feat`, `fix`, `test`, `refactor`, `docs`, `chore`, `migration`
|
|
153
173
|
|
|
174
|
+
El footer `Refs: REQ-NN` cierra la cadena de trazabilidad REQ→T→commit (G4):
|
|
175
|
+
lleva los REQ que la tarea declara en su campo `**Verifica REQ**` del PLAN.
|
|
176
|
+
Omitirlo solo en fases legacy sin REQ-IDs. SIN co-autores ni atribuciones a IA
|
|
177
|
+
(regla global `git-coauthor.md` — el único autor es el usuario).
|
|
178
|
+
|
|
154
179
|
---
|
|
155
180
|
|
|
156
181
|
## Modo Pipeline: acumulación de resultados entre tareas
|
|
@@ -267,23 +292,44 @@ B) [opción B]
|
|
|
267
292
|
|
|
268
293
|
---
|
|
269
294
|
|
|
270
|
-
## TDD
|
|
295
|
+
## TDD por default con evidencia RED (gate G2 — opt-out declarado)
|
|
296
|
+
|
|
297
|
+
TDD es **default ON** desde la Fase 10 (vNext H2). Solo se omite cuando el
|
|
298
|
+
CONTEXTO.md declara `**TDD**: off — razón: [...]` (excepción registrada en
|
|
299
|
+
AUDITORIA.md por `discutir-fase`). Sin esa declaración, toda tarea de código
|
|
300
|
+
sigue el ciclo con evidencia.
|
|
271
301
|
|
|
272
|
-
|
|
302
|
+
### Ciclo RED → GREEN → REFACTOR por tarea (con telemetría)
|
|
273
303
|
|
|
274
|
-
|
|
304
|
+
Al iniciar la primera tarea de código de la fase, abrir la corrida de evidencia:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
node -e "const lt=require('./hooks/lib/loop-telemetry');const r=lt.iniciarCorrida({tipo:'tdd',direccion:'lower_is_better',config:{fase:'0N',tarea:'T-NN'}});console.log(r.dir)"
|
|
308
|
+
```
|
|
275
309
|
|
|
276
310
|
**RED**: Escribir el test que describe el comportamiento esperado.
|
|
277
311
|
El test DEBE fallar. Verificar que falla por la razón correcta, no por error
|
|
278
|
-
de sintaxis o configuración.
|
|
312
|
+
de sintaxis o configuración. **Registrar la evidencia** (métrica = tests fallando,
|
|
313
|
+
descripción = fallo exacto):
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
node -e "const lt=require('./hooks/lib/loop-telemetry');lt.registrarIteracion('<dir>',{iteracion:0,metrica:<N_fallan>,delta:0,estado:'baseline',descripcion:'RED T-NN: <fallo exacto del runner>'})"
|
|
317
|
+
```
|
|
279
318
|
|
|
280
319
|
**GREEN**: Escribir la implementación mínima que hace pasar el test.
|
|
281
|
-
"Mínima" significa: no implementar más de lo que el test exige.
|
|
282
|
-
|
|
320
|
+
"Mínima" significa: no implementar más de lo que el test exige. Registrar:
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
node -e "const lt=require('./hooks/lib/loop-telemetry');lt.registrarIteracion('<dir>',{iteracion:1,metrica:0,delta:-<N>,estado:'keep',descripcion:'GREEN T-NN: suite verde'})"
|
|
324
|
+
```
|
|
283
325
|
|
|
284
326
|
**REFACTOR**: Limpiar el código sin cambiar el comportamiento.
|
|
285
327
|
El test DEBE seguir pasando después del refactor. Hacer commit solo en este paso.
|
|
286
328
|
|
|
329
|
+
La fila RED en `.planning/loops/tdd-*/iteraciones.tsv` es la evidencia que
|
|
330
|
+
`hooks/tdd-gate.js` busca al commitear (warn-only, ADR-0035) — cierra F-TDD-6
|
|
331
|
+
("el RED no deja evidencia"). Sin registro, el gate emite nudge `tdd-red-evidence`.
|
|
332
|
+
|
|
287
333
|
### Cobertura mínima en modo TDD
|
|
288
334
|
|
|
289
335
|
- Toda función pública tiene al menos 1 test de camino feliz
|
|
@@ -344,10 +390,10 @@ Actualizar ESTADO.md después de cada tarea (no al final de la oleada):
|
|
|
344
390
|
- Pendientes: N-M-K
|
|
345
391
|
|
|
346
392
|
## Estado por tarea
|
|
347
|
-
| ID | Nombre | Estado | Commit | Notas |
|
|
348
|
-
|
|
349
|
-
| T-01 | [nombre] | COMPLETADA | abc1234 | |
|
|
350
|
-
| T-02 | [nombre] | COMPLETADA | def5678 | |
|
|
393
|
+
| ID | Nombre | Estado | Commit | REQ | Notas |
|
|
394
|
+
|------|--------|--------|--------|-----|-------|
|
|
395
|
+
| T-01 | [nombre] | COMPLETADA | abc1234 | REQ-01 | |
|
|
396
|
+
| T-02 | [nombre] | COMPLETADA | def5678 | REQ-01, REQ-02 | |
|
|
351
397
|
| T-03 | [nombre] | EN_PROGRESO | — | |
|
|
352
398
|
| T-04 | [nombre] | PENDIENTE | — | depende T-03 |
|
|
353
399
|
| T-05 | [nombre] | BLOQUEADA | — | [descripción del bloqueo] |
|
|
@@ -466,3 +512,7 @@ NO proceder con el deploy hasta aprobar este gate.
|
|
|
466
512
|
- [ ] Decisiones HITL registradas con respuesta del usuario
|
|
467
513
|
- [ ] Tests pasan en el estado final del código
|
|
468
514
|
- [ ] No hay `console.log`, `print()` de debug ni pendientes sin ticket en el código nuevo
|
|
515
|
+
- [ ] `.planning/locks/fase-activa.json` eliminado (libera el gate G0 — el `.lock`
|
|
516
|
+
del plan NO se toca: es evidencia versionada)
|
|
517
|
+
- [ ] `/swl:verificar --until-converge` invocado automáticamente (gate G4) — o
|
|
518
|
+
desviación `--sin-verify` registrada en RESUMEN.md con razón
|
|
@@ -6,9 +6,9 @@ description: >
|
|
|
6
6
|
Cargar al inicializar proyecto nuevo, migrar proyecto existente al sistema SWL,
|
|
7
7
|
auditar estructura Claude-ready, agregar extensiones (commands, skills, agents,
|
|
8
8
|
hooks, plugins), o configurar MCP. Cubre arquitectura de 4 capas, jerarquía
|
|
9
|
-
de memoria, 6 tipos de extensión,
|
|
9
|
+
de memoria, 6 tipos de extensión, 30 hook events, frontmatter de skills/agents/commands
|
|
10
10
|
y settings avanzados.
|
|
11
|
-
version: "1.
|
|
11
|
+
version: "1.1.0"
|
|
12
12
|
herramientasPermitidas: [Read, Write, Edit, Bash, Glob, Grep]
|
|
13
13
|
exclusiones:
|
|
14
14
|
- "No cargar para iniciar un proyecto desde cero — ese flujo usa `/swl:nuevo-proyecto` que incluye entrevista de contexto antes de generar la estructura; este skill genera estructura pero no recoge requisitos de negocio."
|
|
@@ -53,7 +53,7 @@ mi_proyecto/
|
|
|
53
53
|
| +-- plugins/ # Plugins distribuibles
|
|
54
54
|
+-- .planning/ # Estado de planificación SWL
|
|
55
55
|
| +-- PROYECTO.md, REQUISITOS.md, HOJA-RUTA.md, ESTADO.md
|
|
56
|
-
| +-- research/
|
|
56
|
+
| +-- fases/, adrs/, research/
|
|
57
57
|
+-- .mcp.json # Configuracion de servidores MCP
|
|
58
58
|
```
|
|
59
59
|
|
|
@@ -74,17 +74,19 @@ mi_proyecto/
|
|
|
74
74
|
|
|
75
75
|
| Scope | Path | Aplica a |
|
|
76
76
|
|-------|------|----------|
|
|
77
|
-
| **Managed Policy** | Sistema | Todos los usuarios org |
|
|
77
|
+
| **Managed Policy** | Sistema (ej. Windows: `C:\Program Files\ClaudeCode\CLAUDE.md`) | Todos los usuarios org |
|
|
78
78
|
| **User** | `~/.claude/CLAUDE.md` | Todos tus proyectos |
|
|
79
|
-
| **Project** | `./CLAUDE.md` | Proyecto (repo) |
|
|
79
|
+
| **Project** | `./CLAUDE.md` o `./.claude/CLAUDE.md` | Proyecto (repo) |
|
|
80
|
+
| **Local** | `./CLAUDE.local.md` (en `.gitignore`) | Solo tú, este proyecto |
|
|
80
81
|
| **Subdirectory** | `packages/frontend/CLAUDE.md` | Paquete del monorepo |
|
|
81
82
|
|
|
82
83
|
### Comportamiento de carga
|
|
83
84
|
|
|
84
|
-
- **Ancestor (ARRIBA)**: al inicio, carga TODOS los CLAUDE.md desde cwd hasta la raíz del sistema de archivos — siempre se cargan
|
|
85
|
-
- **Descendant (ABAJO)**: lazy — solo carga cuando Claude
|
|
85
|
+
- **Ancestor (ARRIBA)**: al inicio, carga TODOS los CLAUDE.md y CLAUDE.local.md desde cwd hasta la raíz del sistema de archivos — siempre se cargan, concatenados (raíz primero, cwd al final)
|
|
86
|
+
- **Descendant (ABAJO)**: lazy — solo carga cuando Claude lee archivos en ese subdirectorio
|
|
86
87
|
- **Siblings**: NUNCA se cargan entre sí
|
|
87
|
-
-
|
|
88
|
+
- Cada CLAUDE.md se carga **completo** sin importar su longitud — el límite de 200 líneas es recomendación de adherencia, no truncado. (El truncado de 200 líneas / 25KB aplica al `MEMORY.md` de auto memory, no a CLAUDE.md.)
|
|
89
|
+
- **Auto memory** (complementario): Claude escribe notas propias en `~/.claude/projects/<proyecto>/memory/` — activado por defecto, gestionable con `/memory` o `autoMemoryEnabled`
|
|
88
90
|
|
|
89
91
|
**Reglas clave**: Menos de 200 líneas por CLAUDE.md. Subdirectorios agregan, NUNCA sobreescriben.
|
|
90
92
|
|
|
@@ -94,8 +96,8 @@ mi_proyecto/
|
|
|
94
96
|
|
|
95
97
|
| Tipo | Activación | Ubicación |
|
|
96
98
|
|------|-----------|-----------|
|
|
97
|
-
| **Skills** | Auto-activación | `.claude/skills/` |
|
|
98
|
-
| **Commands** | Manual (`/comando`) | `.claude/commands/` |
|
|
99
|
+
| **Skills** | Auto-activación o `/nombre` | `.claude/skills/` |
|
|
100
|
+
| **Commands** | Manual (`/comando`) — fusionados con skills, mismo frontmatter | `.claude/commands/` |
|
|
99
101
|
| **Subagents** | Spawn por orquestador | `.claude/agents/` |
|
|
100
102
|
| **Hooks** | Event-driven | `settings.json` hooks |
|
|
101
103
|
| **MCP Servers** | Siempre disponibles | `.mcp.json` |
|
|
@@ -116,7 +118,7 @@ mi_proyecto/
|
|
|
116
118
|
```yaml
|
|
117
119
|
---
|
|
118
120
|
name: nombre-skill # kebab-case, max 64 chars
|
|
119
|
-
description: > #
|
|
121
|
+
description: > # QUÉ + CUÁNDO (description + when_to_use truncados a 1,536 chars combinados)
|
|
120
122
|
Describe qué hace y cuándo Claude debe auto-activarla.
|
|
121
123
|
allowed-tools: ["Read", "Grep", "Glob"]
|
|
122
124
|
paths:
|
|
@@ -129,7 +131,7 @@ Ver referencia completa en [recursos/frontmatter-y-hooks-referencia.md](recursos
|
|
|
129
131
|
|
|
130
132
|
---
|
|
131
133
|
|
|
132
|
-
## Hook Events (
|
|
134
|
+
## Hook Events (7 críticos de 30 oficiales)
|
|
133
135
|
|
|
134
136
|
| Evento | Cuándo se dispara | Uso típico |
|
|
135
137
|
|--------|-------------------|-----------|
|
|
@@ -141,8 +143,9 @@ Ver referencia completa en [recursos/frontmatter-y-hooks-referencia.md](recursos
|
|
|
141
143
|
| **PostCompact** | Después de compactar | Re-inyectar contexto |
|
|
142
144
|
| **Notification** | Claude espera input | Alertas desktop |
|
|
143
145
|
|
|
144
|
-
Los
|
|
145
|
-
|
|
146
|
+
Los 23 eventos restantes, frontmatter de agents (16 campos) y de skills/commands
|
|
147
|
+
(unificados — los commands se fusionaron con skills), opciones avanzadas de hooks
|
|
148
|
+
y orden de resolución en
|
|
146
149
|
[recursos/frontmatter-y-hooks-referencia.md](recursos/frontmatter-y-hooks-referencia.md).
|
|
147
150
|
|
|
148
151
|
---
|