← Production← Produção

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.

Layers
Camadas
3
Raw → reference/manual → consolidated.
Raw → referência/manual → consolidado.
Idempotency
Idempotência
JSON manifests
Manifests JSON
One per pipeline, tracking what ran for which reference date.
Um por pipeline, rastreando o que rodou para cada data de referência.
Format bug caught
Bug de formato pego
~100×
Inflation from a BR/US number-parsing mismatch during a migration — see below.
Inflação por incompatibilidade de parsing de número BR/US numa migração — ver abaixo.

The three layers

As três camadas

data lake · file-based, manifest-tracked data lake · baseado em arquivo, rastreado por manifest rawraw referencereferência consolidatedconsolidado

What a manifest actually does

O que um manifest realmente faz

01

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.

02

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.

03

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

A migration between two administrators, and a ~100× bug Uma migração entre duas administradoras, e um bug de ~100×

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.

Stack

Stack

StorageArmazenamentoCSV · parquet, on disk
State trackingRastreio de estadoJSON manifests
ETLpandas
CalendarCalendáriohand-rolled business daysdias úteis próprios