No database. A lake and a ledger.
Sem banco de dados. Um lake e um livro-razão.
There is no Postgres behind this pipeline. What replaces it is a three-tier folder structure and a JSON manifest per run — every intermediate state is a file you can open, diff, and re-run from.
Não existe um Postgres por trás deste pipeline. O que substitui isso é uma estrutura de pastas em três camadas e um manifest JSON por rodada — todo estado intermediário é um arquivo que dá pra abrir, comparar e reprocessar a partir dele.
Re-runs must not duplicate, and gaps must not hide.
Reprocessamentos não podem duplicar, e lacunas não podem se esconder.
A daily pipeline fails sometimes — a source is down, a file arrives malformed. When it does, the next run has to pick up exactly where it left off: not re-process a day that already succeeded, not silently skip a day that didn't. Doing that reliably usually means a database with transactions and constraints. This platform does it with a plain file lake instead, because every layer of it needs to be inspectable by a human at 8am, not just queryable.
Um pipeline diário falha de vez em quando — uma fonte cai, um arquivo chega malformado. Quando isso acontece, a próxima rodada precisa retomar exatamente de onde parou: não reprocessar um dia que já deu certo, não pular silenciosamente um dia que não deu. Fazer isso de forma confiável normalmente significa um banco de dados com transações e constraints. Esta plataforma faz isso com um lake de arquivos simples, porque toda camada dela precisa ser inspecionável por um humano às 8h, não só consultável.
The three layers
As três camadas
What a manifest actually does
O que um manifest realmente faz
Records what ran, for which date
Registra o que rodou, para qual data
Each consolidation pipeline keeps a manifest — a JSON file mapping reference dates to run status. Before processing a date, the task checks the manifest instead of guessing from what files exist on disk.
Cada pipeline de consolidação mantém um manifest — um JSON mapeando datas de referência ao status da rodada. Antes de processar uma data, a task consulta o manifest em vez de adivinhar pelos arquivos que existem em disco.
Drives backfill without duplicating
Conduz o backfill sem duplicar
A backfill run walks business days between two dates, skips anything already marked complete in the manifest, and retries anything marked failed — a plain loop over JSON, not a database migration.
Uma rodada de backfill percorre os dias úteis entre duas datas, pula tudo que já está marcado como completo no manifest e tenta de novo tudo que está marcado como falho — um loop simples sobre JSON, não uma migração de banco.
Leaves a paper trail for skips
Deixa um rastro para o que foi pulado
A day that gets skipped — a source outage, a holiday miscalculated — is written to a skip log next to the manifest, so a human reviewing the pipeline sees "skipped, and here's why" instead of a silent hole in the data.
Um dia pulado — uma fonte fora do ar, um feriado calculado errado — é gravado num log de skip ao lado do manifest, para que um humano revisando o pipeline veja "pulado, e aqui está o motivo" em vez de um buraco silencioso no dado.
Engineering decision
Decisão de engenharia
Midway through this platform's life, the fund's records moved from one administrator to another. The two exposed the same information in incompatible shapes — different casing conventions for column names, different date formats, and critically, different number formats: 1.234,56 (thousands-dot, decimal-comma) versus 1,234.56 (the reverse). A migration script that assumed the wrong convention parsed 1.234,56 as 1234.56 — inflating every affected figure by roughly two orders of magnitude. It was caught by comparing the aggregate against the fund's known net asset value, which is now a standing sanity check on every consolidation run, not a one-off fix.
No meio da vida desta plataforma, os registros do fundo migraram de uma administradora para outra. As duas expunham a mesma informação em formatos incompatíveis — convenções diferentes de caixa para nomes de coluna, formatos de data diferentes e, criticamente, formatos de número diferentes: 1.234,56 (ponto de milhar, vírgula decimal) versus 1,234.56 (o inverso). Um script de migração que assumiu a convenção errada leu 1.234,56 como 1234.56 — inflando cada valor afetado em cerca de duas ordens de grandeza. Foi pego comparando o agregado com o patrimônio líquido conhecido do fundo, o que hoje é uma checagem de sanidade permanente em toda rodada de consolidação, não um conserto isolado.