# Inventário completo e honesto de testes do monorepo Monetarie

Data: 2026-07-10. Escopo: core/, pix/, spb/, npc/, sta/, clst/, benchmark/, frontends, mobile/ e e2e Playwright.

Metodologia: contagem estática por grep (`^\s*(test|property) ` para ExUnit, `^\s*(it|test)\(` para Vitest/Playwright, `test(`/`testWidgets(` para Flutter). Contagens estáticas são aproximadas: `describe.each`/`it.each` expandem em runtime (exemplo real: `core/packages/shared` tem 77 casos no grep e 92 executados). Nenhuma suíte de backend foi executada nesta sessão (são caras e exigem serviços locais); as suítes de frontend, por serem rápidas e sem dependências externas, foram executadas e os números reais estão marcados como RODADO. O estado dos backends vem dos handoffs citados com arquivo e linha.

## 1. Tabela por sistema

### 1.1 Backends Elixir (ExUnit)

| Sistema | Framework | Arquivos de teste | Casos (grep) | Comando | Estado conhecido | Bloqueios/dependências |
|---|---|---|---|---|---|---|
| core/backend | ExUnit | 662 `*_test.exs` | 7.273 test/property, 2.120 describe | `cd core/backend && mix test` (alias = `ecto.create` + `ecto.migrate` + `test`, mix.exs:104-110) | Saneamento 07-09: 729 para ~26 falhas residuais, fora do money path (docs/handoff/2026-07-09-incidente-pacs008-canonico-pixin-handoff.md:36 e :48). Baseline anterior: 6.759 testes / 777 falhas em 07-04, 99 determinísticas com seed fixo (docs/handoff/2026-07-04-port-aviv-best-of-breed-handoff.md:23); seed-0 = 780 falhas em 07-05 (docs/handoff/2026-07-05-paridade-legado-FINAL-handoff.md:28). Registro de sessão de 07-09 aponta ~292 falhas pré-existentes na sub-suíte dashboard+credit+regulatory/efinanceira (1.335 testes); esse número é do CORE, não do PIX, e não está publicado em docs/ | Postgres local docker `monetarie-pg` porta 15432, user/senha monetarie/monetarie, DB `mon_core_test` (config/test.exs:50-54). TigerBeetle opcional via `TB_ADDRESSES` (config/test.exs:15). GOTCHA já documentado: o alias cria DB VAZIO SEM seed; rodar `seeds.exs` polui o banco e quebra testes que contam registros. Paralelização por `MIX_TEST_PARTITION` |
| pix/backend (umbrella) | ExUnit | 299 (dict 39, settlement 62, shared 130, spi 68) | 3.452 (387 + 894 + 1.481 + 690) | `cd pix/backend && mix test` (mesmo alias com create+migrate, mix.exs:30) | 07-05: spi_service 634/0, shared 1.211/15, dict 304/1, settlement 700/25 (isolado = 17; as 8 extras são a família CobV `build_cobv_payload` flaky sob run completo do umbrella) (docs/handoff/2026-07-05-paridade-legado-FINAL-handoff.md:27; docs/handoff/2026-07-04-port-aviv-best-of-breed-handoff.md:22 e :47) | Postgres localhost:5432 user postgres, DB `monetarie_pix_test` compartilhado pelos 4 repos (config/test.exs:8-24). NATS configurado em localhost:4222 (config/test.exs:47), a maioria dos testes usa mock |
| spb/services/bacen_gateway | ExUnit | 1.207 | 17.453 test/property, 4.973 describe | `cd spb/services/bacen_gateway && mix test` | Sem número documentado de run completo da suíte inteira em handoff; os handoffs recentes citam apenas suítes alvo verdes (exemplo: "Suíte combinada: 393+7+4 testes, 0 falhas" no fechamento das ondas P0 de 07-09, escopo dirigido) | RESOLVIDO 2026-07-10: config/test.exs agora define `database: "mon_spb_test#{MIX_TEST_PARTITION}"` (mesmo padrão do core/backend). Provado empiricamente: config resolvida em MIX_ENV=test = `mon_spb_test`; `mix test test/bacen_gateway_web/controllers/entity_status_controller_test.exs` criou o banco novo (não existia antes do run), aplicou as 52 migrations (52 linhas em schema_migrations, incluindo tabelas particionadas sem setup extra) e passou 2/2; `mon_spb` de dev seguiu intacto e separado. Árvore de supervisão completa desligada em teste (`start_full_supervision_tree: false`, config/test.exs:22) e `outbox_strict_mode: true` (config/test.exs:30) |
| spb/services/transaction_service | ExUnit | 11 | 235 | `cd spb/services/transaction_service && mix test` | Sem estado documentado | Postgres local |
| spb/services/user_management | ExUnit | 1 | 24 | idem | Sem estado documentado | Postgres local |
| spb/services/cash_service, forex_service, securities_service, settlement_service | ExUnit | 1 cada | 2 cada (scaffold: só `error_json_test.exs`) | idem | Placeholder de geração Phoenix, sem valor de regressão | Nenhuma |
| spb/services/api_gateway, extract_service, message_processor | nenhum | 0 | 0 | não há | ZERO testes | Nenhuma |
| spb/simulator | ExUnit | 5 | 15 | `cd spb/simulator && mix test` | Testes de contrato do catálogo de mensagens, scenario engine e config MQ | Nenhuma dependência externa aparente |
| npc/backend | ExUnit | 20 | 215 | `cd npc/backend && mix test` | Sem estado documentado | Postgres localhost user postgres, DB `monetarie_npc_test` (config/test.exs:9-12) |
| sta/backend | ExUnit | 86 | 1.403 | `cd sta/backend && mix test` | Sem estado documentado | Postgres localhost user postgres, DB `sta_connector_test` (config/test.exs:9-12) |
| clst | ExUnit | 5 | 54 | `cd clst && mix test` | Sem estado documentado | Postgres, DB `monetarie_clst_test` (config/test.exs:5) |
| benchmark | ExUnit | 5 | 42 | `cd benchmark && mix test` | Testes do harness de benchmark (collector, guard, stats) | Nenhuma |

