# Handoff para Claude: mapeamento e ETL dos backups PIX/SPB AB/GX/MGI

Data: 2026-07-01  
Origem do trabalho: analise local dos backups SQL Server em `/Users/luizpenha/Downloads/exportdbs`  
Destino correto: cabines PIX e SPB. Core esta fora do escopo desta carga.

> Este handoff e propositalmente redigido sem valores de certificados, chaves, endpoints MQ, usuarios, senhas ou payloads de cliente. Use somente contagens, nomes tecnicos de tabelas/campos, hashes/fingerprints e evidencias agregadas.

## Resumo executivo

Foram restaurados localmente 16 backups SQL Server 2022 em um container Docker/OrbStack chamado `monetarie-bak-mssql`. A partir da restauracao, foi construido um inventario de schemas/linhas e um ETL local para carregar dados seguros nas cabines:

- PIX: banco `cc_pix`, staging `legacy_ab_pix`, projecoes em schemas locais `cecresa_*`.
- SPB: banco `cc_spb`, staging `legacy_ab_spb`, projecoes em tabelas oficiais SPB.

O ponto central do alinhamento com o Luiz: estes backups nao sao o backup do Core. O backup do Core e outro. Aqui o trabalho e mapear e subir itens de SPB e PIX nas respectivas cabines/bancos de dados, preservando idempotencia e sem importar configuracoes sensiveis.

Resultado local ja obtido:

- PIX staging: 2.083.978 linhas em 55 fontes.
- PIX final/projecoes: 13.250 lancamentos de extrato, 21.808 mensagens outbound, 8.761 respostas inbound, 30.569 payloads/mensagens XML, 1 saldo SPI consolidado, 1.382 saldos historicos e 36 parametros de balde DICT.
- SPB staging: 1.999.426 linhas em 26 fontes.
- SPB final/projecoes: 10.591 operacoes legadas, 14.101 mensagens Bacen, 317 tipos de mensagem novos no catalogo existente e 130 definicoes de tags novas no catalogo existente.
- Tabelas sensiveis `CERTIFICADOS`, `PARAMETROS`, `PARAMETROS_MQ` e `PARAMETROS_SEGURANCA`: nao foram carregadas em staging nem em tabelas finais.

## Regras de seguranca e escopo

1. Nao carregar nada destes backups no Core.
2. Nao migrar valores brutos de certificados, chaves privadas, endpoints MQ, usuarios, senhas, paths operacionais sensiveis ou payloads que revelem segredo.
3. Para certificados e parametros, gerar apenas inventario redigido: contagens, validade, presenca/ausencia, fingerprints/hashes e pendencias de reconfiguracao.
4. Runtime seguro deve vir de Secrets Manager/HSM/configuracao de ambiente, nao de tabelas legadas.
5. Toda carga deve passar por staging por cabine (`legacy_ab_pix`, `legacy_ab_spb`) e por projecoes idempotentes.
6. Payloads e linhas originais ficam em JSONB nos schemas `legacy_ab_*`; nao exportar esses JSONB casualmente, pois podem conter PII/payloads transacionais.
7. O ETL local usa dados restaurados em SQL Server e escreve no Postgres local. Antes de repetir em homologacao, confirmar explicitamente container, banco e credenciais/segredos de ambiente.

## Ambiente local atual

Containers relevantes:

| Container | Imagem | Status observado | Porta |
|---|---|---|---|
| `monetarie-bak-mssql` | `mcr.microsoft.com/mssql/server:2022-latest` | em execucao | `1433/tcp` interno |
| `monetarie-postgres-1` | `postgres:17-alpine` | em execucao e healthy | host `15432 -> 5432` |

Artefatos criados/alterados nesta frente:

