# Validação viva consolidada em HML — F3 (T23) + lote CA + IB (B1/B2 + iniciação)

Data: 2026-07-18 (manhã, 11:23–11:56 BRT). Ambiente: HML (`monetarie-greenfield-homolog`), acesso por túnel SSM 18080 (EC2 `i-02ce3a3b6b3ad0d37` → ALB interno) + proxy local com Host header (VPN indisponível na janela, hosts `*.monetarie.internal` = timeout). Evidências: `docs/reports/screenshots/2026-07-18-validacao-consolidada/`.

## Estado do deploy no início da validação

| Serviço | Task-def | Imagem |
|---|---|---|
| core-api | `:169` → `:170` (swap DURANTE a validação, ver nota) | `homolog-85dc7f2f-iniciacao-20260718` → `homolog-560232bc-f1d1d2-20260718` |
| core-admin-ui | `:31` | `homolog-f89df229-w1consolidado-20260718` |
| core-banking-ui | `:31` | `homolog-85dc7f2f-iniciacao-20260718` |
| core-merchant-ui | `:18` | `homolog-85dc7f2f-iniciacao-20260718` |

Nota operacional: às 11:40 BRT o core-api de HML fez swap `:169` → `:170` (deploy de outra frente, imagem `560232bc`, mais nova que a exigida). A janela do swap gerou 503 transitórios (~2 min) que derrubaram a sessão do CoreAdmin; itens A1–A5 foram validados na `:169`, os demais na `:170`. Nenhum item foi julgado dentro da janela do swap.

Usuários: CoreAdmin `admin@monetarie.com.br` (secret `monetarie/homolog/admin/core/initial_password`); IB cliente de teste GABRIEL CARDOSO (user 24022, CPF 09918358912, conta 10023087 / Ag 0001 Cc 000000982, saldo R$ 0,00, senha padrão de teste). Banco: somente SELECT/leitura (logs CloudWatch e telas); nenhum dinheiro movimentado (TED agendada de R$ 0,01 criada e CANCELADA pela tela; PIX manual NÃO confirmado; cadastro de chave EVP disparado e não materializado — sem efeito monetário).

## Veredito por roteiro

| Roteiro | Validados | Falharam | Não validáveis/parciais |
|---|---|---|---|
| A — F3 (T23, telas novas CoreAdmin) | 5 de 7 (A1, A2, A5, A6, A7) + A3 analítico | 2 (A3 sintético, A4) — MESMA causa raiz | 0 |
| B — lote CA (amostra de 11 itens) | 11 de 11 | 0 | 0 |
| C — IB (B1/B2 + iniciação) | 2 de 3 (C2, C3) + C1 parcial | 0 | 1 parcial (C1: crash B1 corrigido provado; "seletor populado" não comprovável) |

---

## Roteiro A — F3 (T23)

