No test suite. Gates in the pipeline instead.
Sem suíte de testes. Gates no próprio pipeline.
There's no pytest suite behind this platform. What checks correctness is runtime: consistency checks on every load, a version-diff audit that catches silent restatements, and a compliance engine that re-evaluates every regulatory limit every day and keeps a permanent record of the answer.
Não existe uma suíte pytest por trás desta plataforma. O que checa correção é em tempo de execução: checagens de consistência em toda carga, uma auditoria de version-diff que pega reapresentações silenciosas, e um motor de enquadramento que reavalia todo limite regulatório todo dia e guarda um registro permanente da resposta.
Bad data doesn't crash — it just looks plausible.
Dado ruim não trava — só parece plausível.
A malformed input rarely throws an exception; it produces a number that's merely wrong, and wrong numbers in a credit fund's daily report move real decisions. Unit tests catch code that behaves incorrectly against known cases — they don't catch a correct pipeline being fed unexpected data. The checks here are aimed at that second failure mode: they run against the live data every day, not against fixtures once in CI.
Uma entrada malformada raramente lança uma exceção; ela produz um número simplesmente errado, e números errados no relatório diário de um fundo de crédito movem decisões reais. Testes unitários pegam código que se comporta de forma incorreta contra casos conhecidos — eles não pegam um pipeline correto sendo alimentado com dado inesperado. As checagens aqui miram nesse segundo modo de falha: rodam contra o dado ao vivo todo dia, não contra fixtures uma vez no CI.
Where the checks sit in the pipeline
Onde as checagens ficam no pipeline
The six inventory checks
As seis checagens de estoque
Run against the receivables inventory on every load, each writing its own findings to a dedicated sheet so a reviewer sees exactly which rows failed which check, not just a pass/fail flag.
Rodam contra o estoque de recebíveis em toda carga, cada uma escrevendo seus próprios achados numa aba dedicada, para que um revisor veja exatamente quais linhas falharam em qual checagem, não só uma flag de passou/falhou.
- A payer (debtor) linked to more than one consignor entity.
- Um sacado vinculado a mais de um ente consignante.
- The final installment number doesn't match the declared installment count.
- O número da última parcela não bate com a quantidade de parcelas declarada.
- A single contract with multiple payers or multiple assignors.
- Um mesmo contrato com múltiplos sacados ou múltiplos cedentes.
- Non-sequential installment numbers within a contract.
- Números de parcela não sequenciais dentro de um contrato.
- Installment amounts that differ within the same contract.
- Valores de parcela que diferem dentro do mesmo contrato.
- CPF/CNPJ document length validation — 11 digits or 14, nothing else.
- Validação de tamanho de CPF/CNPJ — 11 dígitos ou 14, nada além disso.
Engineering decision
Decisão de engenharia
The compliance history job runs daily and needs to evaluate every regulatory rule against that day's position — the same evaluation the internal dashboard already does on demand. The obvious shortcut is to re-implement that evaluation inside the DAG so it doesn't depend on another app being up. The code does the opposite: it calls the dashboard's own HTTP endpoint and records the answer. The reasoning is written directly into the code — a second implementation of the same rule language would drift from the first the first time either one changed, and the two disagreeing quietly is a worse failure than a network call costing a few dozen milliseconds. Correctness was judged more valuable than decoupling.
O job de histórico de enquadramento roda diariamente e precisa avaliar toda regra regulatória contra a posição daquele dia — a mesma avaliação que o dashboard interno já faz sob demanda. O atalho óbvio seria reimplementar essa avaliação dentro da DAG para não depender de outro app estar de pé. O código faz o oposto: chama o próprio endpoint HTTP do dashboard e registra a resposta. O raciocínio está escrito direto no código — uma segunda implementação da mesma linguagem de regras divergiria da primeira na primeira vez que qualquer uma das duas mudasse, e as duas discordando silenciosamente é uma falha pior do que uma chamada de rede custando algumas dezenas de milissegundos. Correção foi julgada mais valiosa que desacoplamento.