| Caminho | Status git atual | Papel |
|---|---:|---|
| `.scratch/mssql-bak-analysis/analyze_sqlserver_backups.py` | untracked | script de restauracao/inventario dos `.bak` |
| `.scratch/mssql-bak-analysis/out/backup_inventory.json` | untracked | metadados dos backups |
| `.scratch/mssql-bak-analysis/out/all_databases_analysis.json` | untracked | analise consolidada de tabelas/linhas/objetos |
| `.scratch/mssql-bak-analysis/out/SUMMARY.md` | untracked | sumario bruto da analise |
| `docs/reports/2026-07-01-sqlserver-backups-etl-map.md` | untracked | mapa funcional dos backups e decisoes ETL |
| `docs/reports/2026-07-01-pix-spb-cabine-etl-manifest.md` | untracked | manifesto de destinos e regras de carga |
| `docs/reports/2026-07-01-pix-spb-etl-load-result.md` | untracked | resultado da carga local |
| `etl/legacy_pix_spb/load_legacy_pix_spb.py` | untracked | ETL executavel PIX/SPB |
| `docs/reports/2026-07-01-pix-spb-etl-handoff-claude.md` | untracked | este handoff |

## Backups analisados

Lista original informada pelo Luiz:

```text
/Users/luizpenha/Downloads/exportdbs/AB_GX_TRIAGEM.bak
/Users/luizpenha/Downloads/exportdbs/AB_PAGAMENTO_INSTANTANEO_EXTRATO.bak
/Users/luizpenha/Downloads/exportdbs/AB_GX_GESTAO.bak
/Users/luizpenha/Downloads/exportdbs/AB_GX_AGENDAMENTO_UNICO.bak
/Users/luizpenha/Downloads/exportdbs/AB_GX_NOTIFICACAO.bak
/Users/luizpenha/Downloads/exportdbs/AB_MGI_DDAMSG.bak
/Users/luizpenha/Downloads/exportdbs/AB_PAGAMENTO_INSTANTANEO_BALDES_DICT.bak
/Users/luizpenha/Downloads/exportdbs/AB_GI_INFO_MOVIMENTOS_INTERNOS.bak
/Users/luizpenha/Downloads/exportdbs/AB_PAGAMENTO_INSTANTANEO_EXPURGO.bak
/Users/luizpenha/Downloads/exportdbs/AB_GI_INFO_MOVIMENTOS_INTERNOS_ANTIGA.bak
/Users/luizpenha/Downloads/exportdbs/AB_PAGAMENTO_INSTANTANEO_METRICAS.bak
/Users/luizpenha/Downloads/exportdbs/AB_PAGAMENTO_INSTANTANEO_CTAESPECIAL.bak
/Users/luizpenha/Downloads/exportdbs/GX_PIX_AGENDAMENTO.bak
/Users/luizpenha/Downloads/exportdbs/AB_GX_PIX_AGENDAMENTO.bak
/Users/luizpenha/Downloads/exportdbs/AB_MGI.bak
/Users/luizpenha/Downloads/exportdbs/AB_PAGAMENTO_INSTANTANEO.bak
```

Todos foram restaurados com sucesso em SQL Server 2022. Os headers indicaram backups `FULL`, `compatibility_level=160`, `DatabaseVersion=957`, finalizados em 2026-06-30 entre 20:18 e 20:26.

## Mapa por familia

### Familia PIX

