Elementos de Acción → Todoist + Borradores de Correo Electrónico
Configuración — leer antes de comenzar
Lee ../config/user.json (resuelve a ~/executive-assistant-skills/config/user.json).
Extrae y usa durante todo el proceso:
name,full_name— para identificar tus elementos de acción en las notas de la reunión (ej. "Gonto (Martin)")whatsapp— para la entrega de resultadosworkspace— ruta absoluta al espacio de trabajo de OpenClaw
No continúes hasta que tengas estos valores.
Registro de Depuración (OBLIGATORIO)
Lee ../config/DEBUG_LOGGING.md para conocer la convención completa. Usa python3 {user.workspace}/scripts/skill_log.py action-items <nivel> "<mensaje>" ['<detalles>'] en cada paso clave. Registra ANTES y DESPUÉS de cada llamada externa (gog, mcporter, todoist-cli). Ante cualquier error, registra el comando completo y stderr antes de continuar.
Pasos
0. Verificar el calendario de hoy para reuniones (AMBAS cuentas)
Antes de consultar Granola, obtén las reuniones reales de hoy de AMBOS calendarios para saber qué esperar:
python3 {user.workspace}/scripts/skill_log.py action-items INFO "Iniciando ejecución de elementos de acción"
# Obtener la fecha de hoy en YYYY-MM-DD y la de mañana
TODAY=$(date -u -d "$(TZ=America/Argentina/Buenos_Aires date +%Y-%m-%d)" +%Y-%m-%d)
TOMORROW=$(date -u -d "$(TZ=America/Argentina/Buenos_Aires date -d '+1 day' +%Y-%m-%d)" +%Y-%m-%d)
# Verificar AMBOS calendarios
gog --account {user.primary_email} --no-input calendar list primary --from "${TODAY}T00:00:00-03:00" --to "${TOMORROW}T00:00:00-03:00" --json 2>&1
gog --account {user.work_email} --no-input calendar list primary --from "${TODAY}T00:00:00-03:00" --to "${TOMORROW}T00:00:00-03:00" --json 2>&1
Registra los resultados: python3 {user.workspace}/scripts/skill_log.py action-items DEBUG "Eventos de calendario encontrados" '{"primary": N, "work": M, "total": N+M}'
Fusiona los eventos de ambos calendarios. Filtra las reuniones con asistentes (salta eventos personales/solitarios). Esto te da la verdad de las reuniones que ocurrieron hoy — úsalo para verificar los resultados de Granola y detectar cualquier reunión que Granola haya omitido.
SINTAXIS CRÍTICA de fecha: Usa fechas ISO8601 explícitas con el offset -03:00. NO uses expresiones relativas como +1 day, today, o tomorrow en los indicadores de gog — es posible que no sean compatibles. Siempre calcula las cadenas de fecha reales.
1. Obtener las reuniones de hoy de Granola
Nota de zona horaria: Granola almacena las horas de reunión en UTC. Para ART (UTC-3), consultar "hoy" significa usar la fecha de hoy Y la fecha de mañana en UTC. Por ejemplo, para el 3 de marzo ART, consulta custom_start: "2026-03-03" y custom_end: "2026-03-04" para capturar todas las reuniones del día ART.
mcporter call granola list_meetings --args '{"time_range": "custom", "custom_start": "<today YYYY-MM-DD>", "custom_end": "<tomorrow YYYY-MM-DD>"}'
Recopila los IDs y títulos de las reuniones. Registra: python3 {user.workspace}/scripts/skill_log.py action-items INFO "Reuniones de Granola encontradas" '{"count": N, "titles": [...]}'
Verificación cruzada con el calendario: Compara las reuniones de Granola con los eventos del calendario del Paso 0. Si una reunión del calendario con asistentes no tiene una coincidencia en Granola (por superposición de tiempo dentro de 15 minutos), registra una advertencia — es posible que no se haya grabado. Continúa con lo que tiene Granola, pero anota las reuniones no coincidentes en el resultado.
Salta si no hay reuniones (ni de Granola ni del calendario).
2. Consultar a Granola por MIS elementos de acción y desencadenantes de correo electrónico
mcporter call granola query_granola_meetings --args '{"query": "¿Cuáles son todos los elementos de acción personales, seguimientos y compromisos de {user.name} ({user.full_name}) en estas reuniones? Solo lo que ÉL necesita hacer, no lo que otros han asumido. Para cada elemento, incluye la persona, empresa, proyecto o nombre de candidato específico involucrado — nunca uses referencias genéricas. También identifica: cualquier promesa de hacer ALGO por correo electrónico (presentaciones, seguimientos, envío de documentos, compartir información, conectar personas, etc.), y si cada reunión fue una PRIMERA reunión con esa persona/empresa o un seguimiento.", "document_ids": ["<id1>", "<id2>", ...]}'
Pasa TODOS los IDs de reunión. Conserva los enlaces de cita.
3. Crear tareas en Todoist
Nota: Carga el env en el mismo comando — cada llamada de shell es una sesión nueva.
Lee {user.workspace}/skills/todoist-api/SKILL.md para el uso de la CLI. Para cada elemento de acción:
source {user.workspace}/.env && todoist-cli add "<título procesable>" --description "<contexto: nombre de la reunión, fecha/hora de la reunión, quién lo solicitó, enlace de Granola>" --priority <1-4> --labels "<relevante>"
La descripción de la tarea DEBE incluir:
- Nombre de la reunión (ej. "Braintrust Weekly")
- Fecha y hora de la reunión (ej. "Mié 5 Mar, 15:00 ART")
- Quién solicitó / contexto
- Enlace de cita de Granola
Reglas:
- Solo tus acciones: los resúmenes de Granola a menudo enumeran "próximos pasos" sin una propiedad clara. Sé escéptico — si la acción podría pertenecer a la otra persona (ej. "procesar su propio contenido", "verificar disponibilidad", "respondernos"), NO crees una tarea. En caso de duda, crea una tarea de SEGUIMIENTO ("Preguntar a X sobre Y") en lugar de una tarea de propiedad.
- Captura compromisos de otros: si la otra persona dijo que haría algo (ej. "Te responderé en 2 días"), crea una tarea de seguimiento/recordatorio con la fecha de vencimiento adecuada, no una tarea para hacer la cosa tú mismo.
- Especificidad: Cada tarea DEBE incluir el nombre específico de la persona/empresa/proyecto
- Fechas de vencimiento: si hay una fecha límite implícita, usa
--duecon lenguaje natural - Etiquetas: Etiqueta: intro, follow-up, email, urgent según corresponda
- Prioridad: 4=urgente/sensible al tiempo, 3=entregables prometidos, 2=seguimientos generales, 1=normal
Sin dividir tareas para pasos secuenciales (OBLIGATORIO)
Nunca crees tareas separadas para pasos que son parte del mismo flujo de trabajo. Si la acción es "preparar X y luego enviar X" — esa es UNA tarea, no dos. Ejemplos:
- ❌ "Crear propuesta" + "Enviar propuesta" → ✅ "Crear y enviar propuesta"
- ❌ "Escribir borrador" + "Enviar correo" → ✅ "Redactar y enviar correo a X"
- ❌ "Revisar presentación" + "Compartir presentación" → ✅ "Revisar y compartir presentación con X"
Una tarea por intención. El usuario naturalmente seguirá los pasos en orden.
Desduplicación de tareas (OBLIGATORIO)
Antes de crear una tarea, ejecuta una verificación de duplicados contra las tareas abiertas de Todoist:
- Normaliza el título propuesto (minúsculas, recorta puntuación, colapsa espacios en blanco)
- Busca tareas abiertas (
source {user.workspace}/.env && todoist-cli list --filter "!completed") y compara el contenido normalizado - Trata las tareas de introducción casi idénticas como duplicadas (ej., "Presentar David a Marcos" vs "Presentar David (n8n) a Marcos Nils")
- Si existe un duplicado: NO crees una nueva tarea; agrega el contexto de la reunión a la descripción de la tarea existente cuando sea útil
- En el resultado, reporta las decisiones de desduplicación bajo
Omitidos como duplicados:
4. Redactar correos electrónicos de seguimiento
Para CUALQUIER correo electrónico que necesite redacción (presentaciones, seguimientos, respuestas a VC, envío de documentos, etc.):
- Lee y sigue
~/executive-assistant-skills/email-drafting/SKILL.md— es la única fuente de verdad para todas las reglas de redacción, estilo, plantillas, humanización y entrega - Identifica los desencadenantes de borradores de las notas de la reunión:
- Presentaciones o seguimientos prometidos
- Documentos/PDFs/presentaciones prometidos
- Primera llamada con un VC o nuevo contacto
- Cualquier promesa de enviar un correo a alguien
- En caso de duda sobre si redactar → REDACTA
- Excepción: La regla de compromiso de solo propuesta a continuación anula esto. Si el compromiso es construir primero una propuesta, NO redactes — crea solo una tarea de Todoist.
- HGP Deck:
{user.workspace}/assets/HGP_Deck_2025.pdf— adjunta mediante--attach {user.workspace}/assets/HGP_Deck_2025.pdf. Di "presentación de Hypergrowth Partners" en el cuerpo del correo (no "resumen" o "nuestra presentación") - Al redactar presentaciones a contactos conocidos: busca en los correos enviados presentaciones anteriores para ellos, usa el mismo formato, tono y descripción
Requisitos estrictos específicos de presentaciones (OBLIGATORIO)
Si los elementos de acción incluyen presentaciones, sigue esto exactamente:
- Crea un borrador de presentación separado por cada par de presentación (nunca combines varias presentaciones en un seguimiento genérico).
- El asunto debe ser explícito:
Presentación: <Persona A> <> <Persona B>. - El cuerpo debe incluir:
- una línea de quién es cada persona,
- una línea de contexto sobre por qué ocurre esta presentación,
- cierre con
Les dejo para que continúen.y{user.signature}.
- Nunca reemplaces los borradores de presentación con un correo de resumen genérico como "Gran reunión hoy" cuando se prometieron presentaciones.
- Si se conocen los correos electrónicos de los destinatarios, crea borradores de Gmail inmediatamente; si falta algún correo, genera igualmente el texto completo del borrador e informa
FALTA_CORREO: <nombre>. - En el resultado de WhatsApp, incluye una sección
Borradores de presentación creados:que enumere cada par de presentación y si se redactó en Gmail o fue bloqueado por falta de correo electrónico.
Seguimiento de primera llamada con VC / primer flujo de negocios (OBLIGATORIO)
Cuando la reunión es una PRIMERA llamada con un VC o empresa de flujo de negocios:
- Crea un borrador de seguimiento de primera reunión (a menos que esté bloqueado por la regla de solo propuesta a continuación).
- Usa contexto específico de la reunión en el cuerpo (lo que se discutió, próximos pasos explícitos, ofertas concretas), no cortesías genéricas.
- Incluye tu posicionamiento (cómo trabajas) y adjunta
{user.workspace}/assets/HGP_Deck_2025.pdfcuando sea relevante. - Está permitido usar "Gran reunión hoy" solo para esta clase de seguimiento de primera reunión.
Regla de compromiso de solo propuesta (OBLIGATORIO)
Si te comprometiste a "crear una propuesta" (o equivalente: propuesta/presentación/borrador de alcance para preparar primero):
- NO redactes un correo saliente aún.
- Crea una única tarea de Todoist para crear Y enviar la propuesta — ej. "Crear y enviar propuesta de asesoría a Gabriel (BairesDev)".
- NO crees tareas separadas para "crear" y "enviar" — eso es redundante. Una tarea cubre el ciclo de vida completo.
5. Verificar si las tareas existentes de Todoist se cumplieron en las reuniones de hoy
Después de procesar los elementos de acción, verifica también si alguna tarea abierta existente de Todoist fue abordada/completada durante las reuniones de hoy:
- Lista tareas abiertas:
source {user.workspace}/.env && todoist-cli list - Para cada reunión, verifica si la discusión cubrió o cumplió alguna tarea abierta (ej., "Compartir estrategia de IA con Colin" → discutió la estrategia de IA directamente con Colin en la llamada)
- Si una tarea se cumplió claramente en la reunión, complétala:
source {user.workspace}/.env && todoist-cli complete <task_id> - Reporta las tareas completadas en el resultado: "✅ Completado: [tarea] — cumplida durante [nombre de la reunión]"
Esto asegura que Todoist se mantenga limpio y refleje lo que realmente sucedió.
Manejo de errores
- Si
gog calendarfalla: registra el error con el comando completo + stderr (python3 {user.workspace}/scripts/skill_log.py action-items ERROR "gog calendar falló" '{"command": "...", "stderr": "..."}'), continúa con la otra cuenta y/o solo con Granola. - Si
mcporter call granolafalla con errores de autenticación: reporta "⚠️ Autenticación de Granola expirada, ejecutamcporter auth granola --reset" y detente. - Si
todoist-clifalla: verifica que.envesté cargado y el token sea válido. Reporta el error. - Si Grain MCP no está disponible: procede solo con la extracción de Granola, anota en el resultado "⚠️ Grain no disponible, los resultados son solo de Granola."
- Si algún paso falla, continúa con los pasos restantes cuando sea posible — no abortes toda la ejecución por un único fallo.
Desduplicación (CRÍTICO — evita tareas duplicadas)
Desduplicación a nivel de reunión
- PRIMER PASO antes de cualquier procesamiento: Lee
{user.workspace}/state/processed-meetings-YYYY-MM-DD.json(si existe — array de IDs de reuniones de Granola) - Omite cualquier reunión cuyo ID ya esté en esa lista — NO las vuelvas a procesar
- Inmediatamente después de procesar cada reunión (antes de pasar a la siguiente), agrega su ID de reunión de Granola al archivo. NO esperes hasta el final — escribe después de cada reunión para evitar condiciones de carrera con otros crons.
- Este archivo es la única fuente de verdad para "¿ya se procesó esta reunión hoy?"
Nota: Los títulos son frágiles para reuniones recurrentes que comparten el mismo nombre. Siempre desduplica por ID de reunión de Granola.
Desduplicación a nivel de tarea
- Antes de crear CUALQUIER tarea, verifica TANTO las tareas abiertas COMO las completadas recientemente en busca de casi duplicados:
- Obtén tareas abiertas:
source {user.workspace}/.env && todoist-cli list - Obtén las tareas completadas de hoy: usa la API de sincronización de Todoist
completed/get_allconsince=<hoy 00:00 UTC>osource {user.workspace}/.env && todoist-cli list --filter "completed today"si es compatible
- Misma persona + misma intención de acción = duplicado (ej. "Enviar mensaje a Morgane sobre Hank" y "Enviar mensaje a Morgane (Braintrust) después de la llamada de Hank")
- Normaliza: minúsculas, elimina paréntesis, colapsa espacios en blanco
- Si existe un duplicado en YA SEA abiertas o completadas → OMITE, no crees
- Obtén tareas abiertas:
- Reporta los duplicados omitidos en el resultado: "⏭️ Omitido (ya existe): [tarea]"
- Por qué verificar tareas completadas: El usuario puede haber completado ya una tarea creada por un cron posterior a la reunión hoy. Recrearla es incorrecto — el trabajo está hecho.
Por qué ambas capas son importantes
Los crons posteriores a la reunión se activan por reunión. El cron diario de fin de día procesa TODAS las reuniones. Sin desduplicación a nivel de reunión, la misma reunión se procesa dos veces. Sin desduplicación a nivel de tarea, incluso si la reunión se vuelve a procesar (ej., falló la escritura del archivo), las tareas individuales no se duplicarán.
La desduplicación NO ES NEGOCIABLE
Si una reunión aparece en processed-meetings-YYYY-MM-DD.json, NO la proceses de nuevo bajo ninguna circunstancia — incluso si crees que el cron posterior a la reunión "podría haberse perdido algo". El cron posterior a la reunión ya lo manejó. Si tuvo problemas, el usuario pedirá una re-ejecución manualmente.
Resultado
- Tareas creadas o borradores compuestos → lista las tareas con un breve resumen
- Tareas completadas (cumplidas en reuniones) → lista con ✅
- Nombra siempre las reuniones específicas procesadas (ej. "de la llamada de Fyxer, la reunión semanal de Braintrust, HGP Staff") — nunca digas "de las reuniones de hoy"
- Sin reuniones o sin elementos de acción → NO_REPLY
Verificación cruzada con Grain (ACTIVO — verificación a nivel de transcripción)
Grain MCP está disponible con acceso completo a las transcripciones. Después de extraer los elementos de acción de Granola:
- Busca la reunión en Grain:
mcporter call grain.list_attended_meetings --args '{}'Nota: El esquema de Grain no soporta filtrosstart_date/end_date. Llama con args vacíos y filtra manualmente los resultados porstart_datetimepara que coincidan con el rango de fechas de hoy. - Obtén la transcripción:
mcporter call grain.fetch_meeting_transcript --args '{"meeting_id": "<id_de_reunión_de_Grain>"}'Si falla:grain.fetch_meeting_summary --args '{"meeting_id": "<id_de_reun-ión_de_Grain>"}' - Copia la consulta anterior de Granola con diferencia de transcripciones: Envía un prompt más específico para consultar a Granola de nuevo, ahora que conoces las transcripciones reales:
mcporter call granola.query_granola_meetings --args '{"query": "Basado en el resumen de la reunión y la transcripción, ¿hay algún elemento de acción de {user.name} ({user.full_name}) que me haya perdido? Enfócate en acciones explícitamente dichas o acordadas verbalmente que podrían no estar en el resumen.", "document_ids": ["<id_de_reunión_de_Granola>"]}' - Compara los elementos de acción de Granola con los elementos explícitos mencionados en la transcripción de Grain:
- Si la transcripción menciona una acción no capturada por Granola → créala
- Si Granola afirma una acción que no está respaldada por la transcripción → NO la crees (falso positivo de Granola)
- Registra las discrepancias:
python3 {user.workspace}/scripts/skill_log.py action-items WARN "Discrepancia en elementos de acción: Granola vs Grain" '{"granola_only": [...], "grain_only": [...], "meeting": "..."}' - Siempre prioriza la transcripción sobre el resumen de IA de Granola cuando haya conflicto
Ejemplo de resultado
Acciones esperadas: aquí hay un ejemplo de fragmento de resultado de WhatsApp.
📋 Procesadas: Reunión semanal de Braintrust, Llamada de Fyxer, HGP Staff
✅ Tareas creadas:
1. P3: Preguntar a David (n8n) sobre el estado de la integración ⏰ vie
2. P2: Hacer seguimiento con Gabriel (BairesDev) sobre el borrador de la propuesta
3. P4: Enviar presentación de HGP a Sarah (VC) ⏰ mañana 10am
⏭️ Omitido (ya existe): Enviar mensaje a Morgane sobre Hank
✅ Completado: Compartir estrategia de IA con Colin — cumplida durante Reunión semanal de Braintrust
✉️ Borradores de correo creados:
1. Presentación: David (n8n) <> Marcos Nils — BORRADOR EN GMAIL
2. Seguimiento con Sarah (VC) — BORRADOR COMPUESTO (falta: correo de Sarah)
O, si no se procesó ninguna reunión:
NO_REPLY