| # | Item | Veredito | Evidência |
|---|---|---|---|
| A1 | Regulatório/Relatórios → Movimentações CCS | VALIDADA | `a1-ccs-movimentacoes.png`. Tela carrega com 7 linhas reais (pipeline ACCS001, remessas `202607*`); grid com 10 colunas incluindo as 8 do cliente (Data do evento, Tipo, Nome do titular, CPF/CNPJ, Agência, Conta, Situação, Data de envio ao BACEN, Status do envio, Nº remessa); filtro por período inicial/final presente; modos Analítico/Consolidado; export CSV BAIXOU (`movimentacoes-ccs_2026-07-18.csv`, BOM UTF-8 + cabeçalho "Relatório: Movimentações CCS enviadas ao BACEN" + filtros + timestamp). |
| A2 | Relatórios → Avisos de Créditos | VALIDADA | `a2-avisos-creditos.png`. Dados reais do dia: 5 créditos, R$ 11,20, pagador Camille Zanetti Conceição (231.373.557-53) → titular Firmino da Souza Bastos, descrição e valores ao centavo (sem 100x). Cards de resumo + agrupamento por data + exports XLSX/CSV/PDF presentes. |
| A3 | Relatórios → Movimentações Diárias analítico/sintético | ANALÍTICO VALIDADA / SINTÉTICO FALHOU | Analítico: `a3a-movimentacoes-diarias-analitico.png`, 10 movimentos do dia com débito/crédito espelhados (Camille -R$ 3,40 / Firmino +R$ 3,40 etc.). Sintético: **HTTP 500** em `GET /api/v1/reports/accounts/daily-movements?mode=sintetico` (`a3b-movimentacoes-diarias-sintetico-500.png`). Causa raiz no log do core-api: ver BLOQUEADOR B-1. |
| A4 | Relatórios → Saldos por Gerente | FALHOU | **HTTP 500** em `GET /api/v1/reports/accounts/balances-by-manager` (2 tentativas); a tela mascara o erro como "Nenhuma conta encontrada." (`a4-saldos-por-gerente-500.png`). Mesma causa raiz do A3 sintético (BLOQUEADOR B-1); falha silenciosa de front registrada como observação O-1. |
| A5 | Extrato de cliente → export OFX | VALIDADA | Contas Correntes → conta 119372-4 (Firmino, id 10024314) → aba Extrato com 4 formatos PDF/Excel/CSV/OFX e colunas Pagador/Recebedor (`a5a-extrato-conta-4-formatos.png`). OFX BAIXOU e abre com `OFXHEADER:100`, `DATA:OFXSGML`, `VERSION:102`, transações `STMTTRN` presentes (26 lançamentos). |
| A6 | SISBAJUD | VALIDADA (vazia, esperado) | `a6-sisbajud-lista-vazia.png`. Tela lista com cards (Total/Recebidas/Executadas/Falhas = 0), abas Ordens Judiciais/Upload Remessa/Arquivos, grid com a coluna nova "Titular" e filtros; `judicial_orders` vazia em HML por design. |
| A7 | AMES | VALIDADA | `a7-ames-form-ames001.png`. Tela carrega (cards por status, tabela vazia "Nenhuma solicitação AMES registrada"); dialog "Nova solicitação AMES" com Código do arquivo STA pré-preenchido **AMES001** e hint da decisão D6; fechado com Cancelar (nenhuma solicitação criada). |

## Roteiro B — lote CA (amostra)

| CA | Item | Veredito | Evidência |
|---|---|---|---|
| CA-004 | Status PT na tela Liquidação | VALIDADA | `b1a-liquidacao-status-pt-e2e-badge.png`: coluna Status com "Liquidado", "Aceito", "Concluído", "Rejeitado" (fim do `completed`/`settled` cru). |
| CA-005 | Rótulo STR padronizado | VALIDADA | Badge do identificador BACEN em pares "PIX (E2E)" (`b1a`) e "TED (STR)" com NumCtrlSTR real `STR20260710990000222` (`b1b-liquidacao-ted-str-badge.png`, filtro de trilho TED). Observação O-4: a OPÇÃO do dropdown de filtro ainda exibe o literal técnico "NumCtrlSTR (TED)". |
| CA-008 | Tipo traduzido na Reconciliação Contábil PIX | VALIDADA | `b2-reconciliacao-pix-tipos-pt-coluna-data.png` (período 10–18/07, 12 divergências reais): tipos "Divergência de valor", "Sem lançamento", "Lançamento órfão" e **"E2E duplicado"** (o `duplicate_e2e` que faltava, com linha real `E74064502...JU08`), chips de resumo idem. |
| CA-010 | Coluna Data no grid | VALIDADA | Mesma evidência: coluna "Data" presente como primeira coluna, ordenável. |
| CA-015 | Categoria PT no Relatório de Movimentação CC | VALIDADA | `b3-relatorio-movimentacao-cc-categoria-pt-cores.png` (cliente Firmino, julho): coluna Categoria = "Transferência" (não `transfer`). |
| CA-016 | Cores débito/crédito | VALIDADA | Computed style provado no grid: crédito `rgb(22,163,74)` (verde), débito `rgb(220,38,38)` (vermelho); visual na mesma screenshot. |
| CA-018 | Export PDF do Relatório de Movimentação CC | VALIDADA | `client-statement_2026-07-18.pdf` BAIXOU: magic bytes `%PDF-1.3`, 48.954 bytes. |
| CA-019 | Card sem "undefined" | VALIDADA | `b4-saldo-diario-cc-card-71.png`: card "Contas com saldo" = **71** (Saldo total R$ 719.623,67). |
| CA-021 | Export PDF do Saldo Diário CC | VALIDADA | `checking-daily_2026-07-18.pdf` BAIXOU: `%PDF-1.3`, 67.096 bytes. |
| CA-024 | Paginação de clientes mantém página | VALIDADA | `b5-clientes-paginacao-pagina3-mantida.png`: clique em página 3 → após o refetch a página ativa PERMANECE 3 com o conteúdo da página 3 (1ª linha "ADRIANO GONCALVES PICANCO"); sem reset para página 1. |
| CA-025 | Caixa Institucional fora do menu | VALIDADA | `b6-menu-tesouraria-sem-caixa-institucional.png`: seção TESOURARIA expandida SEM o item (contagem programática de botões "Caixa Institucional" no menu = 0). Observação O-3: a rota direta `/dashboard/treasury/caixa-institucional` ainda renderiza por URL (o fix do plano era o menu; remoção da rota era opcional). |

