Metodologia
Coleta
Crawler dockerizado em Python (crawler-wargov) com fallback Playwright + Xvfb para contornar Akamai. Respeita robots.txt, identifica-se com User-Agent honesto e roda com throttle conservador (1 req/2s). Manifest append-only em JSONL — idempotente.
OCR e classificação
Cada página de PDF passa por:
- Extração com PyMuPDF (300 DPI mínimo).
- OCR primário: Gemini 2.5 Pro com input nativo de PDF (~1 chamada por documento, contexto de 1M tokens).
- OCR secundário: Claude Sonnet 4.6 vision per-page, em paralelo.
- Reconciliação: comparação CER (Character Error Rate). Se ambos concordam (CER < 10%), output final é o de Gemini. Se discordam (10–20%), arbitragem por Sonnet. Se discordam muito (>20%), Opus arbitra.
- Classificação por página: typed / handwritten / mixed / photo / blank / redacted_heavy.
- Extração de entidades: pessoas, agências, plataformas, sensores, locais.
- Extração de fotos: páginas marcadas como
photoviram itens de primeira classe no acervo.
Acurácia esperada: 95–98% em datilografado, 88–93% em manuscrito, redações detectadas com >95% de precisão por área.
Tradução
UI nos três idiomas (PT-BR, EN, ES). Títulos, resumos e captions de fotos traduzidos via Gemini 1.5 Flash (primário), com fallback Anthropic em caso de erro. Cache de tradução por (sha, campo, locale) — re-runs são gratuitos.
Busca
Pagefind — índice WASM gerado em build-time, roda 100% no browser. Sem backend, sem rede após o bundle baixar. Indexa o texto OCR, captions de fotos, metadata e títulos.
Hospedagem
Tudo estático: HTML pré-renderizado em AWS S3, distribuído via CloudFront. Sem Lambda, sem RDS, sem OpenSearch. Mídia (PDFs, MP4s, fotos) em bucket separado com cache imutável.
Reprodutibilidade
- Pipeline em Docker com versões pinadas.
- Cada execução tem
run_idúnico. - Output versionado.
- Dumps mensais publicados como release assets.