### 1.2 Frontends (Vitest)

Todas as suítes abaixo com node_modules presente foram RODADAS nesta sessão (rápidas, sem serviço externo). Números reais de execução:

| App | Framework | Arquivos | Casos executados | Resultado (RODADO 2026-07-10) | Comando |
|---|---|---|---|---|---|
| core/apps/admin | Vitest 3 | 39 | 315 | 315 pass, 0 falhas, 4,9s | `cd core/apps/admin && npm run test:run` |
| core/apps/banking (IB) | Vitest 3 | 14 (o 15º arquivo é o smoke Playwright) | 168 | RESOLVIDO 2026-07-10 (sessão de estabilização): 168 pass, 0 falhas. Das 11 falhas, 10 eram teste/infra de teste desatualizados e 1 era bug real de produção no `formatDate` (data-só com formato custom deslocava um dia por parse UTC). Causa por causa na seção 5 | `cd core/apps/banking && npm run test:run` |
| core/apps/merchant | Vitest 3 | 1 | 3 | 3 pass | `cd core/apps/merchant && npm run test:run` |
| core/packages/shared | Vitest 3 | 2 | 92 | RESOLVIDO 2026-07-10: 92 pass, 0 falhas. A falha em `cnpj.test.ts:113` era fixture antiga: a entrada era o CNPJ real da Monetarie (46026562000105, válido pelo algoritmo e aceito pela própria suíte de `isValidCnpj`) mas a expectativa era outro CNPJ. Validador e formatador estão corretos; a asserção foi corrigida para `46.026.562/0001-05` | `cd core/packages/shared && npm run test:run` |
| pix/frontend/admin | Vitest 3 | 16 | 107 | 107 pass | `cd pix/frontend/admin && npm test` |
| spb/frontend-vue | Vitest | 6 | 38 | 38 pass | `cd spb/frontend-vue && npm run test:unit -- --run` |
| sta/admin-portal | Vitest | 1 | 4 (grep) | NÃO RODADO: sem node_modules instalado | `npm install && npm run test:run` |
| backoffice, npc/frontend, sta/frontend, pix/simulator-frontend, npc/simulator-frontend, docs-sites | nenhum | 0 | 0 | ZERO testes | não há |

