Metodologia · engenharia

Engenharia & stack

Como os produtos são construídos — engenharia de dados, ML, infraestrutura, versionamento e web.

Por que esta página existe

As outras abas explicam o que cada número significa. Esta explica como tudo é construído — a engenharia por baixo. É a parte que não aparece na tela, mas é o que torna o resto reprodutível, automático e auditável. Para quem é técnico, é o raio-X da arquitetura; para quem não é, é a prova de que nada aqui é feito à mão num dia de inspiração.

Um princípio guia toda a stack: dado bruto entra de fonte pública, atravessa transformações versionadas, e sai como número na tela — sem nenhuma edição manual no meio. Se você reconstruir o pipeline a partir do código, chega no mesmo número.

A arquitetura num relance

Do dado público ao produto — o caminho completo
Fontes API Câmara dados abertos Portal Transp. emendas Transferegov emenda Pix Ingestão GitHub Actions agendado dlt / DuckDB extração Armazém R2 object storage DuckLake versão de tabela MotherDuck DuckDB nuvem Medallion bronze silver gold Produtos Site Astro + 18 painéis Busca + IA discursos Detector ML anomalia Boletim LinkedIn
O dado atravessa as camadas Medallion uma vez por dia, automaticamente. Cada produto lê do gold. O lineage (duck_lineage → OpenMetadata) cataloga todas as dependências em paralelo.

As plataformas e serviços

ServiçoPapel no projeto
API de Dados Abertos da CâmaraFonte primária — presença, votações, despesas (CEAP), discursos, deputados
Portal da Transparência / TransferegovFonte das emendas individuais e da execução das emendas Pix
GitHub ActionsOrquestra os pipelines agendados (a cascata diária, semanal, mensal)
GitHub ProjectsKanban — a fonte de verdade do que está sendo construído
Cloudflare R2Object storage dos dados brutos, índices e artefatos (modelo bring-your-own-bucket)
MotherDuckDuckDB na nuvem — onde o lakehouse vive e os painéis leem
Cloudflare PagesHospedagem do site estático na borda, com deploy automático
Cloudflare WorkersFunções de borda — vetorizar a busca, rerankear, proteger a chave da API, e o proxy de saída
DagsHubPlataforma de MLOps — onde experimentos e modelos vivem
MLflowTracking de experimentos de ML (parâmetros, métricas, modelos versionados)
DVCVersionamento dos datasets de treino (features + ground truth)
DashScope (Qwen)Modelos de IA — embeddings da busca, reranker, classificação temática por logprobs
molab + marimoNotebooks reativos na nuvem para exploração assistida por IA
OpenMetadataCatálogo de dados e visualização de lineage (governança)

As bibliotecas

BibliotecaPara quê
DuckDBMotor analítico — toda transformação SQL entre camadas
dltExtração e carga de fontes incrementais (a API) com normalização
Polars / PyArrow / pandasManipulação de dados em memória
scikit-learnO ensemble do detector (Isolation Forest, LOF, One-Class SVM)
PyODDetectores de anomalia adicionais avaliados (ECOD, COPOD, HBOS)
CatBoost / OptunaModelagem e busca de hiperparâmetros (experimentos)
sentence-transformersEmbeddings de texto avaliados localmente (CPU)
openlineage-pythonEmissão de eventos de lineage do pipeline
python-pptxGeração das apresentações do boletim
matplotlib / seabornGráficos estáticos de análise exploratória
Observable PlotOs gráficos e dashboards interativos do site (JS, no navegador)
marked + DOMPurifyRenderização segura de markdown no assistente de IA
AstroGerador do site estático
typer / pydantic / tenacity / httpxCLIs, validação de dados, retry resiliente, HTTP

O que o gold serve

A camada gold é o ponto de consumo. Cada domínio vira uma família de tabelas que os produtos leem:

DomínioO que entrega
PresençaPerfil de presença por deputado/partido/ano, snapshot por sessão, bordas da semana
VotaçõesComportamento de voto por deputado/partido, votação enriquecida (polarização, fase, tema)
Gastos (CEAP)Gasto agregado por deputado e por fornecedor, com as flags factuais
EmendasEmendas individuais por autor e por localidade; execução das emendas Pix
DiscursosCorpus substantivo + matriz de temas (discurso × tema)
DeputadosPerfil consolidado (cadastro, mandatos, profissões, histórico partidário)

Engenharia de dados — o lakehouse Medallion

O coração do projeto é um data lakehouse organizado pelo padrão Medallion (raw → bronze → silver → gold), que separa o dado por nível de refino:

