# Registro-mestre de gaps: paridade PIX legado CRK x cabine Monetarie

Data: 2026-07-23. Autor: sintese do deep audit de paridade PIX. Metodo: 31 dossies read-only
(`.scratch/legado-pix-map/deepaudit/*.md`), cada afirmacao com prova arquivo:linha do decompilado
.NET, tabela.coluna do SQL Server vivo (`crk_spi`, `des_4dict`, `crk_multtiliquidacao`,
`CRK_SPICONTABIL`, `crksecurityadminBKP`, `gid`) ou arquivo:linha do nosso Elixir/Vue. Verdict final
por gap veio de verificacao adversarial dupla. Este registro consolida so os vereditos CONFIRMADO e
PARCIAL como gaps acionaveis; REFUTADO e coberto estao no apendice.

Convencao de unidade recorrente: o legado guarda valor em REAIS decimais (`numeric(18,2)`); a nossa
cabine em base_units/centavos. Toda comparacao de valor exige conversao.

---

## 1. Sumario executivo

### 1.1 Foto honesta

O nucleo de MENSAGERIA ISO 20022 do money-path esta em paridade forte e em varios pontos e mais
seguro que o legado. Estao COBERTOS com prova: montagem e validacao da pacs.008 de envio (nucleo),
recepcao/credito da pacs.008 (validacao de conta, de-para de recusa AC03/AC06/AC07/AC14/AG03/BE01/
CH11/DS04, dedup, XSD, assinatura, aceite ACSP), maquina de status da pacs.002 terminal-safe sem
duplo-credito, ausencia correta da pacs.028, geracao e unicidade do RtrId da pacs.004 (nossa mais
forte que a legada), teto cumulativo de devolucao por E2E, parse de camt.052/053 (mais completo, sem
o bug de sinal do legado, com protecao de staleness e idempotencia da remuneracao), ordem de
autoridade camt.054/060/admi.002, ciclo DICT de chaves (CRUD, rate-limit por tier, penalidade
anti-enumeracao, limites PF5/PJ20), claims (5 estados, auto-resolucao por papel, equalizacao
inbound idempotente), infracoes/marcador de fraude/MED 2.0 funds-recovery, CID sync (VSYNC por XOR,
arquivo com verificacao SHA-256, diff bidirecional, hardening anti-des-bloqueio), REDA inbound
reda.016 (state machine dedicado, superior ao legado), eco pibr.001/002, LPI0001-0006 (builders
XSD-compliant, LPI0006 espelho da Conta PI que o PIX legado nem tinha), 4-olhos da alcada
(maker!=checker, N vistos, dedup de voto, despacho unico por CAS), idempotencia de envio/recepcao
(registries + burns + claims), RBAC essencial + MFA + certificados, e o APIX001 regulatorio.

Onde NAO temos paridade, os buracos se concentram em: (1) as CAMADAS DE CONTROLE (alcada universal,
motor antifraude externo, antivarredura DICT, CheckFraud) que na cabine estao ausentes, inertes por
flag ou fora do money-path automatico; (2) subsistemas de PRODUTO inteiros (Multiliquidacao/lote,
PIX Automatico lado pagador, tarifa por tipo de mensagem, contabil configuravel por evento); (3)
lacunas de FLUXO/OPERACAO (conciliacao que so detecta e nao repara, expurgo/retencao ausente,
ReqSaldo/LPI de reserva sem backend, janelas de horario DICT); e (4) alguns DEFEITOS reais em
trilhos que existem mas estao quebrados (trck.002 PJ invalido no XSD, TariffMonitor que nao
persiste, get_daily_spent que consulta coluna inexistente, tracking-graph que fabrica stub, ReqSaldo
que retorna 404).

### 1.2 Contagem de gaps acionaveis (CONFIRMADO + PARCIAL) por risco

| Risco | Entradas de gap (tally por dossie) | Temas distintos consolidados |
|---|---|---|
| Alto | ~52 | 19 (ver secao 2.1) |
| Medio | ~111 | ~45 |
| Baixo | ~83 | ~60 |
| Info | ~15 | ~12 |
| **Total acionavel** | **~261** | |

Observacao de honestidade: o mesmo defeito de fundo costuma aparecer em 2 a 4 dossies (ex.: a alcada
sem escopo aparece em `alcada`, `front-monitoracao`, `db-spi-dict` e `db-contabil-multi-seg`; o
contabil por direcao aparece em `contabil-cosif`, `front-saldos-dict-multi` e `db-contabil-multi-seg`;
a multiliquidacao aparece em `multiliquidacao`, `front-saldos-dict-multi` e `db-contabil-multi-seg`).
Por isso a coluna "temas distintos" e o numero real de frentes de trabalho.

Vereditos nao-acionaveis: REFUTADO ou coberto ~90 entradas (apendice, secao 4). INCONCLUSIVO: 3
(`dict-entries` g5 ConsultaVinculo; `alcada` g12 unidade latente com gate OFF; nota sobre a categoria
de horario da Monetarie no BACEN).

### 1.3 Distribuicao por area (gaps CONFIRMADO/PARCIAL, aprox.)

Maiores concentracoes: `front-monitoracao` (19), `db-contabil-multi-seg` (18), `pain-recorrencia`
(18), `tarifas` (12), `alcada` (13), `front-saldos-dict-multi` (14), `dict-cid-sync` (10),
`multiliquidacao` (10), `contabil-cosif` (9), `db-spi-dict` (11), `saldo-reserva` (10),
`conciliacao-expurgo` (9). Areas de mensageria com poucos gaps e todos de baixo risco:
`pacs002-028` (3, baixo/info), `pacs008-in` (6, majoritariamente info), `admi` (5, medio/baixo),
`pibr-echo` (4, baixo).

### 1.4 Ressalva sobre a area camt.025/029/055

O resultado consolidado da verificacao adversarial trouxe para `camt025-029-055` uma unica entrada
malformada (`{"id":"g1","title":"t","verdict":"REFUTADO"}`), que nao corresponde ao dossie. O dossie
`camt025-029-055.md` prova, com arquivo:linha, gaps reais e de alto risco: a camt.055 recebida NAO
gera camt.029 (o PSP solicitante nunca recebe resolucao; `med.ex:125` abre claim e `approve_claim`/
`deny_claim` sao codigo morto sem caller de producao), e a camt.025 NAO correlaciona nem fecha o
status da trck.002 original (`inbound_processor.ex:2578` so loga+broadcast). Como a linha adversarial
esta corrompida, esses gaps entram neste registro marcados com o rotulo "[verificar]", baseados
diretamente na prova do dossie, e devem passar por nova verificacao antes de virarem backlog firme.

RE-VERIFICACAO 2026-07-23 (leitura direta do codigo, nao adversarial): ambos os gaps CONFIRMADOS.
(a) `approve_claim`/`deny_claim` (`med.ex:451,462`) que emitem a camt.029 NAO tem nenhum caller de
producao (sem rota no router, sem tela, sem worker) -> a camt.055 recebida abre claim (`med.ex:125`)
mas o PSP solicitante nunca recebe camt.029. (b) `process_receipt` (`inbound_processor.ex:2579`) so
registra auditoria + detecta RJCT + broadcast; nao correlaciona nem fecha a trck.002 por MessageId.
Nenhum move dinheiro errado (sao pernas de resposta/status nao ligadas). Rotulo rebaixado de
[verificar] para CONFIRMADO.

---

## 2. Tabela priorizada dos gaps CONFIRMADO/PARCIAL

### 2.1 ALTO (19 temas)

