fix(prospecting): o hash da versão trata inbound_debounce_ms nulo como ausente

O setup do agente de prospecção grava na criação o hash da versão montada, a
partir do objeto parseado, que não tem a chave `inbound_debounce_ms`. Depois ele
confere esse hash contra a linha lida do banco, onde a coluna nova da 0498 vem
`null`. Os dois hashes divergiam, e o setup recusava com "O rascunho foi alterado"
ou "O conteúdo do agente mudou" nas 5 specs de
tests/invariants/prospecting-agent-setup.test.ts (invariants vermelho no #1997).

`trigger_config` já tinha essa exceção. A lista passa a nomear as duas colunas.

Medido: test:db do arquivo, 8/8 com o conserto; sabotado (coluna fora da
lista), 5 failed | 3 passed, as mesmas 5 do CI; restaurado e conferido por grep.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
melgarafael
2026-09-30 11:00:38 -03:00
co-authored by Claude Opus 5.5
parent d645fe8fb9
commit ef05841653
+9 -3
View File
@@ -180,15 +180,21 @@ interface SetupMetadata {
proposal_hash?: string;
prepared_only?: boolean;
}
// Colunas em que `null` na linha do banco é o mesmo que ausente na versão montada: o hash
// gravado na criação parte do objeto parseado (sem a chave), e a conferência parte da
// linha lida (com `null`). Sem esta lista os dois hashes divergem e o setup recusa com
// "O rascunho foi alterado" — o que a 0498 (inbound_debounce_ms) fez nas 5 specs de
// tests/invariants/prospecting-agent-setup.test.ts.
// ponytail: lista explícita; coluna nullable nova em ai_agent_versions entra aqui (#2004).
const NULO_E_AUSENTE = new Set(["trigger_config", "inbound_debounce_ms"]);
function versionHash(row: Record<string, unknown>) {
const keys = Object.keys(versionCreateSchema.shape);
return hash(
versionCreateSchema.parse(
Object.fromEntries(
keys
.filter(
(key) => row[key] !== undefined && !(key === "trigger_config" && row[key] === null),
)
.filter((key) => row[key] !== undefined && !(NULO_E_AUSENTE.has(key) && row[key] === null))
.map((key) => [key, row[key]]),
),
),