### 1.3 E2E Playwright

| Suíte | Arquivos | Casos (grep) | Comando | Estado/bloqueio |
|---|---|---|---|---|
| core/e2e | 43 `*.spec.ts` em 12 projetos (banking, admin, merchant, pix-admin, spb-admin, npc-admin, sta-admin, backoffice e 4 simuladores) | 145 | `cd core/e2e && npx playwright test` (package.json não tem script de teste) | DESATUALIZADA: `playwright.config.ts` resolve todos os hosts `*.vulci.com.br` para o IP `204.157.111.155` (ambiente OPNsense antigo, anterior à migração AWS). Os ambientes atuais são `*.monetarie.internal` via VPN (HML) e o cluster 10.50 (PROD). Existe `playwright.local.config.ts` para rodar contra localhost |
| core/apps/banking/e2e | 1 (`smoke.spec.ts`) | incluído nos 145 acima? não; suíte própria | `cd core/apps/banking && npx playwright test` | Sobe `npm run dev` em localhost:3000 automaticamente fora de CI (playwright.config.ts, bloco webServer) |

### 1.4 Mobile (Flutter)

| App | Framework | Arquivos | Casos (grep) | Comando | Estado |
|---|---|---|---|---|---|
| mobile/ | flutter_test + integration_test (pubspec.yaml:63-65) | 19 em `test/` + 5 em `integration_test/` | ~238 `test(`/`testWidgets(` | `cd mobile && flutter test`; integração via `mobile/test/run_integration_tests.sh` | Sem estado documentado em nenhum handoff; nunca citado como rodado. NÃO RODADO nesta sessão |
| packages/mobile-ui | nenhum | 0 | 0 | não há | ZERO testes |

### 1.5 CI e carga

Não existe `.github/workflows` no repositório e os `cloudbuild.yaml` remanescentes (pix/, clst/, backoffice/) são builds Docker legados do GCP (projeto antigo "fluxiq") que NÃO executam teste algum. Conclusão honesta: hoje NENHUMA suíte roda automaticamente; tudo depende de execução manual. Existem scripts k6 de carga em `core/backend/k6/` (core-load-test.js, core-stress-test.js) e `spb/services/bacen_gateway/k6/`, também fora de qualquer pipeline.

## 2. Cobertura dos money paths (visão de banco)

### 2.1 PIX-in (crédito ao cliente)

O que existe:

- Cabine (único caminho de crédito, anti-crédito-fantasma): `pix/backend/apps/spi_service/test/spi_service/workers/inbound_processor_phantom_credit_test.exs:19` (SPI inválido rejeita CH16 e nunca credita), `:32` (sanção bloqueia), `:40` (sanção indisponível rejeita RR04 fail-closed), `:47` (conta inexistente AC03), `:52` (Core fora re-tenta sem rejeitar crédito real), `:61` (todos os checks passam, credita a conta validada).
- Tratamento de pacs.008/pacs.004/camt.054: `pix/backend/apps/spi_service/test/spi_service/workers/inbound_processor_test.exs:53,66,77` (parte desse arquivo é estrutural, "module is defined").
- Enum canônico de rejeição (fonte única dos 44 códigos, do incidente de 07-09): `pix/backend/apps/shared/test/shared/bacen/iso20022/reject_codes_test.exs`.
- Core credita TB + PG: `core/backend/test/monetarie/infra/nats/handlers/pix_handler_test.exs:140` (created INBOUND untracked roteia para o ledger e credita), `:153` (OUTBOUND nunca credita), `:161` (payload sem direction nunca credita), `:169` (flag two-phase ligada segue audit-only), `:177` (idempotência de redelivery: tx já rastreada não credita de novo).
- Direção (o defeito que teria sacado em vez de creditar): `core/backend/test/monetarie/use_cases/banking/account_resolver_direction_test.exs:36-68` (INBOUND maiúsculo do fio, OUTBOUND, legado minúsculo, payload real da cabine).
- WAL de crédito: `core/backend/test/monetarie/infra/nats/handlers/pix_handler_wal_test.exs:154,174,192` (TB ok completa WAL e espelho PG; redelivery não credita de novo).
- Extrato: `core/backend/test/monetarie/infra/nats/handlers/pix_handler_statement_entry_test.exs`.
- Contrato de entrega durável NATS: `core/backend/test/monetarie/infra/nats/consumers/durable_money_path_contract_test.exs` e `core/backend/test/monetarie/infra/nats/jet_stream_flow_test.exs`; travamento de conexão coberto por `core/backend/test/monetarie/infra/nats/connection_wedge_test.exs` (regressão do incidente de 06/07).