CamadaO que faz
rawcache do que a fonte entrega, sem transformação — bulks da API, parquets, JSONs. Schema fluido.
bronzeconsolida fontes fragmentadas numa tabela única, tipa e limpa; as flags factuais nascem aqui (eh_redondo, eh_estorno) — neutras, antes de qualquer análise.
silveraplica regra de negócio e enriquece com dimensões (cruza presença com partido/UF na data, classifica o calendário, deriva a polarização da votação).
goldo recorte pronto para consumo — é o que os painéis e rankings leem. Fatos descritivos e genéricos; nunca carrega score de modelo.

As ferramentas

A convenção de nomes

As tabelas seguem uma convenção rígida que torna o pipeline legível: <camada>.<domínio>__<especialização>. O separador duplo __ distingue domínio de tabela; uma VIEW deriva barato do que muda pouco, uma TABLE materializa o que é caro de recalcular. Bronze consolida fontes; silver aplica regra; gold serve. Cada script de transformação espelha 1:1 uma tabela.

Engenharia de ML — detecção de anomalia

O detector de anomalia (descrito em detalhe na aba Gastos & CEAP) é tratado como software de verdade, não como um notebook solto:

A mesma máquina roda em três produtos (cota, emendas) e em três grãos (deputado, fornecedor, documento) sem alteração — a arquitetura é agnóstica ao domínio. Isso foi provado reusando o código byte a byte entre os detectores.

Exploração assistida por IA

Antes de uma análise virar painel, ela nasce em exploração — testar uma hipótese, olhar a distribuição, achar o corte certo. Isso acontece em notebooks reativos (marimo) hospedados na nuvem (molab), com uma diferença: o notebook é pareado a um assistente de IA que opera o kernel ao vivo.

Na prática, isso vira uma espécie de text-to-SQL explicável: descreve-se a pergunta em linguagem natural, o assistente escreve a consulta sobre o lakehouse, executa contra o dado real e mostra o resultado — mas a consulta fica à vista, versionada na célula, não escondida atrás de uma caixa-preta. A diferença para um “pergunte ao banco” mágico é justamente essa: cada resposta é uma query reproduzível e auditável. Quem quiser conferir lê o SQL, roda de novo, chega no mesmo número.

É a bancada de trabalho da descoberta — onde os achados das outras abas (a queima de dezembro, a ortogonalidade presença×gasto, os redutos de emenda) foram primeiro encontrados, antes de virarem pipeline produtizado. Exploração com rastro, não improviso.

Infraestrutura & automação

Nada é atualizado à mão. O conteúdo do site se mantém vivo por pipelines automatizados em GitHub Actions:

Versionamento & qualidade

Web — o site

O que você está lendo é um site estático servido da borda — rápido, barato, sem servidor de aplicação para manter:

A busca de discursos — híbrida e soberana
Corpus Discursos substantivos Índice (build) Embeddings Qwen 512d BM25 pré-computado Servido do R2 Vetores float16 Metadados + trechos Na busca Vetor da query Worker Fusão RRF k=60 Reranker Qwen Resultado Site Astro fonte citada
O índice é construído uma vez (incremental) e servido como arquivo. A comparação roda no navegador; só a vetorização da pergunta passa por uma função de borda. Se a borda falhar, degrada para BM25 puro — custo zero.
Classificação temática — uma letra, com probabilidade real
Entrada Fala completa sem chunking Prompt Taxonomia CEDI 30 temas = letras Modelo Qwen-Plus temperatura 0 Saída Tema (1 letra) top-1 Top-5 logprobs prob. real Gold discurso × tema distribuição
O modelo responde uma única letra (cada tema = um token limpo); os logprobs dão a probabilidade real dos 5 temas mais prováveis — não um palpite. O LLM lê através do ruído processual até o tema, onde o cosseno (testado e reprovado) falhava.

Como o conteúdo vira publicação — o boletim

O boletim diário é parte do produto: todo dia de manhã, um pipeline verifica a sessão deliberativa do dia anterior, calcula presença/ausência a partir do gold, e agentes de IA transformam isso em conteúdo editorial — texto, apresentação e copy — que é publicado.

Boletim diário — do gold à publicação
Gatilho Rotina 6h agendada Dado Gold presença do dia Editorial (IA) Texto editorial Apresentação gráficos Copy LinkedIn Publicação Buffer agendador Site arquivo Alcance LinkedIn
O boletim lê o mesmo gold que os painéis — a presença publicada é a presença calculada. Os agentes redigem; a publicação é agendada via Buffer e arquivada no site.

A filosofia, em uma linha

Linkagem