fix(rag): brain_get_document + unifica indexação + config FTS + coalescência#145
Merged
Conversation
…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>
This was referenced Jun 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 porsource_url/source_id, remontado de todos os chunks na ordem original (stitchDocumentremove header repetido + overlap). SQL puro, sem quota, scoping multi-tenant idêntico aobrainSearch. Conteúdo de terceiros cercado (<<<untrusted>>>).indexSinglePage(on-demandbrain_index_url) agora delega aindexDocument, 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".searchKeywordusaplainto_tsquery('portuguese_unaccent'), casando a config do índicetsv(era'portuguese', quebrando busca accent-insensitive no lado da query).target(um roteiro de 14### CENA Nnão vira mais 14 micro-chunks).brain_get_documentpara conteúdo íntegro ("nunca reconstrua somando brain_search").Verificação por máquina
npm run buildlimpo,npm test1265/1265 (17 testes novos, 0 skip).brain_searchnão recupera doc inteiro (invariante consciente), FTS usa a config do índice,stitchDocument,getDocumentChunks(pin de account_id + order by chunk_index),pageToIndexableDocument.npm run evalna VPS vs baseline (mudança em search/chunker).🤖 Generated with Claude Code