| # | Tema (areas/ids) | Legado | Nosso | Prova-chave | Recomendacao |
|---|---|---|---|---|---|
| T1 | Alcada universal ausente/inerte (`alcada` g1-g7; `front-monitoracao` g1-g4,g6-g10; `db-contabil-multi-seg` g14-g17) | `ValidacaoAlcadaUseCase.ValidaAlcada` roda em TODA operacao de IDA com valor antes do BACEN; escopo por usuario/grupo/sistema, whitelist de aprovadores, regra por campo (8 operadores) com desempate por especificidade, acumulado diario por cliente/conta (`SpiRegLimitesOperacao.ValorDisponivel`), janela com feriado/overnight/EstendeLimites; `NrQtdeVistos==0` auto-rejeita | Gate `Shared.Alcada.SendGate` so no envio MANUAL/admin; fluxo automatico do Core isento por construcao (`@system_sources`); flag `ALCADA_PIPELINE_ENABLED` default OFF, fail-open; semantica de faixa INVERTIDA (dentro de [min,max]=retem); acumulado global por tipo/dia-UTC; sem escopo, sem whitelist, sem regra por campo | `FilaEntrada.Application.decompiled.cs:72`; `SpiCadParamAlcada` (18 colunas vivas); `send_gate.ex:81-83,113-120,161-170,229-249`; `parameter.ex:13-28`; `SpiRegLimitesOperacao` (acumulador) | Decidir com o dono se o money-path automatico da cabine deve ganhar gate de alcada; se sim, portar escopo+aprovadores+regra-por-campo+acumulado-por-cliente e ligar a flag; corrigir a semantica de faixa |
| T2 | Motor antifraude externo pre-envio ausente (`antifraude` g1-g5; `pacs008-out` g4) | Motor externo plugavel chamado antes de assinar/enviar todo PIX-out e devolucao (front-spi), com fail-closed/fail-open configuravel, timeout/circuit/fallback (Polly), historico mascarado por E2E, materializacao de "Reprovada pelo Motor" | Nenhum hook antifraude no money-path (grep=0); so screening de sancoes OFAC/PLD no OUTBOUND e no credito recebido; sem captura de IP/User-Agent/UserId/Canal; sem trilha `SpiHistMotorAntiFraude` | `SPI.Web.Api:934-964`, `MotorAntiFraudeUseCase:6709-6903`, `SpiHistMotorAntiFraude` (54 linhas); `core_event_processor.ex:227-266`, `return_processor.ex:43-44` | Definir com o dono se a SCD adota motor antifraude externo pre-envio; se sim, adicionar hook plugavel com resiliencia + trilha mascarada + config UI |
| T3 | Multiliquidacao de negocio inteira ausente (`multiliquidacao` g1-g8; `front-saldos-dict-multi` g20; `db-contabil-multi-seg` g5-g11) | Subsistema completo e vivo (492.076 operacoes): import de lote ZIP+TXT 01/02/03/99, `/batch` inline, agendamento por janela de retentativa por ISPB com debito diferido, PIX Saque (OTHR/VLDN) e Troco (GSCB/VLDN+VLCP) no fio, QR composto, bloqueio de conta parcial->total (MED), sanction screening export | `FileController` stub total; `/api/v1/batch` do gateway faz proxy para rota DELETADA (404 garantido); `composite_qr_code_controller` retorna 501; pacs.008 NAO carrega bloco de retirada (sem Wdrl/AgtMdlty/PrvdrTp); tela `PixSaquePixTroco` nasce vazia (busca endpoint de config); sem modelo de lote/operacao/janela/bloqueio | `TB_OPERACAO=492076`, `TB_ARQUIVO_PAGTO=179`; `Multiliquidacao.Core.Application:2619,4631-4680,6051`; `file_controller.ex:10-82`, `spi_proxy_controller.ex:641`, `router.ex:129-130`, `composite_qr_code_controller.ex:4`, `message_builder.ex:224-247` | Priorizar MVP (importar lote + processar por linha reusando o motor PIX-out unitario existente + `/batch` religado + status por arquivo); saque/troco/QR composto/janela em fase 2; decidir conta de terceiro controlado vs so Monetarie |
| T4 | PIX Automatico lado pagador + geracao pain.012/014 + status no aceite (`pain-recorrencia` g1-g5,g14) | Recebe pain.009/011/013 do BACEN e GERA pain.012/014; marca ACTIVE no ACEITE do pagador; valida Res 505 (retentativa, jornadas 1-4, valor minimo/maximo, devedor!=pagador, expiracao AP07, IBGE AP04, gate UsaPixAutomatico AP15) com mapa de reason codes | So ORIGINAMOS (creditor); marcamos ACTIVE no ACK de transmissao (nao no aceite); builders pain.012/014 existem mas nunca sao disparados; inbound pain.014 publicado em NATS sem consumidor; wiring invertido (update->pain.011 cancelamento, cancel->pain.012 acceptance report); regras Res 505 ausentes | `TratamentoRetornoApiBacen.Infrastructure:3874-3975`, `TB_RECORRENCIA`; `recurrences.ex:190,340,502-549`, `execution_worker.ex:287`, `inbound_processor.ex:213,3179` | Implementar o lado pagador (recepcao 009/011/013 + geracao 012/014), mover ACTIVE para o aceite, e portar as validacoes Res 505 e o mapa de reason codes |
| T5 | Tarifa por CdMsg / monitor de custo interbancario ausente + cobranca nao wired + tela quebrada (`tarifas` g1-g5; `front-monitoracao` g13) | Tarifa = custo interbancario por TIPO DE MENSAGEM ISO (CdMsg), calculada por BLOCO (NrQtdeMsgs) sobre o agregado diario; e um MONITOR/relatorio sobre as mensagens reais | Tarifa = cobranca por transacao por FAIXA DE VALOR e transaction_type; funcoes de calculo/isencao NAO sao chamadas no money-path (endpoint de isencao 501); `TariffMonitorView` manda camelCase que o changeset descarta (nao persiste); dois subsistemas de fee na mesma tabela | `SpiCadParamTarifa`+`XMsg` (25/37 linhas), `Angular.Infrastructure:2377-2395`; `fee_exemption_controller.ex:4-13`, `services/monitors.ts:110-116`, `fee.ex` (FeeRule sem caller) | Corrigir o bug do TariffMonitor (mapear snake_case); decidir se a SCD precisa do monitor de custo por CdMsg; ligar a cobranca por transacao ao money-path ou remover o codigo morto |
| T6 | Contabil por direcao (nao por CdMsg+tag), 1D+1C, devolucao sem lancamento (`contabil-cosif` g1,g2; `db-contabil-multi-seg` g1,g4) | Motor configuravel evento x mensagem x tag com peso/especificidade, ate 2D+2C com centro de custo por perna e historico padrao; qualquer liquidada (incl. pacs.004) entra ou cai no bucket "NAO CONTABILIZADO" | Mapa hardcoded por `event.direction` (INBOUND/OUTBOUND), par fixo reserva<->payable, 1D+1C sem CC; devolucao liquidada (`return.settled`) NAO e consumida pelo worker de contabilidade; contabil autoritativo do PIX vive no Core | `Contabil.Application:715-805,755-787`, `EventoContabil`/`EventoMensagem`/`EventoMensagemTag`; `settlement_obligation_worker.ex:48,177-179,392-406`, `return_processor.ex:569` | Portar (na cabine ou consolidar no Core) o mapa por CdMsg+tag e o lancamento da devolucao; nota: o Core cobre parte via `pix_reconciliation :missing_journal` |
| T7 | trck.002: PJ emite <OrgId> invalido no XSD + gateway do grafo e STUB (`trck` g1,g5) | Party CNPJ sempre em `<PrvtId>` (Book.v111 ToXml:222); grafo de rastreamento consultado real no BACEN | `party_id_type/1` retorna `"OrgId"` para 14 digitos e o builder embrulha em `<OrgId>`, invalido no XSD trck.002.spi.1.1 (Party38Choice so aceita PrvtId) -> BACEN rejeita reporte de PJ; a rota do front `/api/v2/funds-recoveries/:id/tracking-graph` FABRICA o grafo por SQL cru (hop_count=1, status COMPLETED) sem chamar o dict_service/BACEN | `trck.002.spi.1.1.xsd:193-239`, `core_event_processor.ex:1892-1896`, `message_builder.ex:1553-1555`; `dict_proxy_controller.ex:874-915` | Corrigir `party_id_type` para sempre PrvtId no trck.002; ligar a rota do tracking-graph ao caminho real (`FundsRecovery.refresh_tracking_graph`) e parar de fabricar dado sintetico |
| T8 | Antivarredura DICT (consulta x pagamento) ausente (`dict-entries` g1; `front-saldos-dict-multi` g17) | `WorkerProtecao` + `ValidaProtecaoUseCase` sobre `TB_REGRAPROTECAO`: estrangula quem consulta-acha-e-nao-paga por participante x tipoPessoa x pagador em janelas configuraveis | So rate-limit por cota de tier BACEN + penalidade de 404 + uso unico do E2E; sem correlacao consulta->pagamento (o proprio `statistics.ex:26-28` admite que nenhum decisor consome os numeros) | `DICT.Core.Application:648,2327-2361`, `Infrastructure:9455`, `TB_REGRAPROTECAO`; grep negativo em `apps/{dict,shared,spi,settlement}/lib` | Avaliar exigencia regulatoria de limitacao de consulta desproporcional a pagamento; se aplicavel, portar a regra de protecao |
| T9 | CheckFraud (decisao antifraude DICT) ausente (`dict-infracoes` g1) | `CheckFraud`/`CheckFraudFull` decide fraude por janelas d90/m12/m60 de FraudMarkers e alimenta inclusao de marcador + estatistica | Existe agregacao de estatistica mas nenhum decisor automatico a consome | `DICT.Core.Application:3489-3512`, `DICT.Web.Api:1704`; `statistics.ex:25-27` | Definir se a SCD precisa do motor de decisao; se sim, ligar a estatistica ja computada a um decisor |
| T10 | Funds Recovery: poll de event-notifications ausente (`dict-funds-recovery` g1) | Worker polla `/event-notifications` por cursor e mantem o status das recoveries em sincronia (ANALYSED/COMPLETED/CANCELLED) + re-consulta em INFORMATION_UPDATED | Sem essa perna de poll; a recovery so avanca por chamada MANUAL de `refresh_tracking_graph` | `GID.Core.Application:270-342`; `inbound_sync.ex:74` (@poll_types sem recoveries) | Adicionar perna de poll de event-notifications por cursor no `DictInboundPollWorker` |
| T11 | Janelas de horario DICT A/B/C/D + bloqueio eventual ausentes (`dict-cid-sync` g1) | `TB_TIPOHORARIO` define janelas por categoria; `ValidaHorario`+`EstaNoIntervalo` barram operacoes DICT fora da janela por participante x funcionalidade; bloqueio eventual 20h-08h ao redor do sync | Nenhuma tabela de horario, nenhuma checagem de janela; DICT opera 24x7; guarda de concorrencia so em memoria do GenServer | `DICT.Core.Application:863-887`, `TB_TIPOHORARIO`/`TB_HORARIOPARTICIPANTE`; grep negativo em `apps/dict_service` | Confirmar a categoria de horario da Monetarie no BACEN (INCONCLUSIVO hoje); se != A, implementar janelas + bloqueio eventual |
| T12 | ReqSaldo/LPI money-path da reserva ausente na cabine (`saldo-reserva` g2; `front-saldos-dict-multi` g1) | `SpiReqSaldo` (4084 linhas vivas): aporte/credito/debito da Conta PI via LPI0001-0004, com integracao SPB; tela + API + historico | Telas de credito/debito/aporte existem mas `POST /api/v1/balance/requests` NAO existe no spi_service (404); `GET /requests/pending` devolve balance BLOCKS, nao ReqSaldo; rotas admin inject/adjust chamam acoes inexistentes (500) | `SpiReqSaldo`, `SPB.Application:44-66`; `spi_service_web/router.ex:100-127`, `spi_proxy_controller.ex:502`, `balance_operation_controller.ex:200-225` | **EM CORRECAO 24/07 (decisoes do dono fechadas)**: Opcao A com B parametrizavel (BALANCE_REQUEST_EXECUTION_MODE); TODAS as 4 pernas LPI (Monetarie e emissora de moeda eletronica com CCME + tem CL; RB e de bancos); admin inject/adjust = ambos (500 era Decimal.new(float), PROVADO por RED, corrigido + as_request=true). Backend spi_service + gateway + outbox PIX->SPB FEITOS (TDD, suites verdes); lado SPB (consumer LPI + result) e frontend em curso. Plano: docs/plans/2026-07-24-defeito7-telas-reserva-lpi.md |
| T13 | Expurgo/retencao de dados de negocio ausente (`conciliacao-expurgo` g1) | Worker de expurgo move para historico (`CRK_SPIHIST`) e apaga; corte por `QtdDiasManter` (2 dias vivo) | Unica retencao e o Oban Pruner (7d de oban_jobs); nenhum worker apaga/arquiva messages/payments/statements/bacen_inbound/logs por idade; tabelas crescem sem teto | `Expurgo.Infrastructure:498-672`, param `EXPURGO`; `config/config.exs:74,145,183`, grep negativo | Definir politica de retencao COM arquivamento em cold storage (regulatorio exige 10a ICOM / 2a DICT); NAO copiar QtdDiasManter=2 as cegas |
| T14 | Participante indireto: money-path colapsa debtor no liquidante (`participante-indireto` g1) | `IspbIF` (liquidante) e `IspbDebtor`/`IspbCreditor` (reais, podem ser indiretos) sao 3 colunas distintas persistidas e propagadas por todo o pipeline | `do_payment_request` grava `debtor_ispb=sender_ispb` (liquidante) e monta a pacs.008 com DbtrAgt+AppHdr Fr = liquidante; o ISPB do indireto so aparece no log | `SPI.Core.Domain:287-291`; `core_event_processor.ex:238,558,686,704` | Latente hoje (participante direto unico); ao onboardar um indireto real, preservar o ISPB do indireto no DbtrAgt e no registro (g1 vira bloqueante) |
| T15 | Limite diario quebrado: get_daily_spent le coluna/tabela inexistente (`db-spi-dict` g3) | `SpiRegLimitesOperacao` acumula credito/debito por cliente/conta com coluna computada `ValorDisponivel` | Sem tabela acumuladora; `Limits.get_daily_spent/2` consulta `transactions.debtor_account_id`, coluna que NAO existe, em tabela nao-canonica (producao usa `messages`); `check_limit` exposto por RPC | `SpiRegLimitesOperacao`; `limits.ex:125`, dump 6188-6242, grep migrations negativo | Corrigir a consulta do acumulado diario (usar `messages`/`payments` e a coluna certa) ou criar o acumulador persistido |
| T16 | Monitor de Integracao deriva de audit logs (`front-monitoracao` g12) | `TipoMonitor` 1-4: integradas/nao-integradas com o legado, nao processadas na clearing, retorno com erro; rastreia integracao SPI x legado/clearing | A tela mostra LOG DE AUDITORIA (`/api/v1/audit/logs`), nao falhas de integracao com core/clearing; o conceito de "nao integradas"/"nao processadas na clearing" nao existe | `monitor_integracao.component.ts:128-206`; `services/monitors.ts:16-70` | Se o conceito importa, criar visao real de mensagens nao-integradas (DLQ/stuck outbound) por sistema |
| T17 | pacs.008 auto-flow omite TxId/Purpose/InitgPty/RmtInf (`pacs008-out` g1) | Template v15 emite TxId, InitgPty, Purp, RmtInf/Strd conforme o pagamento | O fluxo Core->PIX passa esses campos ao validador mas NAO os inclui na chamada do `MessageBuilder.build`; um pagamento QR originado pelo Core gera LclInstrm=QRDN SEM `<TxId>` (inconsistente ao BACEN); o caminho manual nao tem essa lacuna | `core_event_processor.ex:656-707`, `message_builder.ex:224-247`; contraste `message_controller.ex:1074-1077` | Threadar tx_id/purpose/initiating_party/remittance/value_types do evento ate o builder no fluxo automatico |
| T18 | Janela de 1h de devolucao Saque/Troco ausente (`pacs004-devolucao` g1) | Barra devolucao de OTHR/GSCB apos 1 hora (alem dos 90 dias de IPAY) | `SpiValidator` aplica 90 dias FIXO a qualquer devolucao; sem ramo por finalidade | `Multiliquidacao.Core.Application:4786`; `spi_validator.ex:30,41` | Latente enquanto a SCD nao ofertar saque/troco; adicionar a janela de 1h quando ofertar |
| T19 | camt.055 recebida nao gera camt.029 + camt.025 nao correlaciona trck.002 [CONFIRMADO 2026-07-23] (`camt025-029-055` g1,g2) | camt.055 recebida sempre gera camt.029 (ACCR/RJCR com codigo do whitelist); camt.025 fecha o TB_TRCK002 por MessageId | camt.055 abre um claim MED e NUNCA responde camt.029 (approve/deny sao codigo morto); camt.025 so loga+broadcast, nao correlaciona nem fecha o status da trck.002 | `TratamentoRetornoApiBacen.Infrastructure:3828-3866`, `GID.Core.Application:802,1146`; `med.ex:125,451,462`, `inbound_processor.ex:2578` | Fechar a malha camt.055->camt.029 (automatico ou operator-driven) e correlacionar a camt.025 a mensagem original; RE-VERIFICADO 2026-07-23 CONFIRMADO por leitura direta (approve_claim/deny_claim `med.ex:451,462` sem caller; process_receipt `inbound_processor.ex:2579` so loga+broadcast) |

