@saulwade/swl-ses 1.3.7 → 1.4.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 +12 -4
- package/README.md +1 -1
- package/bin/swl-mcp-server.js +187 -187
- package/bin/swl-webhook-server.js +198 -0
- package/comandos/swl/.evolved.json +22 -22
- package/comandos/swl/adoptar-proyecto.md +21 -1
- package/comandos/swl/claudemd.md +14 -1
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/exportar-vault.md +207 -7
- package/comandos/swl/nuevo-proyecto.md +24 -2
- package/gateway/adapters/base.js +109 -0
- package/gateway/adapters/discord.js +167 -0
- package/gateway/adapters/email.js +221 -0
- package/gateway/adapters/slack.js +192 -0
- package/gateway/adapters/telegram.js +183 -0
- package/gateway/adapters/webhook.js +113 -0
- package/gateway/adapters/whatsapp.js +214 -0
- package/gateway/agent-executor.js +322 -0
- package/gateway/command-relay.js +271 -0
- package/gateway/cron/jobs.js +263 -0
- package/gateway/cron/scheduler.js +322 -0
- package/gateway/cron/store.js +335 -0
- package/gateway/index.js +320 -0
- package/gateway/lib/event-channel.js +191 -0
- package/gateway/session.js +131 -0
- package/gateway/webhook-server.js +324 -0
- package/habilidades/backend-production-resilience/SKILL.md +288 -288
- package/habilidades/benchmark-memoria/SKILL.md +186 -186
- package/habilidades/build-errors-nextjs/SKILL.md +55 -1
- 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/eval-framework/SKILL.md +212 -212
- package/habilidades/extractor-de-aprendizajes/SKILL.md +24 -10
- 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/recursos/convencion-examples.md +93 -93
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
- package/habilidades/nextjs-testing/SKILL.md +89 -5
- package/habilidades/node-experto/SKILL.md +37 -1
- 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/react-experto/SKILL.md +45 -4
- package/habilidades/release-semver/.evolved.json +8 -8
- package/habilidades/swl-claudemd/SKILL.md +15 -1
- package/habilidades/tdd-workflow/SKILL.md +36 -4
- package/habilidades/testing-python/SKILL.md +340 -340
- package/hooks/claudemd-bloat-detector.js +161 -161
- package/hooks/inyeccion-contexto.js +8 -3
- 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-ip.js +177 -0
- 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/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/lib/webhook-dedup.js +184 -0
- package/hooks/lib/webhook-verify.js +123 -0
- package/hooks/proteccion-rutas.js +120 -15
- 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 +1 -0
- package/manifiestos/skills-lock.json +37 -37
- package/package.json +5 -3
- 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 +1 -1
- 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/usar-context7.md +226 -226
- package/reglas/usar-sistema-swl.md +251 -0
- package/schemas/diary-entry.schema.json +80 -80
- package/scripts/benchmark-memoria.js +167 -167
- package/scripts/comandos/skills.js +251 -2
- package/scripts/configurar-branch-protection.js +418 -418
- package/scripts/detectar-aprendizajes-duplicados.js +151 -151
- 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/jaccard-similarity.js +98 -98
- package/scripts/lib/longmemeval-runner.js +125 -125
- 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/limpiar-artefactos-python.js +131 -131
- package/scripts/mcp-server/README.md +128 -128
- package/scripts/mcp-server/handlers.js +206 -206
- 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-manifest.js +195 -195
- package/scripts/validar-userland-vacio.js +110 -110
- package/scripts/verificar-release.js +110 -0
|
@@ -1,152 +1,152 @@
|
|
|
1
|
-
# Regla: Fragmentos compartidos no-routables
|
|
2
|
-
|
|
3
|
-
Esta regla es **OBLIGATORIA** para autores y mantenedores de agentes y reglas
|
|
4
|
-
del sistema SWL. Define un tercer tier entre reglas y skills: bloques de prompt
|
|
5
|
-
compartidos que se incrustan literalmente en agentes/reglas para eliminar
|
|
6
|
-
duplicación textual sin convertirse en componentes invocables.
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## El problema que resuelve
|
|
11
|
-
|
|
12
|
-
Hoy cuando dos agentes necesitan repetir el mismo párrafo (protocolo HITL para
|
|
13
|
-
nivelRiesgo ALTO, anti-fallback silencioso, regla de paralelización, mención
|
|
14
|
-
de "aplica brevedad-output"), las opciones existentes son:
|
|
15
|
-
|
|
16
|
-
| Mecanismo | Problema |
|
|
17
|
-
|-----------|----------|
|
|
18
|
-
| Copiar y pegar el bloque | Drift textual: una copia se actualiza, la otra no. |
|
|
19
|
-
| Convertirlo en regla obligatoria | Las reglas son globales (cargadas por matchers), no se incrustan literal en un agente concreto. |
|
|
20
|
-
| Convertirlo en skill | Las skills se invocan dinámicamente con `Skill("nombre")` y consumen tokens; un fragmento de 6 líneas no justifica el overhead. |
|
|
21
|
-
| Convertirlo en agente | Los agentes son routables; un guard compartido no debe aparecer en la tabla de routing del orquestador. |
|
|
22
|
-
|
|
23
|
-
Faltaba una capa para "texto compartido que vive en el system prompt del agente,
|
|
24
|
-
sin overhead runtime ni routing". Esta regla la formaliza.
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## Convención
|
|
29
|
-
|
|
30
|
-
### Ubicación y naming
|
|
31
|
-
|
|
32
|
-
| Tipo | Ubicación | Naming |
|
|
33
|
-
|------|-----------|--------|
|
|
34
|
-
| Fragmento para agentes | `agentes/_*.md` | prefijo `_`, kebab-case, **sin sufijo `-swl`** |
|
|
35
|
-
| Fragmento para reglas | `reglas/_fragmentos/_*.md` | prefijo `_`, kebab-case |
|
|
36
|
-
|
|
37
|
-
**Ejemplos válidos**:
|
|
38
|
-
- `agentes/_hitl-alto-riesgo.md`
|
|
39
|
-
- `agentes/_anti-fallback-silencioso.md`
|
|
40
|
-
- `agentes/_brevedad-output-ref.md`
|
|
41
|
-
- `reglas/_fragmentos/_descarga-progresiva.md`
|
|
42
|
-
|
|
43
|
-
**Ejemplos inválidos**:
|
|
44
|
-
- `agentes/_scope-guard-swl.md` (no usar sufijo `-swl` — no es un agente)
|
|
45
|
-
- `agentes/scope_guard.md` (snake_case prohibido)
|
|
46
|
-
- `agentes/_ScopeGuard.md` (camelCase prohibido)
|
|
47
|
-
|
|
48
|
-
### Reglas duras
|
|
49
|
-
|
|
50
|
-
1. **NO routable**: el orquestador NO incluye `agentes/_*.md` en su tabla de
|
|
51
|
-
rutas. El prefijo `_` señala al loader que ese archivo es un fragmento, no
|
|
52
|
-
un agente. La validación `scripts/validar-manifest.js` rechaza si un
|
|
53
|
-
`agentes/_*.md` aparece en `manifiestos/modulos.json` como agente.
|
|
54
|
-
|
|
55
|
-
2. **NO invocable**: no se carga con `Skill("...")`. No tiene frontmatter
|
|
56
|
-
`name`/`description` ni schema. Es texto puro Markdown.
|
|
57
|
-
|
|
58
|
-
3. **Importación declarativa via frontmatter**: el agente que usa el fragmento
|
|
59
|
-
lo declara en su frontmatter:
|
|
60
|
-
```yaml
|
|
61
|
-
fragmentos: [_hitl-alto-riesgo, _anti-fallback-silencioso]
|
|
62
|
-
```
|
|
63
|
-
El campo `fragmentos` está definido en `schemas/agent-frontmatter.schema.json`.
|
|
64
|
-
El loader (al cargar el agente) lee cada fragmento referenciado y lo concatena
|
|
65
|
-
al final del system prompt.
|
|
66
|
-
|
|
67
|
-
4. **Tamaño máximo 100 líneas**: si un fragmento crece más, probablemente debe
|
|
68
|
-
ser una regla obligatoria o una skill. Los fragmentos son párrafos, no
|
|
69
|
-
documentos.
|
|
70
|
-
|
|
71
|
-
5. **Sin frontmatter operacional**: el archivo `_*.md` puede tener un comentario
|
|
72
|
-
YAML opcional al inicio con metadata humana (autor, agentes que lo usan), pero
|
|
73
|
-
NO tiene campos como `nivelRiesgo` o `permisosRed` — los hereda del agente
|
|
74
|
-
que lo importa.
|
|
75
|
-
|
|
76
|
-
6. **Auditoría obligatoria**: cuando se crea un fragmento, el script
|
|
77
|
-
`scripts/validar-manifest.js` verifica que el fragmento es referenciado por
|
|
78
|
-
≥2 agentes. Un fragmento usado por un solo agente no justifica su existencia
|
|
79
|
-
y debe re-incrustarse en el agente.
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
## Cuándo crear un fragmento
|
|
84
|
-
|
|
85
|
-
✅ Crear cuando:
|
|
86
|
-
- El mismo bloque de ≥3 líneas aparece literalmente en ≥3 agentes.
|
|
87
|
-
- El bloque es estructural (protocolo, regla operativa) — no contenido de
|
|
88
|
-
dominio variable.
|
|
89
|
-
- Cambiar el bloque en el futuro debe propagarse a todos los agentes.
|
|
90
|
-
|
|
91
|
-
❌ NO crear cuando:
|
|
92
|
-
- El texto solo aparece en 1-2 agentes (no hay ahorro real).
|
|
93
|
-
- El bloque ya existe como regla obligatoria (cargada por matcher).
|
|
94
|
-
- El comportamiento se invoca dinámicamente (eso es una skill).
|
|
95
|
-
- Es un párrafo de menos de 80 caracteres (no justifica el overhead de gestión).
|
|
96
|
-
|
|
97
|
-
---
|
|
98
|
-
|
|
99
|
-
## Diferencia con reglas y skills
|
|
100
|
-
|
|
101
|
-
| Capa | Cuándo carga | Cómo se usa | Ejemplo |
|
|
102
|
-
|------|-------------|-------------|---------|
|
|
103
|
-
| **Regla** (`reglas/X.md`) | Por matcher cuando se tocan ciertos archivos | Cargada al contexto global de la sesión | `reglas/seguridad.md` aplica a `*.py`, `auth/`, etc. |
|
|
104
|
-
| **Skill** (`habilidades/X/SKILL.md`) | Cuando un agente invoca `Skill("X")` | Carga bajo demanda, contiene instrucciones operativas | `habilidades/tdd-workflow/SKILL.md` |
|
|
105
|
-
| **Fragmento** (`agentes/_X.md`) | Al cargar un agente que lo declara en `fragmentos` | Se incrusta literalmente en system prompt — sin overhead runtime | `agentes/_hitl-alto-riesgo.md` |
|
|
106
|
-
|
|
107
|
-
Los fragmentos son la opción más barata: cero tokens runtime adicional, máxima
|
|
108
|
-
consistencia textual entre agentes que comparten un bloque.
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
## Migración desde duplicación existente
|
|
113
|
-
|
|
114
|
-
Para extraer un bloque duplicado a fragmento:
|
|
115
|
-
|
|
116
|
-
1. **Identificar**: con `Grep` confirmar que el texto aparece literal en ≥3 agentes.
|
|
117
|
-
2. **Crear** el archivo `agentes/_nombre.md` con el bloque en el estado más
|
|
118
|
-
reciente/completo de las copias existentes.
|
|
119
|
-
3. **Reemplazar** en cada agente la duplicación por una referencia mínima:
|
|
120
|
-
```markdown
|
|
121
|
-
<!-- fragmento: _nombre -->
|
|
122
|
-
```
|
|
123
|
-
El loader sustituye este marcador por el contenido del fragmento al cargar.
|
|
124
|
-
4. **Declarar** en el frontmatter del agente:
|
|
125
|
-
```yaml
|
|
126
|
-
fragmentos: [_nombre]
|
|
127
|
-
```
|
|
128
|
-
5. **Verificar** con `node scripts/validar-manifest.js` que el fragmento está
|
|
129
|
-
referenciado por ≥2 agentes.
|
|
130
|
-
6. **Commit atómico**: `refactor(fragmentos): extraer X a _nombre — usado en N agentes`.
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## Origen y referencias
|
|
135
|
-
|
|
136
|
-
- Patrón inspirado en `_scope-guard.md` de Bug-Bounty-Agents
|
|
137
|
-
(https://github.com/anthropics/bug-bounty-agents) — convención `_` como
|
|
138
|
-
shared prompt block no-routable.
|
|
139
|
-
- Decisión documentada en ADR-XXX (ver `.planning/adrs/`).
|
|
140
|
-
- Schema: `schemas/agent-frontmatter.schema.json` campo `fragmentos`.
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
## Checklist antes de crear un fragmento
|
|
145
|
-
|
|
146
|
-
- [ ] El texto aparece literal en ≥3 agentes
|
|
147
|
-
- [ ] El nombre sigue convención `_kebab-case.md` (sin sufijo `-swl`)
|
|
148
|
-
- [ ] Tamaño ≤100 líneas
|
|
149
|
-
- [ ] No reemplaza a una regla obligatoria existente
|
|
150
|
-
- [ ] No es contenido invocable dinámicamente (eso es skill)
|
|
151
|
-
- [ ] Cada agente que lo usa lo declara en `fragmentos: [...]`
|
|
152
|
-
- [ ] `scripts/validar-manifest.js` no reporta errores
|
|
1
|
+
# Regla: Fragmentos compartidos no-routables
|
|
2
|
+
|
|
3
|
+
Esta regla es **OBLIGATORIA** para autores y mantenedores de agentes y reglas
|
|
4
|
+
del sistema SWL. Define un tercer tier entre reglas y skills: bloques de prompt
|
|
5
|
+
compartidos que se incrustan literalmente en agentes/reglas para eliminar
|
|
6
|
+
duplicación textual sin convertirse en componentes invocables.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## El problema que resuelve
|
|
11
|
+
|
|
12
|
+
Hoy cuando dos agentes necesitan repetir el mismo párrafo (protocolo HITL para
|
|
13
|
+
nivelRiesgo ALTO, anti-fallback silencioso, regla de paralelización, mención
|
|
14
|
+
de "aplica brevedad-output"), las opciones existentes son:
|
|
15
|
+
|
|
16
|
+
| Mecanismo | Problema |
|
|
17
|
+
|-----------|----------|
|
|
18
|
+
| Copiar y pegar el bloque | Drift textual: una copia se actualiza, la otra no. |
|
|
19
|
+
| Convertirlo en regla obligatoria | Las reglas son globales (cargadas por matchers), no se incrustan literal en un agente concreto. |
|
|
20
|
+
| Convertirlo en skill | Las skills se invocan dinámicamente con `Skill("nombre")` y consumen tokens; un fragmento de 6 líneas no justifica el overhead. |
|
|
21
|
+
| Convertirlo en agente | Los agentes son routables; un guard compartido no debe aparecer en la tabla de routing del orquestador. |
|
|
22
|
+
|
|
23
|
+
Faltaba una capa para "texto compartido que vive en el system prompt del agente,
|
|
24
|
+
sin overhead runtime ni routing". Esta regla la formaliza.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Convención
|
|
29
|
+
|
|
30
|
+
### Ubicación y naming
|
|
31
|
+
|
|
32
|
+
| Tipo | Ubicación | Naming |
|
|
33
|
+
|------|-----------|--------|
|
|
34
|
+
| Fragmento para agentes | `agentes/_*.md` | prefijo `_`, kebab-case, **sin sufijo `-swl`** |
|
|
35
|
+
| Fragmento para reglas | `reglas/_fragmentos/_*.md` | prefijo `_`, kebab-case |
|
|
36
|
+
|
|
37
|
+
**Ejemplos válidos**:
|
|
38
|
+
- `agentes/_hitl-alto-riesgo.md`
|
|
39
|
+
- `agentes/_anti-fallback-silencioso.md`
|
|
40
|
+
- `agentes/_brevedad-output-ref.md`
|
|
41
|
+
- `reglas/_fragmentos/_descarga-progresiva.md`
|
|
42
|
+
|
|
43
|
+
**Ejemplos inválidos**:
|
|
44
|
+
- `agentes/_scope-guard-swl.md` (no usar sufijo `-swl` — no es un agente)
|
|
45
|
+
- `agentes/scope_guard.md` (snake_case prohibido)
|
|
46
|
+
- `agentes/_ScopeGuard.md` (camelCase prohibido)
|
|
47
|
+
|
|
48
|
+
### Reglas duras
|
|
49
|
+
|
|
50
|
+
1. **NO routable**: el orquestador NO incluye `agentes/_*.md` en su tabla de
|
|
51
|
+
rutas. El prefijo `_` señala al loader que ese archivo es un fragmento, no
|
|
52
|
+
un agente. La validación `scripts/validar-manifest.js` rechaza si un
|
|
53
|
+
`agentes/_*.md` aparece en `manifiestos/modulos.json` como agente.
|
|
54
|
+
|
|
55
|
+
2. **NO invocable**: no se carga con `Skill("...")`. No tiene frontmatter
|
|
56
|
+
`name`/`description` ni schema. Es texto puro Markdown.
|
|
57
|
+
|
|
58
|
+
3. **Importación declarativa via frontmatter**: el agente que usa el fragmento
|
|
59
|
+
lo declara en su frontmatter:
|
|
60
|
+
```yaml
|
|
61
|
+
fragmentos: [_hitl-alto-riesgo, _anti-fallback-silencioso]
|
|
62
|
+
```
|
|
63
|
+
El campo `fragmentos` está definido en `schemas/agent-frontmatter.schema.json`.
|
|
64
|
+
El loader (al cargar el agente) lee cada fragmento referenciado y lo concatena
|
|
65
|
+
al final del system prompt.
|
|
66
|
+
|
|
67
|
+
4. **Tamaño máximo 100 líneas**: si un fragmento crece más, probablemente debe
|
|
68
|
+
ser una regla obligatoria o una skill. Los fragmentos son párrafos, no
|
|
69
|
+
documentos.
|
|
70
|
+
|
|
71
|
+
5. **Sin frontmatter operacional**: el archivo `_*.md` puede tener un comentario
|
|
72
|
+
YAML opcional al inicio con metadata humana (autor, agentes que lo usan), pero
|
|
73
|
+
NO tiene campos como `nivelRiesgo` o `permisosRed` — los hereda del agente
|
|
74
|
+
que lo importa.
|
|
75
|
+
|
|
76
|
+
6. **Auditoría obligatoria**: cuando se crea un fragmento, el script
|
|
77
|
+
`scripts/validar-manifest.js` verifica que el fragmento es referenciado por
|
|
78
|
+
≥2 agentes. Un fragmento usado por un solo agente no justifica su existencia
|
|
79
|
+
y debe re-incrustarse en el agente.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Cuándo crear un fragmento
|
|
84
|
+
|
|
85
|
+
✅ Crear cuando:
|
|
86
|
+
- El mismo bloque de ≥3 líneas aparece literalmente en ≥3 agentes.
|
|
87
|
+
- El bloque es estructural (protocolo, regla operativa) — no contenido de
|
|
88
|
+
dominio variable.
|
|
89
|
+
- Cambiar el bloque en el futuro debe propagarse a todos los agentes.
|
|
90
|
+
|
|
91
|
+
❌ NO crear cuando:
|
|
92
|
+
- El texto solo aparece en 1-2 agentes (no hay ahorro real).
|
|
93
|
+
- El bloque ya existe como regla obligatoria (cargada por matcher).
|
|
94
|
+
- El comportamiento se invoca dinámicamente (eso es una skill).
|
|
95
|
+
- Es un párrafo de menos de 80 caracteres (no justifica el overhead de gestión).
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Diferencia con reglas y skills
|
|
100
|
+
|
|
101
|
+
| Capa | Cuándo carga | Cómo se usa | Ejemplo |
|
|
102
|
+
|------|-------------|-------------|---------|
|
|
103
|
+
| **Regla** (`reglas/X.md`) | Por matcher cuando se tocan ciertos archivos | Cargada al contexto global de la sesión | `reglas/seguridad.md` aplica a `*.py`, `auth/`, etc. |
|
|
104
|
+
| **Skill** (`habilidades/X/SKILL.md`) | Cuando un agente invoca `Skill("X")` | Carga bajo demanda, contiene instrucciones operativas | `habilidades/tdd-workflow/SKILL.md` |
|
|
105
|
+
| **Fragmento** (`agentes/_X.md`) | Al cargar un agente que lo declara en `fragmentos` | Se incrusta literalmente en system prompt — sin overhead runtime | `agentes/_hitl-alto-riesgo.md` |
|
|
106
|
+
|
|
107
|
+
Los fragmentos son la opción más barata: cero tokens runtime adicional, máxima
|
|
108
|
+
consistencia textual entre agentes que comparten un bloque.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## Migración desde duplicación existente
|
|
113
|
+
|
|
114
|
+
Para extraer un bloque duplicado a fragmento:
|
|
115
|
+
|
|
116
|
+
1. **Identificar**: con `Grep` confirmar que el texto aparece literal en ≥3 agentes.
|
|
117
|
+
2. **Crear** el archivo `agentes/_nombre.md` con el bloque en el estado más
|
|
118
|
+
reciente/completo de las copias existentes.
|
|
119
|
+
3. **Reemplazar** en cada agente la duplicación por una referencia mínima:
|
|
120
|
+
```markdown
|
|
121
|
+
<!-- fragmento: _nombre -->
|
|
122
|
+
```
|
|
123
|
+
El loader sustituye este marcador por el contenido del fragmento al cargar.
|
|
124
|
+
4. **Declarar** en el frontmatter del agente:
|
|
125
|
+
```yaml
|
|
126
|
+
fragmentos: [_nombre]
|
|
127
|
+
```
|
|
128
|
+
5. **Verificar** con `node scripts/validar-manifest.js` que el fragmento está
|
|
129
|
+
referenciado por ≥2 agentes.
|
|
130
|
+
6. **Commit atómico**: `refactor(fragmentos): extraer X a _nombre — usado en N agentes`.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Origen y referencias
|
|
135
|
+
|
|
136
|
+
- Patrón inspirado en `_scope-guard.md` de Bug-Bounty-Agents
|
|
137
|
+
(https://github.com/anthropics/bug-bounty-agents) — convención `_` como
|
|
138
|
+
shared prompt block no-routable.
|
|
139
|
+
- Decisión documentada en ADR-XXX (ver `.planning/adrs/`).
|
|
140
|
+
- Schema: `schemas/agent-frontmatter.schema.json` campo `fragmentos`.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Checklist antes de crear un fragmento
|
|
145
|
+
|
|
146
|
+
- [ ] El texto aparece literal en ≥3 agentes
|
|
147
|
+
- [ ] El nombre sigue convención `_kebab-case.md` (sin sufijo `-swl`)
|
|
148
|
+
- [ ] Tamaño ≤100 líneas
|
|
149
|
+
- [ ] No reemplaza a una regla obligatoria existente
|
|
150
|
+
- [ ] No es contenido invocable dinámicamente (eso es skill)
|
|
151
|
+
- [ ] Cada agente que lo usa lo declara en `fragmentos: [...]`
|
|
152
|
+
- [ ] `scripts/validar-manifest.js` no reporta errores
|