# Paridade SPB: Monetarie x Legado (Evolution SPB + AutBank MGI)

Data: 2026-07-02
Escopo: síntese da Fase B (5 domínios) da comparação entre a cabine SPB da Monetarie (`spb/services/bacen_gateway`, Elixir + admin Vue) e os legados Evolution SPB (`/Users/luizpenha/mwbank/LegadoSPB`, suíte .NET) e AutBank MGI (bancos `AB_MGI` e `AB_MGI_DDAMSG` restaurados localmente no container `monetarie-bak-mssql`, com staging em `cc_spb.legacy_ab_spb`).
Método: 100% read-only. Cada veredito carrega evidência (arquivo:linha, procedure ou contagem de banco). Vereditos incertos foram marcados DIVERGENTE_VALIDAR. Os fatos de maior impacto foram re-verificados no código em 2026-07-02 (seção 1.2).

Vocabulário de veredito:

- PARIDADE_OK: funcionalidade equivalente comprovada.
- MELHOR_NO_MONETARIE: a Monetarie cobre o caso do legado e o supera.
- MELHOR_NO_LEGADO: o legado tem capacidade que a Monetarie não tem (ou tem incompleta).
- FALTA_NO_MONETARIE: lacuna concreta comprovada.
- DIVERGENTE_VALIDAR: precisa de decisão do dono ou de prova viva antes de virar item de backlog.
- OVERLAP_REMOVER: duplicação interna da Monetarie a consolidar.

## 1. Resumo executivo

A base Monetarie SPB está em paridade ou acima do legado no núcleo do produto. Dos 187 itens brutos levantados nos 5 domínios, após deduplicação restaram 155 itens únicos:

| Veredito | Itens | % |
|---|---|---|
| PARIDADE_OK | 68 | 44% |
| MELHOR_NO_MONETARIE | 26 | 17% |
| DIVERGENTE_VALIDAR | 31 | 20% |
| FALTA_NO_MONETARIE | 21 | 14% |
| OVERLAP_REMOVER | 5 | 3% |
| MELHOR_NO_LEGADO | 4 | 3% |

Pontos fortes comprovados da Monetarie: ciclo de vida explícito com timeline e checkpoints R0/COA/COD/R1/R2/R3, retry com backoff e DLQ, JetStream com dedup no lugar de polling, grade horária auto-ingerida (GEN0021) e enforçada no envio, cripto v3 AES-256-GCM com chave privada exclusivamente no HSM RTM, self-service de certificados (trilhas A e B) validado vivo com GEN0006/GEN0006R1, contrato de saldo por mensagem portado do Evolution (1.452 linhas), ledger de movimentos idempotente e reconciliação dedicada com tolerância zero.

Achados críticos (todos re-verificados no código em 2026-07-02):

1. **Dupla autorização não enforçada no envio.** O motor de alçadas existe completo (engine, telas, rotas), mas o funil de envio (`messages_controller.ex`, `send` na linha 260) não tem nenhuma referência a alçada ou visto: qualquer usuário autenticado dispara envio real ao BACEN em 1 passo. No legado, nada sai sem STATUSSGR chegar a 2/3. Também não há trava de mesmo usuário no visto (status 32 do legado).
2. **CancellationEngine sem fiação.** As 6 variantes protocolares de cancelamento existem, mas grep confirma zero call-site fora do próprio módulo; o cancel do operador (`operations_controller.ex:384-427`) só faz UPDATE de estado local, sem emitir a mensagem de cancelamento ao BACEN. Risco real de divergência de estado com o BACEN.
3. **Semântica errada de GEN0014/15/17/18 no CoaCodHandler.** O catálogo BACEN (provado por `AB_MGI.EVENTOS`) define GEN0014/0015 como requisição/aviso de arquivo e GEN0017/0018 como arquivo via prestador / data de ativação de certificado; o `coa_cod_handler.ex` os usa como abertura/fechamento de dia, em conflito com o próprio `file_transfer/orchestrator.ex`. Pela regra do dono (BACEN é a verdade), o defeito é nosso.
4. **Subsistema Liquidante com saldos fabricados.** `Liquidante.Processor` + `BalanceManager` estão supervisionados (`application.ex:168`) e no caminho inbound vivo (`message_processor.ex:742-753`), decidindo liquidação contra saldos ETS default de R$ 100M/R$ 50M (`balance_manager.ex:572-579`) e emitindo respostas (LDL0002/LTR0002/CMP0002/SLC0002) que a IF não deveria originar.
5. **LPI0006 sem materialização.** Notificação de transferência automática para a Conta PI chega ~2/dia em HML e é apenas registrada (`inbound_consumer.ex:345-377,543-550`): não cria operação, não posta no grupo 43 e não espelha a Conta PI.
6. **Defeitos de catálogo vivos:** `MessageTypeDriver.requires_balance?/requires_accounting?` testam `financial_flag == "S"` (`message_type_driver.ex:64,77`) mas o domínio real da coluna é F/N/D/T/A/C com zero linhas "S"; `value_tag` gravado com colchetes ("[VlrLanc]") nunca casa no `extract_amount` (`message_type_driver.ex:332`, sobrevive só pelo fallback de tags comuns); regex de TpCtDebtd/TpCtCredtd (`xsd_validator.ex:79-80`) rejeitaria CG, valor legítimo do dicionário 5.11.
7. **Cobertura de catálogo:** 983/1.026 legs do manual 5.11 presentes (95,8%); faltam 43 legs, todos R1/R2/R3, mais 6 SCG R1 do catálogo DDA. Em compensação a Monetarie tem 783 tipos além do legado (1.766 no total).

Nenhum desses itens toca os caminhos vivos validados em HML (seção 5). O gate de alçada, por exemplo, entra ANTES do `RealDispatcher`.

### 1.1 Fontes por domínio

- Domínio 1 (ciclo de vida): procedures AB_MGI vivas (`P_CONSULTA_TRANSACOES` com ~100 operações de tela, `SP_GRAVA_TRANS_INTF`, `SP_ENTREGA_PARA_LEGADO`, dump em `ab_mgi_modules.sql`), schemas Evolution via Equalizador (`tabs.json`) e o `bacen_gateway` (LifecycleEngine, seed 036 com 58 status, StatusDePara 495+89, PendingQueue, ClearingLifecycle, GradeLifecycle, DayAutoClose, CancellationEngine, SubstitutionEngine, DLQ, sweepers).
- Domínio 2 (catálogo/roteamento/validação): `AB_MGI.MENSAGENS/EVENTOS/DOMINIOS/COLUNAS/TIPODADO/CONFIG_TAGS` (versionados por VRSMANUAL) x `message_type_config` (1.766), `message_tag_definitions` (21.547), `bacen_validation_rules` (20.639), `post_integration_config` (1.448).
- Domínio 3 (MQ/canais/cripto/contingência): `AB_MGI.FILASMSG/PARAMETROS_MQ/PARAMETROS_SEGURANCA/CERTIFICADOS` x sidecar JMS (`Sidecar.java`), `DomainManager`, `MessagePacker` v3, `InboundAudit`, stores de certificado.
- Domínio 4 (tesouraria/liquidação/contabilidade): `spb_tb_gen_grupo_saldo` (44 grupos), `spb_sp_atu_saldo_res` e correlatas x `BalanceHandler`, `BalanceTracker`, `Posting`, `Reconciliation`, `DayOpenClose`, handlers RDC/RCO/LPI/LDL.
- Domínio 5 (administração/operação): as ~100 operações de tela do `P_CONSULTA_TRANSACOES` + telas ADMWeb x telas Vue (operator/admin) e controllers do `bacen_gateway_web`.

### 1.2 Fatos re-verificados nesta síntese (2026-07-02, read-only)

1. `messages_controller.ex`: zero referências a alçada/visto/awaiting_approval; `send` na linha 260 (grep).
2. `CancellationEngine`: zero call-sites fora de `cancellation_engine.ex` (grep em todo `lib/`).
3. `coa_cod_handler.ex:1-17`: moduledoc confirma GEN0014/GEN0015 como abertura de dia e GEN0017/GEN0018 como fechamento.
4. `engines/message_type_driver.ex:64,77`: predicados exigem `financial_flag == "S"`.
5. `engines/message_type_driver.ex:326-336`: fallback `["VlrLanc","VlrPag","Vlr","VlrOper","VlrLiq","VlrTot","VlrFinanc"]` e `Regex.escape` do valor bruto do `value_tag` (colchetes não removidos).
6. `validation/xsd_validator.ex:79-80`: pattern `^(CC|PP|CI|PG|CD|CO)$` para TpCtDebtd/TpCtCredtd.
7. `application.ex:168` (Liquidante.Supervisor ativo), `message_processor.ex:742-753` (delegação inbound viva), `liquidante/balance_manager.ex:572-579` (defaults 100_000_000_00 e 50_000_000_00 centavos).
8. `consumers/inbound_consumer.ex:345-377,543-550`: LPI0006 classificado como `:inbound_notification` e apenas registrado.

## 2. Matriz de paridade por domínio (com dedupe)

Itens que apareciam em mais de um domínio foram consolidados em uma única linha no domínio mais pertinente; a nota de dedupe ao fim de cada tabela lista as fusões. Coluna Ação referencia o backlog da seção 3 (P0-x, P1-x, P2-x, P3) ou indica "manter".

### 2.1 Domínio 1: ciclo de vida de mensagens/operações

