# Handoff de sessão — 2026-07-10 (noite) — Cabines PIX/SPB locais + contabilização instantânea do PIX

**Para retomar em sessão nova: digite `/retomar`.** Este é o handoff MAIS RECENTE (sucede `2026-07-10-sessao-admin-paginas-merge-main-handoff.md`).

---

## 1. O grande resultado da sessão: as 3 cabines rodam LOCALMENTE e interligadas

Antes só o Core (core-api + core-admin) subia local. Agora **PIX (SPI) e SPB também**, no mesmo NATS/Postgres/TigerBeetle, formando o ecossistema completo em localhost. Receita completa (envs, seeds, gotchas) na memória Serena `cabines_pix_spb_local` e na memória do Claude `cabines-pix-spb-local.md`.

**Portas locais (host):**
- core-api :4002, core-admin :5180 (já existiam)
- **pix-api :4003** (gateway Settlement) + 14001 (DICT) + 14002 (SPI) — container `pix-api`
- **spb-api :4010** — container `spb-api`
- pix-admin (vite dev): **http://localhost:5175** (`cd pix/frontend/admin && pnpm dev`)
- spb-admin (vite dev): **http://localhost:5173** (`cd spb/frontend-vue && pnpm dev`)
- Bancos novos no `monetarie-pg`: `mon_pix`, `mon_spb`
- **Senha das 3 cabines = ADMIN_PASSWORD do core-api** (extrair via `docker inspect core-api`, nunca gravar)

**Gotchas de subida importantes** (detalhe na memória Serena):
- PIX admin cifra o login com RSA-OAEP → o container precisa de `RSA_FALLBACK_ALLOWED=true` (dev-only); sem isso o `/public-key` dá 500 e a tela mostra "Login ou senha inválidos" (enganoso).
- Bootstrap do `mon_pix` do zero quebra com 42P07: a squash `20260101000000` carrega um dump que já contém `holidays` e `ownership_validations`; marcar `20260702130000` e `20260704235000` como aplicadas em `schema_migrations` antes de re-rodar migrate. **Candidato a fix de upstream** (re-extrair o dump sem as incrementais engolidas).
- SPB: gerar cert dev (`bash spb/scripts/gen-dev-cert.sh`) ANTES do build; seeds ENXUTOS (sem os 60k sintéticos) via rpc.

## 2. Frentes de UI entregues (tudo TDD + review adversarial + validação viva; TUDO PUSHADO)

`origin/feat/monetarie_improviments` = **`2ba83756`** (branch 0/0 vs remoto).

- **Segurança (SPB admin, 5 telas)** — `d0ca83b3`+`26e03c24`+`d11d...`: Usuários/Grupos/Permissões/Reset/Importação. Filtros surdos religados no backend, chips de status lendo campo real, IdCell nos UUIDs, i18n 3 idiomas, componente `components/common/IdCell.vue` criado. Fixes de backend: filtros do `GET /api/users`, e o bug SISTÊMICO `NaiveDateTime` vs `timestamptz` (create/update de grupos e entidades dava 500).
- **Cadastro (SPB admin, 9 telas)** — `ccffb58a` (backend) + `d11d30ee` (front): Entidades (paginação server-side real! antes só 25 de 1.410 visíveis; status/busca/CNPJ), Feriados (editar/excluir davam 500 sempre — bind uuid/date), Roteamento R0 (CRUD inteiro morto — coluna `created_at` inexistente), Domínios (status fabricado), Tarifas (valor lia campo errado), Sanções (3 sucessos fabricados), Bloqueio (direction persiste), Filiais/Automação. 327 chaves i18n novas por locale.
- **Contabilização instantânea do PIX** — `ada22a4c` + `2ba83756` (fix do code review): **ver seção 3**, é o assunto mais importante.
- **Tesouraria/Dashboard** — `f140245c` + `ed00f684`: tela Conta de Liquidação exibia PIX 10.000x inflado (base units como reais); card "Operações do Dia" hardcodado em zero + filtro de status + fuso; lista de transações da cabine com data do E2E.

