# Handoff 2026-07-02: paridade best-of-breed dos 3 sistemas + Ondas 1-3 implementadas e deployadas

Data: 2026-07-02
Mandato do dono: revisar 100% de forma sequencial e faseada `monetarie/pix` contra `mwbank/LegadoPIX` (+ backup AutBank), `monetarie/spb` contra `mwbank/LegadoSPB` (+ AB_MGI), e `monetarie/core` contra `coreproviders`, garantindo paridade e o melhor entre sistemas, mantendo o que já está validado vivo (HSM/assinatura/fluxos) e melhorando as regras de negócio sem overlap.

Estado de referência: `origin/main` = `9db233fd`. Todos os 6 serviços na tag `homolog-9db233fd-20260702`, `COMPLETED`, health 200: core-api `:81`, pix-api `:96`, spb-api `:30` (sidecar MQ + 61 envs preservados), core-admin-ui `:12`, core-banking-ui `:24`, pix-admin-ui `:13`.

## 1. As 4 fases de paridade (diagnóstico)

Três matrizes de paridade escritas e commitadas, 508 itens no total, cada um com evidência (arquivo:linha, procedure, dados vivos) e veredito:

- `docs/reports/2026-07-02-paridade-pix-legadopix.md` (160 itens)
- `docs/reports/2026-07-02-paridade-spb-legadospb.md` (155 itens)
- `docs/reports/2026-07-02-paridade-core-coreproviders.md` (193 itens)
- `docs/plans/2026-07-02-ecossistema-best-of-breed-plano-ondas.md` (síntese + backlog em 3 ondas + 18 intocáveis + pendências do dono)

O suposto P0 "PIX Out do IB sem registro no Core" foi provado FALSO ALARME: o rejeitado mora em `failed_transactions` por desenho (a `outbound_requests` é staging que move a linha no estado terminal), com timeline em `pix_out_lifecycle_events`.

## 2. Onda 1 (dinheiro e risco) — deployada

- **Duplo-débito PIX-OUT eliminado** (o defeito money-path mais sério): todo PIX-OUT debitava `available` da Conta PI duas vezes (`create_block` + `debit_pi_balance`). Removido o débito redundante; `create_block` virou o único ponto de saída de `available`. TDD de invariante de saldo. (`24f0c6c1`)
- **Limites PIX-OUT/TED + noturno Res. 142**: não havia checagem de limite no outbound (só PIX-IN). Portado o LimitCheck do coreproviders; noturno resolvido por hierarquia (conta → primária → GlobalLimit → default R$ 1.000). Teto noturno confirmado pelo dono: R$ 1.000 para todos. (`19f57851`, `80c4a531`)
- **CRC do BR Code** (rejeitava todo QR válido), **idempotency por parceiro** (fim do replay cruzado), **charge do parceiro persistida**, **TimeBlock**. (`19f57851`)
- **Alçada SPB no envio** (4 olhos, aprovador ≠ criador) + **cancelamento protocolar** via CancellationEngine (era só UPDATE local). (`17acab31`)
- **Liquidante SPB desligado por flag**: a verificação contra o LegadoSPB provou que a auto-resposta a avisos e os saldos ETS fabricados (R$ 100M/50M) não têm respaldo no legado. Flag-off reversível, código preservado. (`5831754c`)

## 3. Onda 2 (regras de negócio) — deployada

- **Transferência interna mesmo-ISPB**: PIX intra-Monetarie liquida como book-transfer TigerBeetle interno instantâneo, sem ir ao BACEN; externo intacto. Cobre só o caminho do IB (`v2 PixController.send_pix`); follow-up: estender a Partner API/OutboundOrchestrator/MANU. (`cee6ad56`)
- **Devolução automática pacs.004**: crédito recebido que não pode ser aplicado (AC03/06/07/14/AG03) → não credita o cliente (F-07) + devolve ao pagador pelo caminho de devolução existente, idempotente. (`378379f6`)
- **DICT inbound polling + timers de claim + gatilho MED**: poller Oban de claims/infrações/refunds recebidos + timers via deadline durável (Nats-Msg-Deliver-After) + InfractionResponder acionando cautelar block. Máquinas antes mortas, agora ligadas. (`ae666dd0`)
- **SPB GEN0014-18 reclassificados**: eram tratados como abertura/fechamento de dia; o catálogo BACEN/AB_MGI prova que são transferência de arquivo / ativação de cert. Dia real = STR0017/STR0016. (`31d584c7`)
- **LPI0006 espelho da Conta PI** (grupo de saldo 43), refletindo o BACEN sem fabricar (lição do Liquidante). (`31d584c7`)

## 4. Onda 3 (ops/UX/compliance) — deployada