| # | Funcionalidade | Legado (evidência) | Monetarie (evidência) | Veredito | Ação |
|---|---|---|---|---|---|
| D1.1 | Máquina de estados fim a fim | STATUS/STATUSSTR/STATUSSGR em TRANSACOES/TRANS_SISTEMAS (`ab_mgi_modules.sql:879-924`); `spb_tb_gen_status_oper` 58 status | `spb_operation.ex:12-19` (18 estados) + `bacen_message.ex:16-25` (21) + `lifecycle_engine.ex:2028-2040` | PARIDADE_OK | manter |
| D1.2 | De-para dos 58 status legados | `spb_tb_gen_status_oper` (tabs.json) | seed `036_legacy_status_mapping.exs:35-93` + `kpi_buckets.ex` | PARIDADE_OK | manter |
| D1.3 | Dupla autorização antes do envio (STATUSSGR 1->2->3, telas 0/01/0A/T/TA/CA) | `SP_GRAVA_TRANS_INTF` (`ab_mgi_modules.sql:3417-3425`) + telas de autorização (`:1428-1476`) | `AlcadaEngine` existe mas `messages_controller.ex:260` despacha sem gate (re-verificado 2026-07-02); telas VistosMonitorView/AlcadaConfigView só monitoram | FALTA_NO_MONETARIE | P0-1 |
| D1.4 | Segregação de funções no visto (mesmo usuário não aprova; status 32) | Evolution status 32 "Mesmo Usu Visto Alçada" (seed 036:66-67) | `AlcadaEngine.approve` não compara aprovador com criador | FALTA_NO_MONETARIE | P0-1 |
| D1.5 | Cancelamento protocolar por estágio (telas 5/6/9/RC/CR) | `P_CONSULTA_TRANSACOES` ops 5/6/9/RC/CR (`ab_mgi_modules.sql:1516-1639,1877-1894`); `spb_sp_trata_roteamento_protcancel` | `cancellation_engine.ex` (6 variantes) e `cancellation_rules.ex` completos, PORÉM sem call-site; o cancel do operador (`operations_controller.ex:384-427`) só flipa estado local (reconciliado com D5, re-verificado) | MELHOR_NO_LEGADO | P1-1 |
| D1.6 | Pendências por grupo (STATUSSTR 06 reserva vs 08 PAG) | ops 6/L (`ab_mgi_modules.sql:1552-1554,1763-1775`) | `str/pending_queue.ex` (SitLancSTR 17-25, retry até 10, auto-rejeição no fechamento) | PARIDADE_OK | manter |
| D1.7 | SOS Envio (envio sem verificação de saldo, tela 1F) | op 1F (`ab_mgi_modules.sql:776,1478-1487`) | inexistente (grep); só `BalanceController.force` (override de posição) | FALTA_NO_MONETARIE | P1-7 |
| D1.8 | Voltar status (tela VST) | op VST STATUS 2-3 (`ab_mgi_modules.sql:1531-1542`) | só rollback de data (`system_date.ex:108-120`); grafo permite failed->created e r1_rejected->created, sem ação de mesa | FALTA_NO_MONETARIE | P1-7 |
| D1.9 | Conversão PAG<->STR (telas PS/SP) | ops PS/SP (`ab_mgi_modules.sql:1860-1924`); flag `flg_permite_conv_str_pag` + status 1005-1007 | só o mapa de status (`pag_str_status.ex`) e os códigos no seed 036; nenhum motor de conversão | FALTA_NO_MONETARIE | P1-8 |
| D1.10 | Reaproveitamento de enviada (tela RE, RCO0002) | op RE (`ab_mgi_modules.sql:1895-1907`) | `substitution_engine.ex` cobre correção (cancela + reenvia) via `substitution_controller.ex`; reuso sem cancelamento inexiste | DIVERGENTE_VALIDAR | pendência 6.9 |
| D1.11 | Contingência do BACEN por arquivo (tela 1A) e Circular 3.290 | op 1A (`ab_mgi_modules.sql:775`); op 82 STR0043 (`:2622-2634`); ADMWeb Circular3290 | `file_transfer/orchestrator.ex` + builders STR0043/0044 + `contingency_controller.ex` (toggle); costura de rotear tráfego por arquivo não evidenciada | DIVERGENTE_VALIDAR | pendência 6.10 |
| D1.12 | Bloqueio/desbloqueio manual de transação individual (tela 4, status 2000-2002) | op 4 (`ab_mgi_modules.sql:1499-1510`); USUARIOBLOQ/USUARIODESB (`:3208-3209`) | códigos 2000-2002 mapeados (seed 036:90-92); só bloqueio por TIPO (`message_block_controller.ex`) e por sanções; sem hold/release por operação | FALTA_NO_MONETARIE | P1-7 |
| D1.13 | Reagendamento (tela REAG, vínculo TIPO_L 76) | ops 4/REAG (`ab_mgi_modules.sql:1499-1510,860`) | `scheduled_message_processor.ex` (agendamento inicial); re-agendar operação existente não evidenciado | DIVERGENTE_VALIDAR | P2-15 |
| D1.14 | Protocolo R0/COA/COD/R1/R2/R3 com timestamps | TIPO_M R1/R2 + DTHRR1 + flags Evolution | `lifecycle_engine.ex:195-777` (handlers dedicados, timestamps por etapa, correlação NumCtrlIF/NUOP/BizMsgIdr, timeline `get_timeline/1`) | MELHOR_NO_MONETARIE | manter |
| D1.15 | Histórico de status por operação | `spb_tb_msg_ctrl_operacoes_status` | `operation_events` (`lifecycle_engine.ex:1969-2026`) + `message_state_history.ex` | PARIDADE_OK | manter |
| D1.16 | Grade horária por mensagem + ingestão de grades BACEN | `GRADE_HORARIO` (44 linhas vivas) + `spb_fc_vrf_grade_msg`/`spb_sp_trata_grades`; status 15 | `grade_lifecycle.ex` (GEN0021/LDL0023R1/LDL0024, retroação D+1) + `GradeSchedule.within_grade?` enforçado (`flow_orchestrator.ex:330`) + grade_message_map 272-274 linhas | MELHOR_NO_MONETARIE | P2-9 (seeds em ambiente novo) |
| D1.17 | Abertura/fechamento de clearing por mensagens fixas | `spb_sp_abre_fecha_clearing` | `clearing_lifecycle.ex` (gates STR0016 TpSld=2 fail-closed, exceção CIP SILOC, reabertura PAG) | PARIDADE_OK | manter |
| D1.18 | Fechamento do dia + pendentes no fechamento (telas PF/TP) | ops PF/TP + `PENDENTES_FECHAMENTO` (`ab_mgi_modules.sql:1849-1858,1925-1936`) | `day_auto_close.ex` (verificação de pré-condições + force_close auditado) + `pending_queue.handle_grade_close` + `POST /admin/day/force-close` (router.ex:802) | PARIDADE_OK | manter |
| D1.19 | Fila de pendências de saldo no BCB (SitLanc 17-20 -> 22-25) | status 17 Estouro da Reserva; pending queue Evolution | `pending_queue.ex` (retry 30s, notify por STR0016R1/STR0013R1, STR0010 cancel, máx 10) | PARIDADE_OK | manter |
| D1.20 | Redesconto no ciclo de vida (R1, estorno, RDC0015/0016) | telas H/I/J/RC (`ab_mgi_modules.sql:1713-1750,1877-1894`) + procs Evolution | `rdc_handler.ex` (5 procs espelhadas, SitLancRDC 36 regras, ledger, grupo 19); detalhe em D4.15-17 | PARIDADE_OK | ver D4.15 |
| D1.21 | Compensação RCO (tela X, ciclo RCO0001-0019) | op X (`ab_mgi_modules.sql:1979-1993`) | `rco_handler.ex` (status-only correto, mensagens RCO completas) | PARIDADE_OK | manter |
| D1.22 | Tratamento de rejeitadas com refeita/ciente (telas RT/RF/E50/G) | ops RT/RF/E50 com RJ.TRATAMENTO R/C (`ab_mgi_modules.sql:1994-2058`); REJEITADAS_ANALISADAS = 0 linhas no backup | estados r1_rejected/r1_error + DLQ com resolved + `dlq_controller.reprocess` + NotProcessedView.vue (retry/descarte) + retry policies por tipo; triagem refeita/ciente como workflow dedicado não evidenciada | DIVERGENTE_VALIDAR | P2-15 |
| D1.23 | Desdobramento de mensagens (status 31/1001) | `flg_permite_desdobro` + `spb_tb_gen_status_desdobro` | `message_splitter.ex` + `rstr_split_rules.ex` + `batch_unfolder.ex` + AutoSplitConfigView.vue | PARIDADE_OK | manter |
| D1.24 | Duplicidade por hash e NumCtrlIF | `DE_PARA_NUMCTRLIF` + lógica de duplicada | `legacy_parity.ex:196-219` + `xml_hash` + dedup Nats-Msg-Id | PARIDADE_OK | manter |
| D1.25 | Retry com backoff e classificação de erros | reenvio manual em tela; `spb_tb_gen_erros_bacen` | `legacy_parity.ex:256-664` + 5.314 `bacen_error_codes` + DLQ com retry_count | MELHOR_NO_MONETARIE | manter |
| D1.26 | Vigilância de operações presas (stale) | status 13/14/30 + TEMPOPEND (zero preenchidos na 5.11) + alertas por tempo | `stale_operation_sweeper.ex` (sent_to_mq >60s -> error) + `stale_inbound_sweeper.ex` (>15min) + TimeoutMonitorView.vue | MELHOR_NO_MONETARIE | manter |
| D1.27 | Interface SGR<->legado/Core (entrega/recebimento) | `SP_ENTREGA_PARA_LEGADO` (TOP 200, STATUSINTF L->A), `SP_RECEBE_DO_LEGADO`, Service Broker | JetStream (BACEN_OUTBOUND/INBOUND/DLQ/EVENTS, ACK/NAK/TERM, dedup) + outbox transacional + `core_integration/` | MELHOR_NO_MONETARIE | manter |
| D1.28 | Avisos recebidos do SPB + rastreamento por usuário | tela 2 (EVENTOS.TIPO_E='A'); `spb_tb_cad_rastreamento_msg` + `spb_sp_manut_avisos` | `message_watch.ex` (6 flags, hits com ack, fail-soft) + BacenMessagesView + NoticeboardView + `system_notices.ex` | PARIDADE_OK | manter |
| D1.29 | De-para de status por grupo (495+89) e SitLanc por domínio | `spb_tb_gen_status_de_para(_especial)` | `str/status_de_para.ex` (ETS data-driven, 26 grupos; SitLancRDC próprio validado contra o MSSQL) | PARIDADE_OK | manter |
| D1.30 | Flags de capacidade por status (permite envio/alteração/desdobro/conversão/consiste saldo) | `spb_tb_gen_status_oper` com ~20 flags | seed 036 captura só parte (representation, allows_cancellation, is_final...); gates equivalentes hardcoded em módulos (@cancellable_states etc.) | FALTA_NO_MONETARIE | P2-5 |
| D1.31 | Fonte única da máquina de estados | Evolution centraliza em 2 tabelas | 3 fontes: `status_transitions` seeded (52), fallback map do controller (`operations_controller.ex:841-859`) e `state_for_event` do LifecycleEngine | OVERLAP_REMOVER | P2-6 |
| D1.32 | Janela/feriado BACEN antes do envio | `PARAMETROS.DATAPROCES` + GRADE_HORARIO | `lifecycle_engine.ex:46-73` (ScheduleValidator por domínio RSFN) + 829 feriados semeados | PARIDADE_OK | manter |
| D1.33 | Estado vivo da interface AB_MGI (33 TRANS_INTF_REC em STATUSSGR=1) | contagens conferidas vivas no container | staging `cc_spb.legacy_ab_spb` carregado; sem projeção para `spb_operations` | DIVERGENTE_VALIDAR | pendência 6.7 |
| D1.34 | Dead letter queue com reprocesso | ERROS_INTERF + ação manual | `dead_letter_queue.ex` + stream BACEN_DLQ + `dlq_controller.reprocess` | MELHOR_NO_MONETARIE | manter |
| D1.35 | Auditoria de usuário por ação (inclusão/cancelamento/bloqueio) + assinatura de usuário | USUARIOINC/CANC/BLOQ/DESB + ASSN_TRANS_INTERF (`ab_mgi_modules.sql:3208-3209,3484-3495`) | `created_by_user_id` + auditoria de transição + audit_logs; assinatura criptográfica do usuário sobre a transação não evidenciada | DIVERGENTE_VALIDAR | pendência 6.12 |