## 3. CONTABILIZAÇÃO DO PIX — assunto quente, com trabalho feito e MUITO por fazer

Pergunta do dono: quando um PIX acontece, além do saldo do cliente (TB), o Core gera os lançamentos COSIF corretos (trânsito PIX, Conta SPI/PI, 4.9.x de clientes)?

**Estudo completo** (5 agentes + prova viva) em `docs/reports/2026-07-10-estudo-contabilizacao-cabines-core.md`. Achados: SIM existe mapeamento, mas era raso e com 3 defeitos graves, **corrigidos nesta sessão** (`ada22a4c`):
1. **Inversão** no PIX-in real: direção `"INBOUND"` (maiúsculo, fio da cabine) caía no code de ENVIO → razão registrava saída para cada entrada. Agora usa a fonte única `AccountResolver.inbound_direction?/1` (mesma do crédito TB).
2. **Unidade 100x**: journal gravava base units; convenção de `cosif_journal_entries` é CENTAVOS. `to_cents` no PIX-in, estorno e `JournalEntryWorker`.
3. **Ordem**: journal nascia ANTES do TB, fora de transação, sem dedup (redelivery duplicava, TB caído = órfão). Agora dinheiro-primeiro (padrão SPB `InboundCredits`); `reference_id` cai até o E2E.

**Achado do code review, também corrigido** (`2ba83756`): como o journal virou parte da "perna PG" (pós `mark_tb_done`), o `replay_pg_leg` do `PixInCreditRecoveryWorker` precisava recriá-lo — senão crash na janela perde o lançamento silenciosamente. Feito, com teste.

**Padrão-ouro a seguir** (já existe no Core): `UseCases.Spb.InboundCredits` (TB-first + Ecto.Multi atômico + COSIF em centavos + desfecho auditado) e SISBAJUD (`PostingEngine` evento→template em dados, fail-closed). O PIX deveria migrar para esse desenho completo.

### PENDÊNCIAS GRANDES de contabilização (próximas frentes):
- **Plano de contas incompleto**: não existe conta "Conta PI / CORNER SPI" nem transitória de PIX; tudo bate na `1.1.2.10.01.10.001` do liquidante. Cruzamento com o **balancete oficial assinado (Maio/2026)** em `docs/reports/2026-07-10-balancete-oficial-vs-plano-vivo.md`: **34 folhas novas propostas** (ids 50_305–50_338), TODAS pendentes de validação do **contador** (folha COSIF + DV + elenco) antes de semear. Alerta: CORNER SPI fechou negativa e o float diverge dos saldos do Core — reconciliar.
- **ETL contábil**: o ETL nunca trouxe contabilidade. O dono vai disponibilizar um **backup novo** (possivelmente com dados contábeis) e talvez **recriar o ETL** para carregar disponibilidades + saldos iniciais amarrados ao balancete. AGUARDAR o backup.
- **FeeCharger**: suspeita de unidade na tarifa (não confirmada; o teste atual fixa centavos na entrada) — validar na origem (FeeCalculator).

## 4. PENDÊNCIA CRÍTICA reservada para HML (amanhã, com acesso exclusivo do dono)