O que NÃO existe:

- Teste automatizado ponta a ponta cabine -> NATS -> Core num único harness. A prova E2E de 07-09 foi um exercício sintético manual em HML (core-api:98), não um teste versionado e repetível. Cada metade está testada isolada; a costura só foi provada à mão.
- Teste com TigerBeetle real no caminho de crédito como parte obrigatória da suíte (TB é opcional via `TB_ADDRESSES`; a maior parte roda sem ele).

### 2.2 TED-in (STR0008R2 e afins)

O que existe:

- Gateway SPB: `spb/services/bacen_gateway/test/bacen_gateway/lifecycle_engine_inbound_str_credit_test.exs:51` (exatamente 1 operação inbound + evento), `:135` (mesma STR duas vezes gera 1 op), `:184` (redelivery dual-transport dedupado por message_type + control_number_clearing), `:219` (o próprio unique index parcial rejeita INSERT duplicado, não só a lógica da aplicação). Complementos em `lifecycle_engine_inbound_credit_event_test.exs` e `messages_inbound_credit_visibility_test.exs`.
- Core: `core/backend/test/monetarie/infra/nats/handlers/spb_inbound_credit_handler_test.exs:170` (TB em subcentavos + AccountEntry/transactions em subcentavos + COSIF em centavos + credited_member; regressão direta do bug 100x de 07-06), `:214` (fallback por CPF/CNPJ), `:234` (falha no TB = zero escrita de dinheiro no PG), `:255` e `:275` (conta inexistente/inativa fail-closed, suspense), `:364` (mesmo num_ctrl_str duas vezes = 1 crédito), `:387` (retomada de linha presa em processing).

O que NÃO existe: E2E automatizado da perna MQ/sidecar -> gateway -> NATS -> Core (a validação foi viva em HML/PROD).

### 2.3 PIX-out

O que existe:

- Core: `core/backend/test/monetarie/payments/outbound_request_idempotency_test.exs:58-112` (IDs determinísticos por semantic_id entre retries, sem duplicar débito), `core/backend/test/monetarie/payments/outbound_pix_reason_codes_wire_test.exs` (códigos de rejeição do fio), `core/backend/test/monetarie/infra/nats/handlers/pix_handler_return_rejected_test.exs` (estorno de rejeição usa depósito na unidade certa).
- Cabine: `pix/backend/apps/settlement_service/test/settlement_service/spi/pacs008_send_validator_test.exs` (gate de envio), `pix/backend/apps/settlement_service/test/settlement_service_web/controllers/message_controller_send_truth_table_test.exs` (tabela verdade do envio), `pix/backend/apps/spi_service/test/spi_service/workers/status_updater_outbox_atomicity_test.exs` e `status_updater_no_legacy_status_rejected_test.exs` (atualização de status sem regressão de mapa legado), `pix/backend/apps/spi_service/test/spi_service/workers/outbound_subject_arity_test.exs`.
- Partner API: `core/backend/test/monetarie_web/controllers/partner_v1/pix_controller_test.exs`, `transfers_controller_test.exs` e `webhooks_controller_test.exs`.

O que está fraco ou NÃO existe:

- Limites (incluindo noturno Res. BCB 142): `pix/backend/apps/spi_service/test/spi_service/limits_test.exs:25-50` é majoritariamente estrutural (verifica que módulos e funções existem, `exports nighttime?/1`), não prova a regra de valor por horário de ponta a ponta. No Core não achei teste de limite noturno de PIX-out.
- No frontend do IB, os 4 testes de Idempotency-Key do `usePix` estavam FALHANDO (RESOLVIDO 2026-07-10, ver 1.2 e seção 5): os testes travavam o contrato ANTIGO do envio. Confirmado no código fonte que o fluxo real envia o header: `PixSendConfirmView` gera `clientRequestId` estável por transferência lógica (`pixSendSession.ts`, fingerprint + reuso no retry) e `usePix.sendPix` o transforma em `Idempotency-Key` via `buildIdempotencyConfig` (`http/api.ts:10`), lido pelo `MonetarieWeb.Plugs.Idempotency`. Hardening adicional: o composable agora gera chave fresca quando o chamador omite o `clientRequestId` (nunca envia mutação de dinheiro sem o header).

