PTENES
MÓDULO 1.1

🧩 Por qué existen las skills

Los 4 problemas que matan los proyectos con agentes — y cómo las skills resuelven cada uno.

7
Secciones
35
Minutos
Básico
Nivel
Teoría
Tipo

Contenido detallado

1

📦 Qué es una skill en Claude Code

Una skill y es un paquete de instrucciones y herramientas que cambia el comportamiento de Claude Code para una tarea específica. En vez de explicar el mismo proceso todos los días ("antes de programar, escribe una prueba"), empaquetas esa lógica en una skill y el agente la carga cuando la necesita.

Técnicamente, una skill es un directorio con un archivo SKILL.md (frontmatter YAML + cuerpo markdown) que describe cuándo activar e cómo actuar. Puede incluir slash commands, sub-agents, hooks y referencias a otras skills.

⚙️ Tres formas de invocar una skill

  • • Slash command explícito: el usuario escribe /grill-me o /tdd — invocación deliberada.
  • • Trigger automático: el agente lee la descripción de la Skill y la activa cuando la solicitud coincide (ej.: "vamos a refactorizar esto" -> /improve-codebase-architecture).
  • • Composición: una skill llama a otra. /make-plan puede llamar /grill-me internamente.
# Estructura mínima de una SKILL.md
---
name: grill-me
description: Pon a prueba un plan antes de programar.
  Úsalo cuando el usuario diga "voy a empezar a implementar",
  "tengo una idea", "¿tiene sentido hacerlo así?".
---

# Grill Me

Eres un senior escéptico. Antes de aceptar cualquier plan:

1. Enumera 5 suposiciones implícitas en el pedido del usuario.
2. Para cada una, pregunta "¿y si esta es incorrecta?".
3. Sugiere el experimento más barato para validar cada una.
4. Solo entonces devuelve el plan refinado.

💡 Prioridad de instrucciones

Cuando hay un conflicto, el orden de precedencia es: prompt del sistema > skill activa > CLAUDE.md > solicitud del usuario. Una skill bien hecha «amarra» el comportamiento, incluso si el usuario intenta tomar un atajo.

Ejemplo: si /tdd está activa y el usuario dice "sáltate la prueba esta vez", el agente se niega: la skill prevaleció.

2

🎯 Problema #1 — Desalineación

El problema más costoso no es el código incorrecto, sino el código correcto en lo equivocado. El usuario pide X, pero quiere Y; el agente implementa X a la perfección y, dos semanas después, descartan la funcionalidad.

📚 Cita: David Thomas (The Pragmatic Programmer)

"No-one, not even users, knows exactly what they want. Even when they do, they cannot articulate it. And even when they articulate it, they will change their minds tomorrow."

Conclusión: aceptar literalmente la solicitud del usuario casi siempre es una trampa. Skills como /grill-me existen para forzar la conversación de descubrimiento antes del código.

✗ ANTES — Sin grilling

Usuario:

"Agrega un botón para exportar CSV en la pantalla de informes."

Agente:

  • ✗ Codifica un botón CSV en 2 horas.
  • ✗ El usuario prueba: "pero yo quería Excel con formato."
  • ✗ Trabajo repetido. El CSV va a la basura.

✓ DESPUÉS — Con /grill-me

El agente pregunta:

  • ✓ "¿Quién va a abrir este archivo? ¿Excel, Sheets o una herramienta de BI?"
  • ✓ "¿Necesita formato (colores, totales) o solo datos sin procesar?"
  • ✓ "¿Cuántas filas? CSV se bloquea por encima de 1M en Excel."

El usuario responde -> el agente codifica XLSX con fórmulas. Cero retrabajo.

💡 Señal de alarma

Si el agente nunca te corrigió, nunca pidió una aclaración y nunca estuvo en desacuerdo contigo, te está complaciendo, no ayudando. Una buena skill de descubrimiento debe generar fricción productiva en los primeros intercambios.

3

🗣️ Problema #2 — Verbosidad

Cuando el agente y la persona no comparten vocabulario, cada conversación debe explicarse desde cero. Eric Evans (autor de Domain-Driven Design) llama a esto ausencia de lenguaje ubicuo: términos que todo el equipo —humanos y agentes— usa de la misma manera.