## Roteiro C — IB (re-prova B1/B2 + iniciação)

| # | Item | Veredito | Evidência |
|---|---|---|---|
| C1 | Receber PIX: lista de chaves carrega (B1) | PARCIAL — crash CORRIGIDO e provado; "seletor populado" NÃO comprovável | O crash B1 (`TypeError: r.filter is not a function` em toda carga da tela, F2 de 18/07) NÃO ocorre mais: dialog Receber PIX abre limpo, console com apenas os 2 401 esperados de checagem de sessão pré-login (`c1a-ib-receber-pix-sem-crash-b1.png`); `GET /api/accounts/10023087/pix/keys` = 200. O seletor populado não pôde ser provado: a conta de teste não tem chave em HML; o cadastro de EVP pela tela (Minhas Chaves → Chave Aleatória) devolveu **202 Accepted** (POST 14:48:38 UTC, request_id `9dd57cfcc152c68b24060ea9cda8bc34`) e a chave NÃO materializou em ~7 min, sem erro visível nos logs core-api/pix-api da janela. Ver observação O-2. |
| C2 | TED com data futura SEM saldo (B2) | VALIDADA | Saldo R$ 0,00; Nova Transferência → Outros → favorecido de teste (Fulano de Teste HML, CPF teste, ISPB 60746948, Ag 9999 / Cc 999999-9), R$ 0,01, data 21/07/2026: a tela exibe o texto novo do débito diferido ("o debito acontece na abertura da grade do dia agendado; garanta saldo na data"), o Próximo HABILITA sem saldo (`c2a-ib-ted-agendada-form-sem-saldo.png` — na F2 este passo bloqueava, B2), confirmação criou o agendamento e a tela Agendadas listou "Pendente, 21/07/2026, R$ 0,01" (`c2b`); CANCELADA pela própria tela na sequência, status "Cancelada" (`c2c`). Nenhum débito/hold (débito é diferido por design e o agendamento foi cancelado). |
| C3 | PIX manual (agência+conta) até a confirmação, SEM confirmar | VALIDADA | PIX → Dados bancários (`/pix/manual`): Bradesco (ISPB 60746948), Ag 9999, Cc 999999-9 (conta de teste inexistente), CPF de teste, campo novo "Nome do favorecido" = "Fulano de Teste HML", R$ 0,01 (`c3a-ib-pix-manual-form-preenchido.png`). Próximo levou à Revisão com o nome EXATAMENTE como digitado, documento mascarado `123.***.***-09`, tipo "manual", "Chave PIX: 9999/999999-9" (`c3b-ib-pix-manual-revisao-sem-dict.png`). **Prova de ausência de consulta DICT**: zero chamadas de API na rede entre o load da tela e a revisão (nenhum `dictLookup`/`keys` — o fluxo manual é 100% sessão local até o confirm, conforme fix `32631665`/`5d8034b5`). Envio NÃO confirmado (Cancelar na revisão); nada saiu ao BACEN. |