### 2.2 MEDIO (compacto por area)

| Area | Gaps medio (id: titulo curto) |
|---|---|
| pacs008-out | g3 InitgPty sem validacao de CNPJ e nao emitido no auto-flow; g4 motor antifraude (ver T2) |
| pacs008-in | g1 credito inaplicavel: legado RJCT vs nosso ACSP+pacs.004 (divergencia de modelo de liquidacao) |
| pacs004-devolucao | g2 whitelist de reason codes divergente (legado 15, nosso 13 diferentes) |
| camt052-053 | g1 conciliacao legada REPARA vs nossa so DETECTA; g2 gatilho continuo+janela+state-machine vs cron diario; g3 sem API/UI/disparo-manual da conciliacao; g4 sem auto-refresh de saldo (camt.060 sob demanda quando a foto envelhece) |
| camt054-060-admi002 | g1 admi.002 "nao existe lancamento" NAO encerra a operacao presa (legado REJEITA; nos so marcamos not_found) |
| pain-recorrencia | g6 inbound pain.014 sem consumidor; g7 wiring semantica invertida; g8 retentativa Res 505; g9 jornadas 1-4; g10 valor variavel; g11 devedor!=pagador; g13 expiracao AP07; g15 identificadores SC/IS/IC; g16 codigos de frequencia (SEMI vs MIAN) |
| pain001-002-lote | g2 lote inline addLotePagto; g3 devolucao de lote; g4 lote por arquivo (todos ausentes, ver T3) |
| admi | g1 admi.002 OUTBOUND nao enviado (usamos pacs.002 RJCT); g2 camt.060 not_found nao rejeita a operacao original (mesma classe do camt054 g1) |
| pibr-echo | g1 cadencia configuravel por instituicao vs intervalo fixo global |
| reda | g1 reda.041 escopo (so nosso indireto vs diretorio geral); g2 reda.017 materializacao (tabela dedicada + fechamento por 031 vs 1 coluna) |
| trck | g2 status hardcode ACSC sem correlacao; g3 sem persistencia/historico/monitor dedicado; g4 grafo detalhado nunca persistido/exibido; g6 sem addTrck002 validado |
| lpi | g2 sem tela de aporte/saque Conta PI com derivacao automatica do codigo; g4 validacoes de negocio da origem ausentes; g5 form generico com campos fabricados que nao batem com o XSD |
| dict-entries | g2 janela de validade da consulta (60s legado vs 1800s nosso); g3 AlteraChave (mudanca de vinculo conta/chave) ausente |
| dict-claims | g1 prazos hardcoded 14/30d ignoram os periodos do BACEN no outbound; g2 timer de doador sem checar papel (pode auto-confirmar onde somos reivindicador); g3 sem auto-cancel antifraude de portabilidade inbound com documento divergente; g4 sem validacao local de EVP/OWNERSHIP em CPF/CNPJ |
| dict-infracoes | g3 fechamento AGREED nao envia FraudType nem captura FraudMarkerId; g4 regra "reportador nao fecha a propria infracao"; g5 inclusao de marcador sem validacao de CPF/CNPJ+posse |
| dict-funds-recovery | g2 FUNDS_RECOVERY_INFORMATION_UPDATED sem handler; g3 PUT /funds-recoveries/{id} (atualizar) ausente; g4 validacao local da transacao raiz (32/E-D/data/80 dias); g6 refunded_amount virtual (total_refunded sempre 0) |
| dict-cid-sync | g2 bloqueio eventual 20h-08h; g3 gate "sincronismo em execucao" para workers de claim; g4 estrategia (cascata VSync->Log->Base vs full-6h+poll-5min); g5 reacao ao drift (legado auto-cura, nos so logamos); g6 multi-participante; g9 flags OFF por default |
| alcada | g8 aprovadores por alcada (usamos RBAC global); g9 NrQtdeVistos==0 (auto-rejeicao) nao representavel |
| antifraude | g3 captura de sinais de sessao; g4 fail-closed/open+resiliencia; g5 trilha auditavel por E2E (ver T2) |
| participante-indireto | g2 long-poll ICOM assume ISPB unico; g3 POST de envio fixo em Client.ispb(); g4 Conta PI sem Propria/Liquidante/SME; g5 REDA desconectado do roteamento money-path |
| tarifas | g6 semantica de faixa (bloco vs valor); g7 resolucao de vigencia; g8 isencoes nao wired; g9 TariffMonitor descarta campos (ver T5); g10 dois subsistemas de fee na mesma tabela |
| contabil-cosif | g3 sem deteccao "NAO CONTABILIZADO" na cabine; g4 evento 1D+1C vs 2D+2C; g5 centro de custo nao vinculado as pernas; g6 sem CRUD configuravel de evento/plano na cabine |
| saldo-reserva | g1 ledger diario previsto/confirmado por dia (parcial); g4 teto de reserva (MaximoReservaSPI) + versionamento por vigencia |
| conciliacao-expurgo | g2 conciliacao nao auto-repara; g3 conciliacao de devolucao por RtrId; g6 download STR/COMPE; g7 download participantes direto/indireto; g8 automacao agendada de camt.060 |
| multiliquidacao | g5 QR composto 501; g6 agendamento por janela + debito diferido; g7 bloqueio de conta parcial->total; g8 tela PixSaquePixTroco quebrada (ver T3) |
| front-monitoracao | g5 sem regras por campo; g6 acumulado global por tipo; g7 periodo sem dias uteis/EstendeLimites; g8 historico de alcada so pendentes; g9 permissao unica ver/aprovar/rejeitar; g14 tarifa por feeType nao por cdMsg; g17 parametrizacoes gerais editor generico; g18 monitor contabil sem filtros/export/bucket; g19 filtros do monitor de lancamentos estreitos |
| front-saldos-dict-multi | g2 sem separacao real Conta PI x Reserva; g3 sem top-up automatico; g5 evento 1D+1C; g6 sem CdMsg->evento; g7 sem cadastro de historico padrao; g9 monitor contabil sem agregacao/arquivo posicional; g16 politica de limitacao DICT ausente (tela mapeada para Instituicoes); g17 antivarredura por pagador (ver T8) |
| db-spi-dict | g1 payments sem campos fiscais (OrigemTransacao/DocFiscal/Tributos); g2 messages sem IspbIF; g4 alcada sem escopo/aprovadores; g5 motor antifraude SPI de saida |
| db-contabil-multi-seg | g2 evento 2D+2C+CC vs 1D+1C; g7 janela de retentativa por ISPB; g8 participante controlado/provedor de conta de terceiro; g9 sanction screening/AML; g10 QR composto saque/troco; g12 RBAC no nivel de mensagem (cd_msg); g13 historico de senha (spb_tb_cad_senhas); g16 acumulado diario persistido por cliente/conta; g17 regras por campo (PropriedadeFiltro) + desempate por especificidade |

