O que Ações de Itens → Todoist + Rascunhos de E-mail faz?
Configuração — leia antes de começar
Leia ../config/user.json (resolve para ~/executive-assistant-skills/config/user.json).
Extraia e use ao longo de todo o processo:
name,full_name— para identificar seus itens de ação nas notas da reunião (ex.: "Gonto (Martin)")whatsapp— para entrega de resultadosworkspace— caminho absoluto para o workspace do OpenClaw
Não prossiga até ter esses valores.
Log de Depuração (OBRIGATÓRIO)
Leia ../config/DEBUG_LOGGING.md para a convenção completa. Use python3 {user.workspace}/scripts/skill_log.py action-items <level> "<mensagem>" ['<detalhes>'] a cada passo chave. Faça log ANTES e DEPOIS de cada chamada externa (gog, mcporter, todoist-cli). Em caso de erro, registre o comando completo e stderr antes de continuar.
Passos
0. Verifique a agenda de hoje para reuniões (AMBAS as contas)
Antes de consultar o Granola, obtenha as reuniões reais de hoje de AMBOS os calendários para saber o que esperar:
python3 {user.workspace}/scripts/skill_log.py action-items INFO "Iniciando execução de itens de ação"
# Obter data de hoje no formato YYYY-MM-DD e de amanhã
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 os calendários
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
Registre os resultados: python3 {user.workspace}/scripts/skill_log.py action-items DEBUG "Eventos de calendário encontrados" '{"primary": N, "work": M, "total": N+M}'
Mescle eventos de ambos os calendários. Filtre por reuniões com participantes (pule eventos solo/pessoais). Isso fornece a verdade básica de quais reuniões ocorreram hoje — use para cruzar com os resultados do Granola e capturar quaisquer reuniões que o Granola perdeu.
SINTAXE CRÍTICA de data: Use datas ISO8601 explícitas com fuso -03:00. NÃO use expressões relativas como +1 day, today ou tomorrow nas flags do gog — elas podem não ser suportadas. Sempre calcule as strings de data reais.
1. Obtenha as reuniões de hoje do Granola
Nota de fuso horário: O Granola armazena horários de reuniões em UTC. Para ART (UTC-3), consultar "hoje" significa usar a data de hoje E a data de amanhã em UTC. Ex.: para 3 de março ART, consulte custom_start: "2026-03-03" e custom_end: "2026-03-04" para capturar todas as reuniões do dia ART.
mcporter call granola list_meetings --args '{"time_range": "custom", "custom_start": "<hoje YYYY-MM-DD>", "custom_end": "<amanhã YYYY-MM-DD>"}'
Colete IDs e títulos das reuniões. Registre: python3 {user.workspace}/scripts/skill_log.py action-items INFO "Reuniões do Granola encontradas" '{"count": N, "titles": [...]}'
Cruze com o calendário: Compare as reuniões do Granola com os eventos do calendário do Passo 0. Se uma reunião do calendário com participantes não tiver correspondência no Granola (por sobreposição de horário dentro de 15 min), registre um aviso — ela pode não ter sido gravada. Prossiga com o que o Granola tem, mas observe as reuniões não correspondidas na saída.
Pule se não houver reuniões (nem do Granola nem do calendário).
2. Consulte o Granola por MEUS itens de ação + gatilhos de e-mail
mcporter call granola query_granola_meetings --args '{"query": "Quais são todos os itens de ação pessoais, follow-ups e compromissos de {user.name} ({user.full_name}) destas reuniões? Apenas coisas que ELE precisa fazer, não o que outros se comprometeram. Para cada item, inclua a pessoa, empresa, projeto ou nome de candidato específico envolvido — nunca use referências genéricas. Também identifique: quaisquer promessas de fazer ALGO por e-mail (intros, follow-ups, envio de documentos, compartilhamento de informações, conectar pessoas, etc.), e se cada reunião foi um PRIMEIRO contato com aquela pessoa/empresa ou um follow-up.", "document_ids": ["<id1>", "<id2>", ...]}'
Passe TODOS os IDs de reunião. Preserve os links de citação.
3. Crie tarefas no Todoist
Nota: Carregue o env no mesmo comando — cada chamada de shell é uma sessão nova.
Leia {user.workspace}/skills/todoist-api/SKILL.md para uso da CLI. Para cada item de ação:
source {user.workspace}/.env && todoist-cli add "<título acionável>" --description "<contexto: nome da reunião, data/hora da reunião, quem solicitou, link do Granola>" --priority <1-4> --labels "<relevante>"
A descrição da tarefa DEVE incluir:
- Nome da reunião (ex.: "Braintrust Weekly")
- Data e hora da reunião (ex.: "Qua 5 Mar, 15:00 ART")
- Quem solicitou / contexto
- Link de citação do Granola
Regras:
- Apenas suas ações: Os resumos do Granola frequentemente listam "próximos passos" sem proprietário claro. Seja cético — se a ação puder pertencer a outra pessoa (ex.: "digerir o próprio conteúdo", "verificar disponibilidade", "retornar a nós"), NÃO crie uma tarefa. Em caso de dúvida, crie uma tarefa de FOLLOW-UP ("Pingar X sobre Y") em vez de uma tarefa de propriedade.
- Capture compromissos de outros: Se a outra pessoa disse que faria algo (ex.: "Volto em 2 dias"), crie uma tarefa de follow-up/ping com a data de vencimento apropriada, não uma tarefa para fazer a coisa você mesmo.
- Especificidade: Toda tarefa DEVE incluir o nome específico da pessoa/empresa/projeto.
- Datas de vencimento: Se houver prazo implícito, use
--duecom linguagem natural. - Labels: Marque: intro, follow-up, email, urgent conforme apropriado.
- Prioridade: 4=urgente/sensível ao tempo, 3=entregas prometidas, 2=follow-ups gerais, 1=normal.
Sem divisão de tarefas para etapas sequenciais (OBRIGATÓRIO)
Nunca crie tarefas separadas para etapas que fazem parte do mesmo fluxo de trabalho. Se a ação é "preparar X e depois enviar X" — é UMA tarefa, não duas. Exemplos:
- ❌ "Elaborar proposta" + "Enviar proposta" → ✅ "Elaborar e enviar proposta"
- ❌ "Escrever rascunho" + "Enviar e-mail" → ✅ "Rascunhar e enviar e-mail para X"
- ❌ "Revisar deck" + "Compartilhar deck" → ✅ "Revisar e compartilhar deck com X"
Uma tarefa por intenção. O usuário naturalmente executará as etapas em ordem.
Deduplicação de tarefas (OBRIGATÓRIO)
Antes de criar uma tarefa, execute uma verificação de duplicidade contra tarefas abertas do Todoist:
- Normalize o título proposto (minúsculas, remova pontuação, colapse espaços em branco).
- Pesquise tarefas abertas (
source {user.workspace}/.env && todoist-cli list --filter "!completed") e compare o conteúdo normalizado. - Trate tarefas de intro quase idênticas como duplicatas (ex.: "Intro David ao Marcos" vs "Intro David (n8n) ao Marcos Nils").
- Se existir duplicata: NÃO crie uma nova tarefa; anexe o contexto da reunião à descrição da tarefa existente quando útil.
- Na saída, relate as decisões de deduplicação sob
Pulados como duplicatas:.
4. Rascunhe e-mails de acompanhamento
Para QUALQUER e-mail que precise ser rascunhado (intros, follow-ups, respostas a VCs, envio de documentos, etc.):
- Leia e siga
~/executive-assistant-skills/email-drafting/SKILL.md— é a única fonte de verdade para todas as regras de rascunho, estilo, modelos, humanização e entrega. - Identifique gatilhos de rascunho a partir das notas da reunião:
- Intros ou follow-ups prometidos
- Documentos/PDFs/decks prometidos
- Primeira ligação com um VC ou novo lead
- Qualquer promessa de enviar e-mail para alguém
- Em caso de dúvida sobre rascunhar → RASCUNHE.
- Exceção: A regra de compromisso apenas de proposta abaixo substitui esta. Se o compromisso é elaborar uma proposta primeiro, NÃO rascunhe — crie apenas uma tarefa no Todoist.
- HGP Deck:
{user.workspace}/assets/HGP_Deck_2025.pdf— anexe via--attach {user.workspace}/assets/HGP_Deck_2025.pdf. Diga "deck da Hypergrowth Partners" no corpo do e-mail (não "panfleto" ou "nosso deck"). - Ao rascunhar intros para contatos conhecidos: pesquise e-mails enviados em busca de intros anteriores para eles, use o mesmo formato, tom e descrição.
Requisitos específicos para intros (OBRIGATÓRIO)
Se os itens de ação incluírem intros, siga exatamente:
- Crie um rascunho de intro separado por par de intro (nunca mescle múltiplas intros em um e-mail de acompanhamento genérico).
- O assunto deve ser explícito:
Intro: <Pessoa A> <> <Pessoa B>. - O corpo deve incluir:
- uma linha sobre quem cada pessoa é,
- uma linha de contexto sobre por que esta intro está acontecendo,
- feche com
Deixo com vocês a partir daqui.e{user.signature}.
- Nunca substitua rascunhos de intro por um e-mail de resumo genérico como "Ótima reunião hoje" quando intros foram prometidas.
- Se os e-mails dos destinatários forem conhecidos, crie rascunhos no Gmail imediatamente; se algum e-mail estiver faltando, ainda gere o texto completo do rascunho e reporte
FALTANDO_EMAIL: <nome>. - No resultado do WhatsApp, inclua uma seção
Rascunhos de intro criados:listando cada par de intro e se foi rascunhado no Gmail ou bloqueado por e-mail faltante.
Primeiro follow-up de chamada com VC / primeiro dealflow (OBRIGATÓRIO)
Quando a reunião for um PRIMEIRO contato com um VC ou empresa de dealflow:
- Crie um rascunho de follow-up da primeira reunião (a menos que bloqueado pela regra de apenas proposta abaixo).
- Use contexto específico da reunião no corpo (o que foi discutido, próximos passos explícitos, ofertas concretas), não gentilezas genéricas.
- Inclua seu posicionamento (como você trabalha) e anexe
{user.workspace}/assets/HGP_Deck_2025.pdfquando relevante. - Permitido usar "Ótima reunião hoje" apenas para esta classe de follow-up de primeira reunião.
Regra de compromisso apenas de proposta (OBRIGATÓRIO)
Se você se comprometeu a "elaborar uma proposta" (ou equivalente: proposta/deck/escopo a preparar primeiro):
- NÃO rascunhe um e-mail de saída ainda.
- Crie uma única tarefa no Todoist para elaborar E enviar a proposta — ex.: "Elaborar e enviar proposta de consultoria para Gabriel (BairesDev)".
- NÃO crie tarefas separadas para "elaborar" e "enviar" — é redundante. Uma tarefa cobre o ciclo de vida completo.
5. Verifique se tarefas existentes do Todoist foram cumpridas nas reuniões de hoje
Após processar itens de ação, também verifique se alguma tarefa aberta existente do Todoist foi abordada/concluída durante as reuniões de hoje:
- Liste tarefas abertas:
source {user.workspace}/.env && todoist-cli list. - Para cada reunião, verifique se a discussão cobriu ou cumpriu alguma tarefa aberta (ex.: "Compartilhar estratégia de IA com Colin" → discutiu estratégia de IA diretamente com Colin na chamada).
- Se uma tarefa foi claramente cumprida na reunião, complete-a:
source {user.workspace}/.env && todoist-cli complete <task_id>. - Relate tarefas concluídas na saída: "✅ Concluída: [tarefa] — cumprida durante [nome da reunião]".
Isso garante que o Todoist permaneça limpo e reflita o que realmente aconteceu.
Tratamento de erros
- Se
gog calendarfalhar: registre o erro com o comando completo + stderr (python3 {user.workspace}/scripts/skill_log.py action-items ERROR "gog calendar falhou" '{"command": "...", "stderr": "..."}'), continue com a outra conta e/ou apenas Granola. - Se
mcporter call granolafalhar com erros de autenticação: relate "⚠️ Autenticação do Granola expirou, executemcporter auth granola --reset" e pare. - Se
todoist-clifalhar: verifique se.envfoi carregado e o token é válido. Relate o erro. - Se o Grain MCP estiver indisponível: prossiga com extração apenas do Granola, anote na saída "⚠️ Grain indisponível, resultados são apenas do Granola."
- Se qualquer etapa falhar, continue com as etapas restantes quando possível — não aborte toda a execução por uma falha.
Deduplicação (CRÍTICO — evita tarefas duplicadas)
Deduplicação em nível de reunião
- PRIMEIRO PASSO antes de qualquer processamento: Leia
{user.workspace}/state/processed-meetings-YYYY-MM-DD.json(se existir — array de IDs de reunião do Granola). - Pule quaisquer reuniões cujo ID já esteja nessa lista — NÃO as reprocesse.
- Imediatamente após processar cada reunião (antes de passar para a próxima), anexe seu ID de reunião do Granola ao arquivo. NÃO espere até o final — escreva após cada reunião para evitar condições de corrida com outros crons.
- Este arquivo é a única fonte de verdade para "esta reunião já foi processada hoje?"
Nota: Títulos são frágeis para reuniões recorrentes que compartilham o mesmo nome. Sempre deduplique pelo ID da reunião do Granola.
Deduplicação em nível de tarefa
- Antes de criar QUALQUER tarefa, verifique TANTO tarefas abertas QUANTO concluídas recentemente por quase duplicatas:
- Busque tarefas abertas:
source {user.workspace}/.env && todoist-cli list. - Busque tarefas concluídas hoje: use a API Sync do Todoist
completed/get_allcomsince=<hoje 00:00 UTC>ousource {user.workspace}/.env && todoist-cli list --filter "completed today"se suportado.
- Mesma pessoa + mesma intenção de ação = duplicata (ex.: "Mandar mensagem para Morgane sobre Hank" e "Mandar mensagem para Morgane (Braintrust) após chamada com Hank").
- Normalize: minúsculas, remova parênteses, colapse espaços em branco.
- Se duplicata existir em QUALQUER um (aberto ou concluído) → PULE, não crie.
- Busque tarefas abertas:
- Relate duplicatas puladas na saída: "⏭️ Pulada (já existe): [tarefa]".
- Por que verificar tarefas concluídas: O usuário pode já ter concluído uma tarefa criada por um cron pós-reunião mais cedo hoje. Recriá-la é errado — o trabalho está feito.
Por que ambas as camadas são importantes
Crons pós-reunião disparam por reunião. O cron diário de fim de dia processa TODAS as reuniões. Sem deduplicação em nível de reunião, a mesma reunião é processada duas vezes. Sem deduplicação em nível de tarefa, mesmo que a reunião seja reprocessada (ex.: falha na escrita do arquivo), tarefas individuais não serão duplicadas.
Deduplicação é INEGOCIÁVEL
Se uma reunião aparecer em processed-meetings-YYYY-MM-DD.json, NÃO a processe novamente em hipótese alguma — mesmo que você ache que o cron pós-reunião "pode ter perdido algo". O cron pós-reunião já cuidou dela. Se houve problemas, o usuário pedirá uma reexecução manual.
Saída
- Tarefas criadas ou rascunhos compostos → liste tarefas com breve resumo.
- Tarefas concluídas (cumpridas em reuniões) → liste com ✅.
- Sempre nomeie as reuniões específicas processadas (ex.: "da chamada com Fyxer, Braintrust weekly, HGP Staff") — nunca diga "das reuniões de hoje".
- Nenhuma reunião ou nenhum item de ação → NO_REPLY.
Cruzamento com Grain (ATIVO — verificação em nível de transcrição)
O Grain MCP está disponível com acesso completo à transcrição. Após extrair itens de ação do Granola:
- Encontre a reunião no Grain:
mcporter call grain.list_attended_meetings --args '{}'Nota: O schema do Grain não suporta filtrosstart_date/end_date. Chame com args vazios e filtre os resultados manualmente porstart_datetimepara corresponder ao intervalo de datas de hoje. - Busque a transcrição:
mcporter call grain.fetch_me... [truncado para tradução]