| Backup | Representa | Decisao ETL |
|---|---|---|
| `AB_PAGAMENTO_INSTANTANEO.bak` | base operacional principal PIX/Pagamento Instantaneo Autbank, com mensagens Bacen/PSP, credito/debito, ordem de pagamento, MED, devolucoes, infracoes, saldo SPI e reconciliacao | carregar seletivamente na cabine PIX; staging obrigatorio; projecoes para SPI, mensagens, auditoria, saldo e correlacoes |
| `AB_PAGAMENTO_INSTANTANEO_EXTRATO.bak` | melhor fonte tabular de extrato PIX/GI, tabela `EXTRATO_MOVIMENTO_GI` | fonte prioritaria para `statements` e `statement_entries` da cabine PIX |
| `AB_GI_INFO_MOVIMENTOS_INTERNOS.bak` | movimentos internos GI/liquidacao/reporte | carregar como trilha de liquidacao/reporte/auditoria, nao como razao financeiro primario |
| `AB_GI_INFO_MOVIMENTOS_INTERNOS_ANTIGA.bak` | GI antigo com apenas linhas de controle | manter como evidencia; sem carga operacional |
| `AB_PAGAMENTO_INSTANTANEO_METRICAS.bak` | metricas PIX/DICT/status/latencia | opcional para observabilidade historica; nao afeta saldo/extrato |
| `AB_PAGAMENTO_INSTANTANEO_BALDES_DICT.bak` | parametros de baldes/rate limit DICT | carregar apenas configuracao aprovada; no local foram projetados 36 parametros em `cecresa_dict.parameters` |
| `AB_PAGAMENTO_INSTANTANEO_EXPURGO.bak` | controles de expurgo/retencao | referencia de politica; nao carregar em runtime |
| `AB_PAGAMENTO_INSTANTANEO_CTAESPECIAL.bak` | schema de conta especial, sem volume operacional | sem carga operacional |
| `AB_GX_*` e `GX_PIX_AGENDAMENTO.bak` | bases GeneXus de gestao/triagem/agendamento/notificacao, quase vazias | sem ETL transacional; usar como checklist de contratos/configuracao |

### Familia SPB

| Backup | Representa | Decisao ETL |
|---|---|---|
| `AB_MGI.bak` | MGI/SPB/MQ, interfacing, catalogos, operacoes e corpos XML | fonte principal da cabine SPB: `spb_operations`, `bacen_messages`, catalogos/tags; excluir certificados e parametros sensiveis |
| `AB_MGI_DDAMSG.bak` | catalogo DDA/SPB de mensagens, dominios, colunas, tipos e eventos | seed/reference complementar para SPB/DDA; merge/diff, sem duplicar catalogo existente |

## ETL construido

Script:

```bash
etl/legacy_pix_spb/load_legacy_pix_spb.py
```

Variaveis de ambiente/defaults:

| Variavel | Default local | Observacao |
|---|---|---|
| `MSSQL_CONTAINER` | `monetarie-bak-mssql` | container SQL Server com os backups restaurados |
| `MSSQL_SQLCMD` | `/opt/mssql-tools18/bin/sqlcmd` | binario usado dentro do container SQL Server |
| `PG_CONTAINER` | `monetarie-postgres-1` | container Postgres alvo |
| `PGUSER` | `cecresa` | usuario Postgres local |
| `PIX_DB` | `cc_pix` | banco da cabine PIX local |
| `SPB_DB` | `cc_spb` | banco da cabine SPB local |
| `LEGACY_ANALYSIS_JSON` | `.scratch/mssql-bak-analysis/out/all_databases_analysis.json` | inventario usado para selecionar tabelas e chaves |

Comandos executados:

```bash
python3 etl/legacy_pix_spb/load_legacy_pix_spb.py setup
python3 etl/legacy_pix_spb/load_legacy_pix_spb.py stage --profile manifest
python3 etl/legacy_pix_spb/load_legacy_pix_spb.py project
python3 etl/legacy_pix_spb/load_legacy_pix_spb.py verify
```

Ajuda do script:

```text
usage: load_legacy_pix_spb.py [-h] [--profile {manifest,all}]
                              [--target {pix,spb,both}] [--limit LIMIT]
                              {setup,stage,project,verify,all}
```

Observacoes importantes:

- O perfil executado foi `--profile manifest`.
- O perfil `--profile all` existe, mas nao foi executado nesta rodada.
- `--target pix|spb|both` permite rodar por cabine.
- `--limit N` existe para teste controlado.
- A carga e baseada em `docker exec` + `sqlcmd`/`psql`; nao depende de driver Python de banco.
- O ETL faz staging por JSONB com chaves de origem e depois projeta para tabelas finais com idempotencia.
- O ETL exclui explicitamente tabelas sensiveis: `CERTIFICADOS`, `PARAMETROS`, `PARAMETROS_MQ`, `PARAMETROS_SEGURANCA`.

## Resultado de carga local

### PIX

No ambiente local, os schemas finais da cabine PIX nao usam prefixo `monetarie_*`; usam `cecresa_*`. O ETL mapeou o contrato logico para:

