You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/testing/user-journey-map.md
+43Lines changed: 43 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -281,3 +281,46 @@ espaço e acento, que era o gatilho do defeito #6.
281
281
| 28 | 🟠 **CI vermelho por lentidão, não por defeito.** O teste que abre processo filho (`npx tsx`) leva ~5s e o timeout padrão do vitest é 5s — derrubou a `main` num PR que só mexia em documentação | corrigido — timeout explícito de 60s; 3 rodadas seguidas verdes. O controle positivo continua provando o aparato |
282
282
283
283
**Nota de ambiente:** o `.env` da VPS foi apontado para `ghcr.io/...:latest` durante o QA, porque o fluxo de release novo fixa a imagem numa tag (`1.1.0`) e as correções desta sessão estão à frente dela. Para voltar ao comportamento de release, basta repor `APP_IMAGE` com a tag desejada.
284
+
285
+
## RAG do tenant — implementado e provado (2026-07-30)
286
+
287
+
Autorizado pelo dono, o RAG saiu do stub. **Cinco defeitos encadeados**: cada
288
+
conserto revelava o próximo, e nenhum aparecia sem rodar de verdade.
289
+
290
+
| # | Defeito | Como apareceu |
291
+
|---|---|---|
292
+
| 29 | Handler de `knowledge_source.updated` era stub declarado | só `nuvemshop.product_synced` indexava — e a Nuvemshop vem desligada |
293
+
| 30 |`ON CONFLICT` apontava para constraint **inexistente**|*"there is no unique or exclusion constraint matching"* — TODO chunk falhava. **O mesmo alvo errado estava no caminho de produto**: o RAG nunca gravou um chunk, para nenhuma fonte |
294
+
| 31 |`token_count` é NOT NULL e ninguém preenchia |*"null value in column token_count"*|
295
+
| 32 | 🔴 Versão **vazia** era marcada `ready` e **ativada**| numa instalação com base funcionando, uma indexação com problema trocaria a base boa por uma vazia — o agente perderia o RAG em silêncio |
296
+
| 33 | Fonte tipo `policy` era criada **vazia**, conteúdo descartado | a rota só tratava `source_type === "faq"`; política enviada com markdown voltava 201 com o conteúdo no lixo |
297
+
| 34 | 🔴 Limiar padrão **0.72** descartava toda paráfrase | medido: relevante 0.49–0.85, irrelevante 0.27. Só a pergunta **literal** passava — o RAG parecia quebrado funcionando bem |
298
+
299
+
**Decisão de arquitetura tomada** (a que faltava para destravar): a reindexação
300
+
**reconstrói UMA versão com TODAS as fontes**, em vez de uma versão por fonte —
301
+
a busca recebe um único `kb_version_id` e o agente aponta para uma única versão
302
+
ativa; uma versão por fonte faria o FAQ desativar o catálogo e vice-versa.
303
+
304
+
**Prova final, medida:** FAQ (4 itens) + Política (2 itens) → versão 5 com 6
305
+
chunks, ativa. Busca atravessando as duas fontes:
306
+
307
+
| Pergunta | Acerto | Semelhança |
308
+
|---|---|---|
309
+
| "quanto tempo demora pra chegar em BH?" | FAQ — prazo BH | 0.653 |
310
+
| "e se eu quiser devolver o produto?" | Política — devolução | 0.649 |
311
+
| "tem garantia?" | Política — garantia | 0.690 |
312
+
| "aceita pix?" | FAQ — pagamento | 0.490 |
313
+
314
+
E a tela ganhou o cadastro que faltava: o botão "Configurar" era stub `disabled`
315
+
com um toast que nunca aparecia.
316
+
317
+
## Áudio do WhatsApp
318
+
319
+
| # | Defeito | Estado |
320
+
|---|---|---|
321
+
| 35 | 🔴 **A transcrição mandava a chave da Anthropic para a OpenAI.** O Whisper é da OpenAI, mas recebia `llm.apiKey` (provedor de chat da org) → `transcription_401` em toda tentativa, com a `OPENAI_API_KEY` certa no `.env`| corrigido — fallback de ambiente para OpenAI, simétrico ao que a Anthropic já tinha |
322
+
| 36 | 🟠 **O agente responde ANTES de a mídia ser derivada** — dispatch às 20:24:22, derivação pedida às 20:25:03 |**aberto**: é ordenação de pipeline, não conserto pontual |
0 commit comments