@saulwade/swl-ses 1.3.4 → 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/CLAUDE.md +1 -1
  2. package/README.md +1 -1
  3. package/bin/swl-mcp-server.js +187 -187
  4. package/bin/swl-ses.js +4 -62
  5. package/comandos/swl/.evolved.json +22 -22
  6. package/comandos/swl/adoptar-proyecto.md +207 -207
  7. package/comandos/swl/contribuir.md +233 -233
  8. package/habilidades/backend-production-resilience/SKILL.md +288 -288
  9. package/habilidades/benchmark-memoria/SKILL.md +186 -186
  10. package/habilidades/diagrama-arquitectura/assets/template.html +276 -276
  11. package/habilidades/doubt-driven-review/SKILL.md +171 -171
  12. package/habilidades/doubt-driven-review/recursos/EXAMPLES.md +130 -130
  13. package/habilidades/eval-framework/SKILL.md +212 -212
  14. package/habilidades/extractor-de-aprendizajes/SKILL.md +321 -321
  15. package/habilidades/harness-claude-code/SKILL.md +299 -299
  16. package/habilidades/infra-github-actions/SKILL.md +166 -166
  17. package/habilidades/legacy-code-rescue/SKILL.md +267 -267
  18. package/habilidades/manejo-errores/.evolved.json +8 -8
  19. package/habilidades/meta-skills-estandar/recursos/convencion-examples.md +93 -93
  20. package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
  21. package/habilidades/patrones-python/SKILL.md +229 -229
  22. package/habilidades/patrones-python/recursos/patrones-avanzados.md +469 -469
  23. package/habilidades/planear-fase/SKILL.md +319 -319
  24. package/habilidades/release-semver/.evolved.json +8 -8
  25. package/habilidades/swl-claudemd/SKILL.md +220 -220
  26. package/habilidades/testing-python/SKILL.md +340 -340
  27. package/hooks/claudemd-bloat-detector.js +161 -161
  28. package/hooks/extraccion-aprendizajes.js +19 -12
  29. package/hooks/lib/agent-routing.js +107 -107
  30. package/hooks/lib/auto-consolidator.js +335 -335
  31. package/hooks/lib/error-classifier.js +308 -308
  32. package/hooks/lib/merkle-audit.js +96 -96
  33. package/hooks/lib/provenance-tracker.js +191 -191
  34. package/hooks/lib/rate-limit-tracker.js +253 -253
  35. package/hooks/lib/resource-quota.js +122 -122
  36. package/hooks/lib/retry-jitter.js +165 -165
  37. package/hooks/lib/skill-auditor.js +588 -588
  38. package/hooks/lib/sync-status.js +228 -228
  39. package/hooks/lib/taint-tracker.js +107 -107
  40. package/hooks/lib/text-similarity.js +241 -241
  41. package/hooks/lib/toon-compressor.js +245 -245
  42. package/hooks/registro-turnos.js +209 -209
  43. package/hooks/sugerir-regenerar-inventario.js +170 -170
  44. package/hooks/validar-formato-post-subagente.js +140 -140
  45. package/hooks/validar-memoria-hook.js +218 -218
  46. package/instintos/prompt-appendices.yaml +57 -57
  47. package/manifiestos/agent-output-schemas.json +57 -57
  48. package/manifiestos/skills-lock.json +1093 -1093
  49. package/package.json +1 -1
  50. package/plantillas/auditor-veto-template.md +105 -105
  51. package/plantillas/github-workflows/README.md +47 -47
  52. package/plantillas/github-workflows/release-please.yml +44 -44
  53. package/plantillas/github-workflows/swl-ci.yml +107 -107
  54. package/plantillas/github-workflows/swl-security.yml +51 -51
  55. package/plugin.json +1 -1
  56. package/reglas/analisis-previo-tareas-grandes.md +172 -172
  57. package/reglas/arreglar-al-detectar.md +147 -147
  58. package/reglas/fragmentos-compartidos.md +152 -152
  59. package/reglas/harness-claude-code.md +213 -213
  60. package/reglas/usar-context7.md +226 -226
  61. package/schemas/diary-entry.schema.json +80 -80
  62. package/scripts/benchmark-memoria.js +167 -167
  63. package/scripts/configurar-branch-protection.js +418 -418
  64. package/scripts/detectar-aprendizajes-duplicados.js +151 -151
  65. package/scripts/doctor.js +77 -3
  66. package/scripts/field-report.js +199 -199
  67. package/scripts/generar-checklists-consolidados.js +273 -273
  68. package/scripts/generar-inventario.js +420 -420
  69. package/scripts/generar-matriz-lenguajes.js +271 -271
  70. package/scripts/instalador.js +38 -1
  71. package/scripts/lib/artefactos-python.js +43 -43
  72. package/scripts/lib/benchmark-metrics.js +160 -160
  73. package/scripts/lib/budget-enforcer.js +252 -252
  74. package/scripts/lib/configurar-ci.js +380 -380
  75. package/scripts/lib/contadores-inventario.js +217 -217
  76. package/scripts/lib/detectar-stack-detallado.js +307 -307
  77. package/scripts/lib/diary-entry.js +234 -234
  78. package/scripts/lib/eval-metrics-store.js +218 -218
  79. package/scripts/lib/eval-quality.js +171 -171
  80. package/scripts/lib/eval-schemas.js +144 -144
  81. package/scripts/lib/eval-self-correct.js +106 -106
  82. package/scripts/lib/eval-validator.js +185 -185
  83. package/scripts/lib/jaccard-similarity.js +98 -98
  84. package/scripts/lib/longmemeval-runner.js +125 -125
  85. package/scripts/lib/npm-version.js +261 -261
  86. package/scripts/lib/paquetes-conocidos.js +50 -50
  87. package/scripts/lib/parsear-opciones.js +136 -0
  88. package/scripts/lib/prompt-builder.js +264 -264
  89. package/scripts/lib/rrf-fusion.js +175 -175
  90. package/scripts/lib/scoring-instintos.js +277 -277
  91. package/scripts/lib/semantic-search.js +252 -252
  92. package/scripts/lib/transformadores/claude.js +200 -200
  93. package/scripts/limpiar-artefactos-python.js +131 -131
  94. package/scripts/mcp-server/README.md +128 -128
  95. package/scripts/mcp-server/handlers.js +206 -206
  96. package/scripts/migrar-csv-a-array.js +168 -168
  97. package/scripts/migrar-fase-dominio.js +201 -201
  98. package/scripts/publicar.js +511 -511
  99. package/scripts/run-eval.js +141 -141
  100. package/scripts/validar-manifest.js +195 -195
  101. package/scripts/validar-userland-vacio.js +110 -110
  102. package/scripts/verificar-release.js +5 -1