- `cecresa_spi`
- `cecresa_dict`
- `cecresa_spi_msg`
- `cecresa_settlement`
- `cecresa_audit`

Totais verificados:

| Destino | Linhas |
|---|---:|
| `legacy_ab_pix.source_rows` | 2.083.978 |
| fontes distintas em `legacy_ab_pix.source_rows` (`source_db`, `source_table`) | 55 |
| `cecresa_spi.statements` | 2.280 |
| `cecresa_spi.statement_entries` | 13.250 |
| `cecresa_spi.bacen_outbound` | 21.808 |
| `cecresa_spi.bacen_inbound` | 8.761 |
| `cecresa_spi_msg.xml_messages` | 30.569 |
| `cecresa_spi.balances` | 1 |
| `cecresa_spi.balance_history` | 1.382 |
| `cecresa_dict.parameters` | 36 |

Conciliacao do extrato `EXTRATO_MOVIMENTO_GI`:

| Origem | Natureza/status origem | Destino | Qtde | Valor |
|---|---|---|---:|---:|
| SQL Server/staging | `C/SUCESSO` | `credit/booked` | 8.120 | R$ 143.103.559,83 |
| SQL Server/staging | `D/SUCESSO` | `debit/booked` | 4.304 | R$ 166.875.645,67 |
| SQL Server/staging | `C/ERRO` | `credit/legacy_erro` | 689 | R$ 19.017.423,28 |
| SQL Server/staging | `D/ERRO` | `debit/legacy_erro` | 137 | R$ 5.651.646,93 |

Decisao de status usada localmente:

- `SUCESSO` vira `booked` em `statement_entries`.
- `ERRO` foi preservado como `legacy_erro`; nao deve ser tratado como saldo confirmado sem regra de produto.

### SPB

Totais verificados:

| Destino | Linhas |
|---|---:|
| `legacy_ab_spb.source_rows` | 1.999.426 |
| fontes distintas em `legacy_ab_spb.source_rows` (`source_db`, `source_table`) | 26 |
| `spb_operations` com `state='legacy_imported'` | 10.591 |
| `bacen_messages` com `source='legacy_ab_spb'` | 14.101 |
| `message_type_config` total apos carga | 1.766 |
| `message_tag_definitions` total apos carga | 21.547 |

Links de origem para operacao:

| Fonte | Destino | Qtde |
|---|---|---:|
| `TRANS_INTERF_PASS` | `spb_operations` | 10.461 |
| `TRANS_SISTEMAS` | `spb_operations` | 130 |

Decisao de status usada localmente:

- Operacoes SPB entraram com `state='legacy_imported'`.
- Esse estado e seguro para staging/projecao historica, mas ainda precisa de mapa oficial de status antes de qualquer uso produtivo/tela final.

## Certificados, parametros, parametros_mq e parametros_seguranca

Resposta curta para a pergunta do Luiz: temos essas tabelas em `AB_MGI` e `AB_MGI_DDAMSG`; elas foram analisadas por metadados/agregados e foram propositalmente excluidas da carga. Nao ha linhas dessas tabelas no staging/final da carga local.

### `AB_MGI`

`CERTIFICADOS`:

- 76 linhas.
- 72 ISPBs distintos.
- 4 autoridades/CA distintas.
- Validade agregada observada: de 2025-03-14 a 2027-06-18.
- 1 certificado expirado no momento da analise.
- Tamanho de chave observado: 2048 em todos os registros.
- Campos de chave publica `PBKEY1`/`PBKEY2` presentes nas 76 linhas.
- `STATUS_CER` e `CONTAINER` nulos em todos os registros analisados.

`PARAMETROS`:

- 1 linha.
- Tabela ampla, com 79 colunas.
- Contem desenho de configuracao operacional: paths, logs, exportacao, servidor/usuario/senha de email, `URL_PSTI`, portas e parametros correlatos.
- Agregados selecionados indicaram alguns campos PIX/saldo nulos, mas a tabela deve ser tratada como sensivel pelo modelo de dados.
- Nao migrar valores. Gerar checklist redigido e reconfigurar via ambiente/Secrets Manager/HSM.

