Job | meeting-signals

axios job meeting

1. Propósito

Detectar atas novas ou modificadas em **/meetings/ e **/reunioes/, extrair sinais (decisões, riscos, gaps, dependências, tarefas), promover automaticamente às camadas canônicas e avisar no Slack.

Este job operacionaliza o runbook-promover-sinais.


2. Gatilho

  • Cron: */15 * * * * (a cada 15 min, 24/7)
  • Janela: qualquer horário; se detectar ata fora de janela comercial, posta no Slack mas não faz DMs individuais até 09:00 do dia seguinte
  • Skip: se a ata não tem seção “Decisions Made” ou equivalente — provavelmente não é uma ata completa ainda (rascunho)

3. Input

FonteO que ler
Todas as atas modificadas nas últimas 2hvault.find_meetings(hours=2)
memory/sessions/*_meeting-signals.mdAtas já processadas (por hash, para idempotência)
Arquivos canônicos de destino00-projeto/canonico/{decisoes,riscos,gaps,dependencias}.md + TASKS.md + DEFINICOES.md

4. Processo

Passo 1 — Identificar atas não processadas

  1. modified = vault.find_meetings(hours=2)
  2. Para cada arquivo, calcular vault.file_hash(path)
  3. Comparar com memory/context/processed-meetings.md (lista de hashes já promovidos)
  4. Restante = atas a processar nesta execução

Passo 2 — Para cada ata

Usar Claude para extrair sinais com o prompt:

Você é o Axios. Esta é uma ata de reunião do projeto Colliers × Costal.
Extraia os seguintes sinais, RETORNANDO JSON estrito:

{
  "decisoes": [
    {"titulo": "...", "contexto": "1 frase", "data": "YYYY-MM-DD"}
  ],
  "riscos": [
    {"descricao": "...", "impacto": "baixo|médio|alto|crítico",
     "probabilidade": "baixa|média|alta", "dono": "...", "prazo": "...",
     "mitigacao": "..."}
  ],
  "gaps": [
    {"descricao": "...", "impacto": "...", "dono": "...", "prazo": "..."}
  ],
  "dependencias": [
    {"item": "...", "depende_de": "...", "tipo": "entrega|decisão|acesso|dado|sistema|aprovação",
     "dono": "..."}
  ],
  "tasks": [
    {"descricao": "...", "owner": "...", "prazo": "...", "frente": "costal|colliers|anouk-interno|geral"}
  ],
  "definicoes_operacionais": [
    {"tema": "Ritmo|Papéis|Ferramentas|Escopo|Onboarding", "titulo": "...", "definicao": "..."}
  ]
}

Regras:
- Marque `[fato]`, `[hipótese]`, `[premissa]`, `[gap]` no contexto quando aplicável
- Se não encontrar sinais de algum tipo, retorne array vazio
- Ignore discussões exploratórias sem conclusão

Passo 3 — Promover automaticamente

Para cada sinal extraído:

  1. Decisão → adicionar entrada em 00-projeto/canonico/decisoes.md no topo, seguindo formato existente. Linkar a ata de origem.
  2. Risco → nova linha em riscos.md com ID sequencial R-NNN (next_id("R-")). Se descrição é muito parecida com risco existente (fuzzy match >= 85%), atualizar o existente em vez de duplicar.
  3. Gap → nova linha em gaps.md com G-NNN. Mesma regra de dedup.
  4. Dependência → nova linha em dependencias.md com D-NNN.
  5. Task → nova linha em TASKS.md na tabela “curto prazo” com T-NNN. Origem = link da ata.
  6. Definição operacional → entrada em DEFINICOES.md na seção do tema.

Regra de autonomia (desde 2026-04-22): Axios pode promover diretamente (autonomia full). Para cada sinal promovido:

  • Adicionar created-by: axios no metadado do item
  • Adicionar source-meeting: <link-relativo> para rastreabilidade

Passo 4 — Avisar no Slack

Compor uma mensagem no canal principal:

📝 Processei a ata [[link ata]] e promovi:
- Decisões (2): [títulos curtos]
- Riscos (1): R-XXX [descrição curta]
- Gaps (3): G-XXX, G-XXX, G-XXX
- Tasks (5): T-XXX... T-XXX

Link canônico de cada item nos arquivos:
- 📘 decisoes.md
- ⚠️ riscos.md
- 🕳️ gaps.md
- 🔗 dependencias.md

Se algum está errado ou duplicado, reage com 👎 nesta mensagem que eu reverto.

Adicionar reação 📝 à mensagem para marcar “processado”.

Passo 5 — Persistir hash e logar

  1. Adicionar hash da ata em memory/context/processed-meetings.md
  2. Gravar sessão memory/sessions/YYYY-MM-DD_meeting-signals.md

5. Output

DestinoConteúdo
00-projeto/canonico/*.mdNovas linhas (decisões, riscos, gaps, dependências)
TASKS.mdNovas linhas de task
DEFINICOES.mdNovas entradas de definição operacional
Slack canal principal1 post por ata processada
memory/context/processed-meetings.mdHash registry
memory/sessions/...Log

6. Guardrails específicos

  • Nunca remover ou alterar entrada canônica existente sem aprovação (só pode adicionar)
  • Dedup: fuzzy match antes de criar duplicatas. Se em dúvida, criar #revisar-axios no novo item e avisar Pedro
  • Escalação: se a ata marca explicitamente algo como crítico ou urgente e o risco tem impacto Alto × Prob Alta, mencionar Pedro no Slack com <@U_PEDRO>
  • Não promover sinais de atas marcadas com status: draft ou #draft no frontmatter
  • Se a ata é _meeting_minutes.md (bruta) e existe _meeting_summary.md para a mesma data+tópico, usar o summary (é a versão curada)

7. Critério de sucesso

  • Atas novas (últimas 2h) foram processadas
  • Cada sinal tem ID + owner + rastreabilidade para ata de origem
  • Slack post gerado com resumo
  • Hash registrado em processed-meetings.md
  • Zero duplicatas (fuzzy match funcionando)

8. Falha e retry

  • Se o JSON do Claude é mal-formado: tentar 2× mais, depois fallback para prompt mais estrito
  • Se a escrita em canônico falha (permission, lock, conflito): abortar promoção daquele item, logar feedback, não postar no Slack
  • Erro total: DM ao Pedro

9. Memória

  • memory/context/processed-meetings.md — hash → path → timestamp. Permanente.
  • memory/sessions/YYYY-MM-DD_meeting-signals.md — por execução. Inclui quais sinais foram promovidos e seus IDs gerados.

10. Referências