### 2.3 BAIXO e INFO (por area, resumido)

- pacs008-out: g5 prioridade PAGPRI/PAGFRD/PAGAGD sem cross-check; g6 validacao de tributos; g7 ModalidadeAgente/PrestadorSaque; g8 finalidade dominio fechado vs aberto; g9 CPF/CNPJ so pattern XSD sem digito verificador.
- pacs008-in: g3 DT05 nao mapeada; g6 participante indireto (LPI/IspbIF); g2/g4/g5 divergencias info (mecanismo de validacao, momento do credito, sancoes inbound).
- pacs002-028: g5 pacs.002 single sem operacao correlata (ACK-drop vs reprocessa); g6/g7 limiar/tabela vs codigo (info); g9 residuo de label pacs.028 no front (defeito cosmetico).
- pacs004-devolucao: g4 SpiValidator.validate_return_amount codigo morto (le 0 sempre); g5 IN nao amarrada a outbound nosso; g6 lista de razoes por devolucao (info).
- camt052-053: g5 desdobramento por CdMsg (Parciais); g6 tipo de relatorio REL vs TIR.
- camt054-060-admi002: g2 camt.054 nao reconstroi operacao ausente (parcial); g4 settle_payment_line sem CAS; g5 @terminal_statuses hardcoded duplica StatusCodes.
- pain-recorrencia: g12 objeto de vinculo/contrato; g17 codigo IBGE em aceite; g18 notificacao pre-debito no mesmo dia.
- pain001-002-lote: g5 tabelas batches/batch_items e rota /batch mortas (tech-debt); g7 pain.013/014 parcial.
- admi: g3 admi.004 sem persistencia estruturada nem tela; g4 camt.060 fecha not_found por qualquer motivo; g5 parser admi.002 nao extrai RjctnDtTm/ErrLctn/AddtlData.
- pibr-echo: g2 eco como operacao rastreada vs sonda de saude; g3 selecao de canal; g4 config UI do eco ausente.
- reda: g3 reda.017 pre-condicao de existencia local; g4 reda.041 aplica so NOME; g5 reda.022 ScpIndctn fixo INSE; g6 download STR/certificados QR; g7 contexto multi-instituicao.
- trck: g7 dois schemas para tracking_graphs; g8 PmtScnro fixo BOK1; g9 InstrId nao suportado; g10 builder aceita status != ACCC.
- lpi: g3 rotulos CDI vs Conta PI; g7 config de auto-aporte sem worker; g1/g6/g8 divergencias info (arquitetura de origem, fonte do saldo, alcada).
- dict-entries: g4 DerivaTpChave sem rota exposta; g5 ConsultaVinculo (INCONCLUSIVO).
- dict-claims: g5 matriz de motivo em confirm/cancel; g6 gate de janela de horario.
- dict-infracoes: g6 contato obrigatorio no legado vs opcional; g7 filtro de status da UI nao casa com o acervo; g8 estados vestigiais AWAITING_ANALYSIS/ANALYSED.
- dict-funds-recovery: g5 FlowType nao emitido; g7 parametros do grafo/timestamps virtuais.
- dict-cid-sync: g7 base da contiguidade VSYNC (armazenado vs recomputado); g8 historico de sincronismo mais pobre; g10 dedup de CIDs antes do XOR.
- alcada: g10 alerta de e-mail aos aprovadores; g11 desempate entre alcadas; g13 tela ApprovalLimits promete escopo/aprovadores que o backend descarta; g12 unidade latente (INCONCLUSIVO, gate OFF).
- antifraude: g6 relatorios/metricas; g7 config do motor; g8 msg "Reprovada pelo Motor" (info).
- participante-indireto: g6 ramo indireto dormente sem seed; g7 prazo de desvinculacao.
- tarifas: g11 validacao de duplicidade de vigencia por mensagem; g12 precisao/unidade (fracao de bloco vs centavos/bp).
- contabil-cosif: g7 layout de exportacao por conta vs por evento; g8 sem catalogo de historico padrao; g9 unidade REAIS vs base_units (info).
- saldo-reserva: g3 historico de status da requisicao; g5 valores default de requisicao versionados; g6 MetaSaldo/reposicao automatica sem executor; g8 serie historica de fotos CAMT; g9 reconstrucao com parciais por CdMsg; g10 saldo de titulos/garantia; g7 saldo de reserva STR no SPI (info).
- conciliacao-expurgo: g4 janela horaria + flags auto/manual + disparo manual; g5 state-machine/lock/polling "gerar CAMT.060"; g9 auto-request de camt.060 quando o saldo envelhece.
- multiliquidacao: g9 expurgo de operacoes de lote; g10 export de Sanction Screening.
- front-monitoracao: g10 check_and_register ignora acumulado e usa UTC; g11 sem worker de e-mail aos aprovadores; g15 sem monitor de tarifas aplicadas por mensagem.
- front-saldos-dict-multi: g8 plano de contas read-only vs CRUD; g11 sem AlteraChave; g12 bloqueio de chave nao exposto no gateway admin; g15 originar Devolucao Especial pela tela DICT.
- db-spi-dict: g6 admi.004 sem tabela estruturada; g7 modelo de saldo divergente; g8 flags de motor de status ausentes; g9 faixas de CPF/CNPJ por participante (TB_INTERVALOCHAVE); g10 claims sem coluna de contingencia; g11 camt060_requests sem NumCtrlIF/FinlddLPI/Protocolo.
- db-contabil-multi-seg: g3 sem catalogo de historico padrao; g11 de-para SFN<->legado de conta (N/A por desenho); g18 integracao AD/SiteMinder e sessao stateful (divergencia de desenho).