---

## Bloqueadores de PRD

- **B-1 (BLOQUEADOR, F3): `Enum.sum_by/2` não existe no runtime Elixir 1.17.3 do container — 500 em DOIS relatórios novos.** Stack real do core-api HML: `** (UndefinedFunctionError) function Enum.sum_by/2 is undefined or private` em `lib/monetarie/use_cases/reports/daily_movements.ex:116` (`synthetic/3`, via `accounts_reports_controller.ex:75`) e o MESMO erro no `balances_by_manager` (dump mostra as linhas de contas no argumento). `Enum.sum_by/2` é API do Elixir 1.18; a imagem roda 1.17.3. Efeito: Movimentações Diárias modo SINTÉTICO e Saldos por Gerente respondem 500 em TODO ambiente com essa imagem — subir para PRD leva o defeito junto. A suíte local não pegou porque a máquina de dev tem Elixir mais novo. Fix de classe única: trocar por `Enum.reduce`/`Enum.map |> Enum.sum` nos dois pontos (não corrigido aqui por ordem do roteiro: documentar, não consertar).

## Observações (não bloqueadoras)

- **O-1 (front, silent failure):** a tela Saldos por Gerente troca o 500 por "Nenhuma conta encontrada." — falha de backend fica invisível ao operador. Padrão a evitar (mesma classe já tratada em outras telas com toast de erro).
- **O-2 (IB, cadastro de chave assíncrono):** o POST de chave EVP devolve 202 e a chave não materializa em HML (≥7 min), sem linha de erro em `/ecs/monetarie/homolog/core-api` nem `/ecs/monetarie/homolog/pix-api` na janela. Ou o trilho assíncrono está pendurado em silêncio, ou o desfecho não realimenta a lista. Precisa de investigação própria antes de considerar o cadastro de chave pela tela validado ponta a ponta (o fix do openingDate de 17/07 foi provado por outra sessão; o que fica em aberto aqui é o desfecho do 202 desta tentativa).
- **O-3 (rota residual):** `/dashboard/treasury/caixa-institucional` segue acessível por URL direta (menu limpo = CA-025 atendido conforme plano; remover/gatear a rota é o complemento opcional).
- **O-4 (rótulo técnico residual):** no filtro de trilho da tela Liquidação, a opção do dropdown ainda exibe "NumCtrlSTR (TED)" e o placeholder de busca "E2E / NumCtrlSTR"; o badge da TABELA (objeto do CA-005) está correto ("TED (STR)" / "PIX (E2E)").
- **O-5 (tela antiga quebrada):** a rota antiga `/dashboard/accounts/:id/statement` (`AccountStatementView.vue`) chama `GET /api/accounts/:id/statement` e recebe **400** — "Não foi possível carregar o extrato" sempre. É tela distinta da aba Extrato validada no A5 (que usa `/api/admin/bank-accounts/:id/statement`). Candidata a redirect/remoção.
- **O-6 (cosmético):** a confirmação de TED rotula a conta de origem como "Poupança" (a conta é payment); a tela nova Movimentações Diárias (A3) exibe a categoria crua `transfer` na coluna Categoria — mesma classe do CA-015, agora na tela nova.
- **O-7 (ambiente):** localStorage/cookies do browser de validação compartilhados entre CoreAdmin e IB no mesmo host local causam sessão cruzada (403 no admin com cookie do IB); mitigado usando origens distintas (`localhost` vs `127.0.0.1`). Só afeta a técnica de validação, não o produto.

## Artefatos baixados e conferidos (não versionados)

- `movimentacoes-ccs_2026-07-18.csv` — BOM + cabeçalho de relatório/filtros/timestamp (A1).
- `extrato_119372-4_2026-05-01_2026-07-18.ofx` — `OFXHEADER:100`, OFX 1.0.2 SGML, 26 `<STMTTRN>` (A5).
- `client-statement_2026-07-18.pdf` — `%PDF-1.3`, 48.954 bytes (CA-018).
- `checking-daily_2026-07-18.pdf` — `%PDF-1.3`, 67.096 bytes (CA-021).
