Skip to content

fix(google-search): bloqueia temas eleitorais antes da busca [CHATR-294] - #190

Merged
jmaurodev merged 1 commit into
mainfrom
fix/CHATR-294-filtro-eleitoral-google-search
Oct 14, 2026
Merged

jmaurodev merged 1 commit into
mainfrom
fix/CHATR-294-filtro-eleitoral-google-search

Conversation

@jmaurodev

Copy link
Copy Markdown
Collaborator

Filtro de temas eleitorais na busca do MCP

O que foi feito

  • Filtro determinístico no topo de get_google_search, antes do Typesense e do Gemini.
  • Whitelist (regex) e blacklist (palavra inteira) convivem. A whitelist decide o que entra, a blacklist sempre pode vetar e, sem lista configurada, a busca opera normalmente.
  • Blacklist inicial com os 14 candidatos do 2º turno de 25/10 (fonte: TSE) e termos eleitorais, no arquivo versionado query_filter.yaml.
  • Query barrada recebe um texto fixo, igual para qualquer candidato, como sucesso, e não como isError.
  • Observabilidade: search.filter.* no span, linha com source=query_filter no BigQuery e log por bloqueio.
  • Dataset rotulado de 260 queries com runner offline/MCP em src/tests/e2e/filtro_query/: 260/260.
  • Registro das decisões e colisões aceitas em docs/decisions/CHATR-294-filtro-eleitoral.md.

Motivo

  • Em 09/10/2026 o chatbot informou o número eleitoral de um candidato e disse não encontrar o do outro (CHATR-294, relatório anexado). Nenhuma camada barrava o tema.
  • Esta é a camada 3 de 3. As outras são o prompt do agente e o subagent offtopic. Só prompt não basta, porque a assimetria veio da variação do modelo e do buscador.

Impacto

  • Afeta só a tool google_search. web_search_surkai e dharma_search_tool estão desligadas em produção (EXCLUDED_TOOLS).
  • Uma query bloqueada responde em cerca de 10 ms e não chama Typesense nem Gemini.
  • Colisões aceitas conscientemente (D10 do documento), por exemplo "Bolsa Família do Lula" e "eleição do conselho tutelar". A knowledge base responde antes do MCP.
  • Única dependência nova: pyyaml 6.0.3, sem CVE. O bump das transitivas com CVE herdadas da main vai em PR próprio.

Enquanto a whitelist não for entregue

  • Ela fica vazia e só a blacklist atua. Quando chegar, entra por PR no YAML e exige uma nova versão da aplicação, porque as listas são lidas só na subida do pod.

Antes do deploy em produção

  • Validação de negócio da lista de candidatos (D6).

🤖 Generated with Claude Code

Em 09/10/2026 o chatbot informou o número eleitoral de um candidato à
Presidência e disse não encontrar o do outro. A diferença veio do ranking do
Google, não de regra, e nenhuma camada barrava o tema.

- Filtro determinístico no topo de get_google_search, antes do Typesense e
  do Gemini. Strategy: AllowAll, Blacklist, Whitelist e Composite; a
  whitelist (regex) decide o que entra e a blacklist sempre pode vetar.
- Blacklist por palavra inteira sobre texto normalizado (sem acento, caixa,
  pontuação e caracteres invisíveis): candidatos do 2º turno (TSE) e termos
  eleitorais, em query_filter.yaml versionado.
- Query barrada recebe texto fixo, igual para qualquer candidato, como
  sucesso (não isError). Motivo e termo vão para span, BigQuery e log.
- Dataset rotulado de 260 queries e runner offline/MCP em
  src/tests/e2e/filtro_query; decisões em
  docs/decisions/CHATR-294-filtro-eleitoral.md.
- pyyaml declarada explicitamente (já vinha transitiva, sem CVE).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

🚦 PR Quality Gate Summary

Check Result
Lint Passed
Security Scan Passed
Tests + Coverage Passed
Build + Scan + Smoke Passed

📊 Coverage

  • Current: 74.76%
  • Baseline: 68.40%
  • Minimum: 62.00%
  • Delta: +6.36 pp
  • Status: Passed

✅ All quality checks passed

@jmaurodev
jmaurodev merged commit c4da1d1 into main Oct 14, 2026
9 checks passed
@jmaurodev
jmaurodev deleted the fix/CHATR-294-filtro-eleitoral-google-search branch October 14, 2026 18:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant