Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Un solo skill que reemplaza los 6 skills del pack original.
.claude/skills/smart-email-agent/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-17 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-14 | ✗→✓ | ▲ Improved | — | — |
| case-16 | ✗→✓ | ▲ Improved | — | — |
Un solo skill que reemplaza los 6 skills del pack original. Punto de entrada único para toda la gestión de correo.
> Lazy loading activo: este skill se carga completo (~500 tokens). > NO cargues los 6 skills individuales — sería 4.800 tokens desperdiciados.
gog CLIbash# Verificar prerequisitos which gog || echo "Instalar: npm i -g gogcli OR brew install gogcli" echo $GOG_ACCOUNT # debe estar configurado # Autenticar si es la primera vez gog auth add $GOG_ACCOUNT
bash# No leídos en inbox (acción por defecto cuando el usuario dice "revisa mi correo") gog gmail search 'in:inbox is:unread' --max 5 --format minimal --json # Buscar por criterio — usar sintaxis Gmail gog gmail search 'from:juan@empresa.com newer_than:3d' --max 10 --format minimal --json gog gmail search 'subject:factura has:attachment' --max 10 --format minimal --json gog gmail search 'in:spam is:unread' --max 20 --format minimal --json # Leer correo completo gog gmail get <message_id> --format full --json # Leer hilo completo gog gmail thread <thread_id> --format minimal --json
from: to: subject: label: is:unread is:starred has:attachment newer_than:Nd older_than:Nd in:inbox in:sent in:spam in:trash filename:ext
gog en PATH y GOG_ACCOUNT configurado--format minimal --json --max N📬 5 correos no leídos:
1. De: Juan García <juan@empresa.com> | Asunto: Propuesta Q2 | Hace 2h
Vista previa: Hola, te mando el resumen de... | ID: msg_abc123--format minimal --json --max N (N=5 por defecto)| Error | Causa | Solución | |---|---|---| | gog: command not found | gog no instalado | npm i -g gogcli o brew install gogcli | | GOG_ACCOUNT not set | Variable no configurada | Pedir al usuario su email Gmail | | Token expirado | OAuth vencido | gog auth add <email> | | API error 429 | Rate limit | Esperar 60s, reintentar con backoff |
Corp/
├── Interno/
│ ├── Management ← Gerencia, Directores
│ ├── Tech & Ops ← Desarrollo, Soporte, Operaciones
│ ├── Commercial ← Ventas, Marketing
│ ├── Admin & HR ← Jurídica, RRHH, Contabilidad
│ └── Team ← Resto del equipo @empresa.com
├── Partners & Clientes/
│ └── [empresa] ← Wolkvox, Masiv, Unisanitas, Nuva, etc.
├── Proveedores/
│ └── [proveedor] ← Google, Microsoft, AWS, etc.
└── Sistema/
├── DMARC
├── Notificaciones
├── Alertas
└── No-Replybash# Crear etiqueta gog gmail label create "Corp/Interno/Tech & Ops" # Aplicar etiqueta a mensaje gog gmail label apply <message_id> "Corp/Interno/Management" # Mover correo (quitar INBOX + aplicar etiqueta) gog gmail modify <message_id> --add-label "Corp/Partners & Clientes/Wolkvox" --remove-label INBOX # Archivar (quitar INBOX sin borrar) gog gmail modify <message_id> --remove-label INBOX # Mover a spam gog gmail modify <message_id> --add-label SPAM --remove-label INBOX # Mover a papelera gog gmail trash <message_id> # Operación batch (múltiples IDs) gog gmail batch-modify --ids id1,id2,id3 --add-label "Corp/Sistema/No-Reply" --remove-label INBOX
Antes de llamar a la IA, aplicar estas reglas sin costo:
from_domain @empresa.com + from_name contiene [Linda, Rafael, Director] → Corp/Interno/Management
from_domain @empresa.com + from_name contiene [Tech, Dev, Soporte] → Corp/Interno/Tech & Ops
from_domain @empresa.com → Corp/Interno/Team
from contiene noreply / no-reply / donotreply → Corp/Sistema/No-Reply
subject contiene DMARC / SPF / DKIM → Corp/Sistema/DMARC
subject contiene alerta / alert / warning → Corp/Sistema/AlertasGuardar y mantener estas reglas en corp_routing_rules.json.
NUNCA ejecutar acciones destructivas sin confirmación explícita:
⚠️ Pendiente de confirmación:
→ Mover 22 correos a Corp/Sistema/No-Reply
→ Eliminar etiqueta "noreply" (ya vacía)
Esto NO borra correos, solo reorganiza etiquetas.
¿Confirmas? (sí/no)¿Tarea es clasificar / detectar spam / routing?
→ claude-haiku-4-5-20251001 (batch de 10-20 correos, ~$0.00009/correo)
¿Tarea es extraer tareas y fechas de correos importantes?
→ claude-haiku-4-5-20251001 (body[:800], ~$0.00015/correo)
¿El presupuesto está > 80% gastado?
→ forzar haiku para TODO, sin borradores automáticos
¿El presupuesto está > 95% gastado?
→ cero llamadas IA, solo reglas localesOpus: PROHIBIDO para tareas de email. Sonnet: solo para borradores (ver Parte 4).
python# 1. Pre-filtro sin IA (resolver antes de gastar tokens) # - Dominio en corp_routing_rules.json → etiquetar directo # - from en known_spam_domains.txt → spam directo # - message_id ya en analysis_cache → reutilizar resultado # Objetivo: resolver 60-70% a costo $0.00 # 2. Recortar campos al mínimo necesario CAMPOS = { 'clasificacion': ['from', 'subject', 'snippet[:100]'], # ~30 tokens 'prioridad': ['from', 'subject', 'body[:400]'], # ~150 tokens 'tareas_fechas': ['from', 'subject', 'body[:800]'], # ~250 tokens } # 3. Limpiar texto def limpiar(texto, limite): texto = re.sub(r'<[^>]+>', '', texto) # quitar HTML texto = re.sub(r'https?://\S+', '[URL]', texto) # comprimir URLs texto = re.sub(r'\s+', ' ', texto).strip() return texto[:limite] # 4. Batch: NUNCA menos de 10 correos por llamada # Esperar hasta tener 10-20 correos pendientes BATCH_MIN = 10 BATCH_MAX = 20
SYSTEM (idéntico siempre — para prompt caching):
Eres un clasificador de correos corporativos.
Analiza cada correo y devuelve SOLO JSON array. Sin texto extra.
Para cada ítem: {"idx":N,"corp_label":"...","categoria":"spam|importante|informativo|sistema|otro",
"prioridad":0-10,"es_spam":bool,"necesita_respuesta":bool,
"tiene_phishing":bool,"tareas":[],"fecha_limite":"ISO o null","razon":"máx 10 palabras"}
USER: Analiza: [JSON array de hasta 20 correos con from+subject+snippet[:100]]🤖 Análisis — 47 correos procesados
⚡ Sin IA (pre-filtro): 31 (66%) → $0.000
🧠 Con Haiku (2 batches): 16 → $0.006
📊 Resultado:
🔵 Corp/Interno/Management: 2 (prioridad alta)
🔵 Corp/Partners & Clientes: 8
🔵 Corp/Sistema/No-Reply: 14
🗑️ Spam: 12
⚠️ Phishing detectado: 1 → ALERTA
📋 Con tareas pendientes: 4
Críticos:
[10/10] linda@empresa.com — "Aprobación contrato urgente"
Tarea: confirmar antes del viernesPrioridad >= 8 → claude-sonnet-4-6 (calidad importa)
Prioridad 5-7 → claude-haiku-4-5-20251001 (suficiente, más barato)
Prioridad < 5 → NO generar borrador automáticoMáximo 3 borradores por sesión cuando presupuesto < 60%. Máximo 1 borrador por sesión cuando presupuesto 60-80%. Cero borradores automáticos cuando presupuesto > 80%.
bash# 1. Leer el hilo completo gog gmail thread <thread_id> --format minimal --json # 2. Preparar contexto recortado para la IA # Solo: from + subject + body[:600] del último mensaje + resumen del hilo anterior
Redacta una respuesta profesional y concisa (máx 150 palabras).
Solo el cuerpo del mensaje, sin asunto ni encabezados.
Tono: profesional pero cercano.
Firma: [NOMBRE_USUARIO]
Hilo: [RESUMEN + ÚLTIMO MENSAJE RECORTADO]✍️ Borrador para: juan@empresa.com
Re: Propuesta Q2 2026
────────────────────────
Hola Juan,
Gracias por el resumen. Me parece viable la dirección propuesta.
¿Podemos agendar una llamada esta semana?
Saludos,
[Tu nombre]
────────────────────────
[1] Guardar borrador [2] Editar [3] Enviar ahora [4] Descartarbash# Guardar como borrador gog gmail draft create --to "juan@empresa.com" \ --subject "Re: Propuesta Q2 2026" \ --body "Hola Juan,..." \ --reply-to <message_id> # Enviar borrador guardado gog gmail draft send <draft_id> # Enviar directamente (SIEMPRE pedir confirmación antes) gog gmail send --to "juan@empresa.com" --subject "..." --body "..."
acuse_recibo: "Recibido, te respondo a la brevedad."
confirmar_reunion: "Confirmado para [fecha/hora]. Hasta entonces."
solicitar_info: "Necesito más información sobre X para proceder."
ausencia: "Estoy fuera hasta [fecha]. Respondo a mi regreso."bash# Buscar correos enviados sin respuesta en últimos 5 días gog gmail search 'in:sent newer_than:5d' --max 20 --format minimal --json # Cruzar con INBOX para detectar cuáles no tienen respuesta
Por qué 55 min: el caché de Anthropic expira a los 60 minutos. Con heartbeat de 55 min, el agente mantiene el caché caliente → cada mensaje paga cache-read en lugar de cache-write (3.75x más barato).
json// ~/.openclaw/openclaw.json { "agents": { "email-assistant": { "heartbeat": { "every": "55m" }, "model": "anthropic/claude-haiku-4-5-20251001" } } }
json{ "cron": { "jobs": [ { "id": "email-priority-check", "schedule": "*/55 * * * *", "description": "Revisar correos importantes — modelo Haiku", "message": "Revisa inbox no leídos. Si hay prioridad >= 8, notifícame.", "model": "anthropic/claude-haiku-4-5-20251001", "enabled": true }, { "id": "email-spam-cleanup", "schedule": "0 8 * * *", "description": "Limpieza diaria de spam — solo reglas locales, costo $0", "message": "Aplica reglas locales de spam. Sin llamadas IA.", "model": "anthropic/claude-haiku-4-5-20251001", "enabled": true }, { "id": "email-weekly-report", "schedule": "0 9 * * MON", "description": "Informe semanal", "message": "Genera informe semanal de correos con email-reporter.", "model": "anthropic/claude-haiku-4-5-20251001", "enabled": true } ] } }
Regla de oro para crons: SIEMPRE especificar claude-haiku-4-5-20251001. Usar Opus para un cron de 10 tareas/día = $17.70/mes extra innecesario.
markdown## Email Heartbeat — Modelo: claude-haiku-4-5-20251001 ### Check de correos (cada 55 min) 1. gog gmail search 'in:inbox is:unread' --max 10 --format minimal --json 2. Aplicar reglas locales de corp_routing_rules.json 3. Si hay correo con keywords urgente/crítico/emergencia → notificar 4. Si no hay urgentes → HEARTBEAT_OK (silencio) ### Check de spam (cada 2h, sin IA) 1. gog gmail search 'in:spam is:unread' --max 50 --format minimal --json 2. Aplicar known_spam_domains.txt → mover a trash directo 3. Sin llamadas a IA Quiet hours: 23:00–07:00 → HEARTBEAT_OK automático
bash# Configurar webhook Pub/Sub python3 scripts/setup_pubsub.py --topic "email-agent-notifications" # El webhook dispara cuando llega un correo nuevo: openclaw message "Nuevo correo. Revisa con gog y notifícame si es importante."
Usuario: "Activa el agente de correo en modo automático"
Agente:
1. Verificar: gog auth status
2. Crear cron jobs recomendados (ver arriba)
3. Copiar HEARTBEAT.md al workspace
4. Preguntar: ¿activar Gmail Push para tiempo real?
5. Confirmar canal de notificaciones (NOTIFY_CHANNEL)
6. "✅ Agente activado. Reviso cada 55 min. Te aviso si hay algo importante."bash# Resumen del día (al final de sesión — SIEMPRE mostrar) # Ver sección "Resumen de costos" más abajo # Estadísticas de spam gog gmail search 'in:trash newer_than:30d' --max 100 --format minimal --json # Parsear y agrupar por dominio remitente # Tareas pendientes en correos # Consultar analysis_cache donde tareas[] no está vacío y sin respuesta # Log de prompts IA detectados cat .learnings/PROMPTS_DETECTADOS.md # Historial de acciones del agente cat email_audit.log | tail -50 # Deshacer última acción gog gmail modify <ids_from_audit_log> --remove-label TRASH --add-label INBOX
💰 Sesión de hoy
Correos procesados: 47
├─ Sin IA (reglas): 31 (66%) → $0.000
├─ Haiku (2 batches): 14 → $0.005
└─ Sonnet (borradores): 2 → $0.005
Tokens consumidos: 5.090
Costo sesión: $0.010
Ahorro estimado: $0.040 (80% vs. sin optimizar)
Presupuesto mes: $X.XX gastado / $Y.YY total (N%)
Proyección mes: $Z.ZZ| Evento | Archivo | ID | |---|---|---| | Usuario corrige clasificación | .learnings/LEARNINGS.md | LRN-YYYYMMDD-NNN | | Costo sesión > 2x el promedio | .learnings/LEARNINGS.md | LRN-YYYYMMDD-NNN | | Error de API (rate limit, auth) | .learnings/ERRORS.md | ERR-YYYYMMDD-XXX | | Optimización reduce costos >10% | .learnings/LEARNINGS.md | LRN-YYYYMMDD-NNN | | Remitente recurrente sin regla | .learnings/LEARNINGS.md | LRN-YYYYMMDD-NNN |
markdown## [LRN-YYYYMMDD-NNN] <tipo> **Logged**: ISO timestamp **Priority**: low | medium | high **Status**: pending | applied | promoted **Area**: cost | classification | routing | api | spam | drafts ### Summary Una línea con el aprendizaje y su impacto. ### Details Qué pasó. Qué se asumía vs. qué era verdad. ### Action Cambio concreto: qué archivo editar, qué valor cambiar. ### Impact Ahorro estimado: $X/mes | Tokens -N% ---
1. Revisar .learnings/ con Status=pending
2. ¿Learnings con Impact > $0.01/mes?
→ Proponer: "Aprendí que X. ¿Lo aplico a las reglas?"
→ Si acepta → editar corp_routing_rules.json → Status=applied
3. ¿3+ learnings del mismo dominio/patrón?
→ Promover a regla permanente sin preguntar
→ Status=promoted
4. Reportar: "Apliqué N mejoras. Ahorro estimado: $X/mes"Mes 1: ~$0.50/mes (0 reglas)
Mes 2: ~$0.30/mes (10 reglas aprendidas)
Mes 3: ~$0.18/mes (25 reglas)
Mes 6: ~$0.10/mes (60+ reglas)| % gastado | Modo | Restricciones | |---|---|---| | 0–59% | Normal ✅ | Todo habilitado | | 60–79% | Ahorro leve 🟡 | Avisar. Máx 2 borradores/sesión | | 80–94% | Ahorro fuerte 🟠 | Solo Haiku. Sin borradores auto. Batch obligatorio ≥20 | | 95–100% | Emergencia 🔴 | Cero IA. Solo gog + reglas locales |
bash/context list # qué archivos consumen tokens ahora /usage full # tokens + costo por respuesta /usage cost # resumen acumulado de sesión /status # modelo activo, % contexto python3 scripts/token_tracker.py check # estado del budget diario python3 scripts/model_router.py "analizar correos nuevos" # qué modelo usar
references/cost-optimization.md — Técnicas avanzadas: prompt caching, deduplicación semántica, modo emergenciareferences/learning-patterns.md — Patrones de auto-mejora y ciclo de vida de learningshooks/openclaw-handler.js — Inyecta estado de presupuesto + modo activo al inicio de sesiónscripts/init_orchestrator.py — Setup inicial: verifica gog, crea budget_tracker, SKILLS_INDEXassets/HEARTBEAT.email.md — Plantilla lista para copiar al workspace| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +73 percentage points is the difference between those two pass rates over the 20 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.