docs(C160): runbook §C160 e changelog da prova viva em produção (965 falas, 0 legadas) (#988)

This commit is contained in:
Francisco Solla 2026-09-14 04:40:09 -03:00
parent 9687c4160d
commit 94084da662
2 changed files with 9 additions and 3 deletions

View file

@ -0,0 +1 @@
**C160 — Acervo de falas: "Abrir fonte" abre o PDF oficial do Diário (2026-09-14):** o `officialTextUrl` do acervo deixa de gravar o visualizador legado da Câmara (`dc_20b.asp`/`dc_20.asp`, que responde 302 depois de 25–135s e pendura no meta-refresh do host deprecado) e passa a gravar o PDF direto do Diário (`https://imagem.camara.leg.br/Imagem/d/pdf/<arquivo>#page=<página>`). Puros novos em `scripts/lib/camaraSpeeches.mjs` (`classifyOfficialTextUrl`, `isLegacyDiarioUrl`, `parseLegacyOfficialUrl`, `parseMontaPdfUrl`, `parseDirectOfficialPdfUrl`, `buildOfficialPdfUrl`, `officialTextUrlFallback`, `publicationCacheKey`, `planOfficialLinkRepairs`) classificam/parseiam a URL legada (`Datain`→data, `txPagina`→página) e normalizam coleções obsoletas (`J`/vazio → `D`, achado da varredura de produção). `resolveOfficialPdfUrl` (`camaraFetch.mjs`) reescreve o lookup `.gov.br`→`.leg.br`, segue o redirect (`redirect: 'follow'`, `response.url` = `montaPdf.asp?narquivo=…&npagina=…`) e falha fechado fora da Câmara/host esperado; `probeLink` (o antigo `probeVodLink`, generalizado com `contentType`) prova o PDF com GET Range `200/206 application/pdf` antes de cachear. O import normaliza no write path: uma resolução por publicação em `<out>/diario/<data>-<coleção>[-s<suplemento>].json` via `ensureCachedDownload`; falha preserva o PDF direto anterior (senão `null` → fallback `youtubeUrl`/botão oculto) e reporta `stage: 'official-link'`. Novo modo `pnpm camara:import --repair-links [--dry-run]`: varre `speech.officialTextUrl` (uma query, `overrideAccess`), agrupa por publicação, converte `montaPdf` offline, atualiza só quem muda, reporta cobertura em `<out>/reports/repair-links-*.json` (falas/datas, publicações com falha, `unresolvable`, `remainingLegacy`) e é idempotente; o write exige `CAMARA_IMPORT_CONFIRM=1` fora de alvo local (`--dry-run` é read-only). Testes: unit dos puros com as URLs reais medidas (`dc_20b`/`.leg.br`/`montaPdf`/PDF direto/ano curto/J/vazio) e do fallback; int do `findSpeechImportState` com `officialTextUrl`. **Prova viva em produção (`teqo_1313`, 2026-09-14, SHA `9687c416`):** o dry-run achou **965 falas legadas em 504 publicações** (0 diretas; 33 em `J` e 1 vazia normalizadas para `D`) + 32 sem link; a resolução cacheou as 504 publicações (retries absorveram `fetch failed` transiente; PDFs provados por Range); o write atualizou as **965 falas em 58s** (`remainingLegacy: 0`, 0 falhas/0 publicações pendentes); a validação read-only deu **965 diretas, 0 legadas** e o `--coverage` ficou inalterado (997 discursos, 947 com trecho, 924 com vídeo, 920 com segmentos). Runbook novo em `docs/ops/teqo-1313-deploy.md` §C160 (dry-run → write → validação, rollback pelo `previousUrl` do relatório).

View file

@ -547,9 +547,14 @@ publicação (`diario/<data>-<coleção>[-s<suplemento>].json`) e cada PDF é
provado com GET Range antes de gravar. Falha de resolução deixa a fala
intocada, o run sai 1 e a próxima passada é idempotente.
**Resultado registrado (2026-09-14):** 965 falas legadas em 510 publicações
resolvidas; 0 legadas restantes na validação; 32 falas sem link (fallback
YouTube/oculto). Relatórios em
**Resultado registrado (2026-09-14):** dry-run achou 965 falas legadas em 504
publicações (33 em `selCodColecaoCsv=J` e 1 com o parâmetro vazio, normalizadas
para `D`; a Câmara devolve "Documento não encontrado" nos códigos obsoletos e a
mesma data/página resolve em `D`) + 32 falas sem link (fallback
YouTube/oculto); resolução cacheada das 504 publicações (retries absorvem
`fetch failed` transiente); o write atualizou **965 falas** em 58s
(`remainingLegacy: 0`, 0 falhas) e a validação read-only deu 965 diretas/0
legadas com o `--coverage` inalterado (997 discursos). Relatórios em
`/srv/hdd/backups/teqo-camara/reports/repair-links-*.json` e changelog
`docs/changelog/2026-09-14-c160.md`.