`docs/reports/2026-07-10-validate-account-stream-overlap-PENDENTE-HML.md`: o req/reply `monetarie.core.pix.validate_account` (cabine→Core) está DENTRO do escopo do stream JetStream `MONETARIE_CORE` (`monetarie.core.>`) → o PubAck do JetStream chega antes da resposta → a pacs.008 orgânica envenena até a DLQ (caminho realista cabine→Core MORTO no local). Diagnóstico 100% local. **NÃO implementar sem a validação em HML.** Fix proposto: mover para `rpc.core.pix.validate_account` (fora de qualquer stream, padrão gotcha #7), Core primeiro (dual-subscribe), cabine depois. **O dono pediu explicitamente para NÃO acessar HML/prod nesta sessão** — a análise HML será feita amanhã com acesso próprio dele.

## 5. Ambiente local (estado ao fechar)

- Containers vivos: `core-api` (:4002, IP 192.168.155.2), `core-admin` (:5180, env `CORE_API_UPSTREAM=http://192.168.155.2:4000`), `pix-api` (:4003), `spb-api` (:4010), `monetarie-pg` (:15434), `monetarie-nats` (:4422), `tigerbeetle` (192.168.155.3:3001, host 3003).
- Vites de dev (pix-admin 5175, spb-admin 5173) rodam NA SESSÃO — se caírem, subir de novo com `pnpm dev` nas pastas.
- 2 lançamentos COSIF de teste (PROVACOSIF*) ficaram no `mon_core` local (reparados: direção+unidade corretas); acervo limpo dos órfãos.
- Runner de testes do Core: SEMPRE via Docker `monetarie-core-backend-test:latest` da RAIZ do repo (receita em `dev_commands`).
- Testes SPB (backend): `cd spb/services/bacen_gateway && DB_PORT=15434 DB_PASSWORD=monetarie mix test <caminho>` (host tem Elixir 1.19).

## 6. Falhas de teste PRÉ-EXISTENTES a avisar o Bruno (provadas com stash, NÃO são nossas)
- 4 em `test/monetarie/use_cases/fees` (fee packages — `fee_config_id` can't be blank).
- 2 em `test/monetarie/workers/webhook_delivery_stats_refresh_job_test` (`secret` not-null).
- 14 em `GeneratorAuditWireTest` do SPB (cadoc, herdadas da frente dele).
- 2 UPDATEs de `schema_migrations` no localhost dele (herança do merge de 10/07: 130000→131000, 120000→121000).

## 7. Regras inegociáveis (reforçadas nesta sessão)
- **PUSH só com OK explícito naquele momento** — não é transitivo. (Houve push autorizado desta vez.)
- **NUNCA HML/prod sem pedido explícito, nem para leitura.** Os agentes de estudo trabalharam 100% local (código + git + banco local).
- NUNCA alterar/commitar infra (nginx de deploy, terraform, task defs).
- TDD RED primeiro; dinheiro = integração com TB real; consultar `MoneyUnit` antes de tocar valor; nunca travessão em UI.
- Manter SEMPRE atualizados: CLAUDE.md + memória do Claude + memórias Serena do projeto `monetarie`.

## 8. Como retomar
Digite **`/retomar`**. Ele lê ESTE handoff, ativa o Serena (`monetarie`) e as memórias (`cabines_pix_spb_local`, `admin_paginas_estado_atual`, `contabilizacao_pix_estado`, `dev_commands`, `conventions_money_units`), confere `docker ps` + `git log`, e apresenta as pendências.

### Pendências priorizadas para a próxima sessão
1. **AGUARDAR** o backup novo do dono → possivelmente recriar ETL contábil + carga de saldos iniciais (balancete Maio/2026 como régua).
2. **Contador**: validar as 34 folhas COSIF propostas (Conta PI/CORNER SPI, compensação, PIXCARD, tarifas) antes de semear.
3. **HML amanhã**: overlap `validate_account` × stream (com o dono, acesso dele).
4. Migrar o PIX para o desenho completo do padrão SPB (Ecto.Multi atômico TB+extrato+COSIF, contas segregadas).
5. Continuar a varredura tela-a-tela do admin (SPB: Configuração/Operações/Infra/Monitoramento/Compliance/Continuidade; e as telas do PIX admin e core-admin conforme o dono aponta).
6. Fix de upstream do bootstrap `mon_pix` (42P07) e do gap de robustez F1 do aggregator (normalizar type/direction).