@@ -1,147 +1,147 @@
1
- # Regla: Detectar → Informar → Arreglar en el mismo turno
2
-
3
- Esta regla es OBLIGATORIA y aplica a todo trabajo que Claude ejecute en cualquier
4
- proyecto del usuario. Consolida cuatro feedbacks repetidos en sesiones distintas
5
- entre 2026-04-23 y 2026-05-03 con la misma señal: el usuario rechaza entregas
6
- parciales, deuda silenciosa y bypass de errores ajenos.
7
-
8
- ---
9
-
10
- ## Principio
11
-
12
- > Cuando detectes un error, bug, inconsistencia, anomalía o problema secundario
13
- > durante la ejecución de cualquier trabajo, **informa al usuario brevemente Y
14
- > procede a resolverlo en el mismo turno**. Nunca lo dejes como pendiente, deuda
15
- > implícita, "ya estaba antes" ni "fuera del scope".
16
-
17
- Esta regla resume cuatro feedbacks separados que el usuario reforzó como mismo
18
- principio:
19
-
20
- - "No me gustan las cosas a medias" — rechazo de entregas parciales (2026-04-23).
21
- - "Cuando detectes errores, bugs, inconsistencias y demás informes al usuario y
22
- procedas a solucionar y/o arreglar, además nunca debes dejar pendientes, ni
23
- diferir" (2026-04-30).
24
- - "Resuelve los test que fallan, no bypass" — al detectar intento de excluir
25
- tests del glob para evitar arreglarlos (2026-04-30).
26
- - "Si el job CI falla, hay que arreglarlo todo" — al ver tests rotos
27
- presentados como "preexistentes, no críticos" (2026-05-03).
28
-
29
- ---
30
-
31
- ## Cómo aplicar
32
-
33
- ### Al detectar un problema secundario durante el trabajo principal
34
-
35
- - Reportarlo brevemente al usuario: qué se detectó, dónde, severidad.
36
- - Resolverlo en el mismo turno o en commit separado de la misma sesión.
37
- - NUNCA ofrecer "lo documento como deuda" como primera opción.
38
- - NUNCA usar frases como "son tests con mocks pre-existentes que ya estaban rotos",
39
- "esto estaba antes", "no es del scope inmediato" para evitar el trabajo.
40
-
41
- ### Al ejecutar tests, builds, lints, validadores
42
-
43
- - Si hay failures, listarlos todos y atacarlos todos.
44
- - No distinguir "bugs reales" vs "tests con mocks mal configurados" como excusa
45
- para arreglar solo unos. Si están rotos, arreglarlos.
46
- - Excepción: bugs que requieran decisión arquitectural ambigua del usuario —
47
- pedir esa decisión explícitamente, no diferir como "tu decisión".
48
-
49
- ### Al modificar código adyacente
50
-
51
- - Si tocas líneas con problemas adyacentes (None checks faltantes, schemas
52
- obsoletos, mocks inconsistentes, contadores stale, paths inválidos),
53
- arreglarlos en el mismo commit o en commit separado de la misma sesión.
54
-
55
- ### Al refactorizar
56
-
57
- - Si encuentras código adyacente que se quedó obsoleto por un refactor previo,
58
- actualizarlo. No dejar deuda residual.
59
-
60
- ### Al detectar un error ajeno al trabajo actual
61
-
62
- - NO bypassear (excluir tests del glob, comentar checks, `|| true`,
63
- downgradear a warning, ignorar).
64
- - Resolver de raíz o, si requiere decisión, abrir explícitamente la decisión
65
- con el usuario antes de bypassear.
66
- - El default es resolver, no esquivar.
67
-
68
- ### Al presentar planes con sub-tareas
69
-
70
- - Dar primero la opción "todo completo" con esfuerzo estimado.
71
- - Si por capacity hay que partir el trabajo, hacerlo explícito con razón
72
- concreta: "esta sesión cubre 3.1 a 3.4; la 3.5 va en commit separado por
73
- X razón concreta", no por preferencia genérica.
74
-
75
- ### Al recomendar diferir un patrón o feature
76
-
77
- - Redactar **simultáneamente** el ítem de deuda formal con criterio de disparo
78
- verificable. La oferta "lo dejo apuntado" sin entrada formal no es aceptable.
79
- - Distinción de categorías:
80
- - **DT (deuda técnica)** con plan de cierre.
81
- - **DA (decisión arquitectural)** con trigger verificable.
82
- - **OP (pendiente operacional)** con responsable.
83
- - "Mediano plazo / Q3 / cuando aparezca demanda" sin trigger verificable es
84
- deuda silenciosa. Convertir a DA formal en mismo commit.
85
- - Trigger verificable significa condición observable: "≥2 clientes distintos
86
- reportan", "p95 > 60s en producción documentado", "uso > N veces/mes",
87
- no "cuando sea relevante" o "más adelante".
88
-
89
- ---
90
-
91
- ## Excepciones legítimas
92
-
93
- NO aplicar la regla al pie de la letra cuando:
94
-
95
- 1. **El fix es ambiguo** — varias opciones razonables sin criterio claro para
96
- elegir. Presentar opciones concretas con la recomendación y esperar
97
- decisión rápida.
98
- 2. **El fix es destructivo** — `rm -rf`, `git reset --hard`, `git push --force`,
99
- eliminar tablas de BD. Esos siguen requiriendo confirmación explícita por
100
- separado, sin importar que el problema esté detectado.
101
- 3. **El fix tiene blast radius alto** — modifica configuración de CI, infra
102
- compartida, contratos públicos de API. Presentar plan, pedir confirmación.
103
- 4. **El bug requiere decisión de producto** — comportamiento esperado ambiguo,
104
- breaking change. Explícito al usuario y esperar.
105
-
106
- En todos los casos: presentar la opción y la recomendación, NO dejar el
107
- problema sin reportar.
108
-
109
- ---
110
-
111
- ## Anti-patrones explícitos
112
-
113
- - "Lo dejo como deuda residual" — sin DT/DA formal con criterio de disparo.
114
- - "Esos tests ya estaban rotos antes" — usado para evitar arreglarlos.
115
- - "No es parte del scope inmediato" — para esquivar un fix obvio.
116
- - "Lo documento y tú decides" — para diferir trabajo claro al usuario.
117
- - "Mediano plazo" sin trigger verificable.
118
- - Excluir tests del glob, comentar checks, `|| true`, downgradear severidad de
119
- un linter — para que el CI deje de fallar sin arreglar la causa.
120
- - Mover archivos a `legacy/` o `deprecated/` sin plan de eliminación con
121
- criterio de disparo.
122
-
123
- ---
124
-
125
- ## Relación con otras reglas
126
-
127
- - `seguridad-agentes.md` — sección "Anti-fallback silencioso y anti-degradación"
128
- cubre el mismo principio aplicado a agentes autónomos. Esta regla lo extiende
129
- al trabajo del usuario.
130
- - `git-workflow.md` — los commits siguen siendo atómicos; arreglar un problema
131
- detectado puede requerir varios commits, no uno solo gigante.
132
- - `pruebas.md` — los tests rotos son violaciones a esta regla. No se mergea
133
- con tests rotos (excepción: tests rotos por decisión de producto en proceso).
134
-
135
- ---
136
-
137
- ## Origen de esta regla
138
-
139
- Consolidada el 2026-05-04 a partir de cuatro feedbacks repetidos del usuario en
140
- memorias nativas de Claude Code de los proyectos sigm, swl-ses y emaia
141
- (2026-04-23 a 2026-05-03). Antes vivía duplicada en 4 archivos de feedback
142
- distintos en 2 de los 3 proyectos. Promovida a regla global para eliminar
143
- duplicación y aplicar uniformemente a todo proyecto del usuario.
144
-
145
- Memoria nativa local correspondiente: redundante tras esta regla; mantener solo
146
- una mención mínima en MEMORY.md de cada proyecto si se desea preservar el rastro
147
- histórico, pero el contenido operativo vive aquí.
1
+ # Regla: Detectar → Informar → Arreglar en el mismo turno
2
+
3
+ Esta regla es OBLIGATORIA y aplica a todo trabajo que Claude ejecute en cualquier
4
+ proyecto del usuario. Consolida cuatro feedbacks repetidos en sesiones distintas
5
+ entre 2026-04-23 y 2026-05-03 con la misma señal: el usuario rechaza entregas
6
+ parciales, deuda silenciosa y bypass de errores ajenos.
7
+
8
+ ---
9
+
10
+ ## Principio
11
+
12
+ > Cuando detectes un error, bug, inconsistencia, anomalía o problema secundario
13
+ > durante la ejecución de cualquier trabajo, **informa al usuario brevemente Y
14
+ > procede a resolverlo en el mismo turno**. Nunca lo dejes como pendiente, deuda
15
+ > implícita, "ya estaba antes" ni "fuera del scope".
16
+
17
+ Esta regla resume cuatro feedbacks separados que el usuario reforzó como mismo
18
+ principio:
19
+
20
+ - "No me gustan las cosas a medias" — rechazo de entregas parciales (2026-04-23).
21
+ - "Cuando detectes errores, bugs, inconsistencias y demás informes al usuario y
22
+ procedas a solucionar y/o arreglar, además nunca debes dejar pendientes, ni
23
+ diferir" (2026-04-30).
24
+ - "Resuelve los test que fallan, no bypass" — al detectar intento de excluir
25
+ tests del glob para evitar arreglarlos (2026-04-30).
26
+ - "Si el job CI falla, hay que arreglarlo todo" — al ver tests rotos
27
+ presentados como "preexistentes, no críticos" (2026-05-03).
28
+
29
+ ---
30
+
31
+ ## Cómo aplicar
32
+
33
+ ### Al detectar un problema secundario durante el trabajo principal
34
+
35
+ - Reportarlo brevemente al usuario: qué se detectó, dónde, severidad.
36
+ - Resolverlo en el mismo turno o en commit separado de la misma sesión.
37
+ - NUNCA ofrecer "lo documento como deuda" como primera opción.
38
+ - NUNCA usar frases como "son tests con mocks pre-existentes que ya estaban rotos",
39
+ "esto estaba antes", "no es del scope inmediato" para evitar el trabajo.
40
+
41
+ ### Al ejecutar tests, builds, lints, validadores
42
+
43
+ - Si hay failures, listarlos todos y atacarlos todos.
44
+ - No distinguir "bugs reales" vs "tests con mocks mal configurados" como excusa
45
+ para arreglar solo unos. Si están rotos, arreglarlos.
46
+ - Excepción: bugs que requieran decisión arquitectural ambigua del usuario —
47
+ pedir esa decisión explícitamente, no diferir como "tu decisión".
48
+
49
+ ### Al modificar código adyacente
50
+
51
+ - Si tocas líneas con problemas adyacentes (None checks faltantes, schemas
52
+ obsoletos, mocks inconsistentes, contadores stale, paths inválidos),
53
+ arreglarlos en el mismo commit o en commit separado de la misma sesión.
54
+
55
+ ### Al refactorizar
56
+
57
+ - Si encuentras código adyacente que se quedó obsoleto por un refactor previo,
58
+ actualizarlo. No dejar deuda residual.
59
+
60
+ ### Al detectar un error ajeno al trabajo actual
61
+
62
+ - NO bypassear (excluir tests del glob, comentar checks, `|| true`,
63
+ downgradear a warning, ignorar).
64
+ - Resolver de raíz o, si requiere decisión, abrir explícitamente la decisión
65
+ con el usuario antes de bypassear.
66
+ - El default es resolver, no esquivar.
67
+
68
+ ### Al presentar planes con sub-tareas
69
+
70
+ - Dar primero la opción "todo completo" con esfuerzo estimado.
71
+ - Si por capacity hay que partir el trabajo, hacerlo explícito con razón
72
+ concreta: "esta sesión cubre 3.1 a 3.4; la 3.5 va en commit separado por
73
+ X razón concreta", no por preferencia genérica.
74
+
75
+ ### Al recomendar diferir un patrón o feature
76
+
77
+ - Redactar **simultáneamente** el ítem de deuda formal con criterio de disparo
78
+ verificable. La oferta "lo dejo apuntado" sin entrada formal no es aceptable.
79
+ - Distinción de categorías:
80
+ - **DT (deuda técnica)** con plan de cierre.
81
+ - **DA (decisión arquitectural)** con trigger verificable.
82
+ - **OP (pendiente operacional)** con responsable.
83
+ - "Mediano plazo / Q3 / cuando aparezca demanda" sin trigger verificable es
84
+ deuda silenciosa. Convertir a DA formal en mismo commit.
85
+ - Trigger verificable significa condición observable: "≥2 clientes distintos
86
+ reportan", "p95 > 60s en producción documentado", "uso > N veces/mes",
87
+ no "cuando sea relevante" o "más adelante".
88
+
89
+ ---
90
+
91
+ ## Excepciones legítimas
92
+
93
+ NO aplicar la regla al pie de la letra cuando:
94
+
95
+ 1. **El fix es ambiguo** — varias opciones razonables sin criterio claro para
96
+ elegir. Presentar opciones concretas con la recomendación y esperar
97
+ decisión rápida.
98
+ 2. **El fix es destructivo** — `rm -rf`, `git reset --hard`, `git push --force`,
99
+ eliminar tablas de BD. Esos siguen requiriendo confirmación explícita por
100
+ separado, sin importar que el problema esté detectado.
101
+ 3. **El fix tiene blast radius alto** — modifica configuración de CI, infra
102
+ compartida, contratos públicos de API. Presentar plan, pedir confirmación.
103
+ 4. **El bug requiere decisión de producto** — comportamiento esperado ambiguo,
104
+ breaking change. Explícito al usuario y esperar.
105
+
106
+ En todos los casos: presentar la opción y la recomendación, NO dejar el
107
+ problema sin reportar.
108
+
109
+ ---
110
+
111
+ ## Anti-patrones explícitos
112
+
113
+ - "Lo dejo como deuda residual" — sin DT/DA formal con criterio de disparo.
114
+ - "Esos tests ya estaban rotos antes" — usado para evitar arreglarlos.
115
+ - "No es parte del scope inmediato" — para esquivar un fix obvio.
116
+ - "Lo documento y tú decides" — para diferir trabajo claro al usuario.
117
+ - "Mediano plazo" sin trigger verificable.
118
+ - Excluir tests del glob, comentar checks, `|| true`, downgradear severidad de
119
+ un linter — para que el CI deje de fallar sin arreglar la causa.
120
+ - Mover archivos a `legacy/` o `deprecated/` sin plan de eliminación con
121
+ criterio de disparo.
122
+
123
+ ---
124
+
125
+ ## Relación con otras reglas
126
+
127
+ - `seguridad-agentes.md` — sección "Anti-fallback silencioso y anti-degradación"
128
+ cubre el mismo principio aplicado a agentes autónomos. Esta regla lo extiende
129
+ al trabajo del usuario.
130
+ - `git-workflow.md` — los commits siguen siendo atómicos; arreglar un problema
131
+ detectado puede requerir varios commits, no uno solo gigante.
132
+ - `pruebas.md` — los tests rotos son violaciones a esta regla. No se mergea
133
+ con tests rotos (excepción: tests rotos por decisión de producto en proceso).
134
+
135
+ ---
136
+
137
+ ## Origen de esta regla
138
+
139
+ Consolidada el 2026-05-04 a partir de cuatro feedbacks repetidos del usuario en
140
+ memorias nativas de Claude Code de los proyectos sigm, swl-ses y emaia
141
+ (2026-04-23 a 2026-05-03). Antes vivía duplicada en 4 archivos de feedback
142
+ distintos en 2 de los 3 proyectos. Promovida a regla global para eliminar
143
+ duplicación y aplicar uniformemente a todo proyecto del usuario.
144
+
145
+ Memoria nativa local correspondiente: redundante tras esta regla; mantener solo
146
+ una mención mínima en MEMORY.md de cada proyecto si se desea preservar el rastro
147
+ histórico, pero el contenido operativo vive aquí.
@@ -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