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-DDbaixa as edições DO1 e DO1E de um dia e grava os ZIPs emdata/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
articlelê um ZIP e entrega uma matéria por XML;make extractimprime uma por linha, em JSON. O Iago revisou em 06/10, com quatro comentários.
O que foi medido
| Medida | Valor | Onde conferir |
|---|---|---|
| PR #17 (baixador) | 21 arquivos, +2.332 −4, 18 commits | PR #17 |
Testes em Go que o make test ganhou com o PR #17 | 58 testes, 100 casos com os subtestes, sem rede e sem credencial | PR #17 |
Imagem golang:1.26.8-alpine | 68 MB de download | PR #17 |
GET sem credencial no endpoint de download do INLABS | 302 para acessar.php, já com Content-Type: text/html | PR #17 |
| PR #22 (extração), como foi mergeado | 16 arquivos, +809 −4, 4 commits | PR #22 |
| Amostras de XML versionadas para o teste | 2 matérias reais, sem alteração (BOM e CRLF incluídos), e 1 de conselho construída | PR #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 1 | PR #22 |
| Download real de uma edição nas máquinas da revisão e da extração | não exercitado: sem credencial do INLABS | AI-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 o302como 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
fetchrebaixa 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 fetchfalhava. Nada criavadata/bronze/inlabs: o Docker criava./data/bronzecomo root e o comando abortava. A revisão pegou; a correção é ummkdir -pno 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.shecookies.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
forde 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; é omake fetchque resolve o dia, comTZ=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,numberPageeeditionNumberficam como texto; entrada que não é XML é ignorada e logada; XML semid,pubDateouartCategoryé recusado com o nome do arquivo. - O repositório passou a aceitar só squash merge, e a
mainnão foi reescrita com force-push.
O que ficou em aberto
- Rodar
make fetchemake extractcontra 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.