@saulwade/swl-ses 1.5.0 → 1.5.2
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 +19 -2
- package/README.md +561 -561
- package/agentes/arquitecto-swl.md +33 -1
- package/agentes/nemesis-auditor-swl.md +59 -19
- package/bin/swl-mcp-server.js +214 -214
- package/comandos/swl/.evolved.json +22 -22
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/nemesis.md +230 -56
- package/gateway/lib/event-channel.js +191 -191
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/benchmark-memoria/SKILL.md +186 -186
- package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
- package/habilidades/doubt-driven-review/SKILL.md +171 -171
- package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/eval-framework/SKILL.md +212 -212
- package/habilidades/feynman-auditor-swl/SKILL.md +123 -123
- package/habilidades/feynman-auditor-swl/recursos/preguntas-language-agnostic.md +108 -108
- package/habilidades/harness-claude-code/SKILL.md +299 -299
- package/habilidades/infra-github-actions/SKILL.md +166 -166
- package/habilidades/legacy-code-rescue/SKILL.md +267 -267
- package/habilidades/manejo-errores/.evolved.json +8 -8
- package/habilidades/meta-skills-estandar/SKILL.md +225 -1
- package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
- package/habilidades/nemesis-evaluacion-json/SKILL.md +266 -0
- package/habilidades/nemesis-redistribuir/SKILL.md +341 -0
- package/habilidades/node-experto/SKILL.md +105 -4
- package/habilidades/patrones-python/SKILL.md +229 -229
- package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
- package/habilidades/planear-fase/SKILL.md +319 -319
- package/habilidades/protocolo-revision-swl/SKILL.md +350 -276
- package/habilidades/release-semver/.evolved.json +8 -8
- package/habilidades/state-inconsistency-auditor-swl/SKILL.md +166 -166
- package/habilidades/state-inconsistency-auditor-swl/recursos/coupled-state-patterns.md +147 -147
- package/habilidades/tdd-workflow/SKILL.md +150 -4
- package/habilidades/testing-python/SKILL.md +340 -340
- package/habilidades/verificar-trabajo/SKILL.md +8 -3
- package/habilidades/web-fetcher-routing/SKILL.md +75 -75
- package/hooks/check-update.js +31 -3
- package/hooks/claudemd-bloat-detector.js +161 -161
- package/hooks/lib/agent-routing.js +107 -107
- package/hooks/lib/auto-consolidator.js +335 -335
- package/hooks/lib/error-classifier.js +308 -308
- package/hooks/lib/merkle-audit.js +96 -96
- package/hooks/lib/provenance-tracker.js +191 -191
- package/hooks/lib/rate-limit-tracker.js +253 -253
- package/hooks/lib/resource-quota.js +122 -122
- package/hooks/lib/retry-jitter.js +165 -165
- package/hooks/lib/security-net.js +201 -201
- package/hooks/lib/skill-auditor.js +588 -588
- package/hooks/lib/sync-status.js +228 -228
- package/hooks/lib/taint-tracker.js +107 -107
- package/hooks/lib/text-similarity.js +241 -241
- package/hooks/lib/toon-compressor.js +245 -245
- package/hooks/registro-turnos.js +209 -209
- package/hooks/sugerir-regenerar-inventario.js +170 -170
- package/hooks/validar-formato-post-subagente.js +140 -140
- package/hooks/validar-memoria-hook.js +218 -218
- package/instintos/prompt-appendices.yaml +57 -57
- package/manifiestos/agent-output-schemas.json +57 -57
- package/manifiestos/modulos.json +1324 -1321
- package/manifiestos/skills-lock.json +1114 -1114
- package/package.json +2 -2
- package/plantillas/auditor-veto-template.md +105 -105
- package/plantillas/github-workflows/README.md +47 -47
- package/plantillas/github-workflows/release-please.yml +44 -44
- package/plantillas/github-workflows/swl-ci.yml +107 -107
- package/plantillas/github-workflows/swl-security.yml +51 -51
- package/plugin.json +353 -351
- package/reglas/analisis-previo-tareas-grandes.md +172 -172
- package/reglas/arreglar-al-detectar.md +147 -147
- package/reglas/fragmentos-compartidos.md +152 -152
- package/reglas/harness-claude-code.md +213 -213
- package/reglas/registro-componentes-nuevos.md +192 -0
- package/reglas/usar-context7.md +226 -226
- package/schemas/diary-entry.schema.json +80 -80
- package/scripts/actualizar.js +110 -1
- package/scripts/audit-tools/audit-history.js +330 -330
- package/scripts/audit-tools/bundle-tracker.js +290 -290
- package/scripts/audit-tools/canary-monitor.js +352 -352
- package/scripts/audit-tools/code-profiler.js +605 -605
- package/scripts/audit-tools/dep-doctor.js +320 -320
- package/scripts/audit-tools/env-validator.js +206 -206
- package/scripts/audit-tools/lib/fs-walk.js +48 -48
- package/scripts/audit-tools/lib/output.js +23 -23
- package/scripts/audit-tools/migration-checker.js +392 -392
- package/scripts/audit-tools/pentest-scanner.js +1436 -1436
- package/scripts/benchmark-memoria.js +167 -167
- package/scripts/configurar-branch-protection.js +418 -418
- package/scripts/derivar-feature-list.js +489 -489
- package/scripts/detectar-aprendizajes-duplicados.js +151 -151
- package/scripts/doctor.js +58 -4
- package/scripts/field-report.js +199 -199
- package/scripts/generar-checklists-consolidados.js +273 -273
- package/scripts/generar-inventario.js +420 -420
- package/scripts/generar-matriz-lenguajes.js +271 -271
- package/scripts/lib/artefactos-python.js +43 -43
- package/scripts/lib/benchmark-metrics.js +160 -160
- package/scripts/lib/budget-enforcer.js +252 -252
- package/scripts/lib/configurar-ci.js +380 -380
- package/scripts/lib/contadores-inventario.js +217 -217
- package/scripts/lib/detectar-stack-detallado.js +307 -307
- package/scripts/lib/diary-entry.js +234 -234
- package/scripts/lib/eval-metrics-store.js +218 -218
- package/scripts/lib/eval-quality.js +171 -171
- package/scripts/lib/eval-schemas.js +144 -144
- package/scripts/lib/eval-self-correct.js +106 -106
- package/scripts/lib/eval-validator.js +185 -185
- package/scripts/lib/expandir-targets.js +71 -71
- package/scripts/lib/jaccard-similarity.js +98 -98
- package/scripts/lib/longmemeval-runner.js +125 -125
- package/scripts/lib/mcp_config.py +127 -0
- package/scripts/lib/npm-version.js +261 -261
- package/scripts/lib/paquetes-conocidos.js +50 -50
- package/scripts/lib/prompt-builder.js +264 -264
- package/scripts/lib/rrf-fusion.js +175 -175
- package/scripts/lib/scoring-instintos.js +277 -277
- package/scripts/lib/semantic-search.js +252 -252
- package/scripts/lib/toml-merge.js +204 -204
- package/scripts/lib/transformadores/codex.js +375 -375
- package/scripts/lib/transformadores/cursor.js +359 -359
- package/scripts/limpiar-artefactos-python.js +131 -131
- package/scripts/mcp-orchestrator.py +8 -18
- package/scripts/mcp-pool-manager.py +12 -23
- package/scripts/mcp-server/README.md +170 -170
- package/scripts/mcp-server/auth.js +105 -105
- package/scripts/mcp-server/cache.js +106 -106
- package/scripts/mcp-server/telemetry.js +78 -78
- package/scripts/migrar-csv-a-array.js +168 -168
- package/scripts/migrar-fase-dominio.js +201 -201
- package/scripts/publicar.js +511 -511
- package/scripts/run-eval.js +141 -141
- package/scripts/validar-userland-vacio.js +110 -110
|
@@ -1,163 +1,163 @@
|
|
|
1
|
-
# Skills as Agents — patrón técnico avanzado
|
|
2
|
-
|
|
3
|
-
Documenta el patrón Anthropic nativo de ejecutar un skill SWL en su propio
|
|
4
|
-
sub-agente con `agent: true` + `model:` en el frontmatter. Origen: artículo
|
|
5
|
-
"Claude Code's Limits Are Generous. The Problem Is Your Harness." sección 2.3.
|
|
6
|
-
|
|
7
|
-
## Concepto
|
|
8
|
-
|
|
9
|
-
Un SKILL.md normal es contenido que se carga al contexto del padre cuando
|
|
10
|
-
se invoca con `Skill("nombre")`. El skill aporta reglas, conocimiento o
|
|
11
|
-
guía al modelo del padre, que las usa al razonar.
|
|
12
|
-
|
|
13
|
-
Con el patrón skills as agents, el skill se vuelve **invocable como
|
|
14
|
-
sub-agente independiente**: tiene su propio modelo, su propio contexto,
|
|
15
|
-
y solo devuelve un resultado acotado al padre. Útil cuando el skill
|
|
16
|
-
procesa un input grande y debe entregar un resumen.
|
|
17
|
-
|
|
18
|
-
## Cuándo usar este patrón
|
|
19
|
-
|
|
20
|
-
- El skill procesa un archivo o input grande y debe devolver solo un
|
|
21
|
-
resumen al padre (ejemplo: extraer TLDR de un PDF de 50 páginas, sin
|
|
22
|
-
que el texto completo entre al contexto del padre).
|
|
23
|
-
- El skill ejecuta búsqueda exhaustiva o crawling de un codebase completo
|
|
24
|
-
y el resultado es un set acotado de findings.
|
|
25
|
-
- El skill necesita un modelo distinto al del padre por costo o latencia
|
|
26
|
-
(Haiku para trabajo mecánico cuando el padre es Opus).
|
|
27
|
-
- El trabajo del skill es paralelizable y se va a invocar varias veces en
|
|
28
|
-
la misma sesión.
|
|
29
|
-
|
|
30
|
-
## Cuándo NO usar
|
|
31
|
-
|
|
32
|
-
- El skill solo aporta reglas o conocimiento estático que se aplica al
|
|
33
|
-
razonamiento del padre — esos son skills "passive" normales y NO
|
|
34
|
-
necesitan `agent: true`. Su valor es justamente que cargan reglas al
|
|
35
|
-
contexto del padre.
|
|
36
|
-
- El skill es referenciado dentro de otro skill como contenido de apoyo
|
|
37
|
-
— el contexto del padre lo necesita ver.
|
|
38
|
-
- El skill requiere acceso al contexto activo del padre (decisiones
|
|
39
|
-
tomadas mid-session, archivos ya leídos) — `agent: true` aísla del
|
|
40
|
-
padre, así que el sub-agente no vería esa información.
|
|
41
|
-
- El skill es invocado una sola vez en la sesión y su output es pequeño
|
|
42
|
-
— el overhead de spawn de sub-agente puede dominar.
|
|
43
|
-
|
|
44
|
-
## Ejemplo de skill como agent
|
|
45
|
-
|
|
46
|
-
```yaml
|
|
47
|
-
---
|
|
48
|
-
name: tldr-pdf
|
|
49
|
-
description: >
|
|
50
|
-
Extrae TLDR de 200 palabras de un PDF sin cargar el texto completo en
|
|
51
|
-
el contexto del padre. Cargar cuando se reciba ruta a un PDF que solo
|
|
52
|
-
necesita resumen ejecutivo.
|
|
53
|
-
agent: true
|
|
54
|
-
model: claude-haiku-4-5-20251001
|
|
55
|
-
herramientasPermitidas: [Bash, Read]
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
# tldr-pdf
|
|
59
|
-
|
|
60
|
-
Recibes la ruta de un PDF como input.
|
|
61
|
-
|
|
62
|
-
1. Ejecuta `pdftotext "$1" -` para extraer texto.
|
|
63
|
-
2. Lee la salida.
|
|
64
|
-
3. Devuelve SOLO:
|
|
65
|
-
- 5 bullets de TLDR
|
|
66
|
-
- 3 quotes que valga la pena conservar
|
|
67
|
-
- URLs citadas
|
|
68
|
-
|
|
69
|
-
Nunca devuelvas el texto completo. Nunca expandas más allá de la estructura.
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
Flujo: el padre invoca `Skill("tldr-pdf")` con la ruta del PDF; el
|
|
73
|
-
sub-agente Haiku ejecuta `pdftotext`, lee la salida (que llena su propio
|
|
74
|
-
contexto, no el del padre), y devuelve ~200 palabras estructuradas. El PDF
|
|
75
|
-
completo nunca toca el contexto del padre.
|
|
76
|
-
|
|
77
|
-
## Reglas del patrón
|
|
78
|
-
|
|
79
|
-
### Frontmatter
|
|
80
|
-
|
|
81
|
-
- `agent: true` activa el modo sub-agente.
|
|
82
|
-
- `model:` debe ser un modelo Anthropic válido. Para skills mecánicos,
|
|
83
|
-
preferir Haiku (5× más barato que Sonnet, 25× más barato que Opus 4.7).
|
|
84
|
-
- El frontmatter sigue siendo válido SWL: incluir `name`, `description`,
|
|
85
|
-
`herramientasPermitidas`, `exclusiones` y demás campos obligatorios.
|
|
86
|
-
|
|
87
|
-
### Cuerpo
|
|
88
|
-
|
|
89
|
-
- Debe ser **autocontenido**: el sub-agente NO tiene acceso al contexto
|
|
90
|
-
del padre (CLAUDE.md del proyecto, instintos cargados, sesión activa,
|
|
91
|
-
archivos previamente leídos). Todo lo que necesite saber tiene que
|
|
92
|
-
estar en el cuerpo del skill o en lo que reciba como input.
|
|
93
|
-
- El output debe ser **acotado**: si el sub-agente devuelve un dump
|
|
94
|
-
masivo, se pierde el beneficio (terminamos pasando lo mismo al padre,
|
|
95
|
-
solo con un round-trip extra). Especificar formato exacto en el
|
|
96
|
-
cuerpo del skill: número de bullets, longitud máxima, qué incluir y
|
|
97
|
-
qué no.
|
|
98
|
-
|
|
99
|
-
### Errores comunes a evitar
|
|
100
|
-
|
|
101
|
-
- **Usar Opus en `model:` para skills mecánicos**: invalida el ahorro de
|
|
102
|
-
costo. La mayoría de skills as agents deberían ser Haiku o Sonnet.
|
|
103
|
-
- **Devolver el texto crudo del input**: si el skill recibe un PDF y
|
|
104
|
-
devuelve el texto completo, no estamos aislando nada. Devuelve siempre
|
|
105
|
-
la transformación, no el material crudo.
|
|
106
|
-
- **Asumir que el skill verá el CLAUDE.md del proyecto**: no lo verá.
|
|
107
|
-
Si el skill necesita seguir convenciones del proyecto, hay que
|
|
108
|
-
explicárselas en el cuerpo.
|
|
109
|
-
|
|
110
|
-
## Skills SWL candidatos al patrón (no migración masiva)
|
|
111
|
-
|
|
112
|
-
Evaluación caso por caso. NO aplicar masivamente — el patrón aporta solo
|
|
113
|
-
cuando el skill consume input grande y devuelve output acotado.
|
|
114
|
-
|
|
115
|
-
| Skill SWL | Por qué encaja | Modelo recomendado |
|
|
116
|
-
|-----------|----------------|--------------------|
|
|
117
|
-
| `extraccion-documentos` | Procesa PDFs/Office grandes | Haiku |
|
|
118
|
-
| `mapear-codebase` | Procesa codebase entero, devuelve reporte | Sonnet |
|
|
119
|
-
| `wiki-conocimiento` (modo query) | Búsqueda en wiki con respuesta acotada | Sonnet |
|
|
120
|
-
|
|
121
|
-
Skills NO candidatos (son passive, su valor es cargar reglas al contexto del padre):
|
|
122
|
-
|
|
123
|
-
- `manejo-errores`, `auth-patrones`, `api-rest-diseno`, `accesibilidad-a11y`, etc.
|
|
124
|
-
- Toda regla de estilo o convención por lenguaje.
|
|
125
|
-
- Toda regla SWL en `reglas/`.
|
|
126
|
-
|
|
127
|
-
## Implicaciones operativas
|
|
128
|
-
|
|
129
|
-
### Costo
|
|
130
|
-
|
|
131
|
-
Spawn de sub-agente tiene overhead (system prompt + carga del skill +
|
|
132
|
-
contexto inicial). Para inputs chicos, el overhead supera el ahorro.
|
|
133
|
-
Regla práctica: usar el patrón si el input que el skill procesa es
|
|
134
|
-
≥3,000 tokens (o ≥10K caracteres).
|
|
135
|
-
|
|
136
|
-
### Latencia
|
|
137
|
-
|
|
138
|
-
El padre espera al sub-agente antes de continuar. Si el skill demora >10s,
|
|
139
|
-
considerar si la operación cabe en el padre directamente (sin spawn).
|
|
140
|
-
|
|
141
|
-
### Trazabilidad
|
|
142
|
-
|
|
143
|
-
Los sub-agentes spawneados aparecen en `claude-usage` (vendor SWL) como
|
|
144
|
-
invocaciones separadas con su propio modelo. Útil para entender qué
|
|
145
|
-
porcentaje del costo viene de sub-agentes vs. trabajo del padre.
|
|
146
|
-
|
|
147
|
-
### Compatibilidad con SWL
|
|
148
|
-
|
|
149
|
-
- El skill sigue registrado normalmente en `manifiestos/modulos.json`.
|
|
150
|
-
- El skill se invoca igual: `Skill("nombre")`. La diferencia es interna
|
|
151
|
-
(el harness Anthropic decide si lo carga al padre o lo ejecuta como
|
|
152
|
-
sub-agente según el frontmatter).
|
|
153
|
-
- Hooks SWL siguen aplicando: `linea-estado.js`, `monitor-contexto.js`,
|
|
154
|
-
`audit-trail.js` registran las invocaciones del sub-agente.
|
|
155
|
-
|
|
156
|
-
## Referencias
|
|
157
|
-
|
|
158
|
-
- Artículo de origen: "Claude Code's Limits Are Generous. The Problem Is
|
|
159
|
-
Your Harness." (sección 2.3 — Skills Can Also Be Invoked as Agents).
|
|
160
|
-
- Documentación oficial Anthropic sobre Claude Skills (cuando esté
|
|
161
|
-
disponible).
|
|
162
|
-
- `Skill("harness-claude-code")` — uso operativo del patrón en sesiones
|
|
163
|
-
largas, junto con sub-agentes via Task tool y delegación explícita.
|
|
1
|
+
# Skills as Agents — patrón técnico avanzado
|
|
2
|
+
|
|
3
|
+
Documenta el patrón Anthropic nativo de ejecutar un skill SWL en su propio
|
|
4
|
+
sub-agente con `agent: true` + `model:` en el frontmatter. Origen: artículo
|
|
5
|
+
"Claude Code's Limits Are Generous. The Problem Is Your Harness." sección 2.3.
|
|
6
|
+
|
|
7
|
+
## Concepto
|
|
8
|
+
|
|
9
|
+
Un SKILL.md normal es contenido que se carga al contexto del padre cuando
|
|
10
|
+
se invoca con `Skill("nombre")`. El skill aporta reglas, conocimiento o
|
|
11
|
+
guía al modelo del padre, que las usa al razonar.
|
|
12
|
+
|
|
13
|
+
Con el patrón skills as agents, el skill se vuelve **invocable como
|
|
14
|
+
sub-agente independiente**: tiene su propio modelo, su propio contexto,
|
|
15
|
+
y solo devuelve un resultado acotado al padre. Útil cuando el skill
|
|
16
|
+
procesa un input grande y debe entregar un resumen.
|
|
17
|
+
|
|
18
|
+
## Cuándo usar este patrón
|
|
19
|
+
|
|
20
|
+
- El skill procesa un archivo o input grande y debe devolver solo un
|
|
21
|
+
resumen al padre (ejemplo: extraer TLDR de un PDF de 50 páginas, sin
|
|
22
|
+
que el texto completo entre al contexto del padre).
|
|
23
|
+
- El skill ejecuta búsqueda exhaustiva o crawling de un codebase completo
|
|
24
|
+
y el resultado es un set acotado de findings.
|
|
25
|
+
- El skill necesita un modelo distinto al del padre por costo o latencia
|
|
26
|
+
(Haiku para trabajo mecánico cuando el padre es Opus).
|
|
27
|
+
- El trabajo del skill es paralelizable y se va a invocar varias veces en
|
|
28
|
+
la misma sesión.
|
|
29
|
+
|
|
30
|
+
## Cuándo NO usar
|
|
31
|
+
|
|
32
|
+
- El skill solo aporta reglas o conocimiento estático que se aplica al
|
|
33
|
+
razonamiento del padre — esos son skills "passive" normales y NO
|
|
34
|
+
necesitan `agent: true`. Su valor es justamente que cargan reglas al
|
|
35
|
+
contexto del padre.
|
|
36
|
+
- El skill es referenciado dentro de otro skill como contenido de apoyo
|
|
37
|
+
— el contexto del padre lo necesita ver.
|
|
38
|
+
- El skill requiere acceso al contexto activo del padre (decisiones
|
|
39
|
+
tomadas mid-session, archivos ya leídos) — `agent: true` aísla del
|
|
40
|
+
padre, así que el sub-agente no vería esa información.
|
|
41
|
+
- El skill es invocado una sola vez en la sesión y su output es pequeño
|
|
42
|
+
— el overhead de spawn de sub-agente puede dominar.
|
|
43
|
+
|
|
44
|
+
## Ejemplo de skill como agent
|
|
45
|
+
|
|
46
|
+
```yaml
|
|
47
|
+
---
|
|
48
|
+
name: tldr-pdf
|
|
49
|
+
description: >
|
|
50
|
+
Extrae TLDR de 200 palabras de un PDF sin cargar el texto completo en
|
|
51
|
+
el contexto del padre. Cargar cuando se reciba ruta a un PDF que solo
|
|
52
|
+
necesita resumen ejecutivo.
|
|
53
|
+
agent: true
|
|
54
|
+
model: claude-haiku-4-5-20251001
|
|
55
|
+
herramientasPermitidas: [Bash, Read]
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
# tldr-pdf
|
|
59
|
+
|
|
60
|
+
Recibes la ruta de un PDF como input.
|
|
61
|
+
|
|
62
|
+
1. Ejecuta `pdftotext "$1" -` para extraer texto.
|
|
63
|
+
2. Lee la salida.
|
|
64
|
+
3. Devuelve SOLO:
|
|
65
|
+
- 5 bullets de TLDR
|
|
66
|
+
- 3 quotes que valga la pena conservar
|
|
67
|
+
- URLs citadas
|
|
68
|
+
|
|
69
|
+
Nunca devuelvas el texto completo. Nunca expandas más allá de la estructura.
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Flujo: el padre invoca `Skill("tldr-pdf")` con la ruta del PDF; el
|
|
73
|
+
sub-agente Haiku ejecuta `pdftotext`, lee la salida (que llena su propio
|
|
74
|
+
contexto, no el del padre), y devuelve ~200 palabras estructuradas. El PDF
|
|
75
|
+
completo nunca toca el contexto del padre.
|
|
76
|
+
|
|
77
|
+
## Reglas del patrón
|
|
78
|
+
|
|
79
|
+
### Frontmatter
|
|
80
|
+
|
|
81
|
+
- `agent: true` activa el modo sub-agente.
|
|
82
|
+
- `model:` debe ser un modelo Anthropic válido. Para skills mecánicos,
|
|
83
|
+
preferir Haiku (5× más barato que Sonnet, 25× más barato que Opus 4.7).
|
|
84
|
+
- El frontmatter sigue siendo válido SWL: incluir `name`, `description`,
|
|
85
|
+
`herramientasPermitidas`, `exclusiones` y demás campos obligatorios.
|
|
86
|
+
|
|
87
|
+
### Cuerpo
|
|
88
|
+
|
|
89
|
+
- Debe ser **autocontenido**: el sub-agente NO tiene acceso al contexto
|
|
90
|
+
del padre (CLAUDE.md del proyecto, instintos cargados, sesión activa,
|
|
91
|
+
archivos previamente leídos). Todo lo que necesite saber tiene que
|
|
92
|
+
estar en el cuerpo del skill o en lo que reciba como input.
|
|
93
|
+
- El output debe ser **acotado**: si el sub-agente devuelve un dump
|
|
94
|
+
masivo, se pierde el beneficio (terminamos pasando lo mismo al padre,
|
|
95
|
+
solo con un round-trip extra). Especificar formato exacto en el
|
|
96
|
+
cuerpo del skill: número de bullets, longitud máxima, qué incluir y
|
|
97
|
+
qué no.
|
|
98
|
+
|
|
99
|
+
### Errores comunes a evitar
|
|
100
|
+
|
|
101
|
+
- **Usar Opus en `model:` para skills mecánicos**: invalida el ahorro de
|
|
102
|
+
costo. La mayoría de skills as agents deberían ser Haiku o Sonnet.
|
|
103
|
+
- **Devolver el texto crudo del input**: si el skill recibe un PDF y
|
|
104
|
+
devuelve el texto completo, no estamos aislando nada. Devuelve siempre
|
|
105
|
+
la transformación, no el material crudo.
|
|
106
|
+
- **Asumir que el skill verá el CLAUDE.md del proyecto**: no lo verá.
|
|
107
|
+
Si el skill necesita seguir convenciones del proyecto, hay que
|
|
108
|
+
explicárselas en el cuerpo.
|
|
109
|
+
|
|
110
|
+
## Skills SWL candidatos al patrón (no migración masiva)
|
|
111
|
+
|
|
112
|
+
Evaluación caso por caso. NO aplicar masivamente — el patrón aporta solo
|
|
113
|
+
cuando el skill consume input grande y devuelve output acotado.
|
|
114
|
+
|
|
115
|
+
| Skill SWL | Por qué encaja | Modelo recomendado |
|
|
116
|
+
|-----------|----------------|--------------------|
|
|
117
|
+
| `extraccion-documentos` | Procesa PDFs/Office grandes | Haiku |
|
|
118
|
+
| `mapear-codebase` | Procesa codebase entero, devuelve reporte | Sonnet |
|
|
119
|
+
| `wiki-conocimiento` (modo query) | Búsqueda en wiki con respuesta acotada | Sonnet |
|
|
120
|
+
|
|
121
|
+
Skills NO candidatos (son passive, su valor es cargar reglas al contexto del padre):
|
|
122
|
+
|
|
123
|
+
- `manejo-errores`, `auth-patrones`, `api-rest-diseno`, `accesibilidad-a11y`, etc.
|
|
124
|
+
- Toda regla de estilo o convención por lenguaje.
|
|
125
|
+
- Toda regla SWL en `reglas/`.
|
|
126
|
+
|
|
127
|
+
## Implicaciones operativas
|
|
128
|
+
|
|
129
|
+
### Costo
|
|
130
|
+
|
|
131
|
+
Spawn de sub-agente tiene overhead (system prompt + carga del skill +
|
|
132
|
+
contexto inicial). Para inputs chicos, el overhead supera el ahorro.
|
|
133
|
+
Regla práctica: usar el patrón si el input que el skill procesa es
|
|
134
|
+
≥3,000 tokens (o ≥10K caracteres).
|
|
135
|
+
|
|
136
|
+
### Latencia
|
|
137
|
+
|
|
138
|
+
El padre espera al sub-agente antes de continuar. Si el skill demora >10s,
|
|
139
|
+
considerar si la operación cabe en el padre directamente (sin spawn).
|
|
140
|
+
|
|
141
|
+
### Trazabilidad
|
|
142
|
+
|
|
143
|
+
Los sub-agentes spawneados aparecen en `claude-usage` (vendor SWL) como
|
|
144
|
+
invocaciones separadas con su propio modelo. Útil para entender qué
|
|
145
|
+
porcentaje del costo viene de sub-agentes vs. trabajo del padre.
|
|
146
|
+
|
|
147
|
+
### Compatibilidad con SWL
|
|
148
|
+
|
|
149
|
+
- El skill sigue registrado normalmente en `manifiestos/modulos.json`.
|
|
150
|
+
- El skill se invoca igual: `Skill("nombre")`. La diferencia es interna
|
|
151
|
+
(el harness Anthropic decide si lo carga al padre o lo ejecuta como
|
|
152
|
+
sub-agente según el frontmatter).
|
|
153
|
+
- Hooks SWL siguen aplicando: `linea-estado.js`, `monitor-contexto.js`,
|
|
154
|
+
`audit-trail.js` registran las invocaciones del sub-agente.
|
|
155
|
+
|
|
156
|
+
## Referencias
|
|
157
|
+
|
|
158
|
+
- Artículo de origen: "Claude Code's Limits Are Generous. The Problem Is
|
|
159
|
+
Your Harness." (sección 2.3 — Skills Can Also Be Invoked as Agents).
|
|
160
|
+
- Documentación oficial Anthropic sobre Claude Skills (cuando esté
|
|
161
|
+
disponible).
|
|
162
|
+
- `Skill("harness-claude-code")` — uso operativo del patrón en sesiones
|
|
163
|
+
largas, junto con sub-agentes via Task tool y delegación explícita.
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: nemesis-evaluacion-json
|
|
3
|
+
description: >
|
|
4
|
+
Schema y protocolo de emisión del archivo evaluacion.json que el agente
|
|
5
|
+
nemesis-auditor-swl produce al final de cada iteración del loop
|
|
6
|
+
evaluator-optimizer. Estructura PASS/NEEDS_IMPROVEMENT/FAIL + hallazgos
|
|
7
|
+
por archivo:línea + feedback estructurado consumible por orquestador-swl.
|
|
8
|
+
Cargar cuando el agente nemesis necesita emitir output estructurado para
|
|
9
|
+
alimentar el ciclo de remediación de /swl:nemesis --remediar, o cuando
|
|
10
|
+
un componente downstream necesita parsear el veredicto de una auditoría
|
|
11
|
+
nemesis.
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Schema del evaluacion.json del Nemesis
|
|
15
|
+
|
|
16
|
+
Este skill define el contrato JSON que `nemesis-auditor-swl` emite tras cada
|
|
17
|
+
auditoría. El archivo vive en `.planning/audit/findings/iter-N/evaluacion.json`
|
|
18
|
+
y es la fuente de verdad estructurada que el comando `/swl:nemesis` consume
|
|
19
|
+
para decidir convergencia, activar remediación o escalar al Recovery Catalog.
|
|
20
|
+
|
|
21
|
+
Junto al JSON se emite también el reporte markdown legible (`nemesis-verified.md`
|
|
22
|
+
en el mismo directorio), pero la **decisión automática del loop se toma sobre
|
|
23
|
+
el JSON**, no sobre el markdown.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Cuándo cargar
|
|
28
|
+
|
|
29
|
+
- El agente `nemesis-auditor-swl` está terminando una pasada y necesita
|
|
30
|
+
consolidar hallazgos en formato estructurado.
|
|
31
|
+
- El comando `/swl:nemesis` necesita parsear el veredicto para decidir
|
|
32
|
+
PASS / continuar loop / aplicar Recovery.
|
|
33
|
+
- Un componente downstream (orquestador-swl, hook de telemetría, dashboard)
|
|
34
|
+
necesita leer auditorías históricas con consistencia.
|
|
35
|
+
|
|
36
|
+
## Cuándo NO cargar
|
|
37
|
+
|
|
38
|
+
- Auditoría sin loop (`/swl:nemesis` sin `--remediar`): el JSON sigue
|
|
39
|
+
produciéndose, pero el reporte markdown es suficiente para consumo humano.
|
|
40
|
+
- Componentes que solo necesitan el conteo agregado de hallazgos —
|
|
41
|
+
usar `Skill("memoria-busqueda")` sobre los reportes históricos.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Schema canónico (v1.0.0)
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"schema_version": "1.0.0",
|
|
50
|
+
"metadata": {
|
|
51
|
+
"iteracion": 1,
|
|
52
|
+
"max_iter": 3,
|
|
53
|
+
"fecha_emision": "2026-05-16T20:30:00Z",
|
|
54
|
+
"scope": {
|
|
55
|
+
"modulos": ["backend/app/auth/", "database/schemas/002-schema-usuario.sql"],
|
|
56
|
+
"loc_total": 627,
|
|
57
|
+
"archivos_analizados": 5
|
|
58
|
+
},
|
|
59
|
+
"modo": "monolitico",
|
|
60
|
+
"agente_emisor": "nemesis-auditor-swl",
|
|
61
|
+
"version_agente": "1.0.0",
|
|
62
|
+
"comando_invocacion": "/swl:nemesis --remediar --modulo backend/app/auth"
|
|
63
|
+
},
|
|
64
|
+
"veredicto": {
|
|
65
|
+
"status": "NEEDS_IMPROVEMENT",
|
|
66
|
+
"score": 78,
|
|
67
|
+
"puede_remediar_automaticamente": true,
|
|
68
|
+
"razon_si_fail": null
|
|
69
|
+
},
|
|
70
|
+
"hallazgos": [
|
|
71
|
+
{
|
|
72
|
+
"id": "F-04",
|
|
73
|
+
"severidad": "ALTA",
|
|
74
|
+
"categoria_owasp": "A07-Identification-and-Authentication-Failures",
|
|
75
|
+
"categoria_a11": "Agencia-excesiva-no-aplica",
|
|
76
|
+
"archivo": "backend/app/auth/service.py",
|
|
77
|
+
"linea_inicio": 191,
|
|
78
|
+
"linea_fin": 243,
|
|
79
|
+
"descripcion": "Backend nunca incrementa intentos_fallidos pese a que el schema declara la columna y constraint CHECK <= 10. Credential stuffing trivial.",
|
|
80
|
+
"evidencia_adicional": {
|
|
81
|
+
"schema_archivo": "database/schemas/002-schema-usuario.sql",
|
|
82
|
+
"schema_linea": "438-451",
|
|
83
|
+
"constraint": "CHECK (intentos_fallidos >= 0 AND intentos_fallidos <= 10)"
|
|
84
|
+
},
|
|
85
|
+
"accion_sugerida": {
|
|
86
|
+
"tipo": "implementar",
|
|
87
|
+
"descripcion": "Crear funcion SQL usuario.fn_registrar_intento_fallido(email) atomica. Llamar tras bcrypt verify fail. Verificar bloqueado=true antes de validar password.",
|
|
88
|
+
"agente_recomendado": "backend-python-swl",
|
|
89
|
+
"skills_recomendados": ["fastapi-experto", "postgresql-experto"],
|
|
90
|
+
"loc_estimado": 60,
|
|
91
|
+
"riesgo_regresion": "BAJO"
|
|
92
|
+
},
|
|
93
|
+
"discovery_path": "Feynman-cross-State",
|
|
94
|
+
"verification": "Code-trace",
|
|
95
|
+
"feedback_para_generator": "El schema ya tiene la columna. NO crear nueva tabla. NO modificar el constraint. Solo agregar la funcion SQL atomica + invocacion desde backend. Mantener la firma de authenticate_user sin cambios externos visibles."
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"estadisticas": {
|
|
99
|
+
"total_hallazgos": 16,
|
|
100
|
+
"por_severidad": {
|
|
101
|
+
"CRITICA": 0,
|
|
102
|
+
"ALTA": 4,
|
|
103
|
+
"MEDIA": 5,
|
|
104
|
+
"BAJA": 4,
|
|
105
|
+
"INFORMATIVA": 3
|
|
106
|
+
},
|
|
107
|
+
"veto_items": 0,
|
|
108
|
+
"regresiones_detectadas": 0
|
|
109
|
+
},
|
|
110
|
+
"comparacion_iteracion_previa": {
|
|
111
|
+
"hallazgos_cerrados": [],
|
|
112
|
+
"hallazgos_nuevos": ["F-01", "F-02", "F-03", "F-04"],
|
|
113
|
+
"hallazgos_persistentes": [],
|
|
114
|
+
"regresiones_introducidas": []
|
|
115
|
+
},
|
|
116
|
+
"recomendacion_loop": {
|
|
117
|
+
"accion": "remediar",
|
|
118
|
+
"razon": "4 hallazgos ALTOS con accion_sugerida claras y agente_recomendado disponible.",
|
|
119
|
+
"siguiente_iteracion_esperada": "Tras fix de F-01 a F-04, esperar status=PASS si los MEDIOS y BAJOS no son bloqueantes."
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## Reglas de emisión
|
|
127
|
+
|
|
128
|
+
### status del veredicto
|
|
129
|
+
|
|
130
|
+
El campo `veredicto.status` es la única señal que el comando lee para decidir
|
|
131
|
+
convergencia. Reglas estrictas:
|
|
132
|
+
|
|
133
|
+
- **PASS**: 0 hallazgos críticos + 0 hallazgos altos. Pueden quedar MEDIOS,
|
|
134
|
+
BAJOS o INFORMATIVOS — el usuario decide si los persigue manualmente.
|
|
135
|
+
- **NEEDS_IMPROVEMENT**: hay hallazgos ALTOS o CRÍTICOS pero
|
|
136
|
+
`puede_remediar_automaticamente=true` para todos. El loop continúa.
|
|
137
|
+
- **FAIL**: al menos un hallazgo crítico o alto requiere intervención humana
|
|
138
|
+
(decisión de producto, cambio arquitectural, datos inválidos). El comando
|
|
139
|
+
escala a Recovery Catalog inmediatamente sin agotar max-iter.
|
|
140
|
+
|
|
141
|
+
### Veto items
|
|
142
|
+
|
|
143
|
+
Si el agente detecta veto items (definidos en `reglas/gobernanza.md § Veto items`),
|
|
144
|
+
el status DEBE ser FAIL y `puede_remediar_automaticamente=false`. Veto items
|
|
145
|
+
nunca son auto-remediables.
|
|
146
|
+
|
|
147
|
+
### puede_remediar_automaticamente
|
|
148
|
+
|
|
149
|
+
Un hallazgo es auto-remediable si:
|
|
150
|
+
|
|
151
|
+
1. La `accion_sugerida` es concreta (no "evaluar opciones").
|
|
152
|
+
2. Existe `agente_recomendado` válido en el catálogo SWL.
|
|
153
|
+
3. El `riesgo_regresion` es BAJO o MEDIO.
|
|
154
|
+
4. El cambio NO requiere decisión arquitectural (no necesita ADR).
|
|
155
|
+
|
|
156
|
+
Si cualquiera de los 4 falla, marcar `puede_remediar_automaticamente=false`
|
|
157
|
+
y dejar el hallazgo para revisión humana.
|
|
158
|
+
|
|
159
|
+
### Discovery path
|
|
160
|
+
|
|
161
|
+
Mantener la taxonomía del agente original:
|
|
162
|
+
|
|
163
|
+
- `Feynman-only`: detectado únicamente por la pasada Feynman.
|
|
164
|
+
- `State-only`: detectado únicamente por State Inconsistency.
|
|
165
|
+
- `Feynman-cross-State`: hallazgo cruzado entre pasadas (mayor confianza).
|
|
166
|
+
- `Cross-feed-Pass-N-M`: hallazgo que emergió tras N pasadas de feedback.
|
|
167
|
+
|
|
168
|
+
### comparacion_iteracion_previa
|
|
169
|
+
|
|
170
|
+
OBLIGATORIO en iteraciones >= 2. Permite al comando:
|
|
171
|
+
|
|
172
|
+
- Detectar **convergencia parcial**: si `hallazgos_cerrados` crece y
|
|
173
|
+
`hallazgos_nuevos` decrece, el loop avanza correctamente.
|
|
174
|
+
- Detectar **regresiones**: si `regresiones_introducidas` no está vacío,
|
|
175
|
+
el generator introdujo bugs nuevos al remediar. Activar Recovery.
|
|
176
|
+
- Detectar **estancamiento**: si los mismos hallazgos persisten 2 iters
|
|
177
|
+
seguidos sin cerrarse, marcar como FAIL al alcanzar iter 3.
|
|
178
|
+
|
|
179
|
+
En iteración 1, `comparacion_iteracion_previa.hallazgos_cerrados=[]` y todos
|
|
180
|
+
los hallazgos son `hallazgos_nuevos`.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Validación obligatoria antes de emitir
|
|
185
|
+
|
|
186
|
+
El agente DEBE validar el JSON contra estas reglas antes de escribir el archivo:
|
|
187
|
+
|
|
188
|
+
1. `schema_version` presente y == "1.0.0" en esta versión del skill.
|
|
189
|
+
2. `metadata.iteracion` <= `metadata.max_iter`.
|
|
190
|
+
3. Cada hallazgo tiene `id`, `severidad`, `archivo`, `linea_inicio`, `descripcion`, `accion_sugerida`.
|
|
191
|
+
4. `archivo` es path relativo al root del proyecto, sin componentes `..`.
|
|
192
|
+
5. `linea_inicio` <= `linea_fin` cuando ambos están presentes.
|
|
193
|
+
6. `severidad` ∈ {CRITICA, ALTA, MEDIA, BAJA, INFORMATIVA}.
|
|
194
|
+
7. `accion_sugerida.agente_recomendado` existe en el manifiesto de agentes
|
|
195
|
+
SWL (verificable con `grep -l "name: <agente>" agentes/`).
|
|
196
|
+
8. `puede_remediar_automaticamente` es booleano coherente con `accion_sugerida` y `riesgo_regresion`.
|
|
197
|
+
|
|
198
|
+
Si la validación falla, el agente emite el JSON con `veredicto.status=FAIL` y
|
|
199
|
+
`veredicto.razon_si_fail` documentando el problema de validación. NUNCA emite
|
|
200
|
+
JSON malformado al comando.
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Pattern de consumo por el comando
|
|
205
|
+
|
|
206
|
+
```javascript
|
|
207
|
+
const evaluacion = JSON.parse(readFileSync('.planning/audit/findings/iter-' + N + '/evaluacion.json'));
|
|
208
|
+
|
|
209
|
+
if (evaluacion.veredicto.status === 'PASS') {
|
|
210
|
+
return { exito: true, iters: N };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (evaluacion.veredicto.status === 'FAIL') {
|
|
214
|
+
return activarRecoveryCatalog('escalate', evaluacion.veredicto.razon_si_fail);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (!evaluacion.veredicto.puede_remediar_automaticamente) {
|
|
218
|
+
return activarRecoveryCatalog('escalate', 'Hallazgos no auto-remediables');
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const hallazgosRemediables = evaluacion.hallazgos.filter(h => h.severidad === 'CRITICA' || h.severidad === 'ALTA');
|
|
222
|
+
invocar('orquestador-swl', { hallazgos: hallazgosRemediables, feedback: evaluacion });
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
---
|
|
226
|
+
|
|
227
|
+
## Versionado del schema
|
|
228
|
+
|
|
229
|
+
`schema_version` semver. Cambios:
|
|
230
|
+
|
|
231
|
+
- **PATCH** (1.0.X): clarificaciones, campos opcionales agregados, ejemplos.
|
|
232
|
+
- **MINOR** (1.X.0): campos nuevos opcionales que el comando puede ignorar.
|
|
233
|
+
- **MAJOR** (X.0.0): cambios incompatibles — el comando DEBE rechazar JSONs
|
|
234
|
+
de versiones mayores no soportadas con error explícito.
|
|
235
|
+
|
|
236
|
+
Cualquier cambio MAJOR del schema requiere ADR propio referenciando ADR-0021.
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## Anti-patrones
|
|
241
|
+
|
|
242
|
+
- **Emitir JSON sin `status`**: el comando no sabe qué hacer y aplica Recovery
|
|
243
|
+
de forma defensiva. Caro y confuso.
|
|
244
|
+
- **Inventar `agente_recomendado` no existente** en el catálogo SWL: el
|
|
245
|
+
orquestador no puede delegar y el loop falla en iter 1. Validar con grep.
|
|
246
|
+
- **Marcar todo como `puede_remediar_automaticamente=true`** sin verificar
|
|
247
|
+
riesgo de regresión: el loop introduce bugs por confianza excesiva.
|
|
248
|
+
- **Omitir `comparacion_iteracion_previa` en iter >= 2**: el comando no puede
|
|
249
|
+
detectar regresiones ni estancamiento y aplica solo el guardrail de max-iter
|
|
250
|
+
(peor experiencia).
|
|
251
|
+
- **Mezclar veredicto y feedback en el mismo string**: el `status` debe ser
|
|
252
|
+
enum estricto. El feedback descriptivo va en `feedback_para_generator` por
|
|
253
|
+
hallazgo, no en el status.
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## Referencias
|
|
258
|
+
|
|
259
|
+
- ADR-0021: `nemesis-evaluator-optimizer`.
|
|
260
|
+
- `reglas/gobernanza.md § Veto items y cap enforcement`: define qué constituye
|
|
261
|
+
veto y por qué fuerza FAIL.
|
|
262
|
+
- `reglas/seguridad-agentes.md § Recovery Catalog`: define qué hacer cuando
|
|
263
|
+
status=FAIL o cuando max-iter se agota.
|
|
264
|
+
- Cookbook Anthropic, patrón evaluator-optimizer: el campo `status` es
|
|
265
|
+
equivalente al `evaluation` XML del cookbook; `feedback_para_generator` al
|
|
266
|
+
`feedback` XML.
|