# Handoff 2026-07-20 — Pendências mapeadas (SPB MQ + IB/Merchant PR #18)

Consolidação de TODOS os itens pendentes mapeados na sessão de 20/07 (segunda).
O que foi CORRIGIDO E DEPLOYADO nesta sessão está no topo; o que segue
ENFILEIRADO está listado por frente, com evidência arquivo:linha para retomada
direta. Nada aqui é inferido — cada item saiu de auditoria com código na mão.

## Estado vivo ao fim da sessão (2 ambientes, tudo pushado)

- **SPB** (`origin/main` inclui `9ded2ae6`): HML spb-api:70, **PRD spb-api:40** (rollback :39). Full audit do trilho MQ FEITO; incidente STALE_NO_MQ_ACK 06:30 resolvido; latência de ingestão de ~12s → ~2s (sidecar thread-por-fila). CIR0008 slot DESATIVADO (rede recusou por autorização do emissor — serviço não contratado). Detalhe: `docs/reports/2026-07-20-spb-mq-full-audit/` + memória `monetarie-spb-mq-full-audit-0720`.
- **Core/IB/Merchant** (`origin/main` = `0f768655`): HML core-api:179/banking-ui:34/merchant-ui:21; **PRD core-api:75/banking-ui:7/merchant-ui:5** (rollbacks :74/:6/:4, digest MATCH). PR #18 (Micael, responsividade/2FA/comprovante) MERGEADO. 4 P0 + lote P1 (PR-introduzido + money-adjacent) corrigidos com TDD e provados vivos. Detalhe: memória `monetarie-audit-ib-merchant-pr18-0720`.
- Suítes no fecho: SPB 17.910/0; core backend 8.290/0; vitest banking 184/184, merchant 14/14.

## Já corrigido nesta sessão (NÃO re-reportar como pendente)

P0: desvio interno de PIX no IB (book-transfer server-side), IDOR de extrato, IDOR de exclusão de chave, refund parcial merchant 100×. Lote P1: filtro direction-nula do PR, tarifa TEF latente, gate de limites em /pix/send e /pay-qrcode, hardening do desvio interno (cross-check de documento vs entry DICT). Tudo em PRD.

---

## FRENTE A — SPB (P2/menores do MQ audit, sem perda silenciosa de dinheiro)

1. **Janela de e-mail de alertas × fim de semana**: gate de dia útil (`Date.utc_today`) vs janela de 24h → alerta criado sexta à noite nunca sai. Janela em dias úteis (~72h) ou sem corte de idade p/ alertas abertos.
2. **MessageWatch `notify_email`/`notify_popup`** gravados e nunca entregues (nenhum drenador). Ligar ao EmailDelivery ou remover da UI.
3. **BACEN_DLQ write-only**: durable `bacen-dlq-processor` sem puller nem monitor de profundidade. Monitor + drenagem para `dlq_entries`/alerta.
4. **MQBridge serializa todo o inbound num único GenServer** (`mq_bridge.ex:155`, `call` 30s) — sidecar lento degrada todos os domínios. Paralelizar por domínio.
5. **Timeout HTTP do PUT no executor agendado** ainda ambíguo (o EXIT do DomainManager já foi mapeado com quarentena; falta o estado `unknown_sent` para o timeout HTTP com conciliação via R1/consulta antes de reenvio).
6. **RSTR fail-open análogo**: `check_duplicate_ctrl`/`check_duplicate_operation`/`find_outbound_by_ctrl` (`rstr_validator.ex`) — só `check_operation_state` ficou fail-closed. Aplicar o mesmo nos demais.
7. **cir_handler**: fallbacks `Decimal 0` corrompendo fórmulas (`cir_handler.ex:656-678,776-778`).
8. **TES grava volume no grupo fantasma 50** (`tes_handler.ex:503`) vs grupo 24 do moduledoc.
9. **RTM porta MES01 :12522** segue DROP — cobrar da RTM (bloqueio de terceiro).
10. **CIR0008**: slot desativado com lastro; reativar exige contratação/cadastro do serviço junto à rede (decisão de NEGÓCIO do dono, não código).

## FRENTE B — Internet Banking (P1/P2, fora do lote B por serem UX/telas)