### 2.4 Book transfer (mesmo ISPB, não vai ao BACEN)

O que existe: `core/backend/test/monetarie/use_cases/pix/internal_transfer_test.exs:21-57` (ISPB próprio roteia para book-transfer e não para pacs.008; ISPB externo segue caminho padrão; sem conta interna resolvida cai no caminho padrão; self-transfer não é book-transfer) e `core/backend/test/monetarie/use_cases/wallet_internal_transfer_test.exs` (débito/crédito das duas pernas).

### 2.5 XSD e catálogo de mensagens

- PIX: validação real contra XSD em `pix/backend/apps/shared/test/shared/bacen/iso20022/pacs008_xsd_test.exs`, `pacs002_xsd_test.exs`, `pacs004_xsd_test.exs`, `pain013_xsd_test.exs`, `pain014_xsd_test.exs`, `camt054_xsd_test.exs`, mais os testes de catálogo por builder (`message_builder_pacs008_catalog_test.exs` etc.) e a guarda de completude do Construtor (`pix/backend/apps/settlement_service/test/settlement_service_web/message_form_catalog_completeness_test.exs`). Exige `xmllint` disponível.
- SPB: `spb/services/bacen_gateway/test/bacen_gateway/validation/xsd_validator_nuop_alfa_test.exs` mais o catálogo massivo por grupo de mensagem (143 arquivos ctp, 131 sel, 108 ldl, 89 dda, 74 str, 70 lfl, 66 pag, entre outros), que responde pela maior parte dos 17.453 casos do gateway.

### 2.6 Simuladores

- SPB: `spb/simulator/test/` (5 arquivos: contrato do catálogo, scenario engine, response generator, cenários abrangentes, config MQ) e `spb/services/bacen_gateway/test/bacen_gateway/simulator/homologation_scenarios_alfa_test.exs`.
- PIX: `pix/backend/apps/settlement_service/test/settlement_service_web/controllers/simulator_controller_test.exs`.
- Alerta canônico (já documentado, repetido aqui porque é risco de teste): o gatilho settled do `TWO_PHASE_PIX_IN` só existe no simulador; teste de integração simulator-driven NÃO representa o BACEN real, que liquida antes de entregar a pacs.008 e não devolve pacs.002 ao recebedor (docs/handoff/2026-07-09-incidente-pacs008-canonico-pixin-handoff.md:22-24). Qualquer suíte nova de integração precisa modelar esse comportamento real, não o do simulador.

### 2.7 Idempotência e dedup (transversal)

168 arquivos de teste em core + pix + spb mencionam idempotência/dedup. Âncoras principais já citadas: `pix_handler_test.exs:177`, `pix_handler_wal_test.exs:192`, `spb_inbound_credit_handler_test.exs:364`, `lifecycle_engine_inbound_str_credit_test.exs:135-219`, `outbound_request_idempotency_test.exs:112`. Também `core/backend/test/monetarie/infra/nats/msg_identity_test.exs` e `durable_consumer_delivery_test.exs` para identidade de mensagem NATS.

## 3. Recomendações priorizadas

### P0 (estabilizar primeiro)

