110 lines
5.7 KiB
Markdown
110 lines
5.7 KiB
Markdown
# 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.
|