Skip to content

fix(rag): brain_get_document + unifica indexação + config FTS + coalescência#145

Merged
BrunooMoniz merged 1 commit into
mainfrom
fix/rag-doc-retrieval
Jun 18, 2026
Merged

fix(rag): brain_get_document + unifica indexação + config FTS + coalescência#145
BrunooMoniz merged 1 commit into
mainfrom
fix/rag-doc-retrieval

Conversation

@BrunooMoniz

Copy link
Copy Markdown
Owner

Contexto

Diagnóstico de jun/2026: a "gambiarra do roteiro A Ervilha". O assistente (claude.ai via OAuth = superfície friend) não tinha como ler uma página conhecida inteira — só RAG por chunks — então remontava o documento com várias buscas semânticas + include_neighbors, gastando tokens e arriscando a fidelidade (chegou a adivinhar uma cena).

O que este PR faz (Bloco A do plano)

  • brain_get_document (nova tool, owner+friend): devolve o TEXTO COMPLETO de um documento já indexado por source_url/source_id, remontado de todos os chunks na ordem original (stitchDocument remove header repetido + overlap). SQL puro, sem quota, scoping multi-tenant idêntico ao brainSearch. Conteúdo de terceiros cercado (<<<untrusted>>>).
  • Unificação da indexação: indexSinglePage (on-demand brain_index_url) agora delega a indexDocument, o mesmo caminho do indexer agendado. Re-indexar pela tool passa a prepender o context header (título) em todo chunk — fim da divergência que era a raiz do "ervilha vazio".
  • Fix do FTS: searchKeyword usa plainto_tsquery('portuguese_unaccent'), casando a config do índice tsv (era 'portuguese', quebrando busca accent-insensitive no lado da query).
  • Coalescência do chunker: funde seções pequenas adjacentes até target (um roteiro de 14 ### CENA N não vira mais 14 micro-chunks).
  • Instruções owner+friend apontam brain_get_document para conteúdo íntegro ("nunca reconstrua somando brain_search").

Verificação por máquina

  • npm run build limpo, npm test 1265/1265 (17 testes novos, 0 skip).
  • Testes-âncora: brain_search não recupera doc inteiro (invariante consciente), FTS usa a config do índice, stitchDocument, getDocumentChunks (pin de account_id + order by chunk_index), pageToIndexableDocument.
  • Pendente antes do merge: npm run eval na VPS vs baseline (mudança em search/chunker).

🤖 Generated with Claude Code

…scência

Mata a "gambiarra do roteiro": o assistente (superfície friend/OAuth) não tinha
como ler uma página conhecida inteira (só RAG por chunks), então remontava o
documento com várias buscas semânticas, gastando tokens e arriscando a fidelidade.

- brain_get_document: nova tool (owner+friend) que devolve o TEXTO COMPLETO de um
  documento indexado por source_url/source_id, remontado de todos os chunks na
  ordem (stitchDocument: tira o header repetido + o overlap). SQL puro, sem quota,
  scoping multi-tenant igual ao brainSearch. Conteúdo de terceiros vem cercado.
- indexSinglePage agora delega a indexDocument (mesmo caminho do indexer agendado):
  re-indexar pela tool passa a prepender o context header (título) em todo chunk.
  Fim da divergência on-demand/agendado (raiz do "ervilha vazio").
- searchKeyword usa plainto_tsquery('portuguese_unaccent'), casando a config do
  indice tsv (era 'portuguese' -> accent-insensitive quebrava no lado da query).
- chunker: coalescencia de secoes pequenas adjacentes ate target (um roteiro de 14
  '### CENA N' nao vira mais 14 micro-chunks).
- Instrucoes owner+friend apontam brain_get_document para conteudo integro.
- extractNotionId extraido para notion-id.ts (puro, sem arrastar os clients).
- Testes-ancora: brain_search nao recupera doc inteiro (invariante consciente),
  FTS usa a config do indice, stitchDocument, getDocumentChunks, pageToIndexableDocument.

Diagnostico jun/2026. 17 testes novos; build+test verdes (1265/1265).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@BrunooMoniz BrunooMoniz merged commit d3d1433 into main Jun 18, 2026
3 checks passed
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