1. CI inexistente. Nenhum pipeline roda teste algum hoje. Criar um workflow mínimo que rode, a cada push: o money path do Core (pix_handler_test, pix_handler_wal_test, spb_inbound_credit_handler_test, account_resolver_direction_test, internal_transfer_test, outbound_request_idempotency_test), os XSD do PIX (apps/shared iso20022) e o lifecycle inbound do bacen_gateway. É um subconjunto pequeno, determinístico e cobre o dinheiro.
2. RESOLVIDO 2026-07-10: as 11 falhas do Vitest do IB foram diagnosticadas uma a uma e a suíte está 100% verde (168/168). Causa por causa na seção 5. O fix 100x da transferência (`amountCents > balance` sem `*100`, commit 39af6711) foi preservado e conferido intacto em `TransferSendView.vue:83,122,248`.
3. RESOLVIDO 2026-07-10: `spb/services/bacen_gateway/config/test.exs` agora define `database: "mon_spb_test#{MIX_TEST_PARTITION}"` com prova empírica (ver linha do bacen_gateway na tabela 1.1). `ecto.drop` em MIX_ENV=test não alcança mais o banco de dev.
4. Zerar as ~26 falhas residuais do Core (fixtures profundas, docs/handoff/2026-07-09:48) e abrir mandato para as ~292 pré-existentes da sub-suíte dashboard+credit+regulatory. Suíte vermelha crônica mascara regressão nova de dinheiro.

### P1

5. Sanear a família flaky CobV do settlement no run completo do umbrella PIX (700/25 vs 17 isolado; ownership do sandbox), follow-up 6b do handoff 07-04 ainda aberto.
6. Transformar a prova sintética do PIX-in (cabine -> NATS -> Core, feita à mão em HML em 07-09) num script E2E versionado e repetível em HML, respeitando a regra do dono de não testar em produção.
7. Reapontar ou aposentar `core/e2e` (43 specs Playwright apontando para o ambiente OPNsense antigo `204.157.111.155`; hoje não valida nada do ambiente real). Se mantido, migrar para os hosts `*.monetarie.internal` com VPN, aproveitando a técnica de túnel SSM já documentada.
8. Cobrir de verdade os limites de PIX-out (incluindo noturno Res. 142) com testes de regra de valor, não só de exports (`limits_test.exs` atual é estrutural).
9. PARCIALMENTE RESOLVIDO 2026-07-10: a falha única de `core/packages/shared` (`cnpj.test.ts:113`) foi corrigida (92/92 verde). Segue pendente instalar node_modules do `sta/admin-portal` para a suíte dele contar.

### P2

10. Decidir o destino dos serviços SPB sem teste: api_gateway, extract_service e message_processor têm ZERO; cash/forex/securities/settlement têm só scaffold (2 casos de error_json). Ou ganham smoke tests ou são declarados fora do perímetro de regressão.
11. Rodar `flutter test` do mobile/ e registrar baseline (238 casos nunca citados em handoff); mesmo para os frontends sem nenhum teste (backoffice, npc/frontend, sta/frontend, simulator-frontends), um smoke de render por app já pega quebra de build.
12. Integrar os k6 (core/backend/k6 e bacen_gateway/k6) a uma rotina periódica de HML, aproveitando o benchmark/ (42 casos) que já testa o próprio harness.

## 4. Notas de honestidade

- Os números de casos são contagem estática; o total executado tende a ser um pouco maior (parametrização) ou menor (skips: exemplo, 23 skips de cooperativa e 9 de parsers Cecresa documentados no saneamento de 07-09).
- A atribuição "~292 falhas" que circula em resumo de sessão refere-se ao CORE (sub-suíte dashboard+credit+regulatory, 1.335 testes), não ao PIX. O estado documentado do PIX é o de 07-05: 634/0, 1.211/15, 304/1, 700/25 por app.
- Nenhum resultado de backend foi reverificado por execução nesta sessão; tudo que está como "estado conhecido" tem fonte citada. Onde não há fonte, está escrito "sem estado documentado". Exceção de 2026-07-10: o bacen_gateway teve a config de teste provada com um único arquivo de teste (2 casos), não com a suíte inteira.

## 5. Estabilização de 2026-07-10 (P0 itens 2 e 3, P1 item 9)

Sessão dedicada, sem commit. Resultado final RODADO: `core/apps/banking` 168/168, `core/packages/shared` 92/92, `bacen_gateway` com banco de teste dedicado provado. Causa raiz das 11 falhas do IB, uma a uma:

