fix(rag): trecho que não grava derruba a indexação em vez de ativar versão furada - #747
Conversation
…ersão furada O upsert de um trecho que voltava com erro virava só console.warn. Com pelo menos um trecho gravado, o fim do laço marcava a versão como pronta e a ativava — o acervo entrava no ar faltando pedaço, e a versão anterior, completa, saía de cena. Agora qualquer trecho não gravado é falha explícita: markVersionFailed com as posições e as mensagens, retorno de erro com o detalhe trechos_nao_gravados:N, e nem markVersionReady nem activateVersion são chamados — a versão anterior segue ativa. Sem trecho nenhum gravado, o detalhe continua sendo nenhum_trecho_gravado. testes: tests/unit/rag-nao-ativa-versao-incompleta.test.ts cobre os quatro cenários (tudo grava; parcial; nenhum; embedding falha no 1º trecho), com a versão mockada e o upsert de ai_chunks falhando por posição.
|
@webtecnica is attempting to deploy a commit to the rafael-maudibrasil's projects Team on Vercel. A member of the Team first needs to authorize it. |
ECC Tools / Security EvidenceCommit: Security evidence gate passed (success) No security-sensitive scanner-evidence gap detected. Mode: enforce Scanned 3 changed file(s). No missing scanner-evidence signal was detected. Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / PR Risk TaxonomyCommit: PR taxonomy review recommended (neutral) Detected 1 PR taxonomy bucket(s): CI/CD Recommendation. Scanned 3 changed file(s). Roadmap taxonomy buckets: CI/CD RecommendationCI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work. Signals:
Paths:
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
ECC Tools / Reference Set ReadinessCommit: Reference set readiness gaps detected (neutral) Reference evidence present for 1/7 areas (14%) across 3 changed file(s). This check is based on files changed in this PR. Repository-level readiness is still reported by
Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
|
Recebido, @webtecnica — obrigado por isto. Duas coisas que vão parecer erro seu e não são:
Um mantenedor vai revisar de verdade — rodando os gates e reproduzindo o comportamento, não só Esta mensagem é automática e não diz nada sobre o seu PR: ela é sobre o processo. O que vem |
ECC Tools / Hosted Promotion ReadinessCommit: Hosted promotion readiness passed (success) No hosted promotion evidence gaps detected across 3 changed file(s); 0 corpus scenarios had matching evidence. This check compares PR file changes against the evaluator/RAG promotion corpus in No evaluator corpus scenarios matched this PR. Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission. |
O que este PR faz
O indexador de RAG deixa de ativar uma versão quando trechos não foram gravados: falha parcial agora derruba a indexação em vez de marcar a versão furada como pronta.
Antes,
indexarFonteacumulava os upserts e, se algum trecho falhasse (sem que todos falhassem), seguia paramarkVersionReady+activateVersion— a versão entrava no ar faltando trecho e a falha só aparecia depois, no atendimento.Closes #675
Como resolve
workers/rag-indexer.ts— as falhas de upsert passam a ser acumuladas: comgravados === 0seguenenhum_trecho_gravado(como antes) e comfalhas.length > 0chamamarkVersionFailed(motivo com a posição e a mensagem de cada trecho) e devolve{ tipo: "erro", detalhe: "trechos_nao_gravados:N" }, semmarkVersionReady/activateVersion. O caminho de erro de embedding fica inalterado;indexarFonteganhaexport(mudança mínima, para o teste).O que medi (comandos e saídas)
Testes focados —
pnpm exec vitest run tests/unit/rag-nao-ativa-versao-incompleta.test.ts tests/unit/dreno-nao-perde-evento.test.ts→ 2 files passed / 8 tests passed. Os 4 cenários novos: 2/2 gravados → ok + ready + activate; 1/2 falha → erro +markVersionFailed+ sem ready/activate; 2/2 falham →nenhum_trecho_gravado;embedTextrejeitando no 1º trecho → erro +markVersionFailed.Sabotagem (depois do commit, em duas variantes):
workers/rag-indexer.tsinteiro → 4 failed | 4 passed: o vermelho vem deTypeError: indexarFonte is not a functionnos 4 cenários, porque o revert também tira oexportque o teste novo importa.export, guarda ainda ausente) → 1 failed | 7 passed, com o cenário do meio mostrando o bug ao vivo: esperava{tipo:"erro"}, recebeu{tipo:"ok", chunks:1, versionId:"v-2"}— versão ativada com trecho faltando.Restaurado com
git checkout HEAD -- workers/rag-indexer.ts→git statuslimpo e 8/8 verdes de novo.Gates —
eslint --max-warnings=0nos 2 arquivos rc=0 nas medições focadas;release:conferirrc=0 (fragmento.changes/rag-nao-ativa-versao-incompleta.md); e a fila local completa (um pesado por vez —flock+systemd-run --scope -p MemoryMax=5G):pnpm typecheckpnpm lintpnpm lint:channelspnpm lint:role-rankpnpm release:conferirpnpm test:unitpnpm test:shellpnpm buildNota honesta das primeiras passadas: o primeiro
lintda fila foi interrompido por SIGTERM (rc=143) após travar em espera de I/O (estadoD, máquina com dois lotes de gate concorrentes) — re-rodado: rc=0, 0 errors (os avisos são pré-existentes do repo). O primeirotest:unitfechou rc=1 com todas as 8.363 provas verdes (o único erro foi[vitest-pool]: Timeout starting forks runner, infraestrutura). As re-rodadas estão na tabela acima.O que NÃO medi
tests/invariants/**— precisa de Postgres/Docker, fora do include do vitest focado.