- **PLD/FT vivo**: `TransactionMonitorWorker` enfileirado em cada materialização PIX/TED liquidada → `evaluate_transaction` (antes zero chamadores) + screening de sanção com trilha + PiiMask nos logs. (`36a24444`)
- **Webhooks honestos**: `@valid_events` alinhado ao que tem dispatcher, dedup por índice único parcial, entrega pós-commit, guarda fail-closed em eventos que confirmam dinheiro, retry de backstop. (`36a24444`)
- **Feriados + CobV**: tabela + `Monetarie.UseCases.Calendar` (nacionais computados, fail-safe) destrava a CobV dia-útil que estava quebrada; cálculo portado exato do LegadoPIX. (`36a24444`, `6b374675`)
- **PIX agendado one-off** e **SMS onboarding PJ** (Twilio real + fallback homolog). (`36a24444`)
- **DDA ativado**: subsistema estava ~90% pronto e dormente por uma peça (classificação inbound dos avisos base); ativado, não-financeiro, sem auto-resposta, `DDA_ENABLED` default true reversível. (`9db233fd`)

## 5. Correções fora da paridade (pedidos do dono no caminho)

- **Tela Construir Mensagem** (pixadmin): "Enviar" dava 403 para todos (backend exigia permissão de tipo nunca semeada, sem bypass de admin). Corrigido + UX toast + "Requer Aprovação" honesto. Validado ao vivo (HTTP 201). (`9f6221d3`, `8826bcc8`)
- **HTTP não confunde o piloto**: OperationsMonitor rotulava `http_status_code` como "Status"; separado em "ACK transmissão" (HTTP 2xx = recebimento técnico) vs Status de negócio. (`8826bcc8`)
- **Timeline ICOM concatenada**: antes só pacs.008↔pacs.002; agora endpoint genérico por E2E agrega envio + respostas de todos os tipos ICOM. Validado ao vivo (msg 134, 6 pontos). (`5e2fe830`, `8826bcc8`)
- **GEN0001 automação bloqueada**: era falta da flag `SCHEDULED_QUERY_MQ_DISPATCH_ENABLED` (não regressão da alçada). Corrigido + guardrail no SendGate para envios de sistema. Validado vivo (`sent_to_mq` → `r1_confirmed`). (`c31dc6d8`)
- **LPI0006 automático**: handler `:inbound_notification` no ar; próxima chegada orgânica confirma zero-touch.
- **Backfill do saldo PI**: higiene de registro de 13 blocks presos, sem mover dinheiro; o drift de R$ 4,08 é defasagem de espelho (BACEN é a verdade, auto-cura pelo próximo camt), não perda do cliente.
- **Reset de senha do IB**: 1.542 usuários ativos → `Mudar@12345!` (bcrypt, login por CPF), sem bloqueio de primeiro acesso; cobre IB e Merchant Portal. Para o time testar.

## 6. Evidências (regra #11)

- `docs/reports/screenshots/2026-07-02-construir-mensagem-envio/` (envio 201, ACK transmissão, timeline concatenada).
- `docs/reports/screenshots/2026-07-01-ib-internal-transfer-attempt/` (tentativas de PIX pelo IB).
- Backfill: prova de que o saldo NÃO mudou (byte-a-byte antes/depois).

## 7. Follow-ups abertos (nenhum bloqueia)

1. **Validação viva regra #11 das Ondas 2/3** (transferência interna e2e, devolução automática, timers de claim, DDA, LPI espelho) — depende do recebedor homolog cooperar (instabilidade conhecida).
2. **tx 199** (ACSP, aguarda status terminal do BACEN; o download do arquivo de extrato não está implementado — o detalhe do camt.052 vem em arquivo).
3. **Transferência interna**: estender do IB para Partner API/OutboundOrchestrator/MANU.
4. **Seed de features de message-type** para RBAC granular de operador não-admin (hoje só admin envia pela tela Construir Mensagem).
5. **Feriados municipais/estaduais**: a tabela nova está vazia (nacionais são computados); semear se a CobV precisar de feriados não-computáveis. NÃO re-rodar o INSERT antigo do `gap_resolution_seed.sql` (schema obsoleto).
6. **DDA0400** chama `SystemDate.open` (espelha o legado `spb_sp_trata_DDA0400`); confirmar com o dono se é o comportamento desejado.
7. **DayAutoClose** ainda trata GEN0018 como fechamento de dia (dormant, admin-triggered).
8. **Sidecar `spb-mq-sidecar` por digest** (tag mutável `homolog-latest`).
9. **Valor default do teto noturno**: confirmado R$ 1.000 para todos; revisar se a política regulatória mudar.

## 8. Gotchas operacionais desta rodada

- ECS `execute-command` NÃO herda os secrets injetados no container → migrar via `rpc` (nó já bootado com `DATABASE_URL`), nunca `eval` (que sobe nó novo sem secret). Repo do Core = `Monetarie.Infra.Repo.Base` (não `Monetarie.Repo`).
- Migração de holidays da cabine foi bloqueada por uma tabela legada incompatível (baseline `mon_pix_schema_clean.sql`); reconciliada com backup + DROP CASCADE + re-migrate.
- Deploys por `scripts/deploy_hml_arm64.sh` rodam em nohup e sobrevivem à morte do agente; spb-api não é coberto pelo script (deploy manual preservando sidecar).
- Nunca rodar `env` cru em sessão exec (risco de fragmento de segredo no transcript).