| # | Teste | Veredito | Causa raiz |
|---|---|---|---|
| 1 | usePix: PF roteia para /transfers/pix | Teste desatualizado | O commit 835038e4 (integração Core↔PIX do envio) substituiu de propósito o split PF/PJ (`/transfers/pix` vs `/merchants/:id/pix/send`) pelo endpoint account-scoped `POST /accounts/:id/pix/send` (router.ex:3228, `TransferController.create_pix_account`), baseado na conta selecionada do `accountStore`. Teste reescrito para o contrato real |
| 2 | usePix: PJ roteia para /merchants/:id/pix/send | Teste desatualizado | Mesma causa do item 1. O novo teste também trava o fail-closed: sem conta selecionada, nenhum POST sai |
| 3 | usePix: envia Idempotency-Key (UUID) | Teste desatualizado + hardening no código | O header É enviado no fluxo real: a view gera `clientRequestId` (32 hex, `generatePixClientRequestId`) e `sendPix` monta o header via `buildIdempotencyConfig`; o plug do backend aceita 1..256 bytes (não exige UUID). O teste antigo esperava UUID gerado dentro do composable. Hardening aplicado: fallback gerado no composable quando o chamador omite a chave |
| 4 | usePix: chave fresca por tentativa | Teste desatualizado (semântica invertida) | O contrato atual usa chave ESTÁVEL por transferência lógica (fingerprint em `pixSendSession.ts`, reusada no retry), que é o que efetivamente dedupa duplo submit no servidor; chave fresca por tentativa não dedupa nada. Testes novos travam: chave do chamador reusada entre retries e fallback fresco quando omitida |
| 5 | formatters: formatDate com formato custom | BUG DE PRODUÇÃO (corrigido) | `formatDate('2026-03-15', 'yyyy-MM-dd')` devolvia `2026-03-14`: string data-só era normalizada para meia-noite UTC e formatada no fuso local (UTC-3). Sintoma visível: rótulo de grupo do extrato (`StatementView.vue:136`) podia exibir o dia anterior. Fix em `formatters.ts`: data-só parseia como data de calendário local |
| 6 | formatters: formatDateTime contém "às" | Teste desatualizado | O rewrite deliberado 54a853f1 (paridade + fuso BRT via `Intl.DateTimeFormat`) removeu o literal "às". Teste atualizado para o contrato real e mais forte: `15/03/2026 11:30` para `14:30Z` (conversão BRT explícita, independente do fuso da máquina) |
| 7 | account store: fetchAccounts com merchant ID | Teste desatualizado | O store ignora o parâmetro de propósito (`_merchantId`) e sempre chama `/accounts`; o escopo de merchant viaja no header `X-Merchant-Id` (interceptor do axios). Teste atualizado |
| 8 | DashboardView: greeting | Teste desatualizado | Classe CSS renomeada de `.greeting-text` para `.greeting` no componente atual |
| 9 | DashboardView: rótulos Ag/Cc | Teste desatualizado | O template atual usa "Ag." e "Conta" (hardcoded), não mais "Cc" |
| 10 | DashboardView: 12 quick actions | Teste desatualizado | O componente define 9 quick actions hoje (PIX, Extrato, Receber PIX, Favoritos, Comprovantes, Analytics, MEDs, Taxas, Limites) |
| 11 | DashboardView: estado de erro "Erro" | Infra de teste desatualizada | As chaves i18n existem no app real (`src/i18n/pt-BR.ts:414`), mas o i18n próprio do helper de teste (`src/test/helpers.ts`) era um subconjunto duplicado sem `dashboard.errorLoadingTransactions`, `tryAgain`, `monthlyIncome`, `monthlyExpense`; a tela renderizava a chave crua. Chaves adicionadas ao helper com os textos reais do app |

Arquivos alterados (produção): `core/apps/banking/src/lib/formatters.ts` (fix data-só), `core/apps/banking/src/composables/usePix.ts` (fallback de Idempotency-Key), `spb/services/bacen_gateway/config/test.exs` (banco de teste dedicado). Arquivos alterados (teste): `usePix.test.ts` (reescrito), `formatters.test.ts`, `account.test.ts`, `DashboardView.test.ts`, `src/test/helpers.ts`, `core/packages/shared/src/utils/__tests__/cnpj.test.ts`. O fix 100x de 39af6711 não foi tocado (conferido no diff e no fonte).
