diff --git a/.changes/agente-nao-se-apresenta-como-assistente-virtual-sozinho.md b/.changes/agente-nao-se-apresenta-como-assistente-virtual-sozinho.md new file mode 100644 index 000000000..5cfd5fc90 --- /dev/null +++ b/.changes/agente-nao-se-apresenta-como-assistente-virtual-sozinho.md @@ -0,0 +1,15 @@ +--- +impacto: nada_mudou +secao: corrigido +titulo: O agente para de se apresentar como assistente virtual contra as instruções dele +--- + +O texto de base que o sistema coloca antes das instruções de todo agente +mandava ele "se apresentar como assistente virtual" na primeira interação. Quem +escrevia na tela do agente um nome próprio e pedia para não usar esse termo via o +agente repetir "assistente virtual" mesmo assim, porque as duas ordens chegavam +juntas. A apresentação agora fica com as instruções do agente; continua valendo +que ele nunca afirma ser humano e responde com honestidade se perguntarem. + +Vale para instalações novas. Em instalação existente o texto de base já gravado +no banco não é trocado sozinho. Crédito: @rafaelbatistazz. diff --git a/lib/agent-engine/playbooks/platform.md b/lib/agent-engine/playbooks/platform.md index 49a72e0e0..e47f21db9 100644 --- a/lib/agent-engine/playbooks/platform.md +++ b/lib/agent-engine/playbooks/platform.md @@ -7,14 +7,17 @@ ## Identidade -Você é um assistente virtual de vendas. Você conversa por WhatsApp em nome da -empresa da organização, sempre em português do Brasil, com naturalidade e -respeito. +Você conversa por WhatsApp em nome da empresa da organização, sempre em +português do Brasil, com naturalidade e respeito. Nome, apresentação e persona +vêm das instruções do agente, logo abaixo desta camada. ## Transparência -- Na primeira interação de uma conversa, apresente-se como assistente virtual. -- Nunca finja ser humano; se perguntarem, confirme que é um assistente virtual. +- Apresente-se como as instruções do agente definem. Não acrescente por conta + própria "assistente virtual", "robô" ou "IA" à apresentação. +- Nunca afirme ser humano. Se a pessoa perguntar diretamente se está falando + com um robô ou uma IA, responda com honestidade, em uma frase, e retome o + atendimento. - Se a pessoa pedir para falar com um humano, acolha o pedido de imediato — a transferência é feita pelo sistema, você apenas confirma que vai acontecer. diff --git a/tests/invariants/playbook-seed.test.ts b/tests/invariants/playbook-seed.test.ts index 69248f648..179ba8c6b 100644 --- a/tests/invariants/playbook-seed.test.ts +++ b/tests/invariants/playbook-seed.test.ts @@ -80,7 +80,7 @@ describe("seedPlatformPlaybook (boot do worker, self-host)", () => { const loaded = await loadPlaybook(pool, ORG); expect(loaded.prompt).toContain("=== playbook:platform ==="); - expect(loaded.prompt).toContain("assistente virtual"); + expect(loaded.prompt).toContain("Nunca afirme ser humano"); expect(loaded.versionIds.platform).toBe(after.pointerVersionId); }); diff --git a/tests/unit/playbook-plataforma-nao-impoe-apresentacao.test.ts b/tests/unit/playbook-plataforma-nao-impoe-apresentacao.test.ts new file mode 100644 index 000000000..4be16d4a4 --- /dev/null +++ b/tests/unit/playbook-plataforma-nao-impoe-apresentacao.test.ts @@ -0,0 +1,44 @@ +import { readFileSync } from "node:fs"; +import path from "node:path"; + +import { describe, expect, it } from "vitest"; + +/** + * A CAMADA PLATAFORMA NÃO DITA COMO O AGENTE SE APRESENTA. + * + * ## O defeito que fez este teste existir + * + * `platform.md` entra no prompt ANTES das instruções do agente, em todo turno, e mandava + * "Você é um assistente virtual de vendas" e "Na primeira interação, apresente-se como + * assistente virtual". O dono que escreve na tela "me chamo Clara, da loja — nunca diga + * que é assistente virtual" recebia duas ordens contrárias no mesmo prompt, e o modelo + * obedecia a da plataforma várias vezes por conversa. Medido numa instalação real + * (gpt-5.6-luna, painel de Teste): "assistente virtual" voltava mesmo com a proibição + * explícita no prompt do agente. + * + * Apresentação é persona, e persona é do agente. O que é compliance — não afirmar ser + * humano, responder com honestidade quando perguntam — continua aqui, e o gate + * `disclosure` (template por organização) segue sendo o caminho de quem QUER a frase fixa. + * + * ## O que este teste NÃO prova + * + * Que o modelo obedece. Ele só garante que a ordem contrária saiu do texto semeado, e que a + * regra de não afirmar ser humano ficou. E só alcança instalação NOVA: o seed não toca em + * ponteiro existente (regra dura nº 10). + */ +const PLATFORM = readFileSync( + path.join(process.cwd(), "lib", "agent-engine", "playbooks", "platform.md"), + "utf8", +); + +describe("platform.md não impõe apresentação ao agente", () => { + it("não manda se apresentar como assistente virtual", () => { + expect(PLATFORM).not.toMatch(/apresente-se como assistente virtual/i); + expect(PLATFORM).not.toMatch(/Você é um assistente virtual/i); + }); + + it("mantém a regra de não afirmar ser humano e de responder com honestidade", () => { + expect(PLATFORM).toMatch(/Nunca afirme ser humano/); + expect(PLATFORM).toMatch(/responda com honestidade/); + }); +});