Skip to content

fix(rag): trecho que não grava derruba a indexação em vez de ativar versão furada - #747

Open
webtecnica wants to merge 1 commit into
melgarafael:mainfrom
webtecnica:fix/675-falha-parcial-nao-ativa-versao
Open

fix(rag): trecho que não grava derruba a indexação em vez de ativar versão furada#747
webtecnica wants to merge 1 commit into
melgarafael:mainfrom
webtecnica:fix/675-falha-parcial-nao-ativa-versao

Conversation

@webtecnica

@webtecnica webtecnica commented Sep 12, 2026

Copy link
Copy Markdown

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, indexarFonte acumulava os upserts e, se algum trecho falhasse (sem que todos falhassem), seguia para markVersionReady + 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: com gravados === 0 segue nenhum_trecho_gravado (como antes) e com falhas.length > 0 chama markVersionFailed (motivo com a posição e a mensagem de cada trecho) e devolve { tipo: "erro", detalhe: "trechos_nao_gravados:N" }, sem markVersionReady/activateVersion. O caminho de erro de embedding fica inalterado; indexarFonte ganha export (mudança mínima, para o teste).

O que medi (comandos e saídas)

Testes focadospnpm exec vitest run tests/unit/rag-nao-ativa-versao-incompleta.test.ts tests/unit/dreno-nao-perde-evento.test.ts2 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; embedText rejeitando no 1º trecho → erro + markVersionFailed.

Sabotagem (depois do commit, em duas variantes):

  1. Revertendo workers/rag-indexer.ts inteiro → 4 failed | 4 passed: o vermelho vem de TypeError: indexarFonte is not a function nos 4 cenários, porque o revert também tira o export que o teste novo importa.
  2. Cirúrgica (devolvendo só o 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.tsgit status limpo e 8/8 verdes de novo.

Gateseslint --max-warnings=0 nos 2 arquivos rc=0 nas medições focadas; release:conferir rc=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):

gate resultado
pnpm typecheck rc=0 (10s)
pnpm lint rc=0 (re-rodada — ver nota)
pnpm lint:channels rc=0 (2s)
pnpm lint:role-rank rc=0 (2s)
pnpm release:conferir rc=0 (1s)
pnpm test:unit rc=0 (481s) — 792 arquivos · 8.367 provas (+ 1 expected fail)
pnpm test:shell rc=0 (58s)
pnpm build rc=0 (157s)

Nota honesta das primeiras passadas: o primeiro lint da fila foi interrompido por SIGTERM (rc=143) após travar em espera de I/O (estado D, máquina com dois lotes de gate concorrentes) — re-rodado: rc=0, 0 errors (os avisos são pré-existentes do repo). O primeiro test:unit fechou 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

  • e2e / prova em tela — não se aplica (mudança de worker); nada foi filmado.
  • tests/invariants/** — precisa de Postgres/Docker, fora do include do vitest focado.
  • Indexação real com provider de embedding de verdade — os testes usam dublês, como os vizinhos do arquivo.

…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.
@vercel

vercel Bot commented Sep 12, 2026

Copy link
Copy Markdown

@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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Security Evidence

Commit: 3f6b4bdd90922e3738cb13090e7171348a1e62b4

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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / PR Risk Taxonomy

Commit: 3f6b4bdd90922e3738cb13090e7171348a1e62b4

PR taxonomy review recommended (neutral)

Detected 1 PR taxonomy bucket(s): CI/CD Recommendation.

Scanned 3 changed file(s).

Roadmap taxonomy buckets:

CI/CD Recommendation

CI, dependency, coverage, and contract signals should be routed into follow-up checks or verification work.

Signals:

  • Async job or webhook changes may ship without reliability coverage
  • 1 CI or workflow path(s) changed

Paths:

  • tests/unit/rag-nao-ativa-versao-incompleta.test.ts
  • workers/rag-indexer.ts

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

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Reference Set Readiness

Commit: 3f6b4bdd90922e3738cb13090e7171348a1e62b4

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 /ecc-tools analyze comments and generated manifests.

Area Status Evidence / Next Step
Deep analyzer corpus Missing Add analyzer fixture, golden, benchmark, or reference-set files that can catch analyzer regressions.
RAG/evaluator comparison Present tests/unit/rag-nao-ativa-versao-incompleta.test.ts
PR salvage/review corpus Missing Add stale-PR, review-thread, reopen-flow, or salvage reference cases for queue cleanup automation.
Discussion triage corpus Missing Add public discussion triage fixtures, golden cases, or reference sets for informational, answered, and no-response classifications.
Harness compatibility Missing Add cross-harness, adapter-compliance, or harness-audit evidence for Claude, Codex, OpenCode, Zed, dmux, and agent surfaces.
Security evidence Missing Attach security evidence such as SBOMs, SARIF, audit reports, or AgentShield evidence packs.
CI failure-mode evidence Missing Add captured CI failure logs, dry-run fixtures, or troubleshooting docs for common workflow failure modes.

Check publication was denied or unavailable. An app owner must enable Checks: read and write, and the installation owner must approve the updated permission.

@github-actions

Copy link
Copy Markdown

Recebido, @webtecnica — obrigado por isto.

Duas coisas que vão parecer erro seu e não são:

  • O check Vercel vermelho ("Authorization required to deploy") é esperado em PR de fork. A
    main faz deploy de produção e a Vercel se recusa a construir código de fora, o que está
    certo. Ele não entra no gate de merge.
  • No primeiro PR de quem nunca contribuiu aqui, os workflows ficam parados esperando
    liberação
    — política do GitHub, não sua. Enquanto isso o PR parece não ter check nenhum
    (nem o gh pr checks mostra os que estão nesse estado). Quem tria libera; você não precisa
    fazer nada.

Um mantenedor vai revisar de verdade — rodando os gates e reproduzindo o comportamento, não só
lendo o diff — e responde aqui em até um dia útil, com a medição junto, nunca com um "acho
que".

Esta mensagem é automática e não diz nada sobre o seu PR: ela é sobre o processo. O que vem
depois é pessoa.

@ecc-tools

ecc-tools Bot commented Sep 12, 2026

Copy link
Copy Markdown
Contributor

ECC Tools / Hosted Promotion Readiness

Commit: 3f6b4bdd90922e3738cb13090e7171348a1e62b4

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 src/analyzers/fixtures/evaluator-rag-corpus.ts.
Hosted output scoring inspected 0 completed cached hosted job results.

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.

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.

RAG: falha parcial ao gravar chunks ainda ativa a versão incompleta como sucesso

1 participant