# Matriz de paridade PIX — LegadoPIX (CRK/Corner) vs Cabine Monetarie

Data: 2026-07-23. Fonte: inventário completo do dump `LegadoPIX/` (backends .NET decompilados, 184 assemblies; 18 DBs SQL Server restaurados; frontends Angular; 207 scripts SQL) confrontado com `pix/backend` (Elixir) e `pix/frontend` (Vue). Mapas de apoio em `.scratch/legado-pix-map/01..09`.

Legenda de veredito: ✅ paridade · ⚠️ divergência (candidato a defeito, verificar no código) · ❌ lacuna (ausente na cabine) · ➖ decisão de design (não é defeito).

## Sistemas do legado e correspondência

| Legado (CRK) | DB principal | Nosso equivalente |
|---|---|---|
| SPI (cabine central + ~20 workers por fila) | crk_spi, CRK_SPIMENSAGERIA, CRK_SPIFILAS, CRK_SPIAPIBACEN | `spi_service` + `settlement_service` |
| DICT (api + workers Claims/Infracao/Devolucao/Protecao/Sincronismo/Statistics) | des_4dict | `dict_service` |
| MED/GID (Recuperação de Valores 2.0) | gid (crk_gdi) | `spi_service/med` + `dict_service/funds_recovery` |
| Multiliquidação (lote / contas de terceiros) | crk_multtiliquidacao (492 mil operações) | **sem equivalente** |
| AdmWeb (usuários, alçadas, MFA, certificados) | crksecurityadminBKP | `pix/frontend` (security) + auth do Core |
| Contábil | CRK_SPICONTABIL | `settlement_service` (COSIF) |

---

## 1. Money-path PIX OUT

| Capacidade | Legado | Cabine Monetarie | Veredito |
|---|---|---|---|
| E2E nasce na entrada, reusado até o fim | E2E gerado no antifraude (`bUtilizado:false`), nunca re-mintado | E2E da consulta DICT (`E2eCache`) obrigatório por chave; MANU gera novo; `E2eBurn` estrutural | ✅ |
| Retentativa re-posta MESMO XML/MessageId | `WorkerReprocessamentoApi` re-posta idêntico; BACEN deduplica por MessageId | `OutboundSendClaim` anti re-POST | ⚠️ verificar que a retentativa reusa a mesma identidade (não re-minta) |
| Debit-then-send | débito/limite antes do envio | bloqueia Conta PI antes de enviar (`check_and_block_balance`) | ✅ |
| Assinatura XMLDSig no HSM | CLR EVOCryptoXP, na mensageria | `XmlSigner` HSM RTM, 3 refs, gate XSD pós-assinatura | ✅ |
| ACK HTTP não liquida | 201 = aceito, `PI-ResourceId` | ACK só marca ACSP | ✅ |
| Rate-limit TPS por faixa de horário | `LimitaTransacao` (TPS/seg por janela) | cap 6+6 conexões (Redis), sem TPS/seg | ⚠️ TPS por segundo/janela é peça a mais |
| Envio multipart/batch por ISPB | `SendServiceMultipart` | `OutboundBatch` (flag OFF) | ➖ paridade técnica, desligado |

## 2. Money-path PIX IN

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| Validação de crédito plugável por sistema | `IValidacaoCreditoUseCase` por IdSystem | valida conta no Core via RPC NATS | ✅ |
| pacs.002 de resposta (ACCC/RJCT) | `ConvertToPACS002FullDTO` | `send_pacs002_response` + `RejectCodes` (44) | ✅ |
| **Dedup de inbound por (ISPB, E2E/RtrId/MessageId) ANTES de creditar** | `SPI_UPDDADOSRECEPMSG2` registry por ISPB | dedup por transfer_id determinístico (histórico) | ⚠️ **verificar** guard equivalente no PIX-in |
| **camt.054 BOOK = verdade final de liquidação** | camt.054 BOOK → Efetivada; `AddtlNtryInf` → rejeição; grava DtHrLiquidacao só no BOOK | crédito ao Core no `settled` (ACSC/STLD do pacs.002) | ⚠️ **verificar**: nosso gatilho de crédito é pacs.002 ou camt.054? |
| Backfill de operação órfã pelo camt.054 | cria `MessageFull` do camt.054 sem envio conhecido | InboundProcessor trata camt.054 | ⚠️ verificar backfill de órfã |