---

## 3. Detalhe por area

Cada bloco resume o comportamento legado x nosso e lista os gaps CONFIRMADO/PARCIAL com a prova
carregada. Os cobertos estao no apendice.

### 3.1 pacs.008 envio (PIX out)
Nucleo da montagem e validacao COBERTO (envelope, GrpHdr, CdtTrfTxInf, ChrgBr=SLEV, Tax, forma de
iniciacao, E2E reusado da consulta DICT, idempotencia por burn). Gaps: g1 (alto) o auto-flow
`CoreEventProcessor.do_payment_request` passa tx_id/purpose/initiating_party/value_types ao
`Pacs008SendValidator` (`core_event_processor.ex:656-660`) mas nao inclui no
`MessageBuilder.build("pacs.008")` (`:679-707`), gerando QRDN sem `<TxId>` e perdendo InitgPty/Ustrd;
g2 (medio) bloco Strd de Saque/Troco nao emitido (`message_builder.ex:366-367` so Ustrd); g3 (medio)
InitgPty sem validacao de CNPJ; g5-g9 (baixo) prioridade domestica, tributos, ModalidadeAgente/
PrestadorSaque, finalidade dominio aberto, CPF/CNPJ sem digito verificador.

### 3.2 pacs.008 recepcao (PIX in)
Validacao de credito + resposta ACSP/RJCT + de-para de recusa + dedup + XSD + assinatura COBERTOS
(`inbound_processor.ex`, `credit_error_codes.ex`). Gaps de divergencia de MODELO (nao defeitos): g1
(medio) credito inaplicavel: legado responde pacs.002 RJCT, nos respondemos ACSP + devolucao
automatica pacs.004 (`inbound_processor.ex:619-620,839,866-908`), origem no achado canonico "o BACEN
liquida antes de entregar a pacs.008"; g3 (baixo) DT05 nao mapeada; g2/g4/g5/g6 info (plugins por
IdSystem vs RPC unico, momento do credito, sancoes inbound, participante indireto). Verificar G1
contra o Manual SPI vigente antes de tratar como defeito.

### 3.3 pacs.002 (status) e pacs.028
Maquina de status terminal-safe, ordem de autoridade pacs.002/camt.060/camt.054 sem duplo-credito, e
ausencia correta da pacs.028 COBERTOS (verdict adversarial REFUTOU os gaps g1-g4). Gaps: g5 (baixo)
pacs.002 single sem correlacao faz ACK-drop enquanto o multi reprocessa (`inbound_processor.ex:4126-
4137` vs `:2436`); g9 (info) residuo de label pacs.028 no front (`useIso20022Labels.ts:24`); g6/g7
info (limiar camt.060 90s vs 50min, de-para por tabela vs codigo).

### 3.4 pacs.004 devolucao
RtrId (formato e unicidade estrutural mais forte), cadeia original<->devolucao, "so devolve recebido
e liquidado", teto cumulativo e o ciclo IN COBERTOS. Gaps: g1 (alto) sem janela de 1h para Saque/
Troco (`spi_validator.ex:30,41` aplica 90d fixo); g2 (medio) whitelist de reason codes divergente
(`spi_validator.ex:21` 13 codigos vs enum legado de 15, `Multiliquidacao.Core.General:6283`); g4
(baixo) `validate_return_amount` codigo morto (JOIN em `payments` que nunca recebe linha,
`spi_validator.ex:62`, teto real coberto pelo CumulativeCap); g5 (baixo) IN nao amarrada a um
outbound nosso; g6 (info) lista de razoes. G3 (motor antifraude) REFUTADO aqui, tratado em T2.

### 3.5 camt.052/053 (saldo e extrato)
Parse (mais completo, sem o bug de sinal do legado `:5707`), remuneracao REMN idempotente, 17 colunas
do RELACAO_LANCAMENTOS, protecao de staleness e snapshot EOD COBERTOS. Gaps: g1 (medio) a conciliacao
legada REPARA (muta status via `AtualizarStatusSPI` e cria operacao faltante via `CriarOperacaoNoSPI`,
`Angular.Application:3166-4185`), a nossa so DETECTA/ALERTA (`daily_reconciliation.ex:147-229`); g2
(medio) gatilho continuo+janela+state-machine vs cron diario (`config.exs:89`); g3 (medio) sem API/UI/
disparo-manual da conciliacao; g4 (medio) sem auto-refresh de saldo por camt.060 quando a foto
envelhece (`SaldoUseCase.Find:2229-2265`); g5/g6 (baixo) parciais por CdMsg, tipo REL vs TIR.

### 3.6 camt.054/060/admi.002 (liquidacao e reconciliacao)
Ordem canonica sem duplo-credito, guarda out-of-order em dois pontos, camt.060 reconciliation,
orfao inbound alert-first COBERTOS. Gaps: g1 (medio) admi.002 "nao existe lancamento" NAO encerra a
operacao presa: o legado `RejeitaPgtoPorADMI002` seta Rejeitada (`Infrastructure:2079-2110`), nos so
marcamos a camt060_request como not_found (`inbound_processor.ex:1856-1888`), e a pacs.008 fica presa
com re-consulta a cada 5min sem liberar o hold; g2 (baixo, parcial) camt.054 nao reconstroi operacao
OUTBOUND ausente; g4 (baixo) settle_payment_line sem CAS atomico; g5 (baixo) @terminal_statuses
hardcoded duplica StatusCodes.

### 3.7 camt.025/029/055 (MED tracking e cancelamento) [re-verificado 2026-07-23: CONFIRMADO]
COBERTOS: camt.029 inbound libera cautelar, camt.025 parser (StsRsn XSD-correto), camt.055 parser.
Gaps do dossie (verificar): g1 (alto) camt.055 recebida NAO gera camt.029 (`med.ex:125` abre claim,
`approve_claim`/`deny_claim` `med.ex:451,462` sem caller de producao, o solicitante nunca recebe
resolucao); g2 (alto) camt.025 nao correlaciona nem fecha o status da trck.002 (`inbound_processor.ex:
2578` so loga+broadcast, o legado `RetCAMT025`->`AtualizaTRCK002` fecha por MessageId,
`GID.Core.Application:802,1146`); g3 (medio) camt.055 outbound inexistente; g5 (medio) notification
"cancellation_request" descartada silenciosamente (tipo fora do `@valid_notification_types`,
`med.ex:171`, `notification.ex:45`); g4/g6 (baixo) camt.029 outbound com OrgnlPmtInfCxlId/CxlPrcgTp/
CxlStsRsnInf divergentes, camt.055 inbound sem validacao de negocio.

### 3.8 pain.009/011/012/013/014 (PIX Automatico / recorrencia)
Builders ISO 5/5, parser, CRUD de mandato + pause/resume/cancel + scheduler/executor COBERTOS. Gaps:
g1-g3 (alto) lado PAGADOR (inbound pain.009/011/013) e geracao de pain.012/014 ausentes por inteiro;
g4 (alto) pain.013 nao usado no agendamento (parcela vai como pacs.008 direto, `execution_worker.ex:
287`); g5 (alto) status ACTIVE marcado no ACK de transmissao, nao no aceite (`recurrences.ex:511-516`);
g14 (alto) validacoes Res 505 e mapa de reason codes (AP15/AC01/AP04/CH16/AB10) ausentes; g6-g18
(medio/baixo) inbound pain.014 sem consumidor, wiring invertido, retentativa 3R/7D, jornadas 1-4,
valor variavel, devedor!=pagador, expiracao AP07, identificadores SC/IS/IC, frequencia SEMI vs MIAN,
IBGE em aceite, objeto de vinculo, notificacao pre-debito.

### 3.9 pain.001/002 e lote
pain.001/002 corretamente ausentes nos dois lados (COBERTO). Gaps (produto): g2 lote inline
`addLotePagto`; g3 devolucao de lote; g4 lote por arquivo ZIP+TXT 01/02/03/99 (`Multiliquidacao.Core.
Application:2619`), todos ausentes (ver T3); g5 (baixo) tabelas `batches`/`batch_items` + rota
`/api/v1/batch` mortas (`router.ex:580-583`, `mon_pix_schema_clean.sql:5119/5162`); g7 pain.013/014
parcial.

### 3.10 admi.002/004/005/006/007
admi.005/006/007 corretamente ausentes nos dois lados; admi.002 inbound (correlacao direta + REDA +
camt.060) mais amplo que o legado COBERTO. Gaps: g1 (medio) admi.002 OUTBOUND (recusa de mensagem
recebida) nao e enviado, producao usa pacs.002 RJCT (`inbound_processor.ex:1223-1283`), verdict
INCONCLUSIVO se o BACEN exige admi.002; g2 (medio) camt.060 not_found nao rejeita a operacao original
(mesma classe do camt054 g1); g3 (baixo) admi.004 sem persistencia estruturada (EvtCd/EvtDesc) nem
tela (o legado tem `SpiADMI004` com 67.822 linhas); g4/g5 (baixo) camt.060 fecha not_found por
qualquer motivo, parser admi.002 nao extrai RjctnDtTm/ErrLctn/AddtlData.