1. **Devolução PIX inexecutável pela UI** (backend pronto e testado): `PixHubView.vue:119` navega p/ `/pix/refund` sem `transactionId`; ninguém grava o sessionStorage que `PixRefundView.vue:125` lê; extrato/comprovante sem botão devolver. Wire o front.
2. **Defesa de infração → 404**: `api.ts:69` POSTa `/infractions/:id/defense` que só existe em `/api/admin` (`router.ex:2594`) e partner (`:211`); scope IB só tem GET. Criar a rota no scope IB ligando ao use case existente.
3. **4 telas MED/infração no envelope `{data}` não desembrulhado**: MedsView (`:71`), ComplianceView MED (`:72`)/Infrações (`:232`), InfractionDetailView (`:29`) — sempre em branco/erro; MedDefenseView (que funciona) fica inalcançável.
4. **Documentos>Devoluções sempre vazia** (`merchant_portal_controller.ex:749` filtro `type=="refund"` sem writer vivo — devolução nasce `type:"pix"`).
5. **Paginação morta**: StatementView/ReceiptsView/Documents lêem `meta` que o backend não manda (teto 50/20 silencioso).
6. **Tela PIX Agendados lê fonte errada** (`PixScheduledView.vue:79` busca `transactions?status=scheduled`; agendamento não cria linha em transactions). Ler `GET /pix/scheduled`.
7. **TransferSendView ramo "Minhas contas" sempre 422** (sem `recipient_*` → missing_required_fields antes do hold).
8. **Comprovante 404 nos Documentos**: id `url_encode64` no serializer (`:1359`) vs `decode16` no `transaction_controller.ex:294`.
9. **Coluna Data do Extrato sempre "-"** (`ExtractView.vue:117` lê `createdAt`; composable entrega `date`).
10. **Copia-e-cola não paga QR dinâmico URL-only** (422 honesto; CobV com juros recalculados fica errado).
11. **Regenerar backup codes** (`TwoFactorAuthView.vue:277` lê só `backup_codes`; se vier camelizado, códigos antigos invalidados e novos não exibidos).
12. **Boleto de fachada** (se prometido ao cliente): consumer NPC log-only, tx "processing" eterna, comprovante 404 — sem saldo/hold/débito.
13. **Step-up MFA por operação decorativo** (backend nunca lê `totp_code` em transação).

## FRENTE C — Merchant (P1/P2)

1. **Detalhe do QR renderiza vazio** (`QrCodeDetailView.vue:22` não desembrulha `{data}`).
2. **QR estático com valor inacessível** (motor força dynamic; cabine suporta tag54, `settlement_service/qr_codes.ex:755`).
3. **`pix.charge.paid` amount em base units** (`charge_paid.ex:111`) vs centavos do `charge.created` — webhook 100× divergente entre os dois eventos.
4. **Erros da cabine em chave PIX não parseados no front** (backend 422 correto; telas leem `data.message`/`error.code` inexistentes).
5. **EventsView/LogsView sempre vazias** (`api.ts` aponta ambos p/ `/webhooks/events`, catálogo de tipos).
6. **Secret de webhook nunca chega** (só `secret_hint` mascarado; front sem `rotate-secret`) → HMAC inutilizável pela UI.
7. **MED não lista** (`MedsView.vue:28` hardcoded `[]`); **marcador de fraude** sem tela.
8. **TEF between-accounts sem POST no front** (`BetweenAccountsView` só lista; endpoint pronto).
9. **Withdrawal create = 501**; **saldo pending/blocked hardcoded 0**.
10. **Telas mock roteadas** (DashboardAnalyticsView, FeesView, LimitsView, TransactionSearchView raiz) — esconder ou religar.
11. **`authorized?` acoplado a `user.id == merchant_id`** barra colaboradores legítimos sem role admin/developer.
12. **Chamadas mortas do front**: `GET /transactions/search`, `GET /transfers/lookup-account`, `POST /kyc/submit`.

## FRENTE D — Oportunidades vs AVIV (o que eles têm e nos falta, ranqueado por valor)

1. Defesa de infração do lojista ponta a ponta (= item C7/B2; obrigação DICT/MED).
2. Analytics real do merchant (endpoint JÁ existe, `router.ex:3238`; só religar a tela).
3. Busca de transações server-side no merchant.
4. Lookup de conta destino antes de TED (`GET /transfers/lookup-account`) — reduz erro de dinheiro.
5. Dropdown de bancos no TED (`GET /banks`; temos `institution_directory` com 437 instituições).
6. Export de extrato server-side assíncrono (o nosso é client-side sobre o carregado).
7. Comprovante PDF server-side no merchant.
8. UX: check-cnpj no blur do login; criação de webhook exigindo TOTP.
**Não copiar**: "alteração de limite pelo usuário" da AVIV é fachada client-side sem API.

## FRENTE E — Terceiros / negócio (herdadas, dependem do cliente ou de decisão)

- Solicitação de apoio ao cliente (19/07): SES/DNS+destinatários, conta de tesouraria da remuneração, dados do ensaio AMES-SIMBA, validação de infração/MED em HML com transação LIQUIDADA. Ver `docs/reports/2026-07-19-solicitacao-apoio-cliente-pendencias.md`.
- Relação Vulci: item 6 (tarifa SLB) em desenvolvimento; APIX receita fonte 1 R$586,03 = NÃO retificar (decisão do dono).
- CIR0008 (Frente A #10): contratar/cadastrar o serviço se a Monetarie for operar CIR.

## Como retomar

1. Ler este handoff + as 2 memórias (`monetarie-spb-mq-full-audit-0720`, `monetarie-audit-ib-merchant-pr18-0720`).
2. Escolher a frente (B e C são as que o dono cobra: "IB e merchant 100%"). Sugestão de ordem por valor: B1 (devolução UI) + B2/C7 (defesa de infração, casa com Frente D) + C1/C4 (envelopes do merchant) → depois o resto.
3. Regra do recorte: nunca deployar como "100%" o que ficou fora do lote combinado; cada fix com TDD + prova viva.
4. Deploy: core via runbook `docs/operator/2026-06-03-deploy-manual-runbook.md`; digest MATCH homolog→prod por imagetools.