📖 Eric Evans — Domain-Driven Design

La idea central de Evans: el código debe hablar el idioma del negocio. Si tienes que traducir "PaymentBatch" a "lote de cobros" cada vez que abres un archivo, el modelo está mal.

Con los agentes la pérdida se amplifica: cada conversación nueva empieza desde cero porque el agente no "vivió" las discusiones anteriores. Skills con glosario fijo (ej.: /grill-with-docs) inyectan el lenguaje ubicuo en cada prompt.

Un ejemplo concreto. Imagina un curso en el que "clase" puede ser un placeholder O una instancia real materializada con un alumno y su progreso. Sin un lenguaje ubicuo, escribes así:

✗ Verboso (sin lenguaje ubicuo)

"There's a problem when a lesson inside a section of a course is made 'real' for a specific student and the previous lessons in that section weren't made 'real' too — the progress bar shows the wrong percentage."

62 palabras. Comillas en "real" tres veces. Reconstruye el concepto desde cero.

✓ Conciso (con lenguaje ubicuo)

"There's a problem with the materialization cascade — when a lesson is materialized out of order, the progress is miscalculated."

21 palabras. Los términos "materialization cascade" y "materialized" contienen todo el contexto.

💡 Los 3 beneficios del lenguaje ubicuo con agentes

  • 1. Brevedad: una palabra contiene un párrafo de contexto.
  • 2. Precisión: "materializar" significa exactamente una cosa, sin ambigüedades.
  • 3. Auditoría: los commits, PRs y tickets comparten el mismo diccionario.
4

🧪 Problema #3 — Código que no funciona

Los LLM se entrenan para producir código que parece correcto. Los tipos coinciden, los imports existen, la sintaxis es válida y, aun así, la lógica está mal. Sin una señal externa (pruebas), el agente cree en su propio resultado.

La solución clásica es TDD (Test-Driven Development): escribir primero la prueba, verla fallar (rojo), implementar lo mínimo para que pase (verde) y después refactorizar. Skills como /tdd impone este ciclo al agente.

🔴

RED — Escribe la prueba que falla

Antes de escribir una línea de implementación, describe el comportamiento esperado en una prueba.

Por qué funciona: te obliga a definir lo que antes del como. Si no puedes escribir la prueba, no entendiste el requisito. La prueba fallida confirma que estás probando algo real: no una prueba vacía que siempre pasa.

🟢

GREEN — Implementa lo mínimo

La regla: el código más corto y simple que hace pasar la prueba. Puede ser feo. Puede estar duplicado. Funciona.

Por qué funciona: bloquea la tentación de «ya voy a dejarlo listo para el siguiente caso». Cada prueba justifica una línea de código, nada más.

🔵

REFACTOR — Limpia con la red de seguridad debajo

Con las pruebas en verde, ahora reorganizas nombres, extraes funciones, eliminas duplicación, sin miedo a romper nada.

Por qué funciona: el refactor ocurre después que el comportamiento está definido por una prueba. Si un refactor rompe la lógica, la prueba avisa en segundos.

⚠️ Atención: el antipatrón de TDD con agentes

El error más común: pedirle al agente "implementa X y después escribe las pruebas". El agente va a escribir pruebas que pasan por el código de él, no pruebas que validarían el requisito. Probar después no es TDD: es teatro.

5

🏚️ Problema #4 — Ball of mud

El código se deteriora. Foote y Yoder lo documentaron en 1997 con el término "Big Ball of Mud": sistemas que crecen sin una arquitectura coherente porque cada feature se agregó a las apuradas, sin refactorizar. Con agentes, la velocidad aumenta y el deterioro también.

La intuición equivocada: "voy a pedirle al agente que refactorice todo ahora". La intuición correcta: refactor y oportunidad, no evento. No reescribes el sistema; identificas una duplicación y la unificas cuando ya necesitas modificar esa área.

✗ Refactor destructivo

  • ✗ "Refactoriza todo el módulo de pagos" — 2 semanas, 50 archivos, un PR imposible de revisar.
  • ✗ Cambias el nombre de una clase y se rompen 14 lugares que nadie había notado.
  • ✗ La feature flag permanece activa durante 3 meses. El código nuevo y el antiguo conviven.
  • ✗ Resultado: una bola de lodo con otra capa encima.

