@saulwade/swl-ses 1.6.1 → 1.6.3

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 (50) hide show
  1. package/CLAUDE.md +2 -2
  2. package/README.md +4 -4
  3. package/agentes/_intent-spec.md +73 -0
  4. package/agentes/auto-evolucion-swl.md +24 -0
  5. package/agentes/cloud-infra-swl.md +25 -0
  6. package/agentes/datos-swl.md +23 -0
  7. package/agentes/devops-ci-swl.md +24 -0
  8. package/agentes/migrador-swl.md +22 -0
  9. package/agentes/pagos-swl.md +25 -0
  10. package/agentes/release-manager-swl.md +24 -0
  11. package/agentes/sre-swl.md +24 -0
  12. package/comandos/swl/planear-fase.md +16 -0
  13. package/habilidades/aprender-de-git-diff/SKILL.md +288 -0
  14. package/habilidades/diseno-herramientas-agente/SKILL.md +17 -1
  15. package/habilidades/meta-skills-estandar/SKILL.md +6 -0
  16. package/habilidades/meta-skills-estandar/recursos/skill-judge-rubrica.md +281 -0
  17. package/habilidades/proceso-autoverificacion-evidencias/SKILL.md +258 -0
  18. package/habilidades/proceso-confianza-pre-implementacion/SKILL.md +246 -0
  19. package/habilidades/proceso-ddia-fundamentos/SKILL.md +255 -0
  20. package/habilidades/proceso-ddia-streaming/SKILL.md +231 -0
  21. package/habilidades/proceso-intent-engineering/SKILL.md +269 -0
  22. package/habilidades/reducir-entropia/SKILL.md +219 -0
  23. package/hooks/lib/task-budget.js +218 -0
  24. package/hooks/validar-intent-spec.js +222 -0
  25. package/manifiestos/hooks-config.json +9 -0
  26. package/manifiestos/modulos.json +11 -2
  27. package/manifiestos/skills-lock.json +90 -41
  28. package/package.json +2 -2
  29. package/plugin.json +9 -2
  30. package/reglas/fragmentos-compartidos.md +26 -0
  31. package/reglas/intent-engineering.md +214 -0
  32. package/reglas/registro-componentes-nuevos.md +38 -0
  33. package/schemas/agent-frontmatter.schema.json +294 -167
  34. package/schemas/agent-message.schema.json +73 -53
  35. package/schemas/agent-output-implementacion.schema.json +114 -85
  36. package/schemas/agent-output-planificacion.schema.json +150 -113
  37. package/schemas/agent-output-review.schema.json +98 -78
  38. package/schemas/diary-entry.schema.json +42 -10
  39. package/schemas/hook-profiles.schema.json +54 -39
  40. package/schemas/hooks-config.schema.json +89 -74
  41. package/schemas/instinct.schema.json +152 -115
  42. package/schemas/modulos.schema.json +38 -29
  43. package/schemas/perfiles.schema.json +36 -28
  44. package/schemas/plugin.schema.json +77 -64
  45. package/schemas/skill-evals.schema.json +119 -95
  46. package/schemas/skill-frontmatter.schema.json +245 -170
  47. package/scripts/generar-inventario.js +3 -1
  48. package/scripts/lib/schema-version.js +164 -0
  49. package/scripts/validar-manifest.js +1 -1
  50. package/scripts/validar.js +3 -2