`PARAMETROS_MQ`:

- 1 linha.
- Contem desenho de instituicao/dominio, CA, serial, queue manager, servidor, porta e canal.
- Alias MQ nulo no agregado analisado.
- Nao migrar valores. Reconfigurar MQ no padrao atual.

`PARAMETROS_SEGURANCA`:

- 1 linha.
- Contem desenho de path de certificado, path de chave privada secundaria, assinatura dupla e modo criptografico.
- Path de chave privada primaria nulo no agregado analisado.
- Flag HSM e datas de criptografia/assinatura nulas no agregado analisado.
- Nao migrar valores. Converter em checklist de requisitos HSM/assinatura.

### `AB_MGI_DDAMSG`

`CERTIFICADOS`:

- 73 linhas.
- 70 ISPBs distintos.
- 4 autoridades/CA distintas.
- Validade agregada observada: de 2025-10-17 a 2027-06-18.
- 0 expirados no momento da analise.
- Tamanho de chave observado: 2048 em todos os registros.
- Campos `PBKEY1`/`PBKEY2` presentes nas 73 linhas.
- `STATUS_CER` e `CONTAINER` nulos em todos os registros analisados.

`PARAMETROS`:

- 1 linha.
- Agregados selecionados indicaram campos operacionais/sensiveis principais nulos.
- Ainda assim, tratar como tabela sensivel e nao migrar valores brutos.

`PARAMETROS_MQ`:

- 2 linhas.
- 1 instituicao e 2 dominios.
- Campos de endpoint/certificado MQ analisados por agregado vieram nulos: CA, serial, queue manager, alias, servidor, porta e canal.
- Nao migrar valores brutos.

`PARAMETROS_SEGURANCA`:

- 2 linhas.
- 1 instituicao e 2 modulos.
- Path de certificado, path de chave privada secundaria, assinatura dupla e modo criptografico presentes.
- Flag HSM e datas de criptografia/assinatura nulas no agregado analisado.
- Nao migrar valores brutos.

### Decisao recomendada para essas tabelas

1. Manter exclusao no ETL.
2. Se precisar repassar para time de infra/seguranca, criar inventario redigido separado com:
   - contagem por tabela;
   - validade minima/maxima;
   - expirados;
   - fingerprints/hashes, nunca chave/certificado bruto;
   - campos obrigatorios ausentes/presentes;
   - pendencias de reconfiguracao em HSM/Secrets Manager/MQ.
3. Nao versionar dumps, valores de campos, endpoints, CNs sensiveis, paths internos ou usuarios/senhas.

## Consultas seguras de verificacao

Verificar carga pelo script:

```bash
python3 etl/legacy_pix_spb/load_legacy_pix_spb.py verify
```

Verificar se tabelas sensiveis continuam fora do staging:

```bash
docker exec monetarie-postgres-1 psql -U cecresa -d cc_spb -c "
select source_db, source_table, count(*)
from legacy_ab_spb.source_rows
where upper(source_table) in ('CERTIFICADOS', 'PARAMETROS', 'PARAMETROS_MQ', 'PARAMETROS_SEGURANCA')
group by 1, 2
order by 1, 2;
"
```

Resultado esperado: zero linhas.

Verificar conciliacao PIX por status/direcao. Atencao: as colunas reais sao `credit_debit` e `status` (a tabela nao tem `direction` nem `source`); o marcador de origem legada fica em `statements.statement_type = 'legacy_ab_pix'` e, no estado atual, 100% das linhas de `statement_entries` sao legadas:

```bash
docker exec monetarie-postgres-1 psql -U cecresa -d cc_pix -c "
select credit_debit, status, count(*) as rows, sum(amount) as amount
from cecresa_spi.statement_entries
group by 1, 2
order by 1, 2;
"
```

Verificar operacoes SPB importadas:

