@saulwade/swl-ses 1.4.1 → 1.4.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 +1 -1
- package/README.md +1 -1
- package/agentes/nemesis-auditor-swl.md +161 -161
- package/bin/swl-mcp-server.js +187 -187
- package/comandos/swl/.evolved.json +22 -22
- package/comandos/swl/contribuir.md +233 -233
- package/comandos/swl/nemesis.md +122 -122
- 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/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/recursos/convencion-examples.md +93 -93
- package/habilidades/meta-skills-estandar/recursos/skills-as-agents.md +163 -163
- 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/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/testing-python/SKILL.md +340 -340
- package/habilidades/web-fetcher-routing/SKILL.md +75 -75
- 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 +11 -6
- package/manifiestos/perfiles.json +2 -1
- package/manifiestos/skills-lock.json +1114 -1114
- package/package.json +1 -1
- 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 +9 -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/schemas/diary-entry.schema.json +80 -80
- 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/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/manifiestos.js +42 -1
- 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 +231 -195
- package/scripts/validar-userland-vacio.js +110 -110
|
@@ -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
|