@@ -0,0 +1,269 @@
1
+ ---
2
+ name: proceso-intent-engineering
3
+ description: >
4
+ Framework "Intent Engineering" de 8 partes (Pawel Huryn, 2024-2026) para
5
+ especificar agentes IA: Strategy, Objective, Desired Outcomes, Health Metrics,
6
+ Org Context, Constraints (steering+hardGuardrails), Autonomy Boundaries, Stop
7
+ Rules. Cargar cuando se cree un agente nuevo nivelRiesgo:ALTO, se audite uno
8
+ existente, o se diagnostique un agente que falla por intent incompleto.
9
+ when_to_use: >
10
+ Usar cuando el usuario menciona crear agente nuevo, refactor de agente ALTO,
11
+ promover MEDIO a ALTO, agente que "se desvia del objetivo", agente que ignora
12
+ restricciones blandas, intent spec, /goal, agentes que fallan por instrucciones
13
+ ambiguas, health metrics, steering vs guardrails.
14
+ ---
15
+
16
+ # Intent Engineering — el framework de 8 partes para agentes
17
+
18
+ ## Cuándo cargar
19
+
20
+ - Diseñar un agente nuevo `nivelRiesgo: ALTO` (uso obligatorio según
21
+ `reglas/intent-engineering.md`).
22
+ - Refactorizar un agente existente que falla por intent ambiguo.
23
+ - Auditar un agente con `/swl:revisar` y se detecta "deriva de scope".
24
+ - Decidir cómo materializar restricciones blandas (steering) vs duras
25
+ (hardGuardrails) en un agente.
26
+ - Promover un agente de `MEDIO` a `ALTO` — la regla exige las 8 partes.
27
+
28
+ ## Cuándo NO cargar
29
+
30
+ - Agente `BAJO` o `MEDIO` riesgo — declarar las 8 partes es overkill.
31
+ - Fix puntual de typo o ajuste de descripción de un agente existente.
32
+ - Crear skill (no agente) — el framework aplica a agentes, no a skills.
33
+ - Investigación de tooling externo (carga `investigador-swl`).
34
+
35
+ ## Fuente y verificación
36
+
37
+ Adaptado de Pawel Huryn, *"Lead Agents Like Humans"* (Product Compass,
38
+ 2026-05). La cita clave que justifica las 8 partes:
39
+
40
+ > "Lead agents the way good orgs lead empowered teams. OKRs (2016) →
41
+ > empowered teams (2020) → intent engineering (2024). /goal is two of
42
+ > eight parts." (Huryn, línea 5)
43
+
44
+ `/goal` (slash command de Codex y Claude Code) cubre las partes 2 y 3.
45
+ Las otras seis son responsabilidad del autor del agente.
46
+
47
+ ## Las 8 partes — qué declarar y dónde vive en SWL
48
+
49
+ ### Parte 1 — Strategy
50
+
51
+ Visión, mercado, propuesta de valor, tradeoffs. Huryn lo describe así:
52
+
53
+ > "You wouldn't onboard a senior PM with 'handle customer support.' You'd
54
+ > ground them in the strategy first: vision, market, value proposition,
55
+ > trade-offs." (línea 43)
56
+
57
+ **Dónde vive en SWL**: frontmatter `strategy: "..."` (máx 500 chars).
58
+ Cuando un agente operativo (`backend-python-swl`, `frontend-react-swl`)
59
+ necesita strategy específica al proyecto, hereda del `CLAUDE.md`. Cuando
60
+ el rol del agente impone trade-offs propios (`producto-prd-swl`,
61
+ `arquitecto-swl`), se declara explícito.
62
+
63
+ Ejemplo (`arquitecto-swl`):
64
+ ```yaml
65
+ strategy: >
66
+ Diseñar para evolvabilidad sobre completitud inicial. Módulos profundos
67
+ (Ousterhout) sobre micro-servicios prematuros. ADRs sobre wikis. Reversible
68
+ sobre óptimo cuando el costo de equivocarse es bajo.
69
+ ```
70
+
71
+ ### Parte 2 — Objective
72
+
73
+ El problema y por qué importa. Guía el juicio cuando las instrucciones se
74
+ agotan.
75
+
76
+ **Dónde vive en SWL**: campo `description:` del agente. Ya obligatorio
77
+ por schema. Para captura la regla "qué hace + cuándo invocarlo".
78
+
79
+ ### Parte 3 — Desired Outcomes
80
+
81
+ Estados observables (no actividades) que prueban el objetivo cumplido.
82
+ Huryn enumera 4 reglas:
83
+
84
+ - Observable states, not agent activities.
85
+ - From the user's perspective, not the agent's.
86
+ - Measurable or verifiable without relying on agent self-report.
87
+ - Leading, not lagging.
88
+
89
+ **Dónde vive en SWL**: criterios de aceptación en `PLAN.md` por feature.
90
+ El `/swl:verificar` con goal-backward valida outcomes en 4 niveles.
91
+
92
+ ### Parte 4 — Health Metrics
93
+
94
+ Lo que NO debe degradar mientras se persiguen outcomes. Cita textual:
95
+
96
+ > "Goodhart's Law: when a measure becomes a target, it stops being a good
97
+ > measure. [...] Health metrics steer; guardrails enforce." (líneas 134, 150)
98
+
99
+ **Dónde vive en SWL**: frontmatter `healthMetrics: [...]`. Diferencia
100
+ clave con outcomes: outcomes son lo que persigues; health metrics son lo
101
+ que proteges mientras persigues.
102
+
103
+ Ejemplo (`migrador-swl`):
104
+ ```yaml
105
+ healthMetrics:
106
+ - Integridad referencial de datos durante toda la ventana de migración
107
+ - Tiempo de downtime <= 0 (expand-contract obligatorio)
108
+ - Tests preexistentes verde antes y después
109
+ - Sin warnings nuevos de ORM (N+1, lazy loading)
110
+ ```
111
+
112
+ Si el agente detecta que una health metric está cayendo, **debe ser más
113
+ conservador, no más agresivo** — esa es la diferencia operacional con un
114
+ outcome.
115
+
116
+ ### Parte 5 — Org Context
117
+
118
+ Sistema (otros agentes, hooks, tooling) + organización (proyecto, usuario,
119
+ dominio). No todo va en el prompt:
120
+
121
+ > "Core context (always needed) goes in the system prompt. Reference
122
+ > context goes in retrieval. Dynamic context (per-request) goes in the
123
+ > orchestration layer." (línea 159, parafraseada)
124
+
125
+ **Dónde vive en SWL**: `CLAUDE.md` del proyecto (org), `contextos/`
126
+ (dev/review/research), `INVENTARIO.md` (system context). El agente no
127
+ necesita declararlo — lo recibe vía carga inicial.
128
+
129
+ ### Parte 6 — Constraints (los dos tipos)
130
+
131
+ Huryn separa muy claramente:
132
+
133
+ **Steering prompts (prompt-level)** — texto que el agente lee y debería
134
+ seguir, pero puede ignorar bajo presión:
135
+ - Behavioral guidance
136
+ - Risk preferences
137
+ - Tone and caution
138
+
139
+ **Hard guardrails (orchestration-level)** — restricciones aplicadas en
140
+ arquitectura, no en lenguaje:
141
+ - Tool restrictions
142
+ - Output validation
143
+ - Action gating
144
+ - Approval gates (HITL)
145
+
146
+ > "If a constraint matters, it must be enforced in architecture, not
147
+ > language. [...] The reasoning layer proposes. The orchestration layer
148
+ > enforces. If a constraint lives only in the prompt, it's a suggestion."
149
+ > (líneas 196, 197 paraf., 198)
150
+
151
+ **Dónde vive en SWL**:
152
+ - `steering: [...]` en frontmatter del agente (texto que el modelo lee)
153
+ - `hardGuardrails: [...]` declara qué hook/regla/schema enforza qué
154
+ restricción. Sintaxis: `@reglas/X.md`, `@hooks/Y.js`, o texto inline
155
+ si es específico al agente.
156
+
157
+ Anti-patrón: declarar como `steering` algo que necesita enforcement real
158
+ ("no eliminar archivos" sin hook que lo prevenga). Si la restricción
159
+ importa, va en `hardGuardrails` con apoyo de hook/permiso/schema.
160
+
161
+ ### Parte 7 — Autonomy Boundaries
162
+
163
+ Huryn define 4 niveles:
164
+
165
+ 1. **Full Autonomy** — acciones reversibles, impacto limitado, modos de
166
+ falla conocidos.
167
+ 2. **Guarded Autonomy** — cambios visibles al usuario, riesgo medio.
168
+ Requiere logging y rollback.
169
+ 3. **Proposal-First** — decisiones estratégicas. El agente propone, el
170
+ humano aprueba, el agente ejecuta.
171
+ 4. **No Autonomy (Human-Required)** — compromisos legales, cambios
172
+ irreversibles, acciones financieras.
173
+
174
+ **Mapeo a SWL** (3 niveles, no 4 — decisión consciente, ver ADR-0025):
175
+
176
+ | Huryn 4-tier | SWL `nivelRiesgo` | HITL? |
177
+ |---|---|---|
178
+ | Full Autonomy | BAJO | No |
179
+ | Guarded Autonomy | MEDIO | Solo en ramas críticas |
180
+ | Proposal-First | ALTO | Sí, antes de mutaciones irreversibles |
181
+ | Human-Required | ALTO + `permisos*: false` | Sí, siempre |
182
+
183
+ El nivel 4 de Huryn se modela en SWL como ALTO + permisos restrictivos en
184
+ frontmatter. NO se introduce un cuarto tier en el enum `nivelRiesgo`.
185
+
186
+ ### Parte 8 — Stop Rules
187
+
188
+ Tres tipos de stop, todos load-bearing:
189
+
190
+ - **Halt** — restricciones en conflicto, confianza cae 2x consecutivas,
191
+ `maxTurnos` alcanzado.
192
+ - **Escalate** — fuera de scope, tema legal/compliance detectado,
193
+ frustración persistente.
194
+ - **Complete** — outcomes alcanzados, usuario confirma.
195
+
196
+ > "Halt and escalate are the load-bearing branches, and /goal ships
197
+ > neither." (línea 271)
198
+
199
+ **Dónde vive en SWL**:
200
+ - `maxTurnos:` en frontmatter — tope de iteraciones.
201
+ - Recovery Catalog en `reglas/seguridad-agentes.md § Recovery Catalog` —
202
+ reprompt → reduce-autonomy → escalate → terminate.
203
+ - `notificador-swl` para escalado a humano vía Telegram/desktop.
204
+
205
+ ## Cómo aplicar el framework a un agente nuevo
206
+
207
+ 1. Cargar este skill antes de escribir el primer carácter del agente.
208
+ 2. Importar `agentes/_intent-spec.md` con `fragmentos: [_intent-spec]`.
209
+ 3. Declarar los 4 campos opcionales del schema:
210
+ - `strategy:` (Parte 1)
211
+ - `healthMetrics:` (Parte 4)
212
+ - `steering:` (Parte 6 — soft)
213
+ - `hardGuardrails:` (Parte 6 — hard)
214
+ 4. Verificar que `description` cubre Parte 2 (Objective).
215
+ 5. Verificar que `nivelRiesgo` mapea a Parte 7 (Autonomy Boundaries).
216
+ 6. Verificar que `maxTurnos` está declarado si hay loop interno (Parte 8).
217
+ 7. Org Context (Parte 5) vive en CLAUDE.md — no se duplica en el agente.
218
+ 8. Desired Outcomes (Parte 3) vive en PLAN.md de cada invocación — no se
219
+ hardcodea en el agente.
220
+
221
+ ## Anti-patrones específicos a evitar
222
+
223
+ - **`steering` que debería ser `hardGuardrails`**: "no eliminar tablas"
224
+ sin hook `proteccion-rutas.js` o equivalente. Si importa, va en
225
+ arquitectura.
226
+ - **Health metrics como outcomes negados**: "no degradar latencia" es
227
+ health metric; "latencia < 200ms p95" es outcome. La diferencia: outcome
228
+ se persigue, health metric se protege mientras se persigue.
229
+ - **Strategy demasiado genérica**: "código limpio y mantenible" no es
230
+ strategy de un agente — es default. Strategy debe nombrar el tradeoff
231
+ específico que ese agente prioriza.
232
+ - **Autonomy Boundaries por ego, no por riesgo**: `nivelRiesgo: ALTO` no
233
+ es prestigio; es declaración de que el agente toca cosas
234
+ irreversibles. Si BAJO o MEDIO basta, no inflar.
235
+ - **Stop Rules ausentes**: agente sin `maxTurnos` ni recovery declarado
236
+ puede entrar en loop infinito. Default seguro: 10-15 turnos.
237
+
238
+ ## Gotchas no obvios
239
+
240
+ - **Health metrics no se enforce por sí solas**: el agente las lee y se
241
+ comporta más conservador, pero NO hay hook que las verifique
242
+ automáticamente. Diseñar telemetría que las capture si el agente es
243
+ crítico.
244
+ - **`steering` y `hardGuardrails` aceptan `@reglas/X.md`**: cuando una
245
+ restricción es global, no copiar el texto — referenciar la regla
246
+ evita drift.
247
+ - **El framework no resuelve ambigüedad de objetivos en conflicto**:
248
+ si dos health metrics chocan entre sí, la prioridad debe declararse
249
+ como tradeoff en `strategy`.
250
+
251
+ ## Referencia rápida — campos por nivelRiesgo
252
+
253
+ | Campo | BAJO | MEDIO | ALTO |
254
+ |---|---|---|---|
255
+ | `description` (Parte 2) | Obligatorio | Obligatorio | Obligatorio |
256
+ | `nivelRiesgo` (Parte 7) | Obligatorio | Obligatorio | Obligatorio |
257
+ | `maxTurnos` (Parte 8) | Recomendado | Recomendado | Obligatorio |
258
+ | `strategy` (Parte 1) | Opcional | Opcional | Obligatorio |
259
+ | `healthMetrics` (Parte 4) | Opcional | Opcional | Obligatorio |
260
+ | `steering` (Parte 6) | Opcional | Recomendado | Recomendado |
261
+ | `hardGuardrails` (Parte 6) | Opcional | Recomendado | Obligatorio |
262
+ | `fragmentos: [_intent-spec]` | Opcional | Opcional | Obligatorio |
263
+
264
+ ## Origen
265
+
266
+ Skill creado el 2026-05-18 como parte de Opción B de integración
267
+ `temp/Lead-agents-like-humans.md` + `temp/DDIA*.md`. Ver ADR-0025 para la
268
+ decisión de scope. Fragment compartido `_intent-spec` es la
269
+ versión system-prompt-embebida; este skill es la versión invocable on-demand.
@@ -0,0 +1,219 @@
1
+ ---
2
+ name: reducir-entropia
3
+ description: >
4
+ Skill manual-only para minimizar el tamaño total del codebase. Mide el
5
+ éxito por la cantidad de código final, no por el esfuerzo de escribirlo.
6
+ Sesgo hacia la eliminación: 50 líneas que borran 200 = win neto; 14
7
+ funciones para no escribir 2 = pérdida neta. Cargar SOLO cuando el
8
+ usuario lo pide explícitamente — no se activa por similitud o keyword.
9
+ Adaptación de `reducing-entropy` de agent-toolkit.
10
+ version: "1.0.0"
11
+ herramientasPermitidas: [Read, Grep, Glob, Bash]
12
+ exclusiones:
13
+ - "No cargar automáticamente — solo cuando el usuario lo pide explícitamente con 'reducir entropía', 'minimizar código', 'qué podemos borrar'. La activación automática contradice el propósito."
14
+ - "No cargar para greenfield (proyecto nuevo) donde aún no hay código que reducir."
15
+ - "No cargar contra código en framework con convenciones fuertes (Django, Rails, NestJS) — pelearse con el framework siempre suma código, no resta."
16
+ - "No cargar para código bajo requerimiento regulatorio que mandata cierta estructura (auditoría, compliance, separación de concerns legal)."
17
+ evolvable: true
18
+ ---
19
+
20
+ # Habilidad: Reducir entropía
21
+
22
+ Más código engendra más código. La entropía se acumula. Este skill sesga
23
+ hacia el codebase más pequeño posible.
24
+
25
+ **Pregunta central**: "¿Cómo se ve el codebase **después**?"
26
+
27
+ ## Antes de empezar
28
+
29
+ Verificar que el usuario invocó este skill explícitamente. No activarlo
30
+ por keyword similar ("refactor", "limpiar"). Si la invocación es ambigua,
31
+ preguntar:
32
+
33
+ > ¿Quieres que aplique el lente de *reducir-entropia* (sesgo hacia
34
+ > borrar) o un refactor estándar (cambia estructura sin reducir
35
+ > tamaño)?
36
+
37
+ Si la respuesta es "refactor", NO cargar este skill — usar
38
+ `legacy-code-rescue` o `revisor-codigo-swl`.
39
+
40
+ ## Cuándo cargar
41
+
42
+ - Usuario pide explícitamente: "reduce entropía", "minimiza este código",
43
+ "¿qué podemos borrar?", "el codebase está gordo".
44
+ - Tras un sprint donde se duplicaron utilidades sin consolidar.
45
+ - Al cerrar una fase grande para limpiar deuda antes de la siguiente.
46
+
47
+ ## Cuándo NO cargar
48
+
49
+ Listado en `exclusiones` del frontmatter — incluye activación automática,
50
+ greenfield, frameworks opinionados y requerimientos regulatorios.
51
+
52
+ ---
53
+
54
+ ## La meta
55
+
56
+ La meta es **menos código total en el codebase final** — no menos código
57
+ por escribir ahora.
58
+
59
+ - Escribir 50 líneas que borran 200 = win neto.
60
+ - Mantener 14 funciones para no escribir 2 = pérdida neta.
61
+ - "Sin churn" no es la meta. Menos código es la meta.
62
+
63
+ **Medir el estado final, no el esfuerzo.**
64
+
65
+ ## Tres preguntas
66
+
67
+ ### 1. ¿Cuál es el codebase mínimo que resuelve esto?
68
+
69
+ No "cuál es el cambio mínimo" — cuál es el **resultado** mínimo.
70
+
71
+ - ¿Podrían ser 2 funciones en lugar de 14?
72
+ - ¿Podrían ser 0 funciones (borrar la feature completa)?
73
+ - ¿Qué borraríamos si hiciéramos esto?
74
+
75
+ ### 2. ¿El cambio propuesto resulta en menos código total?
76
+
77
+ Contar líneas antes y después. Si después > antes, rechazar el cambio.
78
+
79
+ - "Mejor organizado" pero más código = más entropía.
80
+ - "Más flexible" pero más código = más entropía.
81
+ - "Mejor separación" pero más código = más entropía.
82
+
83
+ ### 3. ¿Qué se puede borrar?
84
+
85
+ Cada cambio es una oportunidad para borrar. Preguntar:
86
+
87
+ - ¿Qué vuelve obsoleto este cambio?
88
+ - ¿Qué solo existía por lo que estamos reemplazando?
89
+ - ¿Cuál es el máximo que podríamos remover?
90
+
91
+ ---
92
+
93
+ ## Red flags (justificaciones que NO compensan más código)
94
+
95
+ - **"Keep what exists"** — sesgo de status quo. La pregunta es código
96
+ total, no churn.
97
+ - **"Esto añade flexibilidad"** — flexibilidad para qué. YAGNI.
98
+ - **"Mejor separación de concerns"** — más archivos/funciones = más
99
+ código. La separación no es gratis.
100
+ - **"Type safety"** — vale cuántas líneas. A veces runtime checks en
101
+ menos código gana.
102
+ - **"Más fácil de entender"** — 14 cosas no son más fáciles que 2 cosas.
103
+ - **"Por si acaso lo necesitamos"** — YAGNI. Borrar.
104
+
105
+ ## Cuándo NO aplica (después de cargar el skill)
106
+
107
+ Aunque el skill se haya cargado, hay casos donde la respuesta correcta
108
+ es "no hay nada que reducir":
109
+
110
+ - El codebase ya es mínimo para lo que hace.
111
+ - Estás dentro de un framework con convenciones fuertes (no peles contra
112
+ el framework — más esfuerzo, más bugs, mismo tamaño).
113
+ - Hay requerimientos regulatorios o de compliance que mandan estructura
114
+ (auditoría, separación legal, accesibilidad WCAG).
115
+ - El código es bibliográficamente pequeño pero **estructuralmente
116
+ necesario** (DI containers, contracts entre módulos, schemas de
117
+ validación legal).
118
+
119
+ Si alguna de estas aplica, decirlo y NO insistir en borrar.
120
+
121
+ ---
122
+
123
+ ## Reglas obligatorias
124
+
125
+ 1. **Manual-only**: este skill no se carga por matcher ni por keyword
126
+ similar. Solo por invocación explícita. **Por qué**: el sesgo hacia
127
+ borrar es agresivo; aplicarlo cuando el usuario no lo pidió destruye
128
+ trabajo legítimo.
129
+
130
+ 2. **Contar líneas antes/después**: cada propuesta de cambio incluye el
131
+ delta de LOC. **Por qué**: sin números, "reducir" se vuelve subjetivo
132
+ — y subjetivamente, "está mejor" suele significar "más código pero
133
+ organizado".
134
+
135
+ 3. **Borrar > extraer**: ante la duda entre "borrar la feature" y
136
+ "refactorizar la feature", priorizar borrar. **Por qué**: la feature
137
+ no usada cuesta mantenimiento aunque esté "bien organizada".
138
+
139
+ 4. **Red flags requieren justificación cuantitativa**: si alguien
140
+ defiende un cambio con "más flexible", exigir números de cuántas
141
+ variaciones reales se anticipan en los próximos 6 meses. **Por qué**:
142
+ "flexible" sin métrica = optimización para casos imaginarios.
143
+
144
+ 5. **Si el codebase ya es mínimo, decirlo y parar**: no forzar reducciones
145
+ inventadas. **Por qué**: borrar de un codebase ya mínimo introduce
146
+ bugs sin reducir entropía real.
147
+
148
+ 6. **Respetar contratos públicos**: APIs públicas con consumidores no se
149
+ borran sin plan de migración. **Por qué**: la entropía se reduce
150
+ internamente, no rompiendo a terceros.
151
+
152
+ ---
153
+
154
+ ## Relación con otras herramientas SWL
155
+
156
+ - **`legacy-code-rescue`**: refactoriza código heredado preservando
157
+ comportamiento. Este skill **borra** comportamiento que no se necesita.
158
+ Opuestos por diseño.
159
+ - **`revisor-codigo-swl`**: detecta code smells y aplica reglas de
160
+ estilo. Este skill aplica un único lente (tamaño total) — más radical.
161
+ - **Regla `estilo-codigo.md § DRY`**: dice "no duplicar conocimiento".
162
+ Este skill dice "borrar si no hace falta". DRY puede generar más
163
+ código (extraer helper); este skill prefiere borrar el caller.
164
+ - **Skill `analisis-previo-tareas-grandes`**: si reducir entropía resulta
165
+ en cambios masivos (>10 archivos), aplicar tabla comparativa + 3
166
+ opciones antes de borrar.
167
+ - **Regla `arreglar-al-detectar.md`**: prohíbe deuda silenciosa. Si al
168
+ reducir se descubren funcionalidades no documentadas, reportar antes
169
+ de borrar.
170
+
171
+ ---
172
+
173
+ ## Ejemplo de uso
174
+
175
+ Usuario: *"el módulo `utils/` está gigante, ¿qué podemos borrar?"*.
176
+
177
+ Agente carga este skill y aplica las tres preguntas:
178
+
179
+ ```
180
+ ### Análisis de entropía — utils/ (1,847 LOC)
181
+
182
+ **Inventario**: 23 archivos, 67 funciones exportadas.
183
+
184
+ **Pregunta 1 — codebase mínimo**: para los casos de uso reales (verificados
185
+ con `grep -rn 'from utils'` en backend/ y frontend/), 12 funciones cubren
186
+ el 90% de los imports. Las otras 55 funciones tienen 0-2 imports cada una.
187
+
188
+ **Pregunta 2 — delta neto**: borrar las 55 funciones poco usadas elimina
189
+ 1,420 LOC. Inlinar los 2-3 imports de cada una añade ~80 LOC en sus
190
+ callers. Delta: -1,340 LOC.
191
+
192
+ **Pregunta 3 — qué se puede borrar**:
193
+ - `utils/dateFormatters.js` (8 funciones, 240 LOC) — 6 funciones no
194
+ usadas; 2 usadas, inlinables en el caller único.
195
+ - `utils/stringHelpers.js` (12 funciones, 380 LOC) — 9 no usadas; 3
196
+ duplican métodos nativos (`String.prototype.padStart` etc.).
197
+ - `utils/legacyAdapter.js` (320 LOC) — 0 imports activos tras migración
198
+ de v3 → v4 en 2025-Q4. Candidato a borrado completo.
199
+
200
+ **Red flags detectadas en el código actual**:
201
+ - "Por si acaso" en 3 helpers que nadie llama.
202
+ - "Type safety" en wrappers que solo agregan annotations sin valor.
203
+
204
+ **Propuesta**:
205
+ 1. Borrar `legacyAdapter.js` (sin imports). -320 LOC.
206
+ 2. Borrar las 9 funciones no usadas de `stringHelpers.js`. -270 LOC.
207
+ 3. Borrar las 6 funciones no usadas de `dateFormatters.js`. -180 LOC.
208
+ 4. Mantener las 12 funciones core (alta concurrencia).
209
+
210
+ **Delta total proyectado**: -770 LOC (de 1,847 → 1,077, -42%).
211
+
212
+ **Lo que NO conviene borrar**:
213
+ - `utils/validation/` — schemas de validación legal (compliance).
214
+ - `utils/auth/` — contratos con frontend; cambio rompería runtime.
215
+
216
+ ¿Procedo con el plan en 3 commits atómicos?
217
+ ```
218
+
219
+ El usuario decide. El agente NO borra antes de aprobación explícita.