From 94084da662ebfb8ae8bd2bc9bfa66b665e6cdda9 Mon Sep 17 00:00:00 2001 From: Francisco Solla Date: Mon, 14 Sep 2026 04:40:09 -0300 Subject: [PATCH] =?UTF-8?q?docs(C160):=20runbook=20=C2=A7C160=20e=20change?= =?UTF-8?q?log=20da=20prova=20viva=20em=20produ=C3=A7=C3=A3o=20(965=20fala?= =?UTF-8?q?s,=200=20legadas)=20(#988)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/changelog/2026-09-14-c160.md | 1 + docs/ops/teqo-1313-deploy.md | 11 ++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 docs/changelog/2026-09-14-c160.md diff --git a/docs/changelog/2026-09-14-c160.md b/docs/changelog/2026-09-14-c160.md new file mode 100644 index 00000000..ceaf88cd --- /dev/null +++ b/docs/changelog/2026-09-14-c160.md @@ -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/#page=`). 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 `/diario/-[-s].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 `/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). diff --git a/docs/ops/teqo-1313-deploy.md b/docs/ops/teqo-1313-deploy.md index 98905c7d..4de21f46 100644 --- a/docs/ops/teqo-1313-deploy.md +++ b/docs/ops/teqo-1313-deploy.md @@ -547,9 +547,14 @@ publicação (`diario/-[-s].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`.