Job | meeting-signals
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
| Fonte | O que ler |
|---|---|
| Todas as atas modificadas nas últimas 2h | vault.find_meetings(hours=2) |
memory/sessions/*_meeting-signals.md | Atas já processadas (por hash, para idempotência) |
| Arquivos canônicos de destino | 00-projeto/canonico/{decisoes,riscos,gaps,dependencias}.md + TASKS.md + DEFINICOES.md |
4. Processo
Passo 1 — Identificar atas não processadas
modified = vault.find_meetings(hours=2)- Para cada arquivo, calcular
vault.file_hash(path) - Comparar com
memory/context/processed-meetings.md(lista de hashes já promovidos) - 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:
- Decisão → adicionar entrada em
00-projeto/canonico/decisoes.mdno topo, seguindo formato existente. Linkar a ata de origem. - Risco → nova linha em
riscos.mdcom ID sequencialR-NNN(next_id("R-")). Se descrição é muito parecida com risco existente (fuzzy match >= 85%), atualizar o existente em vez de duplicar. - Gap → nova linha em
gaps.mdcomG-NNN. Mesma regra de dedup. - Dependência → nova linha em
dependencias.mdcomD-NNN. - Task → nova linha em
TASKS.mdna tabela “curto prazo” comT-NNN. Origem = link da ata. - Definição operacional → entrada em
DEFINICOES.mdna seção do tema.
Regra de autonomia (desde 2026-04-22): Axios pode promover diretamente (autonomia full). Para cada sinal promovido:
- Adicionar
created-by: axiosno 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
- Adicionar hash da ata em
memory/context/processed-meetings.md - Gravar sessão
memory/sessions/YYYY-MM-DD_meeting-signals.md
5. Output
| Destino | Conteúdo |
|---|---|
00-projeto/canonico/*.md | Novas linhas (decisões, riscos, gaps, dependências) |
TASKS.md | Novas linhas de task |
DEFINICOES.md | Novas entradas de definição operacional |
| Slack canal principal | 1 post por ata processada |
memory/context/processed-meetings.md | Hash 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-axiosno 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: draftou#draftno frontmatter - Se a ata é
_meeting_minutes.md(bruta) e existe_meeting_summary.mdpara 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.