### 3.11 pibr.001/002 (eco)
Agrupamento por Data/OrgnlData, XML, limite de 35 chars, MsgDefIdr COBERTOS. Gaps: g1 (medio)
cadencia configuravel por instituicao (janela+periodicidade em `SpiCadParamAutomacaoMsg`) vs intervalo
fixo global (`echo_probe_worker.ex:52`, flag default OFF); g2 (baixo) eco como operacao SPI rastreada
(status Respondida) vs sonda de saude do breaker; g3 (baixo, parcial) selecao de canal; g4 (baixo)
config UI por instituicao ausente (`scheduled_message_job.ex:10` nao aceita pibr.001).

### 3.12 reda.014/016/017/022/031/041 (participante indireto)
Ciclo outbound 014/022/031, inbound reda.016 (state machine dedicado, superior ao legado), diretorio
de participantes por download diario COBERTOS. Gaps: g1 (medio) reda.041 so aplica ao nosso indireto
por `get_by(indirect_ispb)` e so o campo NOME (`reda.ex:171-190`), o legado upserta o diretorio geral
`SpiParticipante` (`:5537-5578`); g2 (medio) reda.017 materializacao (1 coluna `confirmation_deadline`
vs tabela dedicada `SpiPendDesvPartIndireto` com Issuer/prazo/flag e fechamento por reda.031); g3-g7
(baixo) pre-condicao de existencia, campos aplicados, ScpIndctn fixo INSE, download STR/certificados,
contexto multi-instituicao.

### 3.13 trck.002 (MED tracking / grafo cautelar)
Envelope/estrutura fiel ao XSD, ciclo de status da Recuperacao de Valores, amount coerente COBERTOS;
trck.001 corretamente inexistente. Gaps: g1 (alto) Party CNPJ emite `<OrgId>` invalido no XSD
trck.002.spi.1.1 (`core_event_processor.ex:1892-1896`, `message_builder.ex:1553-1555`), BACEN rejeita
reporte de PJ; g5 (alto) gateway do tracking-graph FABRICA grafo STUB por SQL cru
(`dict_proxy_controller.ex:874-915`) em vez de consultar o BACEN; g2 (medio) status hardcode ACSC sem
correlacao; g3 (medio) sem persistencia/historico/monitor dedicado; g4 (medio) grafo detalhado nunca
persistido/exibido; g6-g10 (baixo) addTrck002 sem validacao, dois schemas divergentes, PmtScnro fixo
BOK1, InstrId nao suportado, builder aceita status != ACCC.

### 3.14 LPI0001-0006 (Conta PI / SPB)
Builders LPI0001-0005 XSD-compliant (LPI0003 mais completo que o legado), LPI0006 espelho da Conta PI
idempotente, tratamento R1/R2/R3/E COBERTOS. Nota: na cabine PIX o LPI NAO e originado (vive na cabine
SPB). Gaps: g2 (medio) sem tela de aporte/saque Conta PI com Propria/Liquidante/SME e derivacao
automatica do codigo; g4 (medio) validacoes de negocio da origem ausentes; g5 (medio) form generico
com campos fabricados (SitLancLPI/codFinalidadeLPI) que nao batem com o XSD; g3/g6/g7/g8 (baixo/info)
rotulos CDI, fonte do saldo, auto-aporte sem worker, alcada sobre movimento de Conta PI.

### 3.15 DICT chaves (CRUD + rate-limit + antivarredura)
CRUD, rate-limit por tier, penalidade de 404, limites PF5/PJ20, uso unico do E2E COBERTOS. Gaps: g1
(alto) motor de antivarredura (consulta x pagamento efetivo) ausente (`TB_REGRAPROTECAO`,
`DICT.Core.Application:648`, grep negativo nosso); g2 (medio) janela de validade da consulta 60s
legado vs 1800s nosso (`e2e_cache.ex:19`); g3 (medio) AlteraChave (mudanca de vinculo conta/chave)
ausente (sem rota PUT `/entries/:key`); g4 (baixo) DerivaTpChave sem rota; g5 (INCONCLUSIVO)
ConsultaVinculo.

### 3.16 DICT claims (portabilidade/posse)
Maquina de 5 estados, auto-resolucao por papel/tipo, equalizacao inbound idempotente, transferencia da
chave na conclusao COBERTOS. Gaps: g1 (medio) prazos OUTBOUND hardcoded 14/30d ignoram
resolution_period_end/completion_period_end que o parser ja devolve (`claims.ex:105-106,990-993`); g2
(medio) timer de doador agendado sem checar papel, pode auto-confirmar claim onde somos reivindicador
(`claims.ex:1676-1681,892-927`); g3 (medio) sem auto-cancel antifraude de portabilidade inbound com
documento divergente (legado `Infrastructure:6791-6804`); g4 (medio) sem validacao local de EVP e de
OWNERSHIP em CPF/CNPJ; g5/g6 (baixo) matriz de motivo, gate de janela de horario.

### 3.17 DICT infracoes + marcador de fraude
Enums, lifecycle assinado, sync inbound idempotente, roteamento ao MED COBERTOS. Gaps: g1 (alto)
CheckFraud (motor de decisao) ausente (`DICT.Core.Application:3489`, `statistics.ex:25-27`); g3
(medio) fechamento AGREED nao envia FraudType nem captura FraudMarkerId (`report_fraud_type` le campo
inexistente, `infractions.ex:1170-1172`); g4 (medio) regra "reportador nao fecha a propria infracao"
ausente; g5 (medio) inclusao de marcador sem validacao de CPF/CNPJ+posse de chave; g6-g8 (baixo)
contato obrigatorio, filtro de status da UI, estados vestigiais. G2 (auto-acknowledge) REFUTADO.

### 3.18 DICT funds recovery (MED 2.0) + refunds
Ciclo de status (7 estados), SituationType, payload assinado, contato 2.12 fail-closed, sync inbound
de refunds, automacao infracao->pacs.004 COBERTOS. Gaps: g1 (alto) poll de event-notifications ausente
(status nao auto-sincroniza, `GID.Core.Application:270-342`, `inbound_sync.ex:74`); g2 (medio)
FUNDS_RECOVERY_INFORMATION_UPDATED sem handler; g3 (medio) PUT /funds-recoveries/{id} ausente; g4
(medio) validacao local da transacao raiz (32/E-D/data/80 dias) ausente (`request_builder.ex:456`); g6
(medio) refunded_amount virtual, total_refunded sempre 0 (`refund_request.ex:31`); g5/g7 (baixo)
FlowType nao emitido, parametros do grafo virtuais.

### 3.19 DICT CID sync
VSYNC por XOR, arquivo /cids/files com SHA-256, diff bidirecional, eventos incrementais, hardening
anti-des-bloqueio COBERTOS. Gaps: g1 (alto) janelas de horario A/B/C/D ausentes (`TB_TIPOHORARIO`,
`DICT.Core.Application:863-887`); g2 (medio) bloqueio eventual 20h-08h; g3 (medio) gate "sincronismo
em execucao" para workers de claim; g4 (medio) estrategia cascata vs full-6h+poll-5min; g5 (medio)
reacao ao drift (legado auto-cura, nos so logamos, `cid_sync_service.ex:403-415`); g6 (medio)
multi-participante; g9 (medio) flags OFF por default; g7/g8/g10 (baixo) contiguidade, historico,
dedup antes do XOR.

### 3.20 Alcada (maker-checker, regra por campo)
4-olhos (maker!=checker, N vistos, dedup de voto, despacho unico por CAS) COBERTO. Gaps (todos alto
exceto onde indicado): g1 money-path automatico nao passa por alcada; g2 gate inerte por default; g3
semantica de faixa invertida; g4 motor de regra por campo (8 operadores) ausente; g5 escopo por
usuario/grupo/sistema ausente; g6 (parcial) acumulado diario por cliente/conta ausente; g7 janela
horaria sem overnight/feriado/dia-util/EstendeLimites; g8 (medio) aprovadores por alcada; g9 (medio)
NrQtdeVistos==0 auto-rejeicao; g10/g11/g13 (baixo) alerta de e-mail, desempate entre alcadas, tela
ApprovalLimits promete escopo que o backend descarta; g12 (INCONCLUSIVO) unidade latente com gate OFF.
Prova: `FilaEntrada.Application:72`, `SpiCadParamAlcada`, `send_gate.ex:81-249`, `parameter.ex:13-28`.

### 3.21 Antifraude pre-transacao
Nenhum item coberto (so validacao estrutural e marcadores de fraude reativos, adjacentes). Gaps: g1/g2
(alto) motor externo pre-envio ausente para PIX-out e devolucao (`SPI.Web.Api:934-964`,
`MotorAntiFraudeUseCase:6709-6903`, grep negativo nosso); g3 (medio) captura de sinais de sessao; g4
(medio) fail-closed/open + resiliencia; g5 (medio) trilha `SpiHistMotorAntiFraude` (54 linhas vivas);
g6/g7 (baixo) relatorios/metricas, config; g8 (info) materializacao "Reprovada pelo Motor".