## 3. Devolução (pacs.004) e MED

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| pacs.004 só com original localizado | exige `EndToEndIdMsgDev`, RtrId gerado, cadeia ligada | `ReturnProcessor` deriva verdade da pacs.008 original, `ReturnIdBurn` | ✅ |
| Teto cumulativo de devolução | — | `CumulativeCap` (advisory lock) | ✅ (nosso é superior) |
| MED 2.0 / TRCK002 / camt.025 | worker dedicado + grafo cautelar | `SpiService.Med` (cautelar 72h, chain 5 hops) + `FundsRecovery` | ✅ |
| 4xx BACEN terminal | — | gated `PIX_RETURN_4XX_TERMINAL` | ✅ |

## 4. DICT

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| Ciclo de chave (incluir/alterar/excluir/consultar/bloquear) | `entriesController` | `Keys`/`EntryController` | ✅ |
| Read model local + consulta base-local | `Contadict`, `ConsultaChaveBaseLocal` | cache local + `by-account` | ✅ |
| Limites PF=5/PJ=20, validade consulta 60s | `TB_PARAMETRO` | 5/20 + `DictRateLimit` | ✅ |
| Claims posse/portabilidade, quarentena 7d/30d | Worker.Claims 5 fases/3600s | `Claims` + `ClaimDeadlineConsumer` | ✅ |
| Infrações + marcador de fraude próprio | Worker.Infracao + `IncluirMarcacaoFraude` (MULE/SCAMMER) | `Infractions` + `FraudMarkers` | ✅ |
| **Proteção antivarredura (consulta × pagamento)** | `ValidaProtecaoUseCase`, `RegraProtecao` por participante/tipo pessoa | não mapeado na cabine | ⚠️ **provável lacuna** — verificar |
| Sincronismo CID (files/entries/events, categorias A/B/C/D, bloqueio 20h-08h) | Worker.Sincronismo | `CidSyncService` (full 6h + eventos 5min) | ⚠️ verificar categorias de horário |
| Statistics (KeyStatistics/OwnerStatistics) | Worker.Statistics | DICT Indicators/Statistics | ✅ |

## 5. Multiliquidação / lote

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| Importação de arquivo (ZIP→CSV 01/02/03/99) | parser posicional completo, idempotência por (doc,tipo,seq) | `FileController` STUB | ❌ **lacuna** |
| Cada linha vira pacs.008 individual (IdSystem=4) | motor de PIX-out por linha | reusa nosso motor de PIX-out | ❌ (falta a camada de lote) |
| Validação de crédito por linha (fail-closed via provedor de conta) | roteia por `ParticipanteControlado.TpSistemaConta` | — | ❌ |
| Agendamento com débito diferido + janela de retentativa por ISPB | `AgdOpe`, `JanelaRetentativa` | PIX agendado avulso vive no Core | ❌ na cabine |
| PIX Saque (OTHR) / PIX Troco (GSCB) | fluxo completo | telas existem (`PixSaquePixTroco`) mas sem motor | ❌ |
| QR composto / split payment | pagamento de QR em lote | `CompositeQRCodeController` 501 | ❌ |
| Bloqueio de infração/MED em conta de terceiro | `Bloqueio`/`SolicitacaoBloqueio` | — | ❌ |
| Expurgo (move >90d p/ histórico) | worker.expurgo | — | ❌ |

