Thirty-five DAGs, three kinds of source.
Trinta e cinco DAGs, três tipos de fonte.
Every morning, before anyone reads a number, something has to go get it — from a portal with no API, from a REST or GraphQL endpoint, or from a public government dataset. This is the layer that fetches, on schedule, without a human clicking anything.
Toda manhã, antes de alguém ler um número, algo precisa ir buscá-lo — de um portal sem API, de um endpoint REST ou GraphQL, ou de um dataset público governamental. Esta é a camada que busca, no horário certo, sem ninguém clicar em nada.
Three shapes of input, one daily deadline.
Três formatos de entrada, um prazo diário.
The fund administrator's portal has no public API for some of what's needed, so a browser has to log in and click through it. Other data comes from REST and GraphQL endpoints. And macro context — interest rates, inflation, employment — comes from public sources that each have their own format and cadence. All of it has to land before the reports that depend on it can run, every business day, including around holidays it has to know about.
O portal da administradora não tem API pública para parte do que é preciso, então um navegador precisa logar e clicar. Outros dados vêm de endpoints REST e GraphQL. E o contexto macro — juros, inflação, emprego — vem de fontes públicas, cada uma com seu formato e cadência. Tudo isso precisa chegar antes dos relatórios que dependem dele poderem rodar, todo dia útil, inclusive ao redor de feriados que o sistema precisa conhecer.
How a morning run goes
Como uma rodada de manhã acontece
The DAG taxonomy
A taxonomia de DAGs
Download — get the raw file
Download — buscar o arquivo bruto
Portal scraping, REST/GraphQL calls, and public-data pulls, one DAG per source, each landing a timestamped raw file. A sensor-style "maestro" DAG polls state every five minutes and triggers what's ready, rather than everything running on a rigid fixed clock.
Scraping de portal, chamadas REST/GraphQL e coletas de dados públicos, uma DAG por fonte, cada uma pousando um arquivo bruto com timestamp. Uma DAG "maestro" no estilo sensor consulta o estado a cada cinco minutos e dispara o que estiver pronto, em vez de tudo rodar num relógio fixo rígido.
Consolidation — normalize into one shape
Consolidação — normalizar num formato só
Turns the raw files into the clean, dated tables the rest of the platform reads — see subsystem 02 for how idempotency and backfill work here.
Transforma os arquivos brutos nas tabelas limpas e datadas que o resto da plataforma lê — ver subsistema 02 para como idempotência e backfill funcionam aqui.
Report — turn data into a decision
Relatório — transformar dado em decisão
Aging, liquidity, compliance, and the rest — see subsystem 06.
Aging, liquidez, enquadramento e o resto — ver subsistema 06.
Audit — check the checkers
Auditoria — checar os checadores
Version-diffs and coverage checks that run before the reports depending on them — see subsystem 04.
Version-diffs e checagens de cobertura que rodam antes dos relatórios que dependem deles — ver subsistema 04.
Engineering decision
Decisão de engenharia
The earlier version of this platform ran ingestion as shell commands wrapping standalone scripts, coordinated by file-watching sensors — simple, but every script owned its own state and error handling. The current version moved to Python-native tasks calling importable modules, with idempotency handled centrally through JSON manifests rather than inside each script. Nothing was rewritten wholesale: DAGs migrate one at a time as they need to change anyway, so both patterns coexist on purpose, not by accident.
A versão anterior desta plataforma rodava a ingestão como comandos de shell envolvendo scripts standalone, coordenados por sensores que vigiavam arquivos — simples, mas cada script era dono do próprio estado e tratamento de erro. A versão atual passou para tasks nativas em Python chamando módulos importáveis, com idempotência tratada centralmente por manifests JSON em vez de dentro de cada script. Nada foi reescrito de uma vez: as DAGs migram uma a uma, conforme precisam mudar de qualquer forma, então os dois padrões convivem de propósito, não por acidente.