✓ Oportunidades de profundización

  • ✓ Antes de tocar un archivo, ejecuta /improve-codebase-architecture en él.
  • ✓ Una skill identifica una duplicación específica: "esta función existe en 3 lugares como variaciones."
  • ✓ Unifica solo ese caso. PR de 80 líneas, que se puede revisar en 10 min.
  • ✓ Resultado: cada feature deja el código un poco mejor (regla del boy scout).

💡 Ejemplo práctico: identificación de duplicación

Vas a modificar el UserController. Antes, ejecuta /improve-codebase-architecture UserController. La skill responde:

"Encontré 3 implementaciones parecidas de validación de correo electrónico:
- UserController.create (línea 42)
- AdminController.invite (línea 78)
- WebhookController.signup (línea 31)

Solo varían en el tratamiento del dominio bloqueado. Sugiero extraer EmailValidator.validate(email, options) y refactorizar los 3 llamadores en un PR antes de agregar tu código nuevo."
6

🔗 Cómo se componen las skills

Las skills individuales ya ayudan. Pero el verdadero beneficio aparece cuando se se componen en flujos — cada uno resuelve un problema, y el output de uno alimenta al siguiente.

Workflow típico de una feature, desde cero hasta el código en producción:

   /grill-with-docs        Stress-testa a ideia contra docs e ADRs
          │              (elimina desalinhamento, problema #1)
          ▼
   /to-prd                 Vira documento de produto curto e cravado
          │              (fixa linguagem ubiqua, problema #2)
          ▼
   /to-issues              Quebra o PRD em issues pequenas e testaveis
          │              (escopo pequeno = menos ball of mud)
          ▼
   /tdd                    Para cada issue: teste vermelho -> verde -> refactor
          │              (resolve problema #3)
          ▼
   /triage                 Revisa diff, sugere refator pontual antes do merge
                         (combate problema #4, deepening opportunity)

Cada flecha es una transición deliberada. El usuario no necesita tener todo el contexto en la cabeza: las skills se encargan del handoff. El PRD se convierte en input de /to-issues; el issue se convierte en input del /tdd; el diff se convierte en input del /triage.

🧱 Principio: las skills son bloques de construcción, no monolitos

Una skill que intenta hacer «todo el ciclo de una funcionalidad» es peor que cinco skills pequeñas encadenadas. Razones:

  • • Reutilización: /grill-me sirve para cualquier plan, no solo para features.
  • • Sustitución: cambiar /tdd por /bdd en un proyecto no rompe el resto.
  • • Mantenimiento: una skill corta cabe en la cabeza y es más fácil de auditar.
  • • Composición libre: la misma skill en flujos distintos (ej: /grill-me antes del PRD, antes del ADR, antes de la migración).

💡 Regla práctica

Si estás escribiendo una skill y la descripción necesita más de 2 frases para explicar cuándo activarla, hace demasiadas cosas. Divídela.

📌 Resumen del módulo

✓
Skill = paquete de comportamiento — SKILL.md con frontmatter que define cuándo activarla y cómo actuar.
✓
Problema #1: Desalineación — código correcto para el problema equivocado. Resuélvelo con /grill-me y descubrimiento deliberado.
✓
Problema #2: Verbosidad — sin lenguaje ubicuo, cada conversación empieza desde cero. Resuélvelo con un glosario fijo en la skill.
✓
Problema #3: Código incorrecto que parece correcto — el agente cree en su propio resultado. Se resuelve con TDD (red -> green -> refactor) impuesto por /tdd.
✓
Problema #4: Ball of mud — el código se deteriora rápidamente. Resuélvelo con refactorizar como oportunidad (/improve-codebase-architecture).
✓
Las skills se componen en flujos — /grill-with-docs -> /to-prd -> /to-issues -> /tdd -> /triage. Piezas, no monolitos.

Siguiente módulo:

1.2 — Anatomía de una SKILL.md: frontmatter, activadores de descripción y cuerpo