## 6. Alçada (maker-checker)

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| Faixa Vlr min/máx + teto acumulado diário por conta | `SpiCadParamAlcada` + `RegistroLimiteOperacao` | `alcada_parameters` + acumulado | ✅ modelo |
| Janela de horário (overnight/feriado/estende) | `ChecaHorario`/`EstendeLimites` | por janela horária | ✅ |
| Regra por CAMPO da mensagem (operadores In/NotIn/>=) | `PropriedadeFiltro` | — | ⚠️ verificar regra-por-campo |
| N vistos, maker≠checker, 1 rejeição terminal | `ManAlcada` | `alcada_vistos` + `SendGate` | ✅ modelo |
| **Gate no money-path automático** | retém toda operação de ida acima do limite | **flag `ALCADA_PIPELINE_ENABLED` OFF**; caminho Core isento (ANS 1,6s) | ➖ decisão de design (controle no Core) — **confirmar com o dono** |

## 7. Contábil / COSIF

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| Plano de contas / eventos / centro de custo | `EventoContabil` (2D+2C), `EventoMensagem` | `chart_of_accounts`/`journal_entries`/`accounting_events`/`cost_centers` | ✅ |
| Partida por operação vs monitor agregado | legado = agregado diário (IdStatus=9) + bucket "não contabilizado" | cabine = partida por operação (COSIF 1ª classe) | ➖ nosso é mais granular |
| **Cobertura: todo CdMsg/tag mapeado** | sobra vai a "NÃO CONTABILIZADO" | — | ⚠️ **verificar** que nenhum tipo de msg fica sem evento COSIF |

## 8. Saldos PI / Reserva

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| Saldo previsto vs confirmado (roll-forward) | `SpiSaldo` (FlAtuSldConf evita dupla contabilização) | `balances`/`balance_blocks`/`balance_history` | ✅ verificar dupla dimensão |
| Saldo CAMT (disponível/bloqueado do BACEN) | `SpiSaldoCAMT` | camt.052/053 | ✅ |
| Solicitação de crédito/débito/aporte | `ReqSaldo` | `CreditRequest`/`DebitRequest`/`LiquidityInjection` | ✅ |
| Reserva movimentada via SPB (não direto) | `ReqPagtoUseCase` (TOPAZ/JD) | SPB (outro repo) | ✅ |

## 9. Conciliação / camt.060 / expurgo

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| **camt.060 aos 50 min para presa (não-terminal)** | `DtHrOperacao < now-50min`, PAGPRI | `PaymentStatusReconciler`/`StuckOutboundChecker` | ⚠️ **verificar limiar (~50min) e fecho por admi.002** |
| Conciliação D0 CAMT.052/060 × pacs (BACEN corrige e insere faltantes) | `worker.conciliacao` | `Reconciliation`/`DailyReconciliation` | ✅ |
| Expurgo move (não deleta) p/ histórico | `worker.expurgo` (QtdDiasManter) | — | ⚠️ verificar retenção/expurgo |

## 10. Auth / segurança / RBAC / MFA

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| RBAC por funcionalidade/mensagem | bitmap `map_transacoes`, `mens_func_grupo` | `RequirePermission` (group_features) | ✅ |
| MFA TOTP, lockout, faixa de login | `spb_tb_cad_usuarios_mfa` | `Shared.Auth.MFA` | ✅ |
| Gestão de certificados mTLS | `Adm.Aux` | `Certificates` + `CertificatePool` | ✅ |

## 11. Antifraude

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| **Motor antifraude externo pré-transação (PIX-out e devolução)** | `POST /validaAntiFraudePagamento` antes de montar/assinar; fail-closed configurável; auditado | marcador de fraude do lado DICT/partner; **sem hook pré-envio no money-path** | ⚠️ **provável lacuna** — verificar |

## 12. Participante indireto

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| IspbIF (liquidante direto) ≠ IspbDebtor/IspbCreditor | separação explícita; todo pipeline multi-ISPB | `resolve_sender_ispb`, `indirect_participants`, REDA | ⚠️ verificar se money-path modela liquidante para indireto |
| Conta PI por LPI0001-0004 (Propria/Liquidante/SME) | 4 mensagens LPI | — | ⚠️ verificar |

## 13. Frontend admin

Paridade alta. Nosso admin (Vue, ~110 telas) cobre: transações, DICT, MED hub, QR, saldos (dashboard/crédito/débito/aporte), contabilidade COSIF, alçada (parameters/pending/history), mensagens ISO, camt.060, participantes/REDA, monitores (integração/tempo real/tarifa), relatórios, segurança, simulador. Telas do legado sem par claro: **Multiliquidação (Pix Saque/Troco, Operações, Parâmetros)** e **Monitor de Vistos** (aprovação de alçada em lote — nosso `alcada/Pending` cobre parcialmente).

## 14. Tarefas automáticas

| Capacidade | Legado | Cabine | Veredito |
|---|---|---|---|
| Echo/heartbeat + camt.060 agendados | `AutomacaoPIBR001`, `AutomacaoCAMT060` | `EchoProbeWorker`, reconcilers | ✅ |
| Download automático (certificados ICP, participantes, COMPE) | `downloadautomatico` diário | `Shared.Bacen.PixParticipants.ImportWorker` | ✅ |

---

## Defeitos candidatos de produção (a PROVAR no código — regra do dono)

Priorizados por risco money-path. Cada um precisa ser confirmado no código real antes de virar correção.

| # | Candidato | Domínio | Risco | Como provar |
|---|---|---|---|---|
| D1 | Gatilho de crédito ao Core dispara no **pacs.002 ACSC/STLD** e não no **camt.054 BOOK** (verdade de liquidação) | PIX-in/settlement | Crédito antes da liquidação real; divergência de saldo | Ler `StatusUpdater`/`SettlementObligationWorker`: qual evento credita o Core |
| D2 | Falta **dedup de inbound por (ISPB, E2E/RtrId/MessageId)** antes de creditar | PIX-in | Duplo-crédito por reentrega do BACEN | Ler `InboundProcessor`: há guard por E2E antes do crédito? |
| D3 | Falta **backfill de operação órfã** a partir do camt.054 | conciliação | Liquidação recebida sem envio conhecido fica perdida | Ler tratamento de camt.054 no `InboundProcessor` |
| D4 | Falta **proteção antivarredura DICT** (consulta × pagamento efetivo) | DICT | Abuso de consulta/enumeração de chaves | Buscar `RegraProtecao`/rate por participante no `dict_service` |
| D5 | Falta **hook de antifraude pré-transação** no PIX-out | antifraude | Sem barreira de fraude pré-envio | Buscar chamada a motor externo no `CoreEventProcessor`/`OutboundSender` |
| D6 | **camt.060 aos 50min**: confirmar limiar e fecho por admi.002 | conciliação | Operação presa não reconcilia no tempo certo | Ler `StuckOutboundChecker`/`PaymentStatusReconciler` |
| D7 | Retentativa de envio pode **re-mintar** MessageId/E2E | PIX-out | Duplo-pagamento em timeout de rede | Ler caminho de retry do `OutboundSender` |
| D8 | Cobertura contábil: algum CdMsg sem evento COSIF ("não contabilizado") | contábil | Lançamento regulatório faltando | Cruzar tipos de mensagem × `accounting_events` |

## Lacunas de produto (não são "erros básicos", são features ausentes)

- **Multiliquidação / lote** (importação, agendamento em lote, saque/troco, QR composto, validação de crédito por linha, bloqueio em conta de terceiro). Motor de PIX-out já existe; falta a camada de lote. Esforço MVP médio.
- **Split payment / QR composto** (501).
- **Rate-limit TPS por segundo/janela** no envio (temos cap de conexões, não TPS).

## Recomendação de sequência

1. **Verificar D1-D8 no código** (esta é a fonte dos "erros básicos"): confirmar quais são defeitos reais.
2. Corrigir os defeitos provados por ordem de risco money-path (TDD, sem deploy sem OK).
3. Só então avaliar as lacunas de produto (Multiliquidação é a maior) como frente separada.