```bash
docker exec monetarie-postgres-1 psql -U cecresa -d cc_spb -c "
select state, count(*)
from spb_operations
where created_by = 'legacy_ab_spb'
group by 1
order by 1;
"
```

Verificar mensagens SPB:

```bash
docker exec monetarie-postgres-1 psql -U cecresa -d cc_spb -c "
select source, count(*)
from bacen_messages
where source = 'legacy_ab_spb'
group by 1;
"
```

## Pontos de atencao para continuar

1. `cc_pix` local usa `cecresa_*`; os docs originais mencionavam destino logico `monetarie_*`. Nao trocar prefixo sem confirmar o schema real do ambiente alvo.
2. `message_tracking` foi tratado como destino natural no desenho, mas a verificacao local final confirmou `spb_operations` e `bacen_messages`. Se o ambiente alvo tiver tracking/event history oficial, adicionar projecao controlada.
3. `legacy_imported` e `legacy_erro` sao estados tecnicos de migracao. Antes de expor em produto, fechar tabela de traducao de status legado para status funcional.
4. `balances` recebeu 1 saldo consolidado por ISPB e `balance_history` preservou historico. Confirmar com produto/financeiro antes de usar como saldo operacional.
5. Catalogos SPB (`message_type_config`, `message_tag_definitions`) foram mesclados com `ON CONFLICT`; rollback seletivo requer diff/auditoria, nao simples drop.
6. O perfil `all` nao foi executado. Se for usado, rodar primeiro com `--limit` em ambiente descartavel e validar volume/tempo.
7. Staging JSONB contem linhas originais; tratar como dado sensivel/PII.

## Retomada sugerida para o Claude

1. Ler estes arquivos na ordem:
   - `docs/reports/2026-07-01-pix-spb-etl-handoff-claude.md`
   - `docs/reports/2026-07-01-sqlserver-backups-etl-map.md`
   - `docs/reports/2026-07-01-pix-spb-cabine-etl-manifest.md`
   - `docs/reports/2026-07-01-pix-spb-etl-load-result.md`
   - `etl/legacy_pix_spb/load_legacy_pix_spb.py`
2. Confirmar com Luiz se os artefatos `untracked` devem ser commitados integralmente. Em geral, versionar `docs/reports/*` e `etl/legacy_pix_spb/load_legacy_pix_spb.py`; avaliar se `.scratch/out/*.json` deve ficar fora do git por tamanho/sensibilidade.
3. Rodar novamente `verify` e salvar a saida como evidencia se for abrir PR.
4. Criar, se necessario, um inventario redigido separado para certificados/parametros, sem valores brutos.
5. Fechar mapa oficial de status legado:
   - PIX: `SUCESSO`, `ERRO`, `AUTORIZADO`, `BLOQUEADO`, `ENVIADA`.
   - SPB: `STATUSSGR`, `STATUSSTR`, `STATUSINTF`, `SITUACAO`, `CODEVENTO`, `TIPO_M`.
6. Definir se `legacy_imported` em SPB deve virar estado final funcional, historico/evento, ou apenas acervo auditavel.
7. Definir se linhas PIX `legacy_erro` aparecem em tela/extrato operacional ou somente auditoria.
8. Adicionar testes de idempotencia:
   - segunda execucao do ETL nao deve inserir duplicados;
   - totais por fonte devem permanecer estaveis;
   - cargas parciais por `--target pix` e `--target spb` devem funcionar isoladamente.
9. Preparar rotina de execucao em homologacao somente depois de confirmar:
   - containers/conexoes alvo;
   - usuarios por ambiente;
   - prefixos reais dos schemas PIX;
   - politica de segredo/HSM/MQ;
   - janela de carga e rollback.

## Rollback/local cleanup

Nao executar rollback destrutivo sem snapshot/dump do Postgres local.

Marcadores uteis para identificar o que veio desta carga:

PIX:

- `legacy_ab_pix.*`
- `source = 'legacy_ab_pix'`
- `statement_type = 'legacy_ab_pix'`
- `account_servicer_ref` com prefixo `legacy_ab_pix:`
- `resource_id`/`message_id`/referencias com prefixos gerados pelo ETL legado
- `cecresa_dict.parameters.description` referenciando `AB_PAGAMENTO_INSTANTANEO_BALDES_DICT.PARAMETROS_BALDE_DICT`

