Contenido detallado
📦 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-meo/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-planpuede llamar/grill-meinternamente.
# 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ó.
🎯 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:
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.
🗣️ 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)
62 palabras. Comillas en "real" tres veces. Reconstruye el concepto desde cero.
✓ Conciso (con lenguaje ubicuo)
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.
🧪 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.
🏚️ 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-architectureen é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:
- 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."
🔗 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-mesirve para cualquier plan, no solo para features. -
•
Sustitución: cambiar
/tddpor/bdden 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-meantes 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
Siguiente módulo:
1.2 — Anatomía de una SKILL.md: frontmatter, activadores de descripción y cuerpo