### 3.22 Participante indireto
Modelo direct/indirect, resolucao do liquidante para AppHdr Fr/assinatura, ids ancorados no liquidante,
ciclo REDA COBERTOS. Gaps: g1 (alto) money-path colapsa o debtor no liquidante (perde o ISPB do
indireto, `core_event_processor.ex:558,686,704`); g2 (medio, parcial) long-poll ICOM assume ISPB unico
(`application_supervisor.ex:75-100`); g3 (medio, parcial) POST de envio fixo em Client.ispb()
(`outbound_sender.ex:1456`); g4 (medio, parcial) Conta PI sem Propria/Liquidante/SME; g5 (medio) REDA
desconectado do roteamento money-path (`indirect_participants` != `pix_participants`, sem FK); g6/g7
(baixo) ramo indireto dormente sem seed, prazo de desvinculacao.

### 3.23 Tarifas
Armazenamento de parametro com vigencia e valor, dimensao de tipo (transaction_type), UI administrativa
COBERTOS (parcial). Gaps: g1-g5 (alto) modelo bloco-por-mensagem vs faixa-de-valor, tarifa por CdMsg
inexistente, monitor de custo interbancario inexistente, proposito divergente, cobranca por transacao
nao ligada ao money-path (endpoint 501); g6-g10 (medio) semantica de faixa, vigencia, isencoes nao
wired, TariffMonitor descarta camelCase (`services/monitors.ts:110-116`), dois subsistemas de fee na
mesma tabela; g11/g12 (baixo) duplicidade de vigencia, precisao/unidade.

### 3.24 Contabil COSIF
So contabiliza liquidado, falha de materializacao detectada, estrutura analoga, deteccao de cobertura
no Core COBERTOS. Gaps: g1 (alto) mapa por direcao nao por CdMsg+tag (`settlement_obligation_worker.ex:
177-179`); g2 (alto) devolucao pacs.004 liquidada nao gera lancamento na cabine (`return.settled` nao
consumido); g3 (medio) sem bucket "NAO CONTABILIZADO" na cabine; g4 (medio) evento 1D+1C vs 2D+2C; g5
(medio) centro de custo nao vinculado as pernas; g6 (medio) sem CRUD configuravel de evento/plano; g7/
g8 (baixo) layout de exportacao, catalogo de historico padrao; g9 (info) unidade. Ressalva: o backup
legado tinha config de laboratorio; a superioridade e de CAPACIDADE.

### 3.25 Saldo previsto/confirmado + reserva + remuneracao
Holds/reserva (balance_blocks, mais rico), CAMT.060 7 acoes, consulta de remuneracao, confirmado CLBD
com monotonicidade COBERTOS; sweep de remuneracao ao Core e ENHANCEMENT nosso. Gaps: g2 (alto)
ReqSaldo/LPI money-path de aporte/credito/debito ausente na cabine PIX (`SpiReqSaldo` 4084 linhas, tela
gated, rota 404); g1 (medio, parcial) ledger diario dupla-dimensao previsto/confirmado por dia; g4
(medio, parcial) teto de reserva MaximoReservaSPI + versionamento por vigencia; g3/g5/g6/g8/g9/g10
(baixo) historico da requisicao, defaults versionados, MetaSaldo sem executor, serie de fotos CAMT,
parciais por CdMsg, saldo de titulos/garantia; g7 (info) SaldoSpb no SPI.

### 3.26 Conciliacao + expurgo + tarefas automaticas
Conciliacao EOD 3 vias, snapshot EOD, download diario do diretorio, conciliacao de sessao de netting,
alerta por telemetry COBERTOS. Gaps: g1 (alto) expurgo/retencao de dados de negocio ausente
(`Expurgo.Infrastructure:498-672`, so Oban Pruner de 7d); g2 (medio) conciliacao nao auto-repara
(read-only vs mutacao); g3 (medio) conciliacao de devolucao por RtrId; g6 (medio) download STR/COMPE;
g7 (medio, parcial) download participantes direto/indireto; g8 (medio) automacao agendada de camt.060;
g4/g5/g9 (baixo) janela+flags+disparo manual, state-machine/lock, auto-request de camt.060. G10/g11
REFUTADOS.

### 3.27 Multiliquidacao / lote (produto)
Motor de PIX-out unitario, reconciliacao camt.060, recorrencia por caminho proprio, RetornoMQ
substituido por NATS COBERTOS. Gaps: g1 (alto) import de arquivo de lote ausente (`FileController`
stub); g2 (alto) `/batch` do gateway aponta para rota deletada (404); g3/g4 (alto, parcial) PIX Saque
e Troco end-to-end ausentes (pacs.008 nao carrega bloco de retirada); g5 (medio) QR composto 501; g6
(medio) agendamento por janela + debito diferido; g7 (medio) bloqueio de conta parcial->total; g8
(medio) tela PixSaquePixTroco quebrada; g9/g10 (baixo) expurgo de lote, sanction screening export.

### 3.28 Front: monitoracao + parametrizacoes + alcada
Cobertos: 4-olhos, N-vistos + despacho unico, participante indireto REDA com ciclo, cadastros
contabeis, RCO/tempo de resposta. Gaps alto: g1/g2/g3/g4 alcada sem escopo/aprovadores + gate OFF + UI
que aprova Registration sem liberar a mensagem retida (`alcadas.ex:154-170` vs `held_messages.ex:214-
269`, sem UI para `/messages/held`); g12 monitor de integracao deriva de audit logs; g13 TariffMonitor
nao persiste. Gaps medio: g5-g9 regras por campo, acumulado global, periodo, historico so pendentes,
permissao unica; g14 tarifa por feeType; g16 alerta parametrizavel por evento+usuario ausente; g17
parametrizacoes gerais editor generico; g18/g19 monitor contabil sem filtros/export/bucket, filtros do
monitor de lancamentos estreitos. Baixo: g10 check_and_register em UTC ignora acumulado; g11 sem
worker de e-mail; g15 sem monitor de tarifas aplicadas.

### 3.29 Front: saldos + contabil + DICT + multiliquidacao
Cobertos: parametros de saldo (parcial), Centro de Custo CRUD, claims, infracoes/fraude/MED,
indicadores/ANS, relatorios DICT reais. Gaps alto: g1 ReqSaldo sem backend (SPI 404, tela parece
funcional); g20 multiliquidacao de negocio inteira ausente. Medio: g2 sem separacao real Conta PI x
Reserva (`services/balance.ts:253-259`); g3 sem top-up automatico; g5/g6/g7/g9 contabil 1D+1C, sem
CdMsg->evento, sem cadastro de historico padrao, monitor sem agregacao/arquivo posicional; g16 politica
de limitacao DICT ausente (tela mapeada para Instituicoes, `services/dict.ts:79`); g17 antivarredura.
Baixo: g8 plano de contas read-only; g11 sem AlteraChave; g12 bloqueio de chave nao exposto no gateway
admin; g15 originar Dev Especial pela tela DICT.

### 3.30 DB: SPI core + DICT + indices
Nucleo money-path (messages/payments/history), idempotencia, DICT keys/claims/MED, rate-limit/anti-scan,
indices de consulta COBERTOS ou superiores. Gaps: g3 (alto) `SpiRegLimitesOperacao` sem equivalente e
o substituto `get_daily_spent` consulta `transactions.debtor_account_id` inexistente em tabela
nao-canonica (`limits.ex:125`); g1 (medio) payments sem OrigemTransacao/DocFiscal/Tributos; g2 (medio)
messages sem IspbIF; g4 (medio) alcada sem escopo; g5 (medio) motor antifraude SPI de saida
(`SpiHistMotorAntiFraude`); g6-g11 (baixo) admi.004 estruturado, modelo de saldo, flags de status,
TB_INTERVALOCHAVE, contingencia de claim, camt060_requests sem NumCtrlIF/FinlddLPI/Protocolo.

### 3.31 DB: contabil + multiliquidacao + seguranca
Cobertos: engine de alcada com maker/checker, RBAC essencial + MFA + certificados, idempotencia de
credito recebido (E2ECache ~ TB_CONFIRMACAO_RECEBIDA), APIX001, motor de tarifa mais rico. Gaps alto:
g1 mapa contabil por CdMsg+tag (EventoMensagem/Tag); g4 devolucao nao gera lancamento; g5 sem modelo de
operacao/lote; g6 sem bloqueio de saldo em conta (MED); g14 alcada sem escopo/aprovadores; g15 alcada
so envio manual + flag OFF vs toda operacao de IDA. Medio: g2 evento 2D+2C+CC; g7 janela de retentativa
por ISPB; g8 participante controlado; g9 sanction screening; g10 QR composto; g12 RBAC no nivel de
mensagem (`spb_tb_cad_mens_func_grupo` 46.493 linhas com cd_msg); g13 historico de senha
(`spb_tb_cad_senhas`); g16 acumulado por cliente/conta; g17 regras por campo. Baixo/divergencia de
desenho: g3 historico padrao; g11 de-para SFN<->legado (N/A); g18 AD/SiteMinder/sessao stateful.

---

## 4. Apendice: REFUTADO e coberto (para dar confianca)

Estes itens tiveram verdict REFUTADO ou coberto e confirmam que a paridade ja existe (as vezes com
implementacao superior a legada). Nao sao backlog.

- **Mensageria pacs.008 out**: envelope/GrpHdr, nucleo CdtTrfTxInf, ChrgBr=SLEV, forma de iniciacao,
  E2E reusado, idempotencia por burn, Dbtr/Cdtr sempre PrvtId (g10/g11 REFUTADOS).