SPB:

- `legacy_ab_spb.*`
- `created_by = 'legacy_ab_spb'`
- `source = 'legacy_ab_spb'`
- estados `legacy_imported` criados pelo ETL

Catalogos SPB foram mesclados ao catalogo existente. Para rollback, preferir diff baseado em `created_by`, `source`, timestamps e artefato de carga, quando disponivel. Nao remover catalogos por contagem sem comparar com o estado anterior.

## Fechamento

O trabalho local chegou ao ponto de carga e verificacao nas cabines. O proximo passo nao e "subir no Core"; e amadurecer status mapping, inventario seguro de configuracoes sensiveis e repeticao controlada no ambiente alvo das cabines PIX/SPB, com os mesmos comandos e guardrails acima.

## Adendo de validação empírica (2026-07-01, Claude)

Validação read-only executada em 2026-07-01, com os dois containers vivos e apenas SELECTs:

1. Todas as contagens deste handoff foram reconferidas e batem exatamente, incluindo a conciliação do extrato ao centavo: 8.120 C/booked R$ 143.103.559,83; 4.304 D/booked R$ 166.875.645,67; 689 C + 137 D em `legacy_erro` somando R$ 24.669.070,21.
2. Tabelas sensíveis (`CERTIFICADOS`, `PARAMETROS`, `PARAMETROS_MQ`, `PARAMETROS_SEGURANCA`): zero linhas em `legacy_ab_pix.source_rows` e `legacy_ab_spb.source_rows`, confirmado por query.
3. Correções aplicadas neste documento: a query de conciliação original referenciava colunas inexistentes (`direction`, `source`); as colunas reais são `credit_debit` e `status`, e o marcador de origem legada fica em `statements.statement_type = 'legacy_ab_pix'`. A métrica de "26 tabelas" do SPB corresponde a 26 pares distintos (`source_db`, `source_table`): 19 de `AB_MGI` mais 7 de `AB_MGI_DDAMSG`. Não existe tabela `legacy_ab_spb.tables`.
4. As 2.280 statements legadas têm `message_id` nulo; dedup por `message_id` não protege esse conjunto.
5. Revisão do script `load_legacy_pix_spb.py`: staging e projeções são re-executáveis (ON CONFLICT/NOT EXISTS), com três exceções relevantes. Primeira: `cecresa_spi.balances` usa `ON CONFLICT (ispb) DO UPDATE` e sobrescreve o saldo vivo do ISPB a cada `project`; isso exige gate explícito antes de qualquer execução fora do laboratório local. Segunda: `load_audit`/`projection_audit` crescem a cada execução (62 linhas de auditoria SPB para 19 tabelas indicam múltiplas rodadas). Terceira: tabelas sem PK declarada usam sha256 da linha como PK e duplicariam se a fonte mutasse entre execuções.
6. O script não roda contra homologação como está: os SQLs de projeção têm schemas `cecresa_*` fixos (o ambiente alvo usa `monetarie_*`) e o acesso é exclusivamente via `docker exec` em containers locais (Aurora não tem container). Hoje isso funciona como proteção contra execução no ambiente errado; a adaptação é uma reescrita parcial que deve passar por nova revisão.
7. Cobertura: cerca de 2,08M linhas em staging PIX, mas só cerca de 44 mil projetadas em tabelas finais. `ORDEM_PAGAMENTO`, `ANOTACAO_CREDITO`, `BLOQUEIO`, MED/devoluções/infrações e settlement GI seguem apenas em staging, pendentes de projeção e do mapa oficial de status legado.
8. As projeções contêm valores sintéticos que precisam ser considerados em reconciliações futuras: `return_code=0` forjado em `bacen_outbound`/`bacen_inbound`, fallback de ISPB 46026562 quando o campo de origem não parece um ISPB, e `direction` sempre outbound no SPB.
