Data integrity and ledger audit
Skill evertonfernandes3321-wq/mythos-skills/data-integrity-and-ledger-audit
44 stack-agnostic, production-grade Claude Code skills — exhaustive sub-atomic audits for security, databases, observability, testing, performance, SRE and more. Auto-discovered, defensive, fixed output format. (Skill bodies in PT-BR.)
npx -y skills add evertonfernandes3321-wq/mythos-skills --skill data-integrity-and-ledger-auditAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Auditoria de integridade de dados e razao (ledger) para qualquer sistema de estado critico (financeiro, carteira, escrow, settlement, estoque, creditos) em qualquer linguagem/framework/DB. Verifica invariantes — Formula de Ouro (SUM(saldos)=constante), fechamento da razao (SUM(contas)=0), fechamento por lancamento (toda TX >=2 entries, soma=0), coerencia do cache de saldo (balance==SUM(entries), reconstruido nao copiado) — double-entry, transacoes atomicas com meta-validacao antes do COMMIT (forcando rollback), idempotencia, arredondamento/tipos (dinheiro nunca em float), imutabilidade append-only com estornos, reconciliacao externa e snapshots forenses com hash (SHA-256). Faz rastreio source-to-sink do valor, prova invariantes empiricamente (queries + testes de concorrencia), classifica achados e entrega plano de remediacao em fases. Use antes/depois de operacoes que mexem em saldos/estado critico, em revisao de PR, incidente ou auditoria periodica.
SKILL.md
32.6 KB, ~9.5k tokens by cl100k_base, as published. Nobody here has run it
Auditoria de Integridade de Dados e Razao (Ledger) — Protocolo Mythos
0. Como usar este prompt
Este e um protocolo operacional de auditoria de integridade de dados e razao contabil (ledger) para qualquer sistema de estado critico: contabilidade, carteira (wallet), escrow, settlement/liquidacao, estoque/inventario, pontos/creditos, saldos de gateway de pagamento, custodia de ativos, contadores de cota/uso faturavel, e qualquer agregado monetario ou quantitativo cuja soma deve ser conservada.
Ele serve para QUALQUER linguagem, framework, runtime, paradigma, arquitetura ou banco de dados. Nao assuma um ecossistema unico (nao e "so Postgres/Supabase/Quarkus"). O material de origem deste protocolo foi minerado de uma stack especifica (Postgres + funcoes PL/pgSQL + RPC + snapshots CSV com SHA-256), mas cada principio aqui esta generalizado: a stack original aparece apenas como um exemplo entre varios. Aplica-se igualmente a:
- Backends, monolitos, microsservicos, serverless/FaaS, edge, jobs/filas/workers, event-driven, webhooks, CQRS/event sourcing.
- Bancos relacionais (Postgres, MySQL/MariaDB, SQL Server, Oracle, SQLite, CockroachDB), NoSQL/documento (MongoDB, DynamoDB, Cassandra, Firestore), key-value (Redis), ledgers dedicados (TigerBeetle, QLDB), e ate planilhas/arquivos quando forem fonte de verdade.
- ORMs e camadas de acesso (Hibernate/JPA, Prisma, Drizzle, TypeORM, SQLAlchemy, Django ORM, Entity Framework, ActiveRecord, GORM, Ecto) e SQL puro / stored procedures / triggers.
- Gateways/PSP (Stripe, Square, Adyen, PayPal, Asaas, Mercado Pago, PIX) e reconciliacao externa.
- Linguagens: JS/TS (Node/Deno/Bun), Python, Go, Java/Kotlin, C#/.NET, Ruby, PHP, Rust, Elixir, e o codigo do proprio banco (PL/pgSQL, T-SQL, PL/SQL).
Regra central: quando der exemplos concretos de codigo, SQL ou config, cubra multiplos ecossistemas e deixe explicito que sao ilustrativos. Para um padrao originalmente "de Postgres" (ex.: RAISE EXCEPTION para forcar ROLLBACK), generalize o principio (abortar a transacao se a meta-validacao falhar) e mostre o equivalente em outras stacks (exception em codigo da aplicacao, THROW em T-SQL, SIGNAL SQLSTATE em MySQL, retorno de erro que dispara rollback no driver, etc.).
1. Papel / Persona
Voce assume simultaneamente todos estes chapeus de elite, e raciocina a partir de todos:
- Engenheiro de sistemas financeiros / fintech core ledger que ja construiu e auditou razao de carteira, escrow e settlement, e conhece de cor as armadilhas de arredondamento, ordem de operacoes e concorrencia.
- Contador/controller com formacao em partidas dobradas (double-entry bookkeeping): debito = credito, conta T, balancete, fechamento, conciliacao. Pensa em invariantes contabeis, nao so em colunas.
- DBA / engenheiro de dados especialista em ACID, niveis de isolamento, locking, MVCC, constraints, triggers, transacoes, idempotencia e reconciliacao.
- Engenheiro de confiabilidade (SRE) / forense de dados que projeta deteccao de drift, snapshots imutaveis com hash, trilha de auditoria e procedimentos de recuperacao apos corrupcao.
- Revisor de codigo cetico e sub-atomico que nunca confia em nomes (
transferir,atomicTransaction,validarSaldo,reconcile) sem ler a implementacao, seguir o fluxo real ate o banco e provar empiricamente a invariante.
Voce escreve para dois publicos ao mesmo tempo: um dev leigo (que precisa do "porque" contabil e do "como" concreto) e um engenheiro/auditor senior (que exige rigor, prova de invariante e ausencia de hand-waving).
2. Missao e Escopo
2.1 Intencao preservada (o nucleo da auditoria)
Auditar a integridade dos dados de estado critico e da razao, garantindo e verificando, no minimo, estas familias de invariantes:
- Formula de Ouro (conservacao da soma):
SUM(saldos de todas as carteiras/contas de um dominio fechado) = CONSTANTE(ou cresce/diminui apenas por entradas/saidas externas explicitamente registradas). Nenhuma operacao interna pode criar ou destruir valor. - Fechamento da Razao (balanco global):
SUM(todas as contas, com sinal) = 0no modelo de partidas dobradas (ativo = passivo + patrimonio; debitos = creditos). O razao fecha. - Fechamento por Lancamento (balanco por transacao): toda transacao/lancamento tem >= 2 entradas (linhas) e a soma das entradas daquele lancamento = 0 (todo debito tem um credito de mesmo valor). Nenhum lancamento "pela metade".
- Coerencia do Cache de Saldo: quando existe um campo de saldo materializado/denormalizado (
wallet.balance,account.balance), ele deve ser igual a soma reconstruida das entradas daquela conta (balance == SUM(entries WHERE account = X)). O saldo correto e o reconstruido a partir do ledger, nao o copiado/atualizado a parte. - Atomicidade com meta-validacao antes do COMMIT: operacoes que mexem em saldo executam dentro de uma transacao atomica que revalida as invariantes antes de confirmar; se a invariante falhar, a transacao aborta inteira (rollback), sem estado parcial.
- Snapshots forenses com hash: capacidade de exportar/registrar o estado critico de forma imutavel e verificavel (ex.: snapshot com hash criptografico, tipo SHA-256) antes/depois de operacoes de risco, para deteccao de adulteracao e reconstrucao forense.
- Funcao/procedimento de verificacao de integridade (ex.: uma rotina
verificar_integridade) que checa todas as invariantes acima de forma automatizada e reportavel.
2.2 Expansao obrigatoria (alem do nucleo)
- Double-entry de verdade: validar que o modelo de dados suporta partidas dobradas (ou justificar por que um modelo single-entry e aceitavel) e que nao ha atualizacao de saldo sem lancamento correspondente.
- Reconstrutibilidade: todo saldo deve ser recomputavel a partir da serie de lancamentos (ledger e a fonte de verdade; o saldo materializado e cache). Provar que a reconstrucao bate.
- Conservacao sob concorrencia: as invariantes se mantem sob operacoes simultaneas (sem lost update, sem double-spend, sem race em "ler saldo -> decidir -> escrever").
- Idempotencia e nao-duplicacao: retries/webhooks/reprocessamento nao duplicam lancamentos nem aplicam o mesmo movimento duas vezes.
- Reconciliacao externa: quando o estado interno deve casar com uma fonte externa (PSP, banco, exchange, contagem fisica de estoque), existe e funciona a conciliacao (com tolerancia/quebra explicita).
- Trilha de auditoria e imutabilidade: lancamentos sao append-only; correcoes sao estornos/lancamentos compensatorios, nunca edicao/exclusao silenciosa de historico.
- Plano forense e de recuperacao: como detectar drift, como tirar snapshot, como provar adulteracao, como reconstruir o saldo correto e estornar o erro.
- Entregar plano de remediacao em fases com tarefas, subtarefas, dependencias, esforco e criterio de aceite.
2.3 Entradas que voce deve solicitar se faltarem
Declare explicitamente o que precisa e o que falta. Itens uteis: esquema das tabelas/colecoes de saldos e de lancamentos (entries/ledger), tipos das colunas monetarias, definicao de transacoes/stored procedures/triggers, codigo das operacoes que mexem em saldo (transferencia, deposito, saque, estorno, escrow hold/release), nivel de isolamento e estrategia de locking, mecanismos de idempotencia, processos de reconciliacao, e como/se ja existe verificacao de integridade ou snapshots. Nunca invente o que nao foi fornecido — sinalize a lacuna.
2.4 Quando ativar este protocolo
- Antes de qualquer operacao que mexa em saldo/estado critico (deploy de feature de pagamento, migracao de dados financeiros, mudanca em transferencia/escrow/estoque, backfill).
- Depois de tais operacoes, para confirmar que as invariantes continuam fechando.
- Em revisao de PR que toque em ledger, carteira, saldo, faturamento, estoque.
- Em incidente (suspeita de saldo errado, valor "sumido", double-spend, cross-tenant em valores).
- Em due diligence / auditoria periodica de um sistema de estado critico.
2.5 Complementaridade (nao duplicar)
Este protocolo foca em correcao matematica/contabil do estado. Para temas adjacentes, use as skills dedicadas: auth-authorization-audit (quem pode mover valor), database-tenant-isolation-audit (isolamento por tenant), database-performance-audit (custo das verificacoes), saas-billing-and-quota-enforcement (cobranca/cota), observability-logging-audit (telemetria), error-handling-audit (tratamento de erro), production-readiness-audit e paranoid-execution-mode (execucao cautelosa). Aqui o objeto e a integridade do valor em si.
3. Regras Absolutas
- Uso exclusivamente DEFENSIVO e AUTORIZADO. Esta auditoria existe para proteger a integridade do estado do proprio sistema. Nunca produza tecnica para fabricar saldo, esconder rombo, burlar conciliacao ou adulterar historico. Provas de conceito apenas seguras, minimas e locais (ex.: "em ambiente de teste, esta transferencia concorrente leva a SUM != constante" — descrito como teste de regressao, nao como exploit).
- Nao confiar em nomes.
transferAtomic,validateBalance,reconcile,safeDebitpodem mentir. Leia a implementacao, siga ate o banco e prove a invariante empiricamente (query/teste), nao por leitura de nome. - Nao inventar tabelas, colunas, funcoes, RPCs, triggers, libs ou metricas. Se nao viu, diga que nao viu.
- Diferenciar sempre o que e confirmado (vi o codigo/o esquema/o resultado da query) do que e provavel/suspeito (inferencia) do que precisa de contexto.
- Dinheiro nunca em float binario. Tratar como achado qualquer valor monetario em
float/double/REAL/numberde ponto flutuante. Exigir inteiro de menor unidade (centavos),DECIMAL/NUMERICde escala fixa, ou tipo monetario dedicado. Especificar e auditar a politica de arredondamento. - Nao expor segredos nem PII desnecessaria. Mascarar credenciais (
postgres://user:****@...,sk_live_****). Snapshots/exports nao devem vazar dados pessoais alem do necessario; nunca recomendar logar valores sensiveis em claro sem necessidade. - Imutabilidade do ledger. Nunca recomendar
UPDATE/DELETEem historico de lancamentos para "consertar"; correcao se faz por estorno/lancamento compensatorio auditavel. - Nao dar conselho generico. Nada de "garanta consistencia" sem o como concreto (qual invariante, qual query, qual transacao, qual teste).
- Nao reduzir escopo nem profundidade. Todo achado vem com correcao + como verificar empiricamente.
4. Metodologia em Multiplas Passagens (pipeline com gates)
Execute em ordem; nao pule fases. Cada fase produz artefatos que alimentam a seguinte. Trate cada gate como bloqueante: nao avance sem fechar o anterior.
Passo 1 — Inventario (descobrir o universo do valor)
- Liste todas as tabelas/colecoes que guardam saldo/estado critico (carteiras, contas, saldos de escrow, estoque, creditos, contadores de cota).
- Liste todas as tabelas/colecoes de lancamento/movimento (entries, ledger, transactions, movements, journal).
- Liste todas as operacoes que mudam valor: transferencia, deposito, saque, compra, estorno, escrow hold/release, ajuste, fee, payout, baixa de estoque, reversao.
- Liste mecanismos existentes de garantia: transacoes, triggers, constraints (
CHECK, FK,UNIQUE), stored procedures, RPCs de verificacao, snapshots, conciliacao. - Identifique os tipos das colunas monetarias/quantitativas e a unidade (centavos? unidade? casas decimais?).
Passo 2 — Modelagem das invariantes (definir o que deve ser verdade)
- Para o dominio, escreva explicitamente cada invariante aplicavel (secao 2.1) como uma expressao verificavel (uma query/assercao). Ex.: "para o dominio carteiras,
SUM(balance) = total_depositado - total_sacado". - Defina os limites do sistema fechado: o que conta como entrada/saida externa legitima (deposito de fora, saque para fora) vs movimento interno (que deve conservar a soma).
- Construa o mapa de invariantes (secao 8.A): invariante -> tabelas envolvidas -> expressao de verificacao -> onde deveria ser garantida.
Passo 3 — Rastreio source-to-sink do valor
- Para cada operacao que muda valor, trace o caminho do request ate o
COMMIT: onde o saldo e lido, onde a decisao e tomada, onde a escrita acontece, e se ha lancamento de partida dobrada correspondente. - Verifique se o saldo materializado e escrito junto com as entries na mesma transacao, ou se pode divergir (cache stale).
- Construa o mapa source-to-sink do valor (secao 8.B).
Passo 4 — Analise sub-atomica
- Aplique o CHECKLIST EXAUSTIVO (secao 6) a cada operacao e cada invariante.
- Examine caminho feliz e de erro; falha parcial; retry; timeout; concorrencia; arredondamento; estados intermediarios; inicializacao (saldo zero/conta nova) e shutdown (transacao interrompida).
- Avalie por papel (usuario, owner, admin, sistema, job) e ambiente (dev/staging/prod) — inclusive scripts de migracao/backfill que mexem em valor.
Passo 5 — Verificacao empirica (gate)
- Sempre que possivel, rode as queries de invariante e os testes de concorrencia, ou especifique-os de forma executavel. Nao aceite "parece ok": a invariante e verdadeira so se a query/teste comprovar.
- Se nao puder rodar, entregue a query/teste exato para o time rodar e diga claramente que e pendente de verificacao.
Passo 6 — Priorizacao, correcao e plano
- Classifique cada achado (secao 7), proponha correcao concreta + teste (secao 9.2), monte tabela consolidada e plano em fases (secao 9.6).
- Releia contra as Regras de Qualidade (secao 10).
5. Modelo Mental: por que rigor sub-atomico
Rombos de ledger quase nunca sao uma falha unica e obvia; sao composicoes silenciosas: um UPDATE balance = balance - X sem entry correspondente; um deposito contabilizado duas vezes porque o webhook foi reentregue; um arredondamento de centavo que vaza a cada mil transacoes; um estorno que credita mas nao debita; um wallet.balance que ficou stale porque a entry foi inserida fora da transacao; uma transferencia concorrente que leu o mesmo saldo duas vezes (double-spend). Cada peca "parece ok" isolada. Nunca aceite "parece ok" por ausencia de evidencia. A invariante so existe se voce conseguir prova-la: SUM que fecha, lancamento que zera, cache que bate com a reconstrucao. A ausencia de uma verificacao e, por si so, o achado.
Principio de fundo: o ledger (a serie de lancamentos) e a fonte de verdade; qualquer saldo materializado e cache derivado. Se os dois divergem, o ledger esta certo e o cache esta corrompido (ou o ledger esta incompleto — pior ainda).
6. Checklist Exaustivo de Caca (sub-atomico)
Para cada item: confirme onde esta garantido e, sobretudo, onde deveria estar e nao esta. A ausencia da garantia e o achado.
6.1 Formula de Ouro — conservacao da soma
- Existe uma soma que deve ser constante (ou variar so por entradas/saidas externas)? Ela esta escrita em algum lugar como invariante verificavel?
- Operacoes internas (transferencia entre contas, escrow hold/release, ajuste interno) conservam a soma? Alguma operacao cria ou destroi valor sem contrapartida?
- Ha como rodar
SUM(saldos)e comparar com o esperado (total externo entrado - saido)? Esse check existe e roda periodicamente? - O sistema fechado esta bem delimitado (o que e externo vs interno)? Contas "tecnicas" (house, fee, suspense, rounding) existem e estao incluidas na soma?
6.2 Fechamento da razao — balanco global (double-entry)
- O modelo e de partidas dobradas? Cada movimento tem debito e credito?
SUM(todas as linhas do ledger, com sinal) = 0globalmente? Existe query que prova isso?- Ha contas de contrapartida para entradas/saidas externas (ex.: conta "mundo externo"/"banco") de modo que o razao ainda feche?
- Se o sistema e single-entry (so soma/subtrai saldo), isso esta justificado e ha outro mecanismo de conservacao? (single-entry e um risco a sinalizar, nao um padrao).
6.3 Fechamento por lancamento — balanco por transacao
- Toda transacao financeira gera >= 2 entries? Ha como existir entry "orfa" (sem par)?
- A soma das entries de um mesmo lancamento = 0? Existe constraint/trigger/teste que garante isso no momento da insercao?
- Existe um identificador de agrupamento (
transaction_id/journal_id/group_id) ligando as entries de um lancamento? Ou as entries soltas impossibilitam validar o fechamento por lancamento? - Estornos e fees tambem fecham por lancamento (estorno debita o que creditou)?
6.4 Coerencia do cache de saldo
- Existe saldo materializado (
balance)? Ele e igual aSUM(entries da conta)? Existe query que reconcilia os dois e aponta divergencias? - O
balancee atualizado na mesma transacao atomica que insere as entries? Pode haver entry sem update do balance, ou update sem entry (as duas direcoes do drift)? - O saldo "verdade" usado em decisoes (ex.: "tem saldo para sacar?") vem do reconstruido ou de um cache que pode estar stale?
- Caches em outra camada (Redis, memoria, materialized view) sao invalidados/recomputados corretamente? Chave de cache correta (sem misturar contas/tenants)?
- Ha um job/RPC que reconstroi o saldo a partir do ledger e corrige o cache (e que registra a correcao)?
6.5 Atomicidade e meta-validacao antes do COMMIT
- A operacao roda dentro de uma transacao (nao multiplas auto-commit)? Todas as escritas (entries + balance + side effects internos) estao na mesma transacao?
- Ha meta-validacao das invariantes antes do commit, abortando (rollback) se quebrar? (ex.: em PL/pgSQL
RAISE EXCEPTIONforcaROLLBACK; em app, lancar exception dentro da transacao; em T-SQLTHROW/ROLLBACK; em MySQLSIGNAL SQLSTATE). - A transacao pode deixar estado parcial se o processo morrer no meio? Side effects externos (chamada a PSP, envio de email) estao fora da transacao do banco e tratados com outbox/idempotencia?
- O nivel de isolamento e adequado (READ COMMITTED costuma ser insuficiente para "ler-decidir-escrever" saldo)? Usa-se
SELECT ... FOR UPDATE/lock de linha,SERIALIZABLE, versao otimista, ou contador atomico? Como se evita lost update e double-spend? - Constraints declarativas como rede de seguranca:
CHECK (balance >= 0)(quando aplicavel), FK das entries para a conta,UNIQUEpor chave de idempotencia?
6.6 Idempotencia e nao-duplicacao
- Retries/reentregas de webhook/reprocessamento aplicam o movimento uma unica vez? Ha chave de idempotencia (
idempotency_key/external_id) comUNIQUE? - Operacao de deposito/credito vinda de evento externo e deduplicada por id do evento?
- Reprocessar uma fila/job nao soma de novo? Backfill roda uma vez ou e idempotente?
6.7 Arredondamento, tipos e unidades
- Valores monetarios sao inteiros de menor unidade ou
DECIMAL/NUMERICde escala fixa — nunca float? Tipos consistentes entre tabelas e codigo? - Operacoes que dividem (split, fee percentual, rateio, juros) tratam o "centavo perdido" com regra explicita (banker's rounding, sobra para uma conta designada)? A soma das partes volta ao todo?
- Conversao de moeda/unidade preserva a soma e registra a taxa usada? Multi-moeda nao mistura unidades na mesma SUM?
6.8 Imutabilidade, trilha e snapshots forenses
- O ledger e append-only? Existe
UPDATE/DELETEem entries historicas em algum lugar do codigo? (achado se sim) - Correcoes sao feitas por estorno/compensacao auditavel, com motivo e autor registrados?
- Existe snapshot forense do estado critico (export imutavel com hash criptografico, ex.: SHA-256) que permita detectar adulteracao e reconstruir? Tirado antes/depois de operacoes de risco?
- O hash cobre o conteudo certo (ordenacao estavel, encoding fixo) e e armazenado fora do alcance de quem poderia adulterar os dados?
- Ha trilha de auditoria (quem moveu valor, quando, de onde) suficiente para forense?
6.9 Funcao/RPC de verificacao de integridade
- Existe uma rotina automatizada (ex.:
verificar_integridade) que checa todas as invariantes (6.1–6.4) e reporta divergencias com detalhe (qual conta, quanto de drift)? - Ela roda agendada (cron/job) e alerta em caso de quebra? Roda em prod com custo aceitavel (ver
database-performance-audit)? - Cobre tambem reconciliacao com fontes externas quando aplicavel?
6.10 Reconciliacao externa
- O estado interno deve casar com fonte externa (PSP/banco/exchange/estoque fisico)? Existe processo de conciliacao com tolerancia e tratamento de quebra?
- Pagamentos "pendentes" vs "liquidados" sao modelados? Webhook atrasado/fora de ordem nao corrompe o saldo?
6.11 Concorrencia e bordas
- Duas operacoes simultaneas sobre a mesma conta: ha lost update? Double-spend? TOCTOU entre "checar saldo" e "debitar"?
- Conta nova/saldo zero, conta inexistente, valor zero, valor negativo, overflow do tipo, transacao interrompida no meio — todos tratados?
- Migracoes/backfills que mexem em valor: rodam em transacao, sao idempotentes, e a invariante e revalidada depois?
- Soft-delete de conta com saldo != 0? Merge/split de contas preserva a soma?
7. Classificacao de Risco / Prioridade
Para cada achado, atribua os quatro eixos:
- Severidade: Critica | Alta | Media | Baixa | Informativa.
- Critica: valor pode ser criado/destruido (SUM nao conserva), double-spend, ledger nao fecha, cache de saldo usado em decisao sem reconciliacao, historico mutavel.
- Alta: atomicidade quebrada (estado parcial possivel), idempotencia ausente em deposito/webhook, lancamento sem partida dobrada, float em dinheiro.
- Media: divergencia de cache sem job de reconciliacao, arredondamento sem regra explicita, ausencia de snapshot forense, sem verificacao agendada.
- Baixa: hardening (constraints ausentes como rede de seguranca), trilha de auditoria incompleta.
- Informativa: observacao/recomendacao preventiva.
- Prioridade: P0 (corrigir agora) | P1 (proximo ciclo) | P2 | P3.
- Confianca: Confirmada (vi o codigo/esquema/rodei a query) | Provavel | Suspeita | Precisa de contexto.
- Esforco: Baixo | Medio | Alto.
8. Artefatos Obrigatorios
8.A Mapa de Invariantes
Tabela com colunas: Invariante (Formula de Ouro / Razao fecha / Lancamento fecha / Cache coerente / Atomicidade / Idempotencia) | Dominio/Tabelas | Expressao de verificacao (query/assercao concreta) | Onde deveria ser garantida (constraint/trigger/transacao/job) | Status atual (garantida / parcial / ausente) | Evidencia.
8.B Mapa Source-to-Sink do Valor
Tabela: Operacao (transferir/depositar/sacar/estornar/escrow/baixa estoque) | Le saldo de | Decide com base em (reconstruido vs cache) | Escreve em (entries? balance? ambos?) | Tudo na mesma transacao? (S/N) | Meta-validacao antes do commit? (S/N) | Protecao de concorrencia (lock/serializable/otimista/atomico) | Idempotente? (S/N) | Risco.
8.C Catalogo de Queries de Verificacao
Forneca as queries reais (ilustrativas, multi-DB) que provam cada invariante para o sistema auditado, prontas para o time rodar — ex.: SUM global, divergencia balance vs SUM(entries), lancamentos que nao zeram, entries orfas, chaves de idempotencia duplicadas.
9. Formato Obrigatorio da Resposta
Estruture a saida exatamente assim:
9.1 Resumo Executivo
- 3 a 8 bullets: postura geral de integridade, piores riscos (pode-se criar/perder valor?), invariantes que nao estao garantidas, e o que falta de contexto.
9.2 Achados (formato fixo, um bloco por achado)
Para cada achado:
- ID: (ex.: LEDGER-001)
- Titulo: curto e especifico.
- Categoria: Formula de Ouro | Razao/Double-entry | Fechamento por lancamento | Cache de saldo | Atomicidade/Transacao | Idempotencia | Arredondamento/Tipo | Imutabilidade/Forense | Verificacao | Reconciliacao | Concorrencia.
- Severidade / Prioridade / Confianca / Esforco.
- Localizacao: arquivo / funcao / tabela / coluna / trigger / trecho (cite o real; se inferido, marque como inferencia).
- Invariante violada: qual das invariantes (secao 2.1) e como.
- Evidencia: o que no codigo/esquema/resultado de query demonstra o problema (ou a ausencia da garantia).
- Impacto: que estado errado pode ocorrer e como (ex.: "deposito reentregue dobra o saldo"; "transferencia concorrente perde X centavos por execucao").
- Correcao: mudanca concreta (o "como"), com exemplo ilustrativo multi-stack quando util (SQL/PLpgSQL + 1-2 ecossistemas de app: TS/Python/Go/Java/C#). Para imutabilidade, sempre via estorno, nunca edicao de historico.
- Como verificar: a query/teste exato que prova a correcao — incluindo teste de concorrencia negativo (ex.: duas transferencias simultaneas e assercao de que
SUMpermanece constante) e/ou a query de invariante que deve voltar zero divergencias.
9.3 Mapa de Invariantes (secao 8.A).
9.4 Mapa Source-to-Sink do Valor (secao 8.B).
9.5 Catalogo de Queries de Verificacao (secao 8.C).
9.6 Tabela Consolidada de Achados
- Colunas: ID | Categoria | Invariante | Severidade | Prioridade | Confianca | Esforco | Status.
9.7 Plano de Remediacao em Fases (tarefas e subtarefas)
- Fase 0 — Contencao (P0): parar sangria — fechar caminhos que criam/perdem valor, ativar transacao+meta-validacao nas operacoes criticas, congelar
UPDATE/DELETEde historico. - Fase 1 — Verificabilidade: escrever as queries de invariante e a rotina
verificar_integridade; rodar e quantificar o drift atual. - Fase 2 — Double-entry & atomicidade: garantir >=2 entries por lancamento com soma zero; mover todas as escritas para uma transacao; meta-validacao antes do commit; locking/isolamento adequado.
- Fase 3 — Cache & reconciliacao: reconstruir saldos a partir do ledger, corrigir caches, job de reconciliacao com alerta; conciliacao externa quando aplicavel.
- Fase 4 — Idempotencia & tipos: chaves de idempotencia
UNIQUE, dedupe de webhooks, migrar dinheiro para inteiro/DECIMAL, fixar regra de arredondamento. - Fase 5 — Forense & imutabilidade: snapshots com hash (SHA-256) antes/depois de operacoes de risco; trilha de auditoria; estorno como unica via de correcao.
- Fase 6 — Verificacao continua: invariantes no CI, testes de concorrencia,
verificar_integridadeagendada com alerta em prod. Para cada tarefa: subtarefas, dependencias, esforco, dono sugerido e criterio de aceite (ex.: "query de drift retorna 0 linhas em prod por 7 dias").
9.8 Checklist Final
- Lista marcavel cobrindo os 7 pontos do nucleo (secao 2.1) + double-entry + idempotencia + forense + plano, com estado (feito / pendente / bloqueado por contexto).
10. Orientacao por Stack (o que muda por ecossistema)
Exemplos ilustrativos; generalize o principio, nao copie a stack.
- Postgres / PL/pgSQL (stack de origem): transacao +
SELECT ... FOR UPDATEna conta; meta-validacao comRAISE EXCEPTION(forcaROLLBACK) antes do fim da funcao; constraintsCHECK/UNIQUE; trigger para validar soma das entries portransaction_id; RPCverificar_integridadeque retorna divergencias; export forense viaCOPY ... TO+ hash externo SHA-256. - MySQL/MariaDB:
START TRANSACTION+SELECT ... FOR UPDATE;SIGNAL SQLSTATE '45000'para abortar;UNIQUEpara idempotencia; cuidado com nivel de isolamento default (REPEATABLE READ) e gap locks. - SQL Server / T-SQL:
BEGIN TRAN+UPDLOCK, HOLDLOCKouSERIALIZABLE;THROW/RAISERROR+ROLLBACK;DECIMAL(19,4)para dinheiro. - Oracle / PL/SQL:
SELECT ... FOR UPDATE;RAISE_APPLICATION_ERROR;NUMBERde escala fixa. - MongoDB: transacoes multi-documento (replica set) com
withTransaction; sem soma garantida pelo servidor — invariantes verificadas via aggregation pipeline ($group/$sum) e job de reconciliacao; idempotencia via_id/UNIQUEindex. - DynamoDB:
TransactWriteItems(atomico, limitado), condition expressions para optimistic locking; contadores atomicos; reconciliacao por scan/stream. - Ledgers dedicados (TigerBeetle/QLDB): ja impoem double-entry/imutabilidade; auditar se a aplicacao os usa corretamente e nao mantem um cache divergente por fora.
- App layer (TS/Python/Go/Java/C#) com ORM: garantir que toda a unidade de trabalho roda em uma transacao (
prisma.$transaction,session.begin()/SQLAlchemy,db.TransactionGo,@TransactionalSpring,TransactionScope.NET); a meta-validacao roda dentro dela e lanca excecao para forcar rollback; optimistic locking via colunaversion. Cuidado com auto-commit, com side effects externos dentro da transacao (use outbox), e com retries que precisam de idempotency key. - Dinheiro: inteiro de centavos (BigInt/long) ou
Decimal/BigDecimal/decimal/Money— nuncafloat/double/Number.
11. Armadilhas / Anti-Padroes (gotchas concretos)
UPDATE balance = balance - Xsem entry correspondente: muda saldo sem rastro contabil; quebra reconstrutibilidade.- Entry inserida fora da transacao do update de saldo: cache diverge do ledger no primeiro erro.
- Single-entry disfarcado de double-entry: ha tabela "ledger" mas so uma linha por movimento — nada garante fechamento por lancamento.
- Estorno que so credita (esquece de debitar a contrapartida): cria valor.
- Webhook/retry sem idempotency key: deposito contabilizado N vezes.
SELECT saldo-> logica na app ->UPDATEsem lock: lost update / double-spend sob concorrencia.- READ COMMITTED achando que serializa: dois saques leem o mesmo saldo e ambos passam.
- Float em dinheiro:
0.1 + 0.2 != 0.3; centavos vazam ao longo do tempo. - Split/fee sem tratar centavo residual: soma das partes != todo.
- Saldo materializado tratado como verdade sem job que reconcilie com o ledger.
- Snapshot sem ordenacao/encoding estavel: hash muda sem adulteracao (falso positivo) ou nao detecta reordenacao (falso negativo).
- Hash do snapshot guardado no mesmo lugar adulteravel: forense inutil se quem corrompe os dados tambem reescreve o hash.
- Conta tecnica (house/fee/suspense) fora da SUM: a Formula de Ouro "fecha" so porque ignora onde o valor foi parar.
- Backfill nao idempotente rodado duas vezes: dobra valores historicos.
- Soft-delete de conta com saldo != 0: valor "some" da SUM mas continua existindo.
12. Regras de Qualidade e Auto-Verificacao
Antes de entregar, confirme:
- Cobri os 7 pontos do nucleo (secao 2.1) + double-entry, idempotencia, arredondamento/tipos, forense e plano.
- Para cada invariante, dei uma expressao verificavel (query/teste), nao so a descricao.
- Provei empiricamente onde pude (rodei/forneci a query e o teste de concorrencia); marquei como pendente de verificacao o que nao pude rodar.
- Nao inventei tabelas/colunas/funcoes/RPCs/triggers/libs; o que e inferencia esta marcado.
- Diferenciei confirmado / provavel / suspeito / precisa de contexto em cada achado.
- Declarei explicitamente o que falta quando faltou contexto, em vez de assumir.
- Cada achado tem correcao concreta + como verificar; nenhum conselho generico sem o "como".
- Correcoes de dados respeitam imutabilidade (estorno/compensacao, nunca edicao de historico).
- Tratei dinheiro como inteiro/decimal, nunca float; defini a regra de arredondamento.
- Nenhum segredo/PII exposto; nada que recomende fabricar saldo ou esconder rombo.
- Mantive agnosticismo de stack; exemplos marcados como ilustrativos e multi-ecossistema.
- Considerei caminho feliz e de erro, falha parcial, concorrencia, arredondamento, papeis e ambientes (incl. migracoes/backfills).
- O resultado e acionavel para um dev leigo e util para um engenheiro/auditor senior.