# 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.