Corrige bug real de idempotencia: message_hash nao deve fazer parte do send_key
Bug encontrado AO VIVO durante o teste controlado de envio (secao 14): a IA (gpt-5.5) nao e deterministica. Duas chamadas para o MESMO periodo (mesmo report_type+data) geraram insights com textos diferentes, portanto message_hash diferente, portanto send_key diferente — o retry do MESMO periodo passou pela deteccao de duplicata como se fosse outro relatorio. Resultado real: 3 mensagens verdadeiras enviadas ao canal C0BJNBTPFT5 para o periodo 'diario 2026-08-24' antes de eu interromper e corrigir (execucoes 16744, 16746 e uma terceira ja em voo quando a guarda foi revertida). Estado revertido imediatamente (DEV_MODE/SHADOW_MODE=true, workflow desativado) assim que o padrao foi identificado. Correcao: src/v2/sendGuard.js#buildSendKey agora usa so report_type+period_start+period_end+destination (SEM message_hash) — a identidade de um relatorio e o PERIODO, nao o texto exato produzido pela IA. message_hash continua calculado e armazenado, so para diagnostico. As 3 linhas reais gravadas na Data Table dev_glpi_v2_send_log foram normalizadas manualmente (send_key sem sufixo de hash) para que a protecao de duplicata funcione corretamente para qualquer nova tentativa do mesmo periodo daqui pra frente. Testes novos: sendGuard.test.js e pipeline.test.js ganharam testes de regressao reproduzindo exatamente este cenario (retry do mesmo periodo com aiCall/mensagem diferente -> send_key igual -> duplicata bloqueada). Canal Slack real confirmado nesta sessao: D06JK4GEK8E (DM) foi tentado primeiro e falhou com channel_not_found (bot sem acesso); o usuario optou por reaproveitar C0BJNBTPFT5 (canal do workflow irmao Coordenador GLPI, onde o bot ja e membro). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
f6f12c53d8
commit
9475e68cb1
+3
-1
@@ -213,12 +213,14 @@ function buildReport(input, config) {
|
||||
// fornecidos pelo Code node do n8n a partir de $execution.mode e da
|
||||
// Data Table de log de envios. Ver src/v2/sendGuard.js.
|
||||
const messageHash = computeMessageHash(mensagemV2);
|
||||
// send_key identifica o PERIODO (nao o texto exato — ver comentario em
|
||||
// sendGuard.js#buildSendKey). message_hash continua calculado e guardado
|
||||
// a parte, so para diagnostico.
|
||||
const sendKey = buildSendKey({
|
||||
reportType: period.history_bucket || period.tipo_periodo,
|
||||
periodStart: period.data_inicio,
|
||||
periodEnd: period.data_fim,
|
||||
destination: config.SLACK_DESTINATION || 'destino_nao_configurado',
|
||||
messageHash,
|
||||
});
|
||||
const guarda = canSend({ triggerType: input.triggerType, config });
|
||||
const jaEnviado = (input.sendLogRows || []).some(
|
||||
|
||||
Reference in New Issue
Block a user