Skip to content

Diário — Semana 9 (06/10/2026) ​

Período: 30/09 a 06/10/2026

Quem trabalhou: Iago (@iagorrr), Luis (@Luidooo)

Pauta: começar a E2 pela fonte — o primeiro dado do DOU em disco (issue #6) e a leitura das matérias dentro dos ZIPs (issue #18).


O que foi feito ​

  • Baixador do INLABS (PR #17, do Iago, aberto em 02/10 e mergeado em 05/10): make fetch DATA=AAAA-MM-DD baixa as edições DO1 e DO1E de um dia e grava os ZIPs em data/bronze/inlabs/, validando que cada arquivo é um ZIP antes de aceitá-lo.
  • A #6 foi quebrada em issues menores (03/10): #18 extrair as matérias, #19 persistir uma matéria no OLTP, #20 idempotência.
  • Revisão do PR #17 (05/10), com uma correção antes do merge e a issue #21.
  • Extração das matérias (PR #22, do Luis, aberto em 05/10): o pacote article lê um ZIP e entrega uma matéria por XML; make extract imprime uma por linha, em JSON. O Iago revisou em 06/10, com quatro comentários.

O que foi medido ​

MedidaValorOnde conferir
PR #17 (baixador)21 arquivos, +2.332 −4, 18 commitsPR #17
Testes em Go que o make test ganhou com o PR #1758 testes, 100 casos com os subtestes, sem rede e sem credencialPR #17
Imagem golang:1.26.8-alpine68 MB de downloadPR #17
GET sem credencial no endpoint de download do INLABS302 para acessar.php, já com Content-Type: text/htmlPR #17
PR #22 (extração), como foi mergeado16 arquivos, +809 −4, 4 commitsPR #22
Amostras de XML versionadas para o teste2 matérias reais, sem alteração (BOM e CRLF incluídos), e 1 de conselho construídaPR #22, testdata/README.md
make extract sobre um ZIP montado (2 matérias, 1 XML malformado, 1 imagem)imprimiu 2, logou o malformado e a imagem, saiu com 1PR #22
Download real de uma edição nas máquinas da revisão e da extraçãonão exercitado: sem credencial do INLABSAI-USAGE.md, 05/10

O que surpreendeu ​

  • O INLABS responde 200 com HTML quando recusa a credencial. A única prova de login é o cookie inlabs_session_cookie. E a verificação de sessão lia o cofre de cookies, onde o cookie da sessão anterior continua: um re-login recusado devolvia sucesso. Foi corrigido no PR #17.
  • O redirect de sessão expirada vem com text/html. Classificar a resposta pelo tipo de conteúdo antes do status trataria o 302 como página. O probe sem credencial trocou por evidência uma afirmação que a IA repetia como verificada.
  • "Pular se já existe" está errado para o DOU. A edição do próprio dia pode ser republicada, então o fetch rebaixa de propósito. E distinguir "não houve edição" de "ninguém buscou" exige registro de estado — o que virou a #20.
  • Num clone novo o make fetch falhava. Nada criava data/bronze/inlabs: o Docker criava ./data/bronze como root e o comando abortava. A revisão pegou; a correção é um mkdir -p no alvo.
  • Uma queda de conexão no meio do ZIP aborta o dia inteiro, porque o erro de leitura não está na lista do que é seguro continuar. Virou a issue #21.
  • Havia senha e sessão ativa em texto puro no diretório de trabalho (script.sh e cookies.iakim), fora do .gitignore. A varredura dos commits do PR, antes do merge, não achou credencial no histórico.
  • Dois deadlocks nos testes escritos pela IA, ambos no teste de cancelamento, só apareceram ao rodar. E na revisão do cliente a IA afirmou que dois bugs ainda estavam no arquivo quando já tinham sido corrigidos; o erro só apareceu porque o Iago pediu confirmação.
  • Nenhuma amostra pública de XML do INLABS é de conselho. A do teste teve de ser construída, e está marcada como tal.
  • O PR #17 entrou como merge commit, com os commits um a um na main. Depois do merge, o Iago apontou que deveria ter sido squash.

O que foi decidido ​

  • DO1 e DO1E, uma data por execução. Vários dias são um for de shell; intervalo dentro do comando ficaria sem contabilidade por data antes de existir registro de estado.
  • -date é obrigatório. O container roda em UTC, onde "hoje" vira três horas antes de Brasília; é o make fetch que resolve o dia, com TZ=America/Sao_Paulo.
  • 404 é "sem edição", não falha, e não é retentado. É a única classificação sem evidência: ninguém conferiu o que o INLABS devolve para uma edição inexistente com sessão válida.
  • A lista de erros é de quem sobrevive, não de quem mata. Só o que é sabidamente seguro continua; todo o resto para o dia. Errar para "fatal" custa uma reexecução.
  • O arquivo só ganha o nome final depois de validado como ZIP (temporário, Sync, validação, Rename).
  • Data fora da janela do INLABS é erro de domínio (sai com 1, sem requisição), e não erro de uso (2).
  • Na extração: o HTML do <Texto> é guardado cru e também como texto puro; id, idMateria, numberPage e editionNumber ficam como texto; entrada que não é XML é ignorada e logada; XML sem id, pubDate ou artCategory é recusado com o nome do arquivo.
  • O repositório passou a aceitar só squash merge, e a main não foi reescrita com force-push.

O que ficou em aberto ​

  • Rodar make fetch e make extract contra o INLABS de verdade, com credencial.
  • Os quatro comentários de revisão do Iago no PR #22.
  • A issue #21 (queda de conexão no meio do download).

Nota sobre uso de IA ​

O baixador foi planejado e implementado pelo Iago com auxílio de Claude Code, que também escreveu os testes; a revisão do PR #17 e a extração (PR #22) foram feitas pelo Luis com Claude Code. Cada uso está no AI-USAGE.md (entradas de 02/10 a 05/10), incluindo o que a IA errou e o que foi rejeitado. Este diário foi redigido com Claude Code em 11/10, a partir dessas entradas, dos PRs #17 e #22 e das issues #18 a #21; os números da tabela foram conferidos no texto dos PRs e na API do GitHub, não de memória. A lista de quem trabalhou saiu dos autores dos PRs e das issues, e não de uma ata de reunião.

Projeto Integrado de Banco de Dados 2 — FCTE/UnB, 2026/2.