Dedupe do domínio 1: "Previsões de recebimento" consolidado em D4.9; pendência dos .bak do Evolution movida para a seção 6 (item 6.2).

### 2.2 Domínio 2: catálogo de mensagens, roteamento e validação

| # | Funcionalidade | Legado (evidência) | Monetarie (evidência) | Veredito | Ação |
|---|---|---|---|---|---|
| D2.1 | Cobertura de CodMsg do manual 5.11 | `MENSAGENS` VRSMANUAL=5.11: 1.026 legs | `message_type_config`: 983/1.026 (95,8%); faltam 43 legs, todos R1/R2/R3 (CCS 9, LFL 8, TES 7, CIR 6, CAM 6, STR0045R3/0046R3, LPI0007R1/0008R1, SEL9003R1, SRC0001R1, LDL1301R1) | FALTA_NO_MONETARIE | P1-4 |
| D2.2 | Cobertura do catálogo DDA (base dedicada) | `AB_MGI_DDAMSG` 5.10: 108 legs | 102/108; faltam 6 legs SCG R1 (SCG0005R1/0011R1/0012R1/0013R1/0019R1/0020R1) | FALTA_NO_MONETARIE | P1-4 |
| D2.3 | Amplitude total do catálogo | 5.11 ativa = 1.026 legs; sem legs E | 1.766 tipos; +783 além do legado (445 variantes E, 300 bases de grupos não licenciados no MGI, 38 R-legs) | MELHOR_NO_MONETARIE | manter |
| D2.4 | Versionamento de manual (VRSMANUAL com vigência) | `VERSAO_MANUAL` (50 versões, DATAATIVA/DATADESATIVA); todo o catálogo chaveado por versão | snapshot único sem dimensão de versão; seeds fixam constantes 5.11/5.12 | FALTA_NO_MONETARIE | P3 |
| D2.5 | Validação de domínio de valor por tag (dicionário DOMINIOS) | 12.337 valores/482 tags na 5.11, com vigência | `bacen_domains` = 425 valores/40 tags, usados só para rótulos de tela; nenhum validador os consome | FALTA_NO_MONETARIE | P2-1 |
| D2.6 | Domínio TpCtDebtd/TpCtCredtd | DOMINIOS 5.11: CC, CD, CG, PG, PP | `xsd_validator.ex:79-80`: `^(CC|PP|CI|PG|CD|CO)$` (rejeita CG legítimo; aceita CI/CO não constantes da 5.11) | DIVERGENTE_VALIDAR | P2-2 |
| D2.7 | Dicionário tipado por tag (tipo, tamanho, decimais, regex) | COLUNAS (2.364 na 5.11) + TIPODADO (582, com regex) | `bacen_validation_rules` = 20.639 regras para 1.499 cd_msg + `spb/validator.ex`, PORÉM só 2 call-sites (gen0001.ex:156, gen0006.ex:165) | DIVERGENTE_VALIDAR | P3 (junto de P2-7) |
| D2.8 | Validação de presença/cardinalidade de tags no pipeline | CONFIG_TAGS (5.382 na 5.11 p/ 992 legs) + `spb_sp_consiste_xml_nodes` | `message_tag_validator.ex` (21.547 regras/1.499 tipos, ETS, fail-closed, fallback CSV) | PARIDADE_OK | manter |
| D2.9 | Tipos sem nenhuma regra de tag | legado cobre os eventos ativos por versão | 499 tipos (28% do catálogo, incl. 39 STR) passam fail-open sem validação local alguma | FALTA_NO_MONETARIE | P2-3 |
| D2.10 | Validação XSD real contra schema oficial | Evolution validava com XmlSchemaSet sobre XSDDOCV511/V512 | `priv/xsd` = 980 .md gerados por LLM, zero .xsd; `xsd_schema_path` vazio nas 1.766 linhas; `xsd_registry.ex` praticamente no-op; PIX da própria Monetarie já usa xmllint + XSD real | MELHOR_NO_LEGADO | P2-4 |
| D2.11 | Flag financeiro: domínio divergente entre motores | MENSAGENS.EFEITOFIN (STR0004=D, R1=N, R2=C); Evolution flag F/N/D | `message_type_driver.ex:64,77` exige "S"; banco tem F=126/N=1620/D=6/T=5/A=4/C=5 e ZERO "S": LifecycleEngine pula previsão de saldo/contabilidade para todo tipo configurado; PostIntegration interpreta F corretamente (caminho vivo do dinheiro intacto) | DIVERGENTE_VALIDAR | P1-2 |
| D2.12 | Extração de valor por tag configurada (value_tag) | id_tag_vlr Evolution; TAGVALOR MGI | 254/257 valores gravados com colchetes; `extract_amount` usa Regex.escape do valor bruto e nunca casa; sobrevive só pelo fallback; [VlrTit] (39 tipos), [VlMovto], [VlrDep] etc. retornam :no_amount; `field_access.ex:35` remove colchetes corretamente | DIVERGENTE_VALIDAR | P1-3 |
| D2.13 | Registro/aviso/consulta/não-financeira (TIPO_E) e grade de telas | EVENTOS.TIPO_E R/A/C/N por versão | `message_flow_types` (1.792) + grid_type + `message_grid.ex` (ETS, fallback ao catálogo) | PARIDADE_OK | manter |
| D2.14 | Status inicial por evento | EVENTOS.STATUS_INI (quase todo NULL na 5.11) | `default_status` em 1.222/1.766 + `st_operacao_padrao` consumido no dispatcher | PARIDADE_OK | manter |
| D2.15 | Mapa de status legado -> estado novo + mapas por família | códigos numéricos das telas ADMWeb/MGI | `legacy_status_mapping` 58 + `status_transitions` 52 + group_status_map 495 + fbs 257 + special 86 + mecir 51 + pag_str 15 | PARIDADE_OK | reconferir seeds no HML (fase 5) |
| D2.16 | Regras de negócio por evento (REGRAS/EVENTOS_REGRAS) | 261 regras + 6.679 vínculos por versão | `rstr_validator.ex` (38 regras STR EXECUTÁVEIS no pipeline) + `rstr_error_mapper.ex`; demais famílias sem motor nem exposição do texto | DIVERGENTE_VALIDAR | pendência 6.15 |
| D2.17 | Documentação por evento (DESC_EVENTOS) | 28.624 partes de texto oficial por versão | 980 .md parafraseados por LLM (fonte XSDDOCV511), não versionados | DIVERGENTE_VALIDAR | P3 |
| D2.18 | Grupos de serviço habilitados (GRUPOSERVICO/SERVICOS) | 35 grupos + 4.087 linhas versionadas | `message_groups` = 25 (local) + RBAC por grupo; sem dimensão de versão | DIVERGENTE_VALIDAR | reconferir no HML (nota 6.16) |
| D2.19 | Grade horária por tipo (janela de envio) | GRADE_HORARIO (44) + EVENTOS.CODGRADE | `bacen_operating_schedule` (66) + grade_message_map (272) + schedule_validator + RSTR019-025; open_time/close_time do config vazios | PARIDADE_OK | manter (higiene: colunas redundantes) |
| D2.20 | Roteamento MQ por domínio/fila e sequência | FILASMSG (30 filas) + PARAMETROS_MQ (não migrada por design) | `reference_data.ex` (clearings_mqs) + `mq_sequence` + DomainManager + sidecar vivo em HML | PARIDADE_OK | manter |
| D2.21 | Pós-integração por mensagem (PROCEDIMENTO1-3) | MENSAGENS.PROCEDIMENTO1-3 + procs | `post_integration_config` (1.448) + Dispatcher com 30+ handlers por grupo; dispatch por código substitui as stored procedures | PARIDADE_OK | manter |
| D2.22 | Efeito financeiro por leg de resposta (EFEITOFIN em R1/R2) | STR0004 base=D, R1=N, R2=C | linha-por-leg no config (STR0004 D, STR0004R2 C) + resolve_direction com caso "T" | PARIDADE_OK | manter |
| D2.23 | Tarifação por mensagem (CODTARIFA/TIB) | MENSAGENS.CODTARIFA + EVENTOS.TARIFATIB | `bacen_tariffs` + bandas TIB + RSTR037-038 + telas TariffMonitor/InterbankTariff/TariffsConfig (9.473 tarifas seed) | PARIDADE_OK | manter |
| D2.24 | Identificação e roteamento de inbound | TAG_H de MENSAGENS + SP_ENTREGA_PARA_LEGADO | `inbound_consumer.ex:308-365` (identify_response_type por direction_flag) + validação inbound em modo warning + DLQ | PARIDADE_OK | manter (43 R-legs de D2.1 são o ponto cego) |
| D2.25 | Administração do catálogo em tela (virada de versão) | ADMWeb/Equalizador mantêm catálogo por UI | nenhuma rota CRUD para message_type_config/message_tag_definitions; só seeds/Release tasks | MELHOR_NO_LEGADO | P2-13 |
| D2.26 | Sobreposição de motores de validação | caminho único no legado | MessageTagValidator + XSDValidator (2 ETS da mesma fonte) + SPB.Validator fora do pipeline + XSDRegistry no-op | OVERLAP_REMOVER | P2-7 |
| D2.27 | Tipos alfanuméricos DRN v1.02 (CNPJ/ISPB) | TIPODADO 5.11 (regex alfanumérico) | `xsd_validator.ex:52-62,83-85` idênticos caractere a caractere | PARIDADE_OK | manter |

Dedupe do domínio 2: "TEMPOPEND/varredura" consolidado em D1.26; "DE_PARA_NUMCTRLIF" consolidado em D3.11.

### 2.3 Domínio 3: MQ, canais, criptografia e contingência

| # | Funcionalidade | Legado (evidência) | Monetarie (evidência) | Veredito | Ação |
|---|---|---|---|---|---|
| D3.1 | Separação de filas por propósito (REQ/RSP/REP/SUP) | FILASMSG (30 filas, TIPO_F x UTILIZACAO) | `Sidecar.java:111-126` + `domain_manager.ex:21-22` | PARIDADE_OK | manter |
| D3.2 | PUT restrito a QR.REQ | filas R/RSP e R/SUP existiam p/ BACEN/SELIC/SILOC | `ALLOWED_PUT_PREFIX = "QR.REQ.46026562."` (Sidecar.java:133,290-300) | DIVERGENTE_VALIDAR | P2-14 |
| D3.3 | Contrapartes SELIC e SILOC/CIP | trio REQ/RSP/SUP por contraparte | somente BACEN 00038166 (`mq_bridge.ex:26-32`) | DIVERGENTE_VALIDAR | pendência 6.4 |
| D3.4 | Multi-domínio RSFN (SPB01/MES01/MES02/MES03/SPB02) | só DOMINIO='SPB' no MGI | 5 domínios modelados (Manual de Redes v9.3) com QM/porta/fila/prioridade | MELHOR_NO_MONETARIE | manter |
| D3.5 | Redundância de domínio MES01 viva | sem redundância no MGI | código polla SPB01+MES01 por default, mas :12522 em DROP na RTM | FALTA_NO_MONETARIE | P1-11 |
| D3.6 | Contingência de mensageria via PSTI | filas PSTI + ENVIAPSTI + URL_PSTI | inexistente; só GEN0016/0017 de arquivo | DIVERGENTE_VALIDAR | P2-12 |
| D3.7 | Filas offline de contingência local (OFE/OFI/OFR) | FILASMSG CODINST_EXT='OFF' | inexistente (outbox durável + NATS, sem modo offline de MQ) | DIVERGENTE_VALIDAR | P2-12 |
| D3.8 | Política de backout/poison message | REJEITADAS_ANALISADAS + BOTHRESH de QM | rollback em webhook não-2xx sem ler JMSXDeliveryCount nem quarentena: falha permanente = loop de redelivery a cada 5s (Sidecar.java:428-477 + mq_webhook_controller.ex:26-31) | FALTA_NO_MONETARIE | P1-5 |
| D3.9 | Commit MQ só após persistência durável | sem contrato explícito | `inbound_audit.ex:3-8` + commit pós-2xx (Sidecar.java:443-447): zero janela de perda | MELHOR_NO_MONETARIE | manter |
| D3.10 | Trilha de recepção por perna | TRANS_INTF_REC (tabela única) | InboundAudit estagiado (raw -> decrypted -> published -> processed, sha256, dedupe) | MELHOR_NO_MONETARIE | manter |
| D3.11 | Trilha de envio + sequenciamento NumCtrlIF crash-safe | TRANS_INTF_ENV + `spb_sp_gera_numctrlif` SERIALIZABLE + DE_PARA_NUMCTRLIF (0 linhas nos backups) | `bacen_messages.binary_payload/binary_response` (bytes exatos de fio) + `num_ctrl_if.ex` (advisory lock, upsert atômico, prefixo MON vivo) | PARIDADE_OK | manter |
| D3.12 | Relatórios MQ COA/COD por mensagem | reports padrão + SEQ_LOG_MQ | `mqmd_builder.ex:27-30` (COA=256/COD=2048) + handle_report persiste e avança lifecycle | PARIDADE_OK | manter |
| D3.13 | Cifra de mensagem (header 588B, protocolo v2/v3) | MOD_CRIPTO char(1) + DLL externa | `message_packer.ex:29-38` (v3 AES-256-GCM nativo, fallback v2, mandatos C04) | MELHOR_NO_MONETARIE | manter |
| D3.14 | Custódia da chave privada | LOCALCHVPRIV em `C:\AUTBANK\CER` (disco) | `our_cert_store.ex:1-9,28`: privada NUNCA em arquivo, só UID no HSM RTM 443 | MELHOR_NO_MONETARIE | manter (intocável) |
| D3.15 | Dupla assinatura (DUPLAASSN) | existia, desligada ('N') | assinatura única C15 conforme Manual de Segurança 5.07 | PARIDADE_OK | manter |
| D3.16 | Certificado de destino por domínio RSFN | PARAMETROS_MQ (CA + NUMSERIE por domínio) | `bacen_cert_store.ex` + `bacen_domain_certificates` + ETS por domínio (T068 SPB01/T069 MES01 reais SERPRO) | PARIDADE_OK | manter (intocável) |
| D3.17 | Ciclo de vida e inventário de certificados | CERTIFICADOS (troca manual de arquivos) | trilhas A/B self-service (imported -> verified -> activating -> active), pickup sem restart, telas em spb-admin-ui :9 | MELHOR_NO_MONETARIE | manter (intocável) |
| D3.18 | GEN0006 ativação com dual-key | GEN0006 + 2 slots LOCALCHVPRIV | `message_packer.ex:84-88` (signing_key_uid por chamada) + mandatos C04; T010 ativado vivo em 2026-06-30 | MELHOR_NO_MONETARIE | manter (intocável) |
| D3.19 | GEN0007 (cert de terceiros) | EVENTOS GEN0007 | `institution_registry.ex` ingest_pem em runtime + índice ETS por serial | PARIDADE_OK | manter |
| D3.20 | Semântica GEN0014/15/17/18 | EVENTOS (prova viva): GEN0014=requisita arquivo, GEN0015=avisa arquivo, GEN0017=arquivo via prestador, GEN0018=data de ativação de cert | `coa_cod_handler.ex:5-8` os usa como abertura/fechamento de dia, em conflito com `file_transfer/orchestrator.ex:17-26` e `gen_handler.ex:34-35` (re-verificado 2026-07-02) | MELHOR_NO_LEGADO | P0-2 |
| D3.21 | GEN0001 teste de conectividade (ECO) | EVENTOS GEN0001 | `gen0001_test.ex` (por domínio, usado no go-live do MQ) | PARIDADE_OK | manter |
| D3.22 | GEN0003 (resync de sequência) | evento operacional exposto | só schema XML, sem fluxo ativo (grep) | FALTA_NO_MONETARIE | P1-6 |
| D3.23 | GEN0012 (cópia de mensagem) | evento operacional exposto | só schema XML, sem fluxo ativo | FALTA_NO_MONETARIE | P1-6 |
| D3.24 | GEN0008 (consulta certificado) | evento disponível | só schema XML | FALTA_NO_MONETARIE | P3 |
| D3.25 | GEN0021 grade de horários | tabela estática + evento | `grade_schedule_ingestor.ex` ingere automaticamente | MELHOR_NO_MONETARIE | manter |
| D3.26 | GEN0004 + catálogo de erros | MENSAGENS_ERRO (3 linhas) | `bacen_security_error_decoder.ex` + `bacen_error_code.ex` (severity, retryable, pt/en) | MELHOR_NO_MONETARIE | manter |
| D3.27 | TLS do canal MQ (SSLCIPHER) | rede RSFN fechada gerenciada | `mtls_config.ex` só no caminho REST; sidecar JMS vivo sem TLS de canal (user/password MCAUSER) | DIVERGENTE_VALIDAR | P1-11 |
| D3.28 | Monitoramento de canal e heartbeat | MONITORAR/TEMPOALERTA + supervisor Evolution | `/statusz` PCF + heartbeat 60s com /health 503 (mq_bridge.ex:47-53) | MELHOR_NO_MONETARIE | manter |
| D3.29 | Transferência de arquivos GEN0014/0015 (assinar/cifrar/SFTP/retry) | `spb_sp_trata_GEN0015_MB` + op G15 | `file_transfer/orchestrator.ex` (sign -> encrypt -> SFTP -> retry, eventos NATS) | PARIDADE_OK | manter |
| D3.30 | Arquivos via prestador (GEN0016/0017) | EVENTOS GEN0016/0017 | código completo, nunca exercitado vivo (sem prestador em HML) | DIVERGENTE_VALIDAR | pendência 6.17 |
| D3.31 | Transporte alternativo (MQ REST) | cliente MQ nativo único | `mq_response_poller.ex` + `rest_tls.ex` alternável por configuração | MELHOR_NO_MONETARIE | manter |
| D3.32 | Equalizador Evolution (CRKDBSE) | equalização manual de schema | migrações Ecto versionadas | PARIDADE_OK | manter |
| D3.33 | Facade ConnectionPool sobre DomainManager | n/a | `connection_pool.ex` sem lógica própria | OVERLAP_REMOVER | P3 |
| D3.34 | Auditoria de operações criptográficas | LOG_CONF_CERT + ASSN_TRANS_INTERF | `crypto_logger.ex` + `cert_monitor.ex` + bytes de fio persistidos | PARIDADE_OK | manter |