- **pacs.008 in**: validacao de credito + ACSP/RJCT, de-para de recusa, dedup, XSD, assinatura, aceite
  ACSP (nao ACCC), AddtlInf no RJCT, terminal-safe, casamento por E2E/RtrId (c1-c10 CONFIRMADOS como
  cobertos; c4 XSD parcial).
- **pacs.002**: mapa de status, terminal-safe idempotente, ordem pacs.002/camt.060/camt.054 sem
  duplo-credito, pacs.028 ausente por desenho, ACCC/STLD final:false (g1-g4,g8 REFUTADOS).
- **pacs.004**: RtrId formato+unicidade estrutural (mais forte), so devolve recebido+liquidado, teto
  cumulativo por E2E, IN aceite+credito na confirmacao, auto-return inaplicavel (c1-c8 CONFIRMADOS).
- **camt.052/053**: parse SADP/SABK sem bug de sinal, remuneracao REMN idempotente, 17 colunas do
  extrato, protecao de staleness (c1-c3,c6 REFUTADOS como cobertos).
- **camt.054/060/admi.002**: pacs.002 credita, anti duplo-credito em dois pontos, camt.060
  reconciliation, classificacao camt.054, orfao inbound alert-first, OperationQuery fail-closed,
  StuckOutbound so detecta (c1-c8 REFUTADOS como cobertos).
- **camt.029 inbound + camt.025 parser + camt.055 parser** (g7/g8/g9 cobertos).
- **pain recorrencia**: builders 5/5, parser, CRUD + pause/resume/cancel, scheduler/executor (c1-c4
  REFUTADOS como cobertos).
- **admi**: admi.005/006/007 ausentes nos dois, admi.002 inbound mais amplo, deteccao/roteamento,
  auditoria (c1-c4 REFUTADOS como cobertos).
- **pibr**: agrupamento por Data/OrgnlData, XML EchoReq/EchoRpt, 35 chars (c1-c3 REFUTADOS).
- **reda**: reda.016 inbound state machine, ciclo 014/022/031 + parse 017/041 (g8/g9 REFUTADOS).
- **trck**: trck.001 inexistente, envelope fiel, ciclo de status, amount coerente (g11-g14 REFUTADOS).
- **lpi**: builders 0001-0005, LPI0006 espelho, tratamento R1/R2/R3/E (c1-c4 REFUTADOS).
- **dict entries**: rate-limit por tier, penalidade 404, limites PF5/PJ20, uso unico do E2E, CRUD
  (g6-g10 REFUTADOS).
- **dict claims**: 5 estados, auto-resolucao por papel, equalizacao inbound, gating de papel,
  validacao de posse, transferencia da chave (c1,c3,c4,c5,c6,c8,c10 REFUTADOS).
- **dict infracoes**: trilhas + cursor, enums + lifecycle (g9,g10 REFUTADOS); auto-acknowledge g2
  REFUTADO.
- **dict funds recovery**: ciclo de status, SituationType, payload assinado, contato 2.12, sync de
  refunds, automacao infracao->pacs.004 (g8-g15 REFUTADOS).
- **cid sync**: VSYNC XOR, arquivo com SHA-256, eventos incrementais, guarda anti-des-bloqueio (c1,c2,
  c3,c6 REFUTADOS).
- **alcada**: maker!=checker, um voto, rejeicao terminal, retencao+trilha (g14-g17 REFUTADOS).
- **antifraude**: validacao estrutural fail-closed, marcadores de fraude DICT (c1,c4 REFUTADOS).
- **participante indireto**: modelo direct/indirect, resolucao do liquidante, ids ancorados, ciclo
  REDA (c1-c4 REFUTADOS).
- **tarifas**: armazenamento de parametro, dimensao de tipo (parcial), UI (c1-c3).
- **contabil**: so liquidado, falha detectada, tarifa nao gera COSIF, estrutura analoga, deteccao no
  Core (c1-c5 REFUTADOS).
- **saldo/reserva**: holds, CAMT.060 demonstrativo + sweep (g11,g12 REFUTADOS).
- **conciliacao**: EOD 3 vias, snapshot, diretorio, netting, alerta (c1-c5); g10/g11 REFUTADOS.
- **multiliquidacao**: motor unitario, reconciliacao, recorrencia, RetornoMQ->NATS (g11-g14 REFUTADOS).
- **front**: 4-olhos, N-vistos+CAS, REDA, cadastros contabeis, indicadores/relatorios DICT reais,
  Centro de Custo CRUD, parametros de saldo (parcial).
- **DB**: nucleo money-path, idempotencia, DICT keys/claims/MED, rate-limit, indices, RBAC+MFA+cert,
  APIX001, idempotencia de credito recebido (c1-c5 e g12-g16 REFUTADOS).

---

## 5. Lacunas de PRODUTO vs DEFEITOS

Separacao pratica para o planejamento: features ausentes (decisao de produto, esforco maior) vs
trilhos que existem mas estao quebrados (correcao pontual, geralmente barata).

### 5.1 Lacunas de PRODUTO (features/capacidades ausentes)

1. **Multiliquidacao / lote de pagamento** (T3): import 01/02/03/99, `/batch`, agendamento por janela
   com debito diferido, PIX Saque/Troco no fio, QR composto, bloqueio de conta parcial->total, sanction
   screening. E o maior buraco funcional. Base reaproveitavel: motor PIX-out unitario + schema de
   saque/troco ja existem.
2. **PIX Automatico lado pagador** (T4): recepcao de pain.009/011/013 e geracao de pain.012/014 +
   regras Res 505 (retentativa, jornadas, valor variavel, devedor, expiracao).
3. **Motor antifraude externo pre-envio** (T2): pix-out + devolucao, com resiliencia, trilha mascarada,
   config e relatorios.
4. **Motor de alcada universal** (T1): escopo por usuario/grupo/sistema, whitelist de aprovadores,
   regra por campo, acumulado por cliente/conta, cobertura do money-path automatico.
5. **CheckFraud** (T9) e **antivarredura DICT** (T8): motores de decisao/protecao do DICT.
6. **Tarifa por CdMsg + monitor de custo interbancario** (T5, parte).
7. **Contabil configuravel** (T6): motor evento x mensagem x tag, 2D+2C, centro de custo por perna,
   historico padrao, bucket "NAO CONTABILIZADO", export posicional.
8. **Expurgo/retencao com arquivamento** (T13).
9. **ReqSaldo/LPI money-path da reserva pela cabine** (T12) e **top-up automatico por min/max**.
10. **Janelas de horario DICT A/B/C/D + bloqueio eventual** (T11).
11. **Conciliacao camt.052/053 com reparo + UI/disparo manual + auto-refresh de saldo** (camt052-053
    g1-g4).
12. **Notificacao/alerta parametrizavel por evento de mensagem + usuario** (front g16, alerta).
13. **RBAC no nivel de mensagem (cd_msg)** e **historico de senha** (db-contabil-multi-seg g12,g13).
14. **Poll de event-notifications da recovery** (T10) e **PUT de atualizar recovery**.
15. **camt.055 -> camt.029 (resolucao ao solicitante)** e **camt.055 outbound** (T19, verificar).

### 5.2 DEFEITOS (trilhos existentes quebrados)

1. **trck.002 PJ emite `<OrgId>` invalido no XSD** (T7, alto): BACEN rejeita o reporte de PJ.
   `core_event_processor.ex:1892-1896`.
2. **Gateway do tracking-graph fabrica grafo STUB** (T7, alto): dado sintetico enganoso.
   `dict_proxy_controller.ex:874-915`.
3. **get_daily_spent consulta coluna/tabela inexistente** (T15, alto): limite diario quebrado.
   `limits.ex:125`.
4. **TariffMonitor nao persiste** (T5, alto): camelCase descartado pelo changeset.
   `services/monitors.ts:110-116`.
5. **ReqSaldo retorna 404** (T12, alto): tela de credito/debito/aporte parece funcional mas o backend
   nao existe; rotas admin inject/adjust chamam acoes inexistentes (500). `spi_service_web/router.ex:
   100-127`, `balance_operation_controller.ex:200-225`.
6. **/api/v1/batch proxy para 404 garantido** (multiliquidacao g2). `router.ex:129-130`.
7. **Tela PixSaquePixTroco nasce vazia** (multiliquidacao g8): busca endpoint de config.
8. **AlcadaPending aprova Registration que nao libera a mensagem retida** (front g4/g6-disconnect):
   a liberacao real e `/messages/held/:id/approve`, sem UI.
9. **check_and_register ignora acumulado e usa UTC** (front g10, alcadas.ex:53-82,187).
10. **notification "cancellation_request" descartada silenciosamente** (camt025-029-055 g5,
    med.ex:171).
11. **SpiValidator.validate_return_amount codigo morto** (pacs004 g4): le 0 sempre; teto real coberto
    pelo CumulativeCap.
12. **pacs.008 auto-flow gera QRDN sem `<TxId>`** (T17, pacs008-out g1).
13. **Tela Politicas DICT mapeada para cadastro de Instituicoes** (front-saldos g16).
14. **refunded_amount virtual, total_refunded sempre 0** (dict-funds-recovery g6).
15. **Tabelas batches/batch_items + rota /api/v1/batch mortas** (pain001-002 g5, tech-debt).
16. **Residuo de label pacs.028 no front** (pacs002-028 g9, cosmetico).
17. **admi.002 not_found nao encerra a operacao presa** (camt054 g1 / admi g2): hold nunca liberado.

Fim do registro.
