Files
SLACK_COORD_RELATORIO/docs/AI_PROJECT_STATE.md
T
2026-10-01 14:23:46 -03:00

5.7 KiB

Estado do Projeto — Coordenador GLPI

Última atualização: 2026-09-27 (revisão de documentação; último estado live verificado por execução real: 2026-08-25).

O que é

Workflow n8n que roda seg-sex 08:00 (America/Sao_Paulo), lê chamados abertos do GLPI (MySQL, read-only), classifica cada um com IA e envia no Slack os 10 que precisam de ação humana hoje. Duas gerações no repo: V2 (ativo, n8n/ + logic/) e V1 (legado, Coordenador GLPI - Chamados Abertos Slack.n8n.json na raiz — nunca foi importado no n8n de produção, existe só como rollback).

Estado de produção (n8n instance, workflow id y6JFEnp7Z2IJEUe2)

Confirmado por n8n_get_workflow em 2026-08-25 após ativação explícita autorizada pelo usuário ("pode ativar em produção"):

  • active: true
  • Config node: ENVIRONMENT=production, SEND_ENABLED=true, FORCE_SEND=false
  • Schedule Trigger conectado, cron 0 8 * * 1-5, settings.timezone=America/Sao_Paulo
  • 43 nodes, nenhum webhook temporário de debug presente
  • Credenciais live: MySQL GLPI (id dsVj1nmOIXRvix9n), Slack Slack - Bot Coordenador (Chamados Suporte) (id lNqwBBrtLfkRqw2X), OpenAI OpenAI - Coordenador GLPI (id WUGriAn5FgCiLza2)
  • Slack destino: canal chamados-suporte (id C0BJNBTPFT5)

Este arquivo não substitui uma verificação live. Se for tomar qualquer decisão que dependa do estado atual (reativar, mudar config, investigar um envio), reconfirme com n8n_get_workflow / n8n_executions antes — não assuma que nada mudou desde 25/08 só porque este arquivo diz isso.

Limpeza pós-ativação (2026-08-25)

Durante a fase de correção final, execuções de teste reais enviaram mensagens ao Slack para ~37 tickets, gravando last_sent_at/times_sent/ consecutive_days_sent na Data Table coordenador_glpi_memoria. Isso foi resetado manualmente (last_sent_at, times_sent, times_sent_30d, consecutive_days_sent → null para essas linhas) para que o primeiro envio real de produção não sofresse penalidade de cooldown por causa do teste. last_context_hash/ai_classification/next_action foram preservados (não há motivo para reclassificar de novo o que não mudou no GLPI).

Arquitetura (resumo — detalhe completo no README.md)

GLPI (MySQL read-only) -> candidatos -> normalização -> cache de classificação
(Data Table, chave = hash do contexto + AI_CLASSIFIER_VERSION) -> IA (OpenAI,
só quem mudou) -> score determinístico -> Top10 com diversidade por grupo
(desempate por ticket.id — ver "bugs reais corrigidos") -> guard de envio
(SEND_ENABLED + FORCE_SEND + idempotência por hash da mensagem) -> Slack
-> shadow-diff contra query legada do V1 (auditoria, não bloqueia)

logic/*.js é lógica pura testável (node --test, 171/171 passando em 2026-09-27). n8n/nodes/*.node.js são drivers finos que tools/build-workflow.js inlina dentro de n8n/workflow.template.json para gerar n8n/deployed/coordenador-glpi-v2.n8n.json.

O template local (ENVIRONMENT=dev, SEND_ENABLED=false) diverge de propósito do live (production/true) — ver README.md seção "Build" para a tabela completa e o motivo (template = default seguro para reimportação; promoção para produção é ato manual e auditável, não algo que rebuild reverte).

Bugs reais corrigidos (histórico — não reabrir sem nova evidência)

  1. WAITING_*/bloqueados entrando no Top10 via contextChanged — corrigido em logic/cooldown.js.
  2. Rótulo fixo "Validar e executar" sempre vencendo o next_action real da IA — corrigido em logic/message.js (shortActionLabel).
  3. Crítico: Top10 não-determinístico (empate de score desempatado pela ordem de chegada dos itens, que o n8n não garante entre branches paralelos) causou envio real duplicado com conteúdo diferente no mesmo dia. Corrigido com desempate por ticket.id em logic/diversity.js. Regressão em logic/diversity.test.js.
  4. alwaysOutputData faltando em Data Table - Buscar Envios Recentes quebraria o caminho feliz todo dia sem envio prévio (0 linhas = n8n não roda os nodes seguintes).
  5. columns.mappingMode faltando nos nodes de insert da Data Table de envio (Cannot convert undefined or null to object).
  6. Rodapé de atribuição automática do n8n no Slack (includeLinkToWorkflow) — desligado explicitamente.
  7. Falta de escopo OAuth (channels:join) causando not_in_channel mesmo com o bot já no canal — resolvido reinstalando o app Slack com o escopo.

Detalhe completo de cada um, com execução real que provou a causa raiz, em docs/superpowers/notes/2026-08-25-relatorio-correcao-final.md e 2026-08-25-relatorio-finalizacao-producao.md.

Restrições que continuam valendo (não renegociar sem pedido explícito do usuário)

  • GLPI é estritamente somente leitura — nenhuma escrita, nunca.
  • V1 nunca é apagado; é o rollback.
  • Não recalibrar pesos de score/diversidade/pool sem bug real comprovado.
  • Segredos só via credential store do n8n — nunca em arquivo do repo.
  • Execução manual nunca envia de verdade sem FORCE_SEND=true (proteção contra teste acidental em produção).

Onde olhar primeiro

  • Dúvida sobre comportamento atual do workflow → n8n_get_workflow (live), não os arquivos deste repo (o repo é a fonte de verdade da lógica, não necessariamente da config live, ver seção "Build" do README).
  • Dúvida sobre por que uma decisão de design foi tomada → docs/superpowers/specs/2026-08-24-coordenador-glpi-v2-design.md e docs/superpowers/plans/2026-08-24-coordenador-glpi-v2.md.
  • Dúvida sobre um bug específico já corrigido → notas datadas em docs/superpowers/notes/, mais recente primeiro.