Dedupe do domínio 3: "stale sweep" consolidado em D1.26; "DLQ triagem" em D1.34; "barramento com o Core" em D1.27; pendência EvolutionCrypto/CRKSecurityAdmin movida para a seção 6 (item 6.2).

### 2.4 Domínio 4: tesouraria, liquidação e contabilidade

| # | Funcionalidade | Legado (evidência) | Monetarie (evidência) | Veredito | Ação |
|---|---|---|---|---|---|
| D4.1 | Grupos de saldo (44, LPI=43) | `spb_tb_gen_grupo_saldo` (44, siglas duplicadas BVF/CIP) | `balance_group.ex:98` + `legacy_balance_groups.csv` (44 linhas) | PARIDADE_OK | manter |
| D4.2 | Contrato de saldo por mensagem (grp_saldo + tp_sld_impactar) | `spb_tb_gen_msg_detalhe` (1.452 linhas, dump vivo) | `balance_contract_seed.ex` (1.452 linhas) + `posting.ex:35-62` (resolver fail-closed) | PARIDADE_OK | manter |
| D4.3 | Algoritmo de saldo de reserva (flg_sens_pc, DB/CR, rejeição, mudança de data) | `spb_sp_atu_saldo_res` (22K chars) | `balance_handler.ex:1-28,259-323` + `balance_sens_pc.ex` (porte completo C6/C7) | PARIDADE_OK | manter |
| D4.4 | Handler volumétrico STR/PAG (C9) | `spb_sp_atu_saldo_res_vol` | str/pag/tes_handler escrevem `balance_operation_volumes` | PARIDADE_OK | manter |
| D4.5 | Zeragem de saldo CIP | `spb_sp_zera_saldo_cip` (grupo 20) | `balance_handler.ex:103-253` (multi-grupo 20/25 + log auditável idempotente) | MELHOR_NO_MONETARIE | manter |
| D4.6 | Espelho de reserva: STR0016 fechamento -> abertura D+1 | `spb_sp_trata_STR0016` | `day_open_close.ex:37-108` (force_balance grp 15, totalize, abertura D+1, valor BACEN autoritativo) | PARIDADE_OK | manter |
| D4.7 | Consultas agendadas (STR0013/STR0014/CIR0008/GEN0001) | `spb_tb_cad_prog_envio` (12 linhas vivas) | `scheduled_automation_seed.ex` espelho 1:1 com cron SP e dedup; ativação gateada pelo operador | PARIDADE_OK | manter |
| D4.8 | Conciliação reserva vs extrato BACEN (dia/extrato/saldo) | `SP_CONCILIA_PREVISAO` (só previsão x boleto) | `reconciliation.ex` (3 modos, tolerância zero, órfãos, NumCtrlSTR duplicado) + ReconciliationView.vue | MELHOR_NO_MONETARIE | prova viva HML pendente (regra #11) |
| D4.9 | Previsões de recebimento/liquidez (consolidado D1+D4+D5) | PREVISOES/LOG_PREVISOES + tela E + P_TRANS_PREV; PREVISOES = 0 linhas no backup (nunca usado pelo cliente) | `forecast_engine.ex` projeta posições por hora; conciliação previsão x efetivado (por boleto/ordem) inexiste | DIVERGENTE_VALIDAR | P3 (só se tesouraria pedir) |
| D4.10 | Monitoramento de TED com limiares | MONITORAMENTO_TEDS_CONFIG (1 linha toda NULL: nunca configurado) | `return_alert_checker.ex` (SLA 60min) + `ted_coincidente_detector.ex` + telas Timeout/DuplicateMonitor; sem baseline estatístico | MELHOR_NO_MONETARIE | P3 (check estatístico opcional) |
| D4.11 | Devolução de transferência indevida (op 7 / STR0010) | op 7 + `spb_sp_gera_devolucao_credito` | `devolution_controller.ex` + DevolutionsView.vue + str_handler (R1/R2/E, grupo 15, guards, idempotência, desfecho via outbox W2) | PARIDADE_OK | prova viva HML pendente (P3) |
| D4.12 | Rastreio de créditos recebidos (received_credits) | TRANS_SPB + ops M/GR | `message_processor.ex:1128-1148` insere no crédito inbound; `return_alert_checker` consome | PARIDADE_OK | conferir população em HML (P1-10) |
| D4.13 | Crédito automático de STR0008 em conta de pagamento (TpCt=PG) | `SP_ENTREGA_PARA_LEGADO` | `lifecycle_engine.ex:1170-1172,1685` + CoreNotifier; fix 79ae2077 validado VIVO em HML | PARIDADE_OK | intocável (seção 5) |
| D4.14 | Redesconto: pagamento (H/I) | `ab_mgi_modules.sql:1713-1730` | `rdc_handler.ex` (SitLancRDC 36 regras próprias, RedescontoLedger, grupos 11/19); sem fila operacional de iniciação | DIVERGENTE_VALIDAR | pendência 6.3 |
| D4.15 | Redesconto: conversão (J) + estorno overnight RDC0015/0016 | `ab_mgi_modules.sql:1732-1750` + `spb_sp_trata_RDC0015` | `rdc_handler.ex:66-68` (estorno grupo 19 com justificativa documentada) | PARIDADE_OK | pendência 6.3 |
| D4.16 | Cancelamento de redesconto (RC / RDC0014) | `ab_mgi_modules.sql:1877-1900` | `rdc_handler.ex:65` com idempotência por estados terminais | PARIDADE_OK | manter |
| D4.17 | Depósito de garantia/operacional (op V: LDL0013/LDL0021) | `ab_mgi_modules.sql:1951-1963` | saldo via contrato (grp 7); CONFLITO: Liquidante.Processor reivindica LDL0021 como netting e auto-responde LDL0022 | DIVERGENTE_VALIDAR | P0-4 (resolver na decisão do Liquidante) |
| D4.18 | Compensação RCO/CMP (op X) | `ab_mgi_modules.sql:1979-1995` | `cmp_handler.ex` + mensagens CMP/RCO + contrato; mesmo overlap com Liquidante (CMP0001) | PARIDADE_OK | P0-4 (overlap) |
| D4.19 | LPI0001-0005 (lançamentos Conta PI) | EVENTOS LPI0001-0005 TIPO_E='R' | `lpi_handler.ex:36-49` (status-only + saldo pelo contrato grp 43; post duplicado removido) | PARIDADE_OK | P3 (nomenclatura do moduledoc) |
| D4.20 | LPI0006 (transferência automática p/ Conta PI) | EVENTOS LPI0006 TIPO_E='N'; legado reflete a Conta PI | `inbound_consumer.ex:345-377,543-550`: apenas registra como confirmed; sem operação, sem grupo 43, sem espelho; ~2/dia acumulando em HML | FALTA_NO_MONETARIE | P0-3 |
| D4.21 | LPI0007/LPI0008 | EVENTOS TIPO_E='N' | builders/parsers presentes; registrados pelo caminho genérico | PARIDADE_OK | P0-3 (avaliar junto se financeiras) |
| D4.22 | Contabilização por evento (roteiro contábil) | `spb_cnt_roteiro` + `spb_sp_interface_contab` (39.324 lançamentos); MGI delega ao core | 3 trilhas coexistem (STR.COSIFEngine; AccountingEngine com `accounting_scripts`=0; Roteiro -> Core com flag `cosif_to_core_enabled` OFF); `accounting_entries`=0 local | DIVERGENTE_VALIDAR | P1-9 |
| D4.23 | Reprocessamento de eventos contábeis | `spb_sp_reprocessa_eventos` | `event_reprocessor.ex` (dry-run, batch 1000, runs auditadas, soft-delete) | MELHOR_NO_MONETARIE | inerte até P1-9 |
| D4.24 | Subsistema Liquidante (Processor + BalanceManager ETS) | sem equivalente (reserva espelhada de mensagens reais) | supervisionado (`application.ex:168`), no inbound vivo (`message_processor.ex:742-753`), saldos default fabricados R$ 100M/50M (`balance_manager.ex:572-579`), auto-responde LDL0002/LTR0002/CMP0002/SLC0002/SEL1055 (re-verificado 2026-07-02) | OVERLAP_REMOVER | P0-4 |
| D4.25 | Tabelas settlements e str_transfers | 1 tabela por operação no legado | existem com 0 linhas e ZERO leitores/escritores; modelo vigente = spb_operations + bacen_messages | OVERLAP_REMOVER | P2-8 |
| D4.26 | Ledger de movimentos de saldo idempotente | atualização aditiva sem dedup | `balance_tracker.ex:76-100,236-296` (índice único parcial operation_id/phase/direction) | MELHOR_NO_MONETARIE | manter |
| D4.27 | Data de processamento e fechamento do dia | PARAMETROS.DATAPROCES + `spb_sp_dt_sistema` (VOLTAR) | `system_date_policy.ex` + retroação D+1 + SystemDateView.vue + variante DDA0400 fiel | PARIDADE_OK | manter |
| D4.28 | Flag afeta-reserva por transação (AFETARESERVA) | TRANS_SPB.AFETARESERVA | derivado do contrato tp_sld_impactar P/C/N por mensagem | PARIDADE_OK | manter |
| D4.29 | Resultado divergente LDL (op B / LDL0005) | `ab_mgi_modules.sql:785,1613` | `ldl_handler.ex:42,124` + mensagens LDL0005 completas | PARIDADE_OK | manter |
| D4.30 | Dashboard de saldo/tesouraria + atualização manual | ADMWeb Slds/AttSaldo (`spb_tb_pil_saldo_grupo`) | `balance_controller.ex` (index/show/history/force) + BalanceDashboardView.vue (threshold saldo baixo) + SettlementMonitorView | PARIDADE_OK | manter |
| D4.31 | Transferência de resultado à câmara (op K: LDL0001/LTR0001) | `ab_mgi_modules.sql:1753-1765` | caminho canônico via contrato existe; Liquidante intercepta os mesmos tipos | DIVERGENTE_VALIDAR | P0-4 |
| D4.32 | Trilhas de dinheiro vazias no ambiente local | staging `legacy_ab_spb.source_rows` = 1.948.202 | balance_movements/positions, grade tables, accounting_scripts = 0 no `mon_spb` local (verificado); ambiente novo sobe sem grade/contrato/roteiro até rodar seeds gateados | DIVERGENTE_VALIDAR | P1-10 + P2-9 |

Dedupe do domínio 4: "grade horária" consolidada em D1.16/D2.19; "interface com o core" em D1.27; "tarifas" em D2.23.

### 2.5 Domínio 5: administração e operação (telas e mesa)

| # | Funcionalidade | Legado (evidência) | Monetarie (evidência) | Veredito | Ação |
|---|---|---|---|---|---|
| D5.1 | Grid segregado por categoria (F/C/A/N) | telas por tp_oper_grid + famílias do P_CONSULTA_TRANSACOES | `message_grid.ex` + financial_sql_clause no index | PARIDADE_OK | manter |
| D5.2 | Envio manual/em lote (op 1) | `ab_mgi_modules.sql:774` | `send_bulk` com dispatch real ao MQ (gap fechado 2026-05-09) | PARIDADE_OK | manter |
| D5.3 | Consulta das pernas R1/R2 (ops O/P/D) | `ab_mgi_modules.sql:788,804-805` + GetHistMensagem | `response_correlation.ex` + show com filhos e state_history + MessageTimeline.vue | PARIDADE_OK | manter |
| D5.4 | Pagamento de débitos recebidos e vencimentos SLB0001 (ops 8/TV/VENC) | `ab_mgi_modules.sql:783,817,819,969-987` | `payments_controller.ex` genérico; sem tela dedicada SLB | DIVERGENTE_VALIDAR | pendência 6.13 |
| D5.5 | Pendentes + aprovação 4 olhos de ações administrativas | ops 9/L | monitores por estado + `dual_custody_engine.ex:318-410` (executa payload após 2ª aprovação) | PARIDADE_OK | manter |
| D5.6 | Consulta gerencial em tempo real (G2/GR) | TOP 30 por polling (`ab_mgi_modules.sql:794-795,1155-1163`) | CommandCenter + LiveMessageFeed (WebSocket) + stats/metrics + 5 monitores | MELHOR_NO_MONETARIE | manter |
| D5.7 | Compensação/câmbio em tela (ops X/W/69) | `ab_mgi_modules.sql:820-821,855` | catálogo cobre RCO/CMP/CAM; sem tela de mesa dedicada (caminho = GenericRequestView) | DIVERGENTE_VALIDAR | pendência 6.13 |
| D5.8 | Consulta de operações ligadas (op LG, NROTRANSLIG) | `ab_mgi_modules.sql:801,1107-1124` | vínculo resposta->envio existe; operações irmãs por número de transação ligada não | FALTA_NO_MONETARIE | P3 |
| D5.9 | Grade de horário em tela + agendamento | ADMWeb GradeHorarios | ScheduleGridView + schedule_controller (windows/schedule/cancel) + processador 30s | PARIDADE_OK | manter |
| D5.10 | Alertas de devolução/RDC com e-mail | `spb_sp_trata_alerta_devolucao` (840 inscrições, TMPDEVAUT=50min) + AlertaRedesconto | `alert_engine.ex` (3 checks com paridade verbatim, dedupe, auto-resolve, e-mail só dia útil) + OperationalAlertsView | MELHOR_NO_MONETARIE | prova viva e-mail (P3) |
| D5.11 | Não processadas + reprocessamento | ADMWeb NaoProc/Reproc | NotProcessedView + retry_not_processed + DLQ reprocess + reprocessing contábil auditado | PARIDADE_OK | manter |
| D5.12 | Consulta base histórica | bases fisicamente segregadas por banco (`ab_mgi_modules.sql:928-929`) | HistoricalQueryView + ArchiveSearchView (base viva, cap 1000 linhas); retenção/particionamento não comprovados | DIVERGENTE_VALIDAR | P3 |
| D5.13 | Desdobro automático (config) | ADMWeb DesdAut | AutoSplitConfigView + motores de split (D1.23) | PARIDADE_OK | manter |
| D5.14 | Automação de consultas e de envio | ADMWeb AutoConsultas/AutoMensagens | ScheduledQueriesView + SendAutomationView + processador | PARIDADE_OK | manter |
| D5.15 | Exportação de movimento e planilha TED | ADMWeb ExportMov/ExportPlanTED | ExportsView + export_controller (CSV) + DdaPcrMovementsView; layout específico da planilha TED não localizado | DIVERGENTE_VALIDAR | P3 |
| D5.16 | Atualização de domínios (BACEN/erros) | ADMWeb AttDominios | DomainRegistryView + domain_values_controller + ErrorCodeBrowser (5.314 códigos) | PARIDADE_OK | manter |
| D5.17 | IFs operantes CIP + cadastro de instituições | ADMWeb IfsOperantesCip/InstFinanc | CIPInstitutionsView + diretório SPB automático 140->547 (75e3feb9, vivo em :25) | MELHOR_NO_MONETARIE | manter (intocável) |
| D5.18 | Permissões por grupo/mensagem | GRUPO_PERMISSAO = 0 linhas no backup; conteúdo real no CRKSecurityAdmin.bak NÃO restaurado | RBAC completo (PermissionTree/Groups/RoleEditor + MessagePermissionsView) | DIVERGENTE_VALIDAR | pendência 6.2 |
| D5.19 | Multi-empresa/coligadas | @COLIGADA; EMPRESAS = 1 linha no backup | single-institution por design (cobre o uso real do cliente) | PARIDADE_OK | pendência 6.14 se houver white-label |
| D5.20 | Monitoramento estatístico de TEDs | MONITORAMENTO_TEDS_CONFIG (referência/tolerância, nunca configurado) | Performance/Duplicate/TimeoutMonitor; sem alarme por desvio estatístico | FALTA_NO_MONETARIE | P3 |
| D5.21 | DDA/PCR (mensageria, telas, integração) | AB_MGI_DDAMSG: MENSAGENS=3.006 mas ESTOQUE_TITULOS=0 e TRANS_INTF_ENV/REC=0 (zero tráfego no legado do cliente) | 89 módulos `messages/dda/*` + `dda_handler.ex` com paridade documentada + 12 telas DDA/PCR dedicadas; 0 tráfego E2E | DIVERGENTE_VALIDAR | P2-11 + pendência 6.1 |
| D5.22 | Filtros da consulta de transações da mesa | ~40 parâmetros (`ab_mgi_modules.sql:643-683`) | 9 filtros no index + MessageSearchView + monitores; faltam usuário de inclusão, prioridade, natureza D/C, faixa de hora, número de origem, status STR granular | FALTA_NO_MONETARIE | P2-10 |
| D5.23 | Central de mensagens com histórico e XML | ADMWeb Mensageria + GetHistMensagem | Messages/BacenMessagesView + MessageTimeline + XMLViewer + 21.547 tags | PARIDADE_OK | manter |
| D5.24 | Requisição genérica (qualquer tipo do catálogo) | dezenas de telas específicas por evento | GenericRequestView (wizard por catálogo, templates salvos) | MELHOR_NO_MONETARIE | manter |
| D5.25 | Relatórios de auditoria | rptLogAuditoria.trdp + rpt_log_audit_pcr | AuditTrail/AuditReport/DdaPcrAuditView + reports_controller + audit_logs | PARIDADE_OK | manter |
| D5.26 | Dashboard de paridade com o legado (meta-tela) | inexistente | LegacyParityDashboardView + `legacy_parity.ex` (procs espelhadas, hash de envio igual ao CLR legado) | MELHOR_NO_MONETARIE | manter |

Dedupe do domínio 5: alçada/vistos (D1.3/D1.4), SOS (D1.7), bloqueio individual (D1.12), conversão PS/SP (D1.9), cancelamento protocolar (D1.5), reaproveitamento (D1.10), contingência 1A (D1.11), previsões (D4.9), grade (D1.16), fechamento PF/TP (D1.18), timeout op 3 (D1.26), devolução op 7 (D4.11), rejeitadas RT/RF (D1.22), abertura/fechamento de data (D4.27), saldos (D4.30), tarifas (D2.23), rastreamento (D1.28), redesconto (D4.14-16), certificados (D3.16-18), Equalizador (D3.32).

## 3. Backlog consolidado

Esforço: S (até 2 dias), M (até 2 semanas), L (acima). Nenhum item toca os caminhos intocáveis da seção 5; onde há vizinhança, a validação empírica de não regressão (regra #11) é obrigatória.

### 3.1 P0 (risco financeiro/regulatório direto)

| ID | Item | Esforço | Risco se não fizer |
|---|---|---|---|
| P0-1 | Gate de dupla autorização no envio: ligar `AlcadaEngine.check_alcada`/submit_for_approval no `MessagesController.send` (e em todo funil que chame `process_outgoing`), com estado `awaiting_approval` antes do dispatch, envio automático pós-aprovação (paridade tela 01) e trava `approver != created_by` (paridade status 32). O gate entra ANTES do `RealDispatcher`; MQ/T010/STR0008 ficam intactos. Registrar a decisão do dono se a autorização for do Core (nesse caso documentar e rebaixar as telas a monitoração). | M | Qualquer usuário autenticado envia mensagem financeira real ao BACEN em 1 passo, sem 4 olhos; único item com risco financeiro direto no envio. |
| P0-2 | Corrigir a semântica do `CoaCodHandler`: GEN0014/0015 = requisição/aviso de arquivo, GEN0017/0018 = arquivo via prestador / data de ativação de certificado (provado por `AB_MGI.EVENTOS`). Não acionar esse fluxo vivo antes do fix. | S | Enviar GEN0014 como "abertura de dia" seria interpretado pelo BACEN como requisição de arquivo (regra do dono: BACEN é a verdade, o defeito é nosso). |
| P0-3 | LPI0006 segunda onda: materializar `spb_operation`, postar no grupo 43 via `Posting.post` e espelhar o saldo da Conta PI; avaliar LPI0007/0008 na mesma frente. Reprocessar as mensagens reais acumuladas em HML como evidência (regra #11). | M | Espelho de reserva/Conta PI diverge do BACEN a cada transferência automática (~2/dia acumulando em HML). |
| P0-4 | Decidir e executar o destino do subsistema Liquidante (Processor + BalanceManager): desativar atrás de flag ou remover. Resolve junto a dupla reivindicação de LDL0001/LDL0021/LTR0001/CMP0001. Validar empiricamente que STR0008/T010/MQ não regridem. | M | Decisões de liquidação contra saldos ETS fabricados (default R$ 100M/50M) e auto-respostas (LDL0002/LTR0002/CMP0002/SLC0002) que a IF não deveria originar, no caminho inbound vivo. |

### 3.2 P1 (paridade operacional e defeitos de catálogo)

| ID | Item | Esforço | Risco se não fizer |
|---|---|---|---|
| P1-1 | Fiar o `CancellationEngine` ao `POST /api/operations/:id/cancel` (e bulk-cancel): emitir a mensagem protocolar por grupo (STR0011R1/SEL1400/CIR/RDC/ECR/DDA0400) e reverter saldo, em vez do UPDATE local atual. | M | Divergência de estado com o BACEN para operação em trânsito cancelada "só no nosso banco". |
| P1-2 | Corrigir o predicado financeiro do `MessageTypeDriver` (`message_type_driver.ex:64,77`): trocar `financial_flag == "S"` pelo domínio real ("F" e "D", como o PostIntegration.MessageConfig) e revalidar em HML previsão de saldo/contabilização em r1_confirmed. | S | LifecycleEngine pula previsão de saldo e contabilidade para 100% dos tipos configurados (zero linhas "S" no banco). |
| P1-3 | Normalizar colchetes do `value_tag` no `extract_amount` (remover `[ ]` como o `FieldAccess` já faz, ou sanear os 254 valores no banco). | S | Extração de valor falha para tipos com tag fora do fallback ([VlrTit] em 39 tipos, [VlMovto], [VlrDep], [VlrAditt], [VlrDen], [VlrTotCobrir]). |
| P1-4 | Semear os 49 legs de resposta ausentes: 43 R-legs do catálogo 5.11 + 6 SCG R1 do DDA, com direction_flag='R', grid/flags herdados do leg base e tag definitions correspondentes. | S | Resposta inbound desses tipos roteia sem config (direction_flag/grid/status default ausentes). |
| P1-5 | Política de backout/poison no sidecar MQ: ler JMSXDeliveryCount e acima de N entregas mover para quarentena (BOQNAME ou tabela) commitando a sessão, mantendo commit-after-2xx no caminho feliz. | M | Falha permanente de webhook gera loop de redelivery a cada 5s para sempre. |
| P1-6 | Implementar fluxo ativo de GEN0003 (informações de controle da última mensagem enviada) e GEN0012 (cópia de mensagem) como comandos de operação/tela admin (schemas já existem). | M | Sem as ferramentas clássicas de ressincronização/recuperação pós-queda que o legado expunha. |
| P1-7 | Ações operacionais de destravamento: bloqueio/desbloqueio manual de transação individual (status 45/2000-2002 já catalogados), voltar-status controlado (reusar `validate_transition`, que já permite failed->created e r1_rejected->created) e SOS-envio com alçada própria; tudo como endpoint admin + tela, gravando `operation_events`. | M | Mesa sem instrumentos de contingência do legado (fraude/análise GR, mensagem presa, estouro de reserva no fechamento). |
| P1-8 | Conversão PAG<->STR (telas PS/SP): motor que cancela a original (cadeia da SubstitutionEngine), regera o XML no evento espelho (PAG0105-0143 <-> STR0005-0037) e liga as operações, usando os status 1005-1007 já semeados; gate por config (paridade CONVERTE_STRPAG). | M | Sem contingência quando a CIP (PAG) fica indisponível. Antes de implementar, confirmar com o dono se a SCD opera PAG além de STR (pendência 6.13). |
| P1-9 | Consolidar a contabilidade em UMA trilha: manter Core-dono-do-COSIF (Accounting.Posting -> CoreNotifier), construir o consumer de `monetarie.spb.cosif.entry` no Core, ligar `cosif_to_core_enabled` e aposentar/marcar como legado AccountingEngine + STR.COSIFEngine. | L | 3 trilhas contábeis coexistem e nenhuma opera; log `template_not_found` vira ruído e a trilha contábil do SPB fica cega. |
| P1-10 | Validar em HML (read-only) que balance_movements, balance_positions, received_credits e tabelas de grade populam com o tráfego real pós-deploy :25; anexar contagens como evidência (entra no checklist da fase 5). | S | Sem prova viva do espelho de reserva; contagens locais zeradas não provam nada. |
| P1-11 | Pendências RTM: cobrar abertura do MES01 :12522 (redundância de domínio; código já polla SPB01+MES01) e definir requisito de SSLCIPHER no canal MQ para produção (perfil já existe em `mtls_config.ex`, faltaria ligar no sidecar JMS). | S (externo) | Contingência por domínio alternativo indisponível; canal JMS sem TLS se a RTM exigir em produção. |

### 3.3 P2 (robustez e paridade fina)

| ID | Item | Esforço |
|---|---|---|
| P2-1 | Importar o dicionário DOMINIOS do manual vigente (12.337 valores/482 tags na 5.11; conferir 5.12) para `bacen_domains` e ligar validação de domínio de valor no pipeline outbound (começar pelas tags financeiras TpCt*, TpPessoa*, Finldd*). | M |
| P2-2 | Corrigir o regex de TpCtDebtd/TpCtCredtd (incluir CG; validar CI/CO contra o dicionário vigente), preferindo derivar de `bacen_domains` em vez de hardcode. Depende da validação da pendência 6.8. | S |
| P2-3 | Preencher `message_tag_definitions` para os 499 tipos sem nenhuma regra (28% do catálogo, incl. 39 STR), extraindo dos XSD oficiais XSDDOCV512 do LegadoSPB. | M |
| P2-4 | Adotar validação XSD real no SPB reutilizando o padrão provado no PIX (xmllint + XSD oficial): copiar os .XSD de XSDDOCV511/V512, preencher `xsd_schema_path` e validar outbound antes de assinar. | M |
| P2-5 | Mover as flags de capacidade por status (permite envio/alteração/desdobro/conversão/consiste saldo/fechamento) para `operation_status_catalog`, espelhando `spb_tb_gen_status_oper`, e fazer CancellationRules/SubstitutionEngine/MessageWatch consultarem. | M |
| P2-6 | Fonte única da máquina de estados: `status_transitions` + cache ETS consumido por `validate_transition`, remoção do fallback map e teste de contrato contra `state_for_event`. | M |
| P2-7 | Consolidar os 3 motores de validação (MessageTagValidator + XSDValidator + SPB.Validator) em um único validador orientado a `bacen_validation_rules` + domínios, aposentando o XSDRegistry (no-op); estender o SPB.Validator de GEN0001/GEN0006 para todo o outbound. | M |
| P2-8 | Dropar (ou documentar como mortas) as tabelas órfãs `settlements` e `str_transfers`. | S |
| P2-9 | Checklist de bootstrap de ambiente novo: `Release.seed_balance_contract` (gate do dono), seeds 023/044 (grade + grade_message_map), `seed_scheduled_automations` e seed do roteiro contábil escolhido. | S |
| P2-10 | Enriquecer filtros da consulta de operações (usuário de inclusão, prioridade, natureza D/C, faixa de hora, número de origem, status STR granular). | S |
| P2-11 | Decisão DDA (pendência 6.1) e, se positiva, plano de homologação E2E do DDA/PCR (mensageria e telas já prontas). | L (condicional) |
| P2-12 | Plano formal de contingência de mensageria do participante direto (legado tinha PSTI e filas offline; hoje há outbox+NATS e transporte REST alternativo, nada formalizado), validado com BACEN/cliente. | M |
| P2-13 | Catálogo self-service no admin (paridade ADMWeb/Equalizador): CRUD auditado de message_type_config/message_tag_definitions/bacen_domains com pickup por reload ETS, no molde do self-service de certificados. | M |
| P2-14 | Confirmar no Manual de Redes v9.3 se algum fluxo exige PUT em QR.RSP/QR.SUP; se sim, ampliar `ALLOWED_PUT_PREFIX` com whitelist explícita por propósito. | S |
| P2-15 | Validar na UI/HML e, se faltarem, implementar: triagem de rejeitadas refeita/ciente (TRATAMENTO R/C) e re-agendamento de operação existente (update de scheduled_at com auditoria e vínculo tipo 76). | S |

### 3.4 P3 (menor prioridade, decisão ou higiene)

- Versionamento de manual no catálogo (padrão VERSAO_MANUAL: vrsmanual + vigência em message_type_config/message_tag_definitions/bacen_validation_rules, resolução por data). Esforço L.
- Previsões de recebimento (SP_CONCILIA_PREVISAO): só se a tesouraria pedir projeção de entradas; legado nunca usou (PREVISOES=0). Esforço M.
- Política de retenção/particionamento do histórico + comprovar RetentionPolicyView operante. Esforço M.
- Check de desvio estatístico de volume/tempo de TEDs no AlertEngine + validar layout da planilha TED se houver consumidor externo. Esforço S/M.
- Fluxo ativo de GEN0008 (consulta de certificado); GEN0007 + upload cobrem o caso comum. Esforço S.
- Consulta de operações ligadas (NROTRANSLIG). Esforço S.
- Higiene: corrigir moduledoc do LpiHandler (LPI = Conta PI, não CDI); remover facade `mq/connection_pool.ex`; fixar imagem do spb-mq-sidecar por digest; remover colunas open_time/close_time órfãs do config; validar fidelidade dos .md de `priv/xsd` antes de uso operacional. Esforço S cada.
- Prova viva (regra #11) dos fluxos fiados ainda sem evidência: devolução STR0010 pela tela, contingência por arquivo, fechamento com pendências, alertas com e-mail real, conciliação de extrato com STR0014R1 real.

## 4. Intocáveis (base validada viva em HML, não regredir)

Estes caminhos foram validados empiricamente contra o BACEN de homologação e são a base do mandato. Nenhum item do backlog pode alterá-los sem validação empírica de não regressão (regra #11):

1. **HSM RTM 443**: assinatura/decifra de PIX e SPB exclusivamente via `https://monetarie-hsm-hml.priv.rtmcloud.net.br` (HTTPS 443, vHSM 60042). Proibido reintroduzir :6443; chave privada nunca em repositório/arquivo (o `OurCertStore` rejeita PEM com bloco privado por design).
2. **Cert T010 ativado no BACEN** via GEN0006/GEN0006R1 (2026-06-30), com `BACEN_CERT_PEM_FILE=monetarie_spb_t010.pem`, `BACEN_CONTROL_PREFIX=MON` e certs reais T068 (SPB01)/T069 (MES01) da AC SERPRO.
3. **MQ SPB01 vivo**: sidecar `spb-mq-sidecar` na task do `spb-api` (`:25`), `IBM_MQ_ENABLED=true`, canal APP.SVRCONN :1514 com MCAUSER `spb_server`, tráfego real comprovado (GEN0006/GEN0006R1). Contrato commit-after-persistência do InboundAudit preservado.
4. **STR0008 inbound com crédito automático** em conta de pagamento (classificador CtPgtoCredtd, fix 79ae2077), validado vivo (crédito real reprocessado em HML). O gate de alçada do P0-1 atua no OUTBOUND, antes do RealDispatcher; o inbound não é tocado.
5. **Self-service de certificados (trilhas A e B)**: tabela `bacen_domain_certificates` + BacenCertStore/OurCertStore + APIs e telas admin, pickup em runtime sem restart, GEN0006 dual-key dormente.
6. **Diretório SPB automático** (140 -> 547 participantes, commit 75e3feb9, vivo em :25).

Observação de fronteira: P0-2 (CoaCodHandler) e P0-4 (Liquidante) tocam módulos vizinhos do caminho inbound vivo; ambos exigem plano de validação empírica (reproduzir STR0008 e GEN0006R1 em HML antes/depois) como critério de aceite.

## 5. Pendências DIVERGENTE_VALIDAR para decisão do dono

1. **DDA: ativar ou congelar.** Mensageria (89 módulos), handler pós-integração e 12 telas DDA/PCR estão prontos e dormentes; o próprio backup legado do cliente tem zero tráfego DDA (ESTOQUE_TITULOS=0, TRANS_INTF_ENV/REC=0). Decidir se a Monetarie SCD precisa aderir ao DDA (agenda de sacado); se sim, planejar homologação E2E (P2-11); se não, registrar a decisão como definitiva no CLAUDE.md do SPB.
2. **Restaurar EvolutionPro.bak, EvolutionCrypto.bak e CRKSecurityAdmin.bak** (em `LegadoSPB/DB`, NÃO restaurados nesta fase por regra da tarefa; NÃO restaurar sem autorização). Sem eles não é possível: re-conferir as linhas de `st_evo` e os 495+89 de-paras na origem, comparar o modelo criptográfico do Evolution (containers de chave, ACLs), conferir as permissões/alçadas reais (GRUPO_PERMISSAO=0 no MGI; conteúdo real no CRKSecurityAdmin) e fazer a comparação fina de telas de tesouraria do ADMWeb. Recomendação: autorizar restauração pontual read-only em container isolado para fechar essas semânticas.
3. **Redesconto (telas H/I/J) e depósitos de garantia (op V) fora de escopo permanente?** A SCD não é elegível a redesconto no BACEN; a pós-integração RDC está completa e forward-looking. Se confirmado fora de escopo, registrar no CLAUDE.md do SPB e congelar o RdcHandler como está.
4. **SELIC e SILOC/CIP como contrapartes futuras?** O legado roteava para as três; hoje só existe o par com o BACEN. Se o escopo vier a incluir câmaras, faltam filas e roteamento por contraparte.
5. **Alçada: Core ou cabine?** O P0-1 recomenda enforcar na cabine (paridade com o legado). Se o dono decidir que a autorização é responsabilidade do Core a montante, documentar formalmente e rebaixar as telas de alçada/visto da cabine a monitoração.
6. **SOS-envio**: confirmar se o cenário (enviar ignorando consistência de saldo em contingência) precisa existir na cabine, dado que a verificação de saldo do cliente é do Core (afeta o escopo do P1-7).
7. **Histórico da interface AB_MGI** (TRANS_INTF_*, 33 transações paradas em STATUSSGR=1; staging `legacy_ab_spb` com 1,95M linhas): projetar para `spb_operations` ou manter só como acervo consultável.
8. **TpCt CG/CI/CO**: validar contra o Dicionário de Domínios do Catálogo vigente (5.12) antes de corrigir o regex (P2-2); se CG segue válido, mensagem outbound de conta garantida falha na validação local hoje.
9. **Reaproveitamento RE (RCO0002)**: o legado reusa mensagem já confirmada como template sem cancelar; a SubstitutionEngine só cobre correção. Validar se o produto precisa do reuso RCO antes de implementar.
10. **Contingência do BACEN por arquivo (tela 1A)**: as peças existem (STR0043/0044, orquestrador de arquivos), mas o roteamento do tráfego de mensagens pelo canal de arquivo não está costurado; validar o requisito frente ao canal secundário ATUAL do BACEN antes de investir.
11. **Regras não-STR por evento (REGRAS/EVENTOS_REGRAS)**: validar se as regras relevantes de BMA/CAM/SEL/LDL/CIR estão embutidas nos handlers/builders antes de declarar lacuna funcional.
12. **Não-repúdio interno (ASSN_TRANS_INTERF)**: o legado assinava a transação incluída com a chave do usuário (usado em TED); validar se o cliente ainda exige.
13. **Escopo de sistemas da SCD**: confirmar quais famílias a Monetarie efetivamente opera (PAG/CIP? SLB? RCO de compensação? câmbio CAM?). As decisões definem a relevância de P1-8, D5.4 e D5.7.
14. **Multi-IF white-label na cabine SPB**: o modelo é single-institution; se houver plano de white-label (como na Partner API do Core), o item vira gap estrutural.
15. **Previsões de recebimento**: só relevante se a tesouraria passar a projetar entradas STR do dia (legado nunca usou).
16. **Contagens locais x HML**: todas as contagens Postgres citadas são do ambiente LOCAL (dev). Antes de abrir issues por contagem (message_groups 25, bacen_error_codes 339, operation_status_catalog 0), reconferir no Aurora HML, que recebe os seeds completos (5.314 erros, 9.473 tarifas).
17. **GEN0016/0017 via prestador**: código completo, nunca exercitado (sem prestador configurado em HML); validar contra um prestador real antes de contar como paridade plena.

## 6. Conclusão

O núcleo transacional, criptográfico e de tesouraria da cabine SPB Monetarie está em paridade comprovada com o legado e o supera em rastreabilidade, idempotência, automação de grade/diretório e self-service de certificados. O que falta não é motor: é FIAÇÃO (alçada no envio, cancelamento protocolar), correção de 3 defeitos de catálogo verificados no código (financial_flag, value_tag, semântica GEN0014-0018), a segunda onda do LPI0006 e a remoção do artefato Liquidante. Os 4 itens P0 e 11 itens P1 acima fecham o risco real; o restante é robustez, decisão de escopo do dono e paridade fina de mesa. Os caminhos vivos de HML